Implement getpwuid_r
This commit is contained in:
28
fakeid.c
28
fakeid.c
@@ -38,6 +38,9 @@ struct passwd *getpwuid(uid_t uid) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
struct passwd *pass = getpwuid(uid);
|
struct passwd *pass = getpwuid(uid);
|
||||||
|
if (pass == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
char *name = getenv("USER");
|
char *name = getenv("USER");
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
fprintf(stderr, "Could not find the USER environment variable. Using the real username.\n");
|
fprintf(stderr, "Could not find the USER environment variable. Using the real username.\n");
|
||||||
@@ -46,3 +49,28 @@ struct passwd *getpwuid(uid_t uid) {
|
|||||||
pass->pw_name = name;
|
pass->pw_name = name;
|
||||||
return pass;
|
return pass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getpwuid_r(uid_t uid, struct passwd *pw, char *buf, size_t size, struct passwd **res) {
|
||||||
|
int prev_err = errno;
|
||||||
|
*res = NULL;
|
||||||
|
struct passwd *pass = getpwuid(uid);
|
||||||
|
if (pass == NULL || errno != prev_err) {
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
memcpy(pw, pass, sizeof(struct passwd));
|
||||||
|
size_t name_len = strlen(pass->pw_name) + 1;
|
||||||
|
size_t passwd_len = strlen(pass->pw_passwd) + 1;
|
||||||
|
size_t gecos_len = strlen(pass->pw_gecos) + 1;
|
||||||
|
size_t dir_len = strlen(pass->pw_dir) + 1;
|
||||||
|
size_t shell_len = strlen(pass->pw_shell) + 1;
|
||||||
|
if ((name_len + passwd_len + gecos_len + dir_len + shell_len) > size) {
|
||||||
|
return ERANGE;
|
||||||
|
}
|
||||||
|
pw->pw_name = memcpy(buf, pass->pw_name, name_len);
|
||||||
|
pw->pw_passwd = memcpy(buf + name_len, pass->pw_passwd, passwd_len);
|
||||||
|
pw->pw_gecos = memcpy(buf + name_len + passwd_len, pass->pw_gecos, gecos_len);
|
||||||
|
pw->pw_dir = memcpy(buf + name_len + passwd_len + gecos_len, pass->pw_dir, dir_len);
|
||||||
|
pw->pw_shell = memcpy(buf + name_len + passwd_len + gecos_len + dir_len, pass->pw_shell, shell_len);
|
||||||
|
*res = pw;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user