+\f
+/*
+ * getpwuid() stuff
+ */
+
+/* Return a newly-allocated string holding the username for "uid", or
+ * NULL if there's no such user.
+ *
+ * KLUDGE: We also return NULL if malloc() runs out of memory
+ * (returning strdup() result) since it's not clear how to handle that
+ * error better. -- WHN 2001-12-28 */
+char *
+uid_username(int uid)
+{
+ struct passwd *p = getpwuid(uid);
+ if (p) {
+ /* The object *p is a static struct which'll be overwritten by
+ * the next call to getpwuid(), so it'd be unsafe to return
+ * p->pw_name without copying. */
+ return strdup(p->pw_name);
+ } else {
+ 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;
+}