CMSG_SPACE(sizeof(int)))
#endif
+struct passwd;
+
struct dhcpcd_ctx {
char pidfile[sizeof(PIDFILE) + IF_NAMESIZE + 1];
int fork_fd; /* FD for the fork init signal pipe */
char *randomstate; /* original state */
#ifdef PRIVSEP
- char *ps_user; /* Username to drop privs to */
+ struct passwd *ps_user; /* struct passwd for privsep user */
pid_t ps_root_pid;
int ps_root_fd; /* Privileged Actioneer commands */
int ps_data_fd; /* Data from root spawned processes */
}
static ssize_t
-ps_root_docopy(const char *dir, const char *file)
+ps_root_docopy(struct dhcpcd_ctx *ctx, const char *file)
{
char path[PATH_MAX], buf[BUFSIZ], *slash;
struct timeval ts[2];
#endif
- if (snprintf(path, sizeof(path), "%s/%s", dir, file) == -1)
+ if (snprintf(path, sizeof(path), "%s/%s",
+ ctx->ps_user->pw_dir, file) == -1)
return -1;
if (stat(file, &from_sb) == -1)
return -1;
}
static ssize_t
-ps_root_docopy1(const char *file)
-{
- struct passwd *pw;
-
- errno = 0;
- if ((pw = getpwnam(PRIVSEP_USER)) == NULL) {
- if (errno == 0)
- errno = ENOENT;
- return -1;
- }
-
- return ps_root_docopy(pw->pw_dir, file);
-}
-
-static ssize_t
-ps_root_dofileop(void *data, size_t len, uint8_t op)
+ps_root_dofileop(struct dhcpcd_ctx *ctx, void *data, size_t len, uint8_t op)
{
char *path = data;
size_t plen;
switch(op) {
case PS_COPY:
- return ps_root_docopy1(path);
+ return ps_root_docopy(ctx, path);
case PS_UNLINK:
return (ssize_t)unlink(path);
default:
break;
case PS_COPY: /* FALLTHROUGH */
case PS_UNLINK:
- err = ps_root_dofileop(data, len, psm->ps_cmd);
+ err = ps_root_dofileop(ctx, data, len, psm->ps_cmd);
break;
default:
err = ps_root_os(psm, msg);
int
ps_init(struct dhcpcd_ctx *ctx)
{
- struct passwd *pw;
char path[PATH_MAX];
+ struct passwd *pw = ctx->ps_user;
errno = 0;
- if ((pw = getpwnam(PRIVSEP_USER)) == NULL) {
+ if ((ctx->ps_user = pw = getpwnam(PRIVSEP_USER)) == NULL) {
ctx->options &= ~DHCPCD_PRIVSEP;
if (errno == 0) {
logerrx("no such user %s", PRIVSEP_USER);
int
ps_dropprivs(struct dhcpcd_ctx *ctx)
{
- struct passwd *pw;
-
- if ((pw = getpwnam(PRIVSEP_USER)) == NULL) {
- if (errno == 0)
- logerrx("no such user %s", PRIVSEP_USER);
- else
- logerr("getpwnam");
- return -1;
- }
+ struct passwd *pw = ctx->ps_user;
if (!(ctx->options & DHCPCD_FORKED))
logdebugx("chrooting to `%s'", pw->pw_dir);