X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fwrap.c;h=a3d88810df6cf8468a68a872473960e24a36ffc6;hb=89823a09e0dd2869f7fea351d887f75e70548ea7;hp=c7c878c36ed7adfa2314a8e0a273b9f7d6278723;hpb=85f9c92558538b85540ff420fa8970af91e241a2;p=sbcl.git diff --git a/src/runtime/wrap.c b/src/runtime/wrap.c index c7c878c..a3d8881 100644 --- a/src/runtime/wrap.c +++ b/src/runtime/wrap.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "runtime.h" #include "sbcl.h" @@ -125,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; @@ -253,6 +254,33 @@ 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