#include <string.h>
#include <unistd.h>
#include <pwd.h>
-
+#include <stdio.h>
#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;
\f
/*
* stuff needed by CL:DIRECTORY and other Lisp directory operations
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;
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;
+ }
+}
+\f
+/*
+ * 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;
+}