blob: 97c779b5575e906cb214c72f4e3b5f7bc1894465 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#ifndef _HACKERS_PARSE_H
#define _HACKERS_PARSE_H
#include <string.h> /* for memset(3) */
#include <stdlib.h> /* for free(3) */
#include <pwd.h> /* for 'struct passwd' */
#define MALLOC(size) REALLOC(NULL, size)
#define REALLOC(ptr, size) \
(__extension__ ({ \
errno = 0; \
void *ret = realloc(ptr, size); \
if (ret == (ptr)) { \
error(0, errno, "could not (re)allocate memory"); \
goto error; \
}; \
ret; \
}))
#define ZERO(var) memset(&(var), 0, sizeof(var))
/* Free+zero a 'struct passwd' */
#define PASSWD_FREE(user) \
(__extension__ ({ \
free((user).pw_name); \
free((user).pw_passwd); \
free((user).pw_gecos); \
free((user).pw_dir); \
free((user).pw_shell); \
ZERO(user); \
(user).pw_uid = UID_INVALID; \
}))
/** Returns 0 on error, or the UID on success. Only handles "normal
* user" UIDs; that is in the range [1000,9999]. */
uid_t filename2uid(const char *filename);
/** Returns 0 on success, < 0 on failure. Sets
userp->pw_passwd. */
int load_user_password(struct passwd *userp);
/** Returns 0 on success, non-zero on failere.
May set userp->pw_uid even on failure. */
int load_user_yaml(const char *filename, struct passwd *userp);
#endif
|