Simple R5 style pwd function implementation, courtesy of Eli Green.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7332 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-04-27 18:08:20 +00:00
parent caa910df64
commit 86f34490f8
+82 -10
View File
@@ -1,62 +1,134 @@
/* /*
** Copyright 2002, Axel Dörfler, [email protected]. All rights reserved. ** Copyright 2002-2004, Axel Dörfler, [email protected]. All rights reserved.
** Copyright 2004, Eli Green, [email protected]. All rights reserved.
** Distributed under the terms of the OpenBeOS License. ** Distributed under the terms of the OpenBeOS License.
*/ */
/*
** All the functions in this file return the "baron" user.
** baron is uid 0, gid 0. the pw_name field is set to either
** "baron" or the value of the USER environment variable.
**
** This is done to be fully compatible with BeOS R5. /etc/passwd
** is not consulted.
**
** One difference:
** R5's getpwnam always returns NULL, but the implementation in this
** file returns passwd struct for baron if the name argument is set to
** the USER environment variable, or "baron" if USER is unset.
**
** The reentrant versions do not exist under BeOS R5.
*/
#include <pwd.h> #include <pwd.h>
#include <syscalls.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h>
// ToDo: implement pwd stuff for real! static char _pw_first = 1;
static struct passwd _pw_struct;
static char *
get_user_name()
{
char *user = getenv("USER");
if (user != NULL)
return user;
return "baron";
}
static void
getbaron(struct passwd *pw)
{
pw->pw_name = get_user_name();
pw->pw_passwd = "";
pw->pw_uid = 0;
pw->pw_gid = 0;
pw->pw_dir = "/boot/home";
pw->pw_shell = "/bin/sh";
pw->pw_gecos = "system";
}
struct passwd * struct passwd *
getpwent(void) getpwent(void)
{ {
return NULL; if (!_pw_first)
return NULL;
_pw_first = 0;
getbaron(&_pw_struct);
return &_pw_struct;
} }
void void
setpwent(void) setpwent(void)
{ {
_pw_first = 1;
} }
void void
endpwent(void) endpwent(void)
{ {
_pw_first = 1;
} }
struct passwd * struct passwd *
getpwnam(const char *name) getpwnam(const char *name)
{ {
if (!strcmp(name, get_user_name())) {
getbaron(&_pw_struct);
return &_pw_struct;
}
return NULL; return NULL;
} }
int int
getpwnam_r(const char *name, struct passwd *passwd, char *buffer, getpwnam_r(const char *name, struct passwd *passwd, char *buffer,
size_t bufferSize, struct passwd **result) size_t bufferSize, struct passwd **_result)
{ {
return -1; if (strcmp(name, get_user_name())) {
*_result = NULL;
return 0;
}
getbaron(passwd);
*_result = passwd;
return 0;
} }
struct passwd * struct passwd *
getpwuid(uid_t uid) getpwuid(uid_t uid)
{ {
return NULL; if (uid != 0)
return NULL;
getbaron(&_pw_struct);
return &_pw_struct;
} }
int int
getpwuid_r(uid_t uid, struct passwd *passwd, char *buffer, getpwuid_r(uid_t uid, struct passwd *passwd, char *buffer,
size_t bufferSize, struct passwd **result) size_t bufferSize, struct passwd **_result)
{ {
return -1; if (uid != 0) {
*_result = NULL;
return 0;
}
getbaron(passwd);
*_result = passwd;
return 0;
} }