X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fwrap.c;h=a3d88810df6cf8468a68a872473960e24a36ffc6;hb=dc5e3163fe667e2629c7769aa8cf2e501eeeefa6;hp=1331e6de9c4adea3d9c0f9afb66d3b0d812aa6f5;hpb=21bb73db9c3f333ead8a848f863b957a6db5a5c9;p=sbcl.git diff --git a/src/runtime/wrap.c b/src/runtime/wrap.c index 1331e6d..a3d8881 100644 --- a/src/runtime/wrap.c +++ b/src/runtime/wrap.c @@ -30,11 +30,15 @@ #include #include #include - +#include #include "runtime.h" #include "sbcl.h" #include "util.h" + +/* KLUDGE: Neither the OpenBSD nor the Linux man page give a header + * file to find this in (?). -- WHN 2002-02-07 */ +extern char **environ; /* * stuff needed by CL:DIRECTORY and other Lisp directory operations @@ -122,7 +126,7 @@ wrapped_readlink(char *path) int bufsiz = strlen(path) + 16; while (1) { char *result = malloc(bufsiz); - int n_read = readlink(path, result, n_read); + int n_read = readlink(path, result, bufsiz); if (n_read < 0) { free(result); return 0; @@ -250,3 +254,44 @@ uid_username(int uid) return 0; } } + +char * +uid_homedir(uid_t uid) +{ + struct passwd *p = getpwuid(uid); + if(p) { + /* Let's be careful about this, shall we? */ + size_t len = strlen(p->pw_dir); + if (p->pw_dir[len-1] == '/') { + return strdup(p->pw_dir); + } else { + char *result = malloc(len + 2); + if (result) { + int nchars = sprintf(result,"%s/",p->pw_dir); + if (nchars == len + 1) { + return result; + } else { + return 0; + } + } else { + return 0; + } + } + } else { + return 0; + } +} + +/* + * functions to get miscellaneous C-level variables + * + * (Doing this by calling functions lets us borrow the smarts of the C + * linker, so that things don't blow up when libc versions and thus + * variable locations change between compile time and run time.) + */ + +char ** +wrapped_environ() +{ + return environ; +}