Using erl_iolist_length instead of strlen
diff --git a/lib/bcrypt/c_src/bcrypt_erlang.c b/lib/bcrypt/c_src/bcrypt_erlang.c
index f93e783..34ad1cc 100644
--- a/lib/bcrypt/c_src/bcrypt_erlang.c
+++ b/lib/bcrypt/c_src/bcrypt_erlang.c
@@ -21,18 +21,18 @@
 #include <ei.h>
 #include <unistd.h>
 
-#define BCRYPT_VERSION '2'
-
-#define dec_int16(s) ((((unsigned char*)  (s))[0] << 8) |       \
-                      (((unsigned char*)  (s))[1]))
+#define dec_int16(s) ((((unsigned char*)(s))[0] << 8) | \
+                      (((unsigned char*)(s))[1]))
 
 #define enc_int16(i, s) {((unsigned char*)(s))[0] = ((i) >> 8) & 0xff;  \
-    ((unsigned char*)(s))[1] = (i)         & 0xff;}
+    ((unsigned char*)(s))[1] = (i) & 0xff;}
 
 #define BUFSIZE (1 << 16)
 #define CMD_SALT 0
 #define CMD_HASHPW 1
 
+typedef unsigned char byte;
+
 char *bcrypt(const char *, const char *);
 void encode_salt(char *, u_int8_t *, u_int16_t, u_int8_t);
 
@@ -40,7 +40,7 @@
  * http://www.erlang.org/doc/tutorial/c_port.html#4.2
  */
 static int
-read_buf(int fd, unsigned char *buf, int len)
+read_buf(int fd, byte *buf, int len)
 {
   int i, got = 0;
   do {
@@ -56,7 +56,7 @@
 }
 
 static int
-read_cmd(unsigned char *buf)
+read_cmd(byte *buf)
 {
   int len;
   if (read_buf(0, buf, 2) != 2)
@@ -68,7 +68,7 @@
 }
 
 static int
-write_buf(int fd, unsigned char *buf, int len)
+write_buf(int fd, byte *buf, int len)
 {
   int i, done = 0; 
   do {
@@ -83,9 +83,9 @@
 }
 
 static int
-write_cmd(unsigned char *buf, int len)
+write_cmd(byte *buf, int len)
 {
-  unsigned char hd[2];
+  byte hd[2];
   enc_int16(len, hd);
   if (write_buf(1, hd, 2) != 2)
     return 0;
@@ -94,11 +94,12 @@
   return 1;
 }
 
-static int process_reply(ETERM *pid, int cmd, const char *res)
+static int
+process_reply(ETERM *pid, int cmd, const char *res)
 {
   ETERM *result;
   int len, retval;
-  unsigned char *buf;
+  byte *buf;
   result = erl_format("{~i, ~w, ~s}", cmd, pid, res);
   len = erl_term_len(result);
   buf = erl_malloc(len);
@@ -109,7 +110,8 @@
   return retval;
 }
 
-static int process_encode_salt(ETERM *pid, ETERM *data)
+static int
+process_encode_salt(ETERM *pid, ETERM *data)
 {
   int retval = 0;
   ETERM *pattern, *cslt, *lr;
@@ -121,7 +123,7 @@
   if (erl_match(pattern, data)) {
     cslt = erl_var_content(pattern, "Csalt");
     csalt = erl_iolist_to_string(cslt);
-    csaltlen = strlen(csalt);
+    csaltlen = erl_iolist_length(cslt);
     lr = erl_var_content(pattern, "LogRounds");
     log_rounds = ERL_INT_UVALUE(lr);
     if (16 != csaltlen) {
@@ -140,12 +142,14 @@
   return retval;
 }
 
-static int process_hashpw(ETERM *pid, ETERM *data)
+static int
+process_hashpw(ETERM *pid, ETERM *data)
 {
   int retval = 0;
   ETERM *pattern, *pwd, *slt;
   char *password, *salt;
-  char *ret;
+  char *ret = NULL;
+  char hashed[200];
   pattern = erl_format("{Pass, Salt}");
   if (erl_match(pattern, data)) {
     pwd = erl_var_content(pattern, "Pass");
@@ -153,10 +157,13 @@
     slt = erl_var_content(pattern, "Salt");
     salt = erl_iolist_to_string(slt);
     if (NULL == (ret = bcrypt(password, salt)) ||
-        0 == strcmp(ret, ":")) {
+        0 == strncmp(ret, ":", 1)) {
       retval = process_reply(pid, CMD_HASHPW, "Invalid salt");
     } else {
-      retval = process_reply(pid, CMD_HASHPW, ret);
+      int retlen = strlen(ret);
+      strncpy(hashed, ret, retlen);
+      hashed[retlen] = 0;
+      retval = process_reply(pid, CMD_HASHPW, hashed);
     }
     erl_free_term(pwd);
     erl_free_term(slt);
@@ -198,7 +205,7 @@
 static void
 loop(void)
 {
-  unsigned char buf[BUFSIZE];
+  byte buf[BUFSIZE];
   int retval = 0;
   do {
     if (read_cmd(buf) > 0)