Add a -C, --nohook option to skip the running of hook scripts. Makes it easier to just not do any configuring of resolv.conf

This commit is contained in:
Roy Marples 2008-05-20 16:05:15 +00:00
parent 5f81be76fc
commit 37156a6b53
7 changed files with 97 additions and 3 deletions

View File

@ -98,6 +98,19 @@ exec_script(const struct options *options, const char *iface,
elen += configure_env(env + elen, "new", dhcpn, options); elen += configure_env(env + elen, "new", dhcpn, options);
} }
} }
/* Add our base environment */
if (options->environ) {
e = 0;
while (options->environ[e++])
;
env = xrealloc(env, sizeof(char *) * (elen + e + 1));
e = 0;
while (options->environ[e]) {
env[elen + e] = xstrdup(options->environ[e]);
e++;
}
elen += e;
}
env[elen] = '\0'; env[elen] = '\0';
/* OK, we need to block signals */ /* OK, we need to block signals */

View File

@ -266,6 +266,13 @@ Here are some option that deal with turning these bits off.
Don't request or claim the address by ARP. Don't request or claim the address by ARP.
.It Fl G , -nogateway .It Fl G , -nogateway
Don't set any default routes. Don't set any default routes.
.It Ic nohook Ar script
Don't run this hook script.
Matches full name, or prefixed with 2 numbers optionally ending with .sh.
Example for not running the hook script to configure
.Pa /etc/resolv.conf :-
.Nm
-C resolv.conf
.It Fl L , -noipv4ll .It Fl L , -noipv4ll
Don't use IPv4LL at all. Don't use IPv4LL at all.
.It Fl O , -nooption Ar option .It Fl O , -nooption Ar option

View File

@ -51,7 +51,7 @@ const char copyright[] = "Copyright (c) 2006-2008 Roy Marples";
/* Don't set any optional arguments here so we retain POSIX /* Don't set any optional arguments here so we retain POSIX
* compatibility with getopt */ * compatibility with getopt */
#define OPTS "c:df:h:i:kl:m:no:pr:s:t:u:xADEF:GI:LO:TV" #define OPTS "c:df:h:i:kl:m:no:pr:s:t:u:xAC:DEF:GI:LO:TV"
static int doversion = 0; static int doversion = 0;
static int dohelp = 0; static int dohelp = 0;
@ -73,6 +73,7 @@ static const struct option longopts[] = {
{"userclass", required_argument, NULL, 'u'}, {"userclass", required_argument, NULL, 'u'},
{"exit", no_argument, NULL, 'x'}, {"exit", no_argument, NULL, 'x'},
{"noarp", no_argument, NULL, 'A'}, {"noarp", no_argument, NULL, 'A'},
{"nohook", required_argument, NULL, 'C'},
{"duid", no_argument, NULL, 'D'}, {"duid", no_argument, NULL, 'D'},
{"lastlease", no_argument, NULL, 'E'}, {"lastlease", no_argument, NULL, 'E'},
{"fqdn", optional_argument, NULL, 'F'}, {"fqdn", optional_argument, NULL, 'F'},
@ -156,7 +157,48 @@ usage(void)
printf("usage: "PACKAGE" [-dknpxADEGHLOSTV] [-c script] [-f file ] [-h hostname]\n" printf("usage: "PACKAGE" [-dknpxADEGHLOSTV] [-c script] [-f file ] [-h hostname]\n"
" [-i classID ] [-l leasetime] [-m metric] [-o option] [-r ipaddr]\n" " [-i classID ] [-l leasetime] [-m metric] [-o option] [-r ipaddr]\n"
" [-s ipaddr] [-t timeout] [-u userclass] [-F none|ptr|both]\n" " [-s ipaddr] [-t timeout] [-u userclass] [-F none|ptr|both]\n"
" [-I clientID] <interface>\n"); " [-I clientID] [-C hookscript] <interface>\n");
}
static char *
add_environ(struct options *options, const char *value, int uniq)
{
char **newlist;
char **lst = options->environ;
size_t i = 0, l, lv;
char *match = NULL, *p;
match = xstrdup(value);
p = strchr(match, '=');
if (p)
*p++ = '\0';
l = strlen(match);
while (lst && lst[i]) {
if (match && strncmp(lst[i], match, l) == 0) {
if (uniq) {
free(lst[i]);
lst[i] = xstrdup(value);
} else {
/* Append a space and the value to it */
l = strlen(lst[i]);
lv = strlen(p);
lst[i] = xrealloc(lst[i], l + lv + 2);
lst[i][l] = ' ';
memcpy(lst[i] + l + 1, p, lv);
lst[i][l + lv + 2] = '\0';
}
free(match);
return lst[i];
}
i++;
}
newlist = xrealloc(lst, sizeof(char *) * (i + 2));
newlist[i] = xstrdup(value);
newlist[i + 1] = NULL;
options->environ = newlist;
return (newlist[i]);
} }
static int static int
@ -166,6 +208,7 @@ parse_option(int opt, char *oarg, struct options *options)
int i; int i;
int j; int j;
char *p; char *p;
size_t s;
switch(opt) { switch(opt) {
case 'h': case 'h':
@ -282,6 +325,16 @@ parse_option(int opt, char *oarg, struct options *options)
/* IPv4LL requires ARP */ /* IPv4LL requires ARP */
options->options &= ~DHCPCD_IPV4LL; options->options &= ~DHCPCD_IPV4LL;
break; break;
case 'C':
/* Commas to spaces for shell */
while ((p = strchr(oarg, ',')))
*p = ' ';
s = strlen("skip_hooks=") + strlen(oarg) + 1;
p = xmalloc(sizeof(char) * s);
snprintf(p, s, "skip_hooks=%s", oarg);
add_environ(options, p, 0);
free(p);
break;
case 'D': case 'D':
options->options |= DHCPCD_DUID; options->options |= DHCPCD_DUID;
break; break;
@ -784,6 +837,12 @@ abort:
close(pidfd); close(pidfd);
unlink(options->pidfile); unlink(options->pidfile);
} }
if (options->environ) {
len = 0;
while (options->environ[len])
free(options->environ[len++]);
free(options->environ);
}
free(options); free(options);
#ifdef THERE_IS_NO_FORK #ifdef THERE_IS_NO_FORK

View File

@ -86,6 +86,13 @@ Don't send any ARP requests.
This also disables IPv4LL. This also disables IPv4LL.
.It Ic nogateway .It Ic nogateway
Don't install any default routes. Don't install any default routes.
.It Ic nohook Ar script
Don't run this hook script.
Matches full name, or prefixed with 2 numbers optionally ending with .sh.
Example for not running the hook script to configure
.Pa /etc/resolv.conf :-
.Nm dhcpcd
-C resolv.conf
.It Ic noipv4ll .It Ic noipv4ll
Don't attempt to obtain an IPv4LL address if we failed to get one via DHCP. Don't attempt to obtain an IPv4LL address if we failed to get one via DHCP.
See See

View File

@ -87,6 +87,7 @@ struct options {
struct in_addr request_address; struct in_addr request_address;
struct in_addr request_netmask; struct in_addr request_netmask;
char **environ;
const char *script; const char *script;
char pidfile[PATH_MAX]; char pidfile[PATH_MAX];
}; };

View File

@ -25,6 +25,13 @@ for hook in \
@SYSCONFDIR@/dhcpcd.hook \ @SYSCONFDIR@/dhcpcd.hook \
@HOOKDIR@/* @HOOKDIR@/*
do do
for skip in ${skip_hooks}; do
case "${hook}" in
"${skip}") continue 2;;
*/[0-9][0-9]"-${skip}") continue 2;;
*/[0-9][0-9]"-${skip}.sh") continue 2;;
esac
done
if [ -f "${hook}" ]; then if [ -f "${hook}" ]; then
. "${hook}" . "${hook}"
fi fi

View File

@ -1,6 +1,6 @@
# Just echo our DHCP options we have # Just echo our DHCP options we have
if [ "${reason}" = "TEST" ]; then if [ "${reason}" = "TEST" ]; then
env | grep "^\(interface\|pid\|reason\)=" env | grep "^\(interface\|pid\|reason\|skip_hooks\)="
env | grep "^\(new_\|old_\)" | sort env | grep "^\(new_\|old_\)" | sort
fi fi