If you're building for an MMU-less system where fork() does not work, you
should add -DTHERE_IS_NO_FORK to your CPPFLAGS.
+This also puts the --no-background flag on and stops the --background flag
+from working.
You can change the default dir with these knobs.
For example, to satisfy FHS compliance you would do this:-
---------
We no longer supply a ChangeLog.
However, you're more than welcome to read the git commit comments at
-http://git.marples.name/?p=dhcpcd/.git;a=summary
+http://git.marples.name/?p=dhcpcd.git;a=summary
return NULL;
}
+#ifdef THERE_IS_NO_FORK
+#define daemonise(a,b) 0
+#else
static int
daemonise(struct if_state *state, const struct options *options)
{
pid_t pid;
sigset_t full;
sigset_t old;
-#ifdef THERE_IS_NO_FORK
- char **argv;
- int i;
-#else
char buf = '\0';
int sidpipe[2];
-#endif
if (state->options & DHCPCD_DAEMONISED ||
!(options->options & DHCPCD_DAEMONISE))
sigfillset(&full);
sigprocmask(SIG_SETMASK, &full, &old);
-#ifndef THERE_IS_NO_FORK
/* Setup a signal pipe so parent knows when to exit. */
if (pipe(sidpipe) == -1) {
logger(LOG_ERR,"pipe: %s", strerror(errno));
close(sidpipe[0]);
break;
}
-#else
- logger(LOG_INFO, "forking to background");
-
- /* We need to add --daemonise to our options */
- argv = xmalloc(sizeof(char *) * (dhcpcd_argc + 4));
- argv[0] = dhcpcd;
- for (i = 1; i < dhcpcd_argc; i++)
- argv[i] = dhcpcd_argv[i];
- argv[i] = (char *)"--daemonised";
- if (dhcpcd_skiproutes) {
- argv[++i] = (char *)"--skiproutes";
- argv[++i] = dhcpcd_skiproutes;
- }
- argv[i + 1] = NULL;
-
- switch (pid = vfork()) {
- case -1:
- logger(LOG_ERR, "vfork: %s", strerror(errno));
- _exit(EXIT_FAILURE);
- case 0:
- signal_reset();
- sigprocmask(SIG_SETMASK, &old, NULL);
- execvp(dhcpcd, argv);
- /* Must not use stdio here. */
- write(STDERR_FILENO, "exec failed\n", 12);
- _exit(EXIT_FAILURE);
- }
-
- free(argv);
-#endif
/* Done with the fd now */
if (pid != 0) {
state->options |= DHCPCD_PERSISTENT | DHCPCD_FORKED;
return -1;
}
+#endif
#define THIRTY_YEARS_IN_SECONDS 946707779
static size_t
dhcp->servername[0] = '\0';
if (!IN_LINKLOCAL(ntohl(dhcp->yiaddr))) {
-#ifndef THERE_IS_NO_FORK
if (!(state->options & DHCPCD_LASTLEASE))
goto eexit;
-#endif
/* Ensure that we can still use the lease */
if (gettimeofday(&tv, NULL) == -1) {
logger(LOG_ERR, "cannot request a link local address");
return -1;
}
-#ifdef THERE_IS_NO_FORK
- if (options->options & DHCPCD_DAEMONISED) {
- iface->addr.s_addr = lease->addr.s_addr;
- iface->net.s_addr = lease->net.s_addr;
- state->new = state->offer;
- state->offer = NULL;
- get_option_addr(&lease->server.s_addr,
- state->new, DHCP_SERVERID);
- open_socket(iface, ETHERTYPE_ARP);
- state->state = STATE_ANNOUNCING;
- state->timeout.tv_sec = ANNOUNCE_INTERVAL;
- }
-#endif
} else {
lease->addr.s_addr = options->request_address.s_addr;
lease->net.s_addr = options->request_netmask.s_addr;
int retval = 0;
char *addr;
-#ifdef THERE_IS_NO_FORK
- char *skipp;
- size_t skiplen;
- int skip = 0;
-
- free(dhcpcd_skiproutes);
- /* We can never have more than 255 routes. So we need space
- * for 255 3 digit numbers and commas */
- skiplen = 255 * 4 + 1;
- skipp = dhcpcd_skiproutes = xmalloc(sizeof(char) * skiplen);
- *skipp = '\0';
-#endif
-
ort = get_option_routes(dhcp);
#ifdef IPV4LL_ALWAYSROUTE
}
#endif
-#ifdef THERE_IS_NO_FORK
- if (dhcpcd_skiproutes) {
- int i = -1;
- char *sk, *skp, *token;
- free_routes(iface->routes);
- for (rt = ort; rt; rt = rt->next) {
- i++;
- /* Check that we did add this route or not */
- sk = skp = xstrdup(dhcpcd_skiproutes);
- while ((token = strsep(&skp, ","))) {
- if (isdigit((unsigned char)*token) &&
- atoi(token) == i)
- break;
- }
- free(sk);
- if (token)
- continue;
- if (nr) {
- rtn->next = xmalloc(sizeof(*rtn));
- rtn = rtn->next;
- } else {
- nr = rtn = xmalloc(sizeof(*rtn));
- }
- rtn->dest.s_addr = rt->dest.s_addr;
- rtn->net.s_addr = rt->net.s_addr;
- rtn->gate.s_addr = rt->gate.s_addr;
- rtn->next = NULL;
- }
- iface->routes = nr;
- nr = NULL;
-
- /* We no longer need this */
- free(dhcpcd_skiproutes);
- dhcpcd_skiproutes = NULL;
- }
-#endif
-
/* Now remove old routes we no longer use.
* We should do this in reverse order. */
iface->routes = reverse_routes(iface->routes);
rtn->gate.s_addr = rt->gate.s_addr;
rtn->next = NULL;
}
-#ifdef THERE_IS_NO_FORK
- /* If we have daemonised yet we need to record which routes
- * we failed to add so we can skip them */
- else if (!(options->options & DHCPCD_DAEMONISED)) {
- /* We can never have more than 255 / 4 routes,
- * so 3 chars is plently */
- printf("foo\n");
- if (*skipp)
- *skipp++ = ',';
- skipp += snprintf(skipp,
- dhcpcd_skiproutes + skiplen - skipp,
- "%d", skip);
- }
- skip++;
-#endif
}
free_routes(ort);
free_routes(iface->routes);
iface->routes = nr;
-
-#ifdef THERE_IS_NO_FORK
- if (dhcpcd_skiproutes) {
- if (*dhcpcd_skiproutes)
- *skipp = '\0';
- else {
- free(dhcpcd_skiproutes);
- dhcpcd_skiproutes = NULL;
- }
- }
-#endif
-
return retval;
}
const char copyright[] = "Copyright (c) 2006-2008 Roy Marples";
#include <sys/file.h>
-#include <sys/stat.h>
#include <sys/types.h>
#include <arpa/inet.h>
{"blacklist", required_argument, NULL, 'X'},
{"help", no_argument, &dohelp, 1},
{"version", no_argument, &doversion, 1},
-#ifdef THERE_IS_NO_FORK
- {"daemonised", no_argument, NULL, 'z'},
- {"skiproutes", required_argument, NULL, 'Z'},
-#endif
#ifdef CMDLINE_COMPAT
{"nohostname", no_argument, NULL, 'H'},
{"nomtu", no_argument, NULL, 'M'},
{NULL, 0, NULL, '\0'}
};
-#ifdef THERE_IS_NO_FORK
-char dhcpcd[PATH_MAX];
-char **dhcpcd_argv = NULL;
-int dhcpcd_argc = 0;
-char *dhcpcd_skiproutes = NULL;
-#define EXTRA_OPTS "zZ:"
-#endif
-
#ifdef CMDLINE_COMPAT
# define EXTRA_OPTS "HMNRSY"
#endif
FILE *f;
char *cf = NULL;
char *intf = NULL;
-#ifdef THERE_IS_NO_FORK
- char argvp[PATH_MAX];
- char *path, *token;
- struct stat sb;
-#endif
closefrom(3);
/* Saves calling fflush(stream) in the logger */
}
#endif
-#ifdef THERE_IS_NO_FORK
- dhcpcd_argv = argv;
- dhcpcd_argc = argc;
- if (*argv[0] == '/' || *argv[0] == '.')
- strncpy(argvp, argv[0], sizeof(argvp));
- else {
- p = path = xstrdup(getenv("PATH"));
- while ((token = strsep(&p, ":"))) {
- snprintf(argvp, sizeof(argvp), "%s/%s", token, argv[0]);
- if (stat(argvp, &sb) == 0)
- break;
- }
- free(path);
- }
- if (!realpath(argvp, dhcpcd)) {
- logger(LOG_ERR, "unable to resolve the path `%s': %s\n",
- argv[0], strerror(errno));
- goto abort;
- }
-#endif
-
gethostname(options->hostname + 1, sizeof(options->hostname));
if (strcmp(options->hostname + 1, "(none)") == 0 ||
strcmp(options->hostname + 1, "localhost") == 0)
break;
case 'f':
break;
-#ifdef THERE_IS_NO_FORK
- case 'z':
- options->options |= DHCPCD_DAEMONISED;
- close_fds();
- break;
- case 'Z':
- dhcpcd_skiproutes = xstrdup(optarg);
- break;
-#endif
case 'k':
sig = SIGHUP;
break;
}
}
+#ifdef THERE_IS_NO_FORK
+ options->options &= ~DHCPCD_DAEMONISE;
+#endif
+
if (options->request_address.s_addr == 0 &&
(options->options & DHCPCD_INFORM ||
options->options & DHCPCD_REQUEST))
}
free(options->blacklist);
free(options);
-
-#ifdef THERE_IS_NO_FORK
- /* There may have been an error before the dhcp_run function
- * clears this, so just do it here to be safe */
- free(dhcpcd_skiproutes);
-#endif
-
exit(retval);
/* NOTREACHED */
}