summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-01-13 06:57:04 -0800
committerKaz Kylheku <kaz@kylheku.com>2016-01-13 06:57:04 -0800
commitd1d529634ca0efabd8def4d1e4d103facb9f9380 (patch)
treeb78b2ac15b30f1b62b9de6303c5eff2a74a64dab
parentdbc666fb0822e3bc0fd97d90e068f104ea4f5781 (diff)
downloadtxr-d1d529634ca0efabd8def4d1e4d103facb9f9380.tar.gz
txr-d1d529634ca0efabd8def4d1e4d103facb9f9380.tar.bz2
txr-d1d529634ca0efabd8def4d1e4d103facb9f9380.zip
Support crypt function.
* configure: Check for availability of crypt, and what library must be used. * sysif.c (crypt_wrap): New static function. (sysif_init): Register crypt intrinsic. * txr.1: Documented crypt.
-rwxr-xr-xconfigure27
-rw-r--r--sysif.c19
-rw-r--r--txr.127
3 files changed, 73 insertions, 0 deletions
diff --git a/configure b/configure
index 1122cc15..b4042c9e 100755
--- a/configure
+++ b/configure
@@ -2235,6 +2235,33 @@ int main(void)
fi
fi
+printf "Checking for crypt ... "
+
+cat > conftest.c <<!
+#include <unistd.h>
+
+int main(void)
+{
+ char *c = crypt("foo", "bar");
+ return 0;
+}
+!
+
+for try_lcrypt in "" "-lcrypt" "no" ; do
+ if [ "$try_lcrypt" = "no" ] ; then
+ printf "no\n"
+ break
+ fi
+ if conftest EXTRA_LDFLAGS=$try_lcrypt; then
+ printf "yes\n"
+ printf "#define HAVE_CRYPT 1\n" >> $config_h
+ if [ -n "$try_lcrypt" ] ; then
+ conf_ldflags="${conf_ldflags:+"$conf_ldflags "}-lcrypt"
+ fi
+ break;
+ fi
+done
+
printf "Checking for alloca ... "
for try_header in alloca.h malloc.h ; do
diff --git a/sysif.c b/sysif.c
index 1f7eb085..cd59cc64 100644
--- a/sysif.c
+++ b/sysif.c
@@ -1037,6 +1037,21 @@ static val getgrnam_wrap(val wname)
#endif
+#if HAVE_CRYPT
+
+static val crypt_wrap(val wkey, val wsalt)
+{
+ char *key = utf8_dup_to(c_str(wkey));
+ char *salt = utf8_dup_to(c_str(wsalt));
+ char *hash = crypt(key, salt);
+ val whash = string_utf8(hash);
+ free(key);
+ free(salt);
+ return whash;
+}
+
+#endif
+
off_t off_t_num(val num)
{
switch (type(num)) {
@@ -1397,6 +1412,10 @@ void sysif_init(void)
reg_fun(intern(lit("getgrnam"), user_package), func_n1(getgrnam_wrap));
#endif
+#if HAVE_CRYPT
+ reg_fun(intern(lit("crypt"), user_package), func_n2(crypt_wrap));
+#endif
+
#if HAVE_POLL
reg_fun(intern(lit("poll"), user_package), func_n2o(poll_wrap, 1));
#endif
diff --git a/txr.1 b/txr.1
index a408611b..43b1fc5e 100644
--- a/txr.1
+++ b/txr.1
@@ -36030,6 +36030,33 @@ If the search fails,
.code nil
is returned.
+.SS* Unix Password Hashing
+.coNP Function @ crypt
+.synb
+.mets (crypt < key << salt )
+.syne
+.desc
+The
+.code crypt
+function is a wrapper for the Unix C library function of the same name.
+It calculates a hash over the
+.meta key
+and
+.meta salt
+arguments, which are strings. The hash is returned as a string.
+
+The
+.meta key
+and
+.meta salt
+arguments are converted into UTF-8 prior to being passed into the underlying
+platform function. The hash value is assumed to be UTF-8 and converted to
+Unicode characters, though it is not expected to contain anything but 7
+bit ASCII characters.
+
+Note: the underlying C library function uses a static buffer for its return
+value. The return value of the \*(TL function is a copy of that buffer.
+
.SS* Unix Signal Handling
On platforms where certain advanced features of POSIX signal handling are