#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 */
+/* Although it might seem as though this should be in some standard
+ Unix header, according to Perry E. Metzger, in a message on
+ sbcl-devel dated 2004-03-29, this is the POSIXly-correct way of
+ using environ: by an explicit declaration. -- CSR, 2004-03-30 */
extern char **environ;
\f
/*
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;
* when values are small.
*
* FIXME: But of course we should fix the FFI so that we can use the
- * actual 64-bit values instead. */
-typedef long ffi_dev_t; /* since Linux dev_t can be 64 bits */
+ * actual 64-bit values instead. In fact, we probably have by now
+ * (2003-10-03) on all working platforms except MIPS and HPPA; if some
+ * motivated spark would simply fix those, this hack could go away.
+ * -- CSR, 2003-10-03 */
+typedef u32 ffi_dev_t; /* since Linux dev_t can be 64 bits */
typedef u32 ffi_off_t; /* since OpenBSD 2.8 st_size is 64 bits */
/* a representation of stat(2) results which doesn't depend on CPU or OS */
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