From be8f73c399c0f89192e57453db153aaa48fcbb2e Mon Sep 17 00:00:00 2001 From: Pavel Zhukov Date: Thu, 21 Feb 2019 10:21:14 +0100 Subject: [PATCH 03/28] Handle releasing interfaces requested by /sbin/ifup --- client/dhclient.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/client/dhclient.c b/client/dhclient.c index 6c1c09a..07679a7 100644 --- a/client/dhclient.c +++ b/client/dhclient.c @@ -793,9 +793,81 @@ main(int argc, char **argv) { } } fclose(pidfd); + } else { + /* handle release for interfaces requested with Red Hat + * /sbin/ifup - pidfile will be /var/run/dhclient-$interface.pid + */ + + if ((path_dhclient_pid == NULL) || (*path_dhclient_pid == '\0')) + path_dhclient_pid = "/var/run/dhclient.pid"; + + char *new_path_dhclient_pid; + struct interface_info *ip; + int pdp_len = strlen(path_dhclient_pid), pfx, dpfx; + + /* find append point: beginning of any trailing '.pid' + * or '-$IF.pid' */ + for (pfx=pdp_len; (pfx >= 0) && (path_dhclient_pid[pfx] != '.') && (path_dhclient_pid[pfx] != '/'); pfx--); + if (pfx == -1) + pfx = pdp_len; + + if (path_dhclient_pid[pfx] == '/') + pfx += 1; + + for (dpfx=pfx; (dpfx >= 0) && (path_dhclient_pid[dpfx] != '-') && (path_dhclient_pid[dpfx] != '/'); dpfx--); + if ((dpfx > -1) && (path_dhclient_pid[dpfx] != '/')) + pfx = dpfx; + + for (ip = interfaces; ip; ip = ip->next) { + if (interfaces_requested && (ip->flags & (INTERFACE_REQUESTED))) { + int n_len = strlen(ip->name); + + new_path_dhclient_pid = (char*) malloc(pfx + n_len + 6); + strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx); + sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name); + + if ((pidfd = fopen(new_path_dhclient_pid, "r")) != NULL) { + e = fscanf(pidfd, "%ld\n", &temp); + oldpid = (pid_t)temp; + + if (e != 0 && e != EOF) { + if (oldpid) { + if (kill(oldpid, SIGTERM) == 0) + unlink(path_dhclient_pid); + } + } + + fclose(pidfd); + } + + free(new_path_dhclient_pid); + } + } + } + } else { + FILE *pidfp = NULL; + long temp = 0; + pid_t dhcpid = 0; + int dhc_running = 0; + char procfn[256] = ""; + + if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) { + if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) { + snprintf(procfn,256,"/proc/%u",dhcpid); + dhc_running = (access(procfn, F_OK) == 0); + } + + fclose(pidfp); + } + + if (dhc_running) { + log_fatal("dhclient(%u) is already running - exiting. ", dhcpid); + return(1); } } + write_client_pid_file(); + if (!quiet) { log_info("%s %s", message, PACKAGE_VERSION); log_info(copyright); -- 2.35.1