]> git.pld-linux.org Git - packages/dhcp.git/blob - dhcp-release-by-ifup.patch
- patch no-ipv6 - don't require ipv6 support in kernel
[packages/dhcp.git] / dhcp-release-by-ifup.patch
1 --- dhcp-3.0.5/client/dhclient.c.release        2007-03-30 15:30:14.000000000 -0400
2 +++ dhcp-3.0.5/client/dhclient.c        2007-03-30 15:29:58.000000000 -0400
3 @@ -366,9 +366,81 @@
4                                 }
5                         }
6                         fclose(pidfd);
7 +               } else {
8 +                       /* handle release for interfaces requested with Red Hat
9 +                        * /sbin/ifup - pidfile will be /var/run/dhclient-$interface.pid 
10 +                        */
11 +
12 +                       if ((path_dhclient_pid == NULL) || (*path_dhclient_pid == '\0'))
13 +                               path_dhclient_pid = "/var/run/dhclient.pid";
14 +
15 +                       char *new_path_dhclient_pid;
16 +                       struct interface_info *ip;
17 +                       int pdp_len = strlen(path_dhclient_pid), pfx, dpfx;
18 +
19 +                       /* find append point: beginning of any trailing '.pid'
20 +                        * or '-$IF.pid' */
21 +                       for (pfx=pdp_len; (pfx >= 0) && (path_dhclient_pid[pfx] != '.') && (path_dhclient_pid[pfx] != '/'); pfx--);
22 +                               if (pfx == -1)
23 +                                       pfx = pdp_len;
24 +
25 +                       if (path_dhclient_pid[pfx] == '/')
26 +                               pfx += 1;
27 +
28 +                       for (dpfx=pfx; (dpfx >= 0) && (path_dhclient_pid[dpfx] != '-') && (path_dhclient_pid[dpfx] != '/'); dpfx--);
29 +                               if ((dpfx > -1) && (path_dhclient_pid[dpfx] != '/'))
30 +                                       pfx = dpfx;                 
31 +
32 +                       for (ip = interfaces; ip; ip = ip->next) {
33 +                               if (interfaces_requested && (ip->flags & (INTERFACE_REQUESTED)) && (ip->name != NULL)) {
34 +                                       int n_len = strlen(ip->name);
35 +
36 +                                       new_path_dhclient_pid = (char*) malloc(pfx + n_len + 6);
37 +                                       strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx);
38 +                                       sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name);
39 +
40 +                                       if ((pidfd = fopen(new_path_dhclient_pid, "r")) != NULL) {
41 +                                               e = fscanf(pidfd, "%ld\n", &temp);
42 +                                               oldpid = (pid_t)temp;
43 +
44 +                                               if (e != 0 && e != EOF) {
45 +                                                       if (oldpid) {
46 +                                                               if (kill(oldpid, SIGTERM) == 0)
47 +                                                                       unlink(path_dhclient_pid);
48 +                                                       }
49 +                                               }
50 +
51 +                                               fclose(pidfd);
52 +                                       }
53 +
54 +                                       free(new_path_dhclient_pid);
55 +                               }
56 +                       }
57 +               }
58 +       } else {
59 +               FILE *pidfp = NULL;
60 +               long temp = 0;
61 +               pid_t dhcpid = 0;
62 +               int dhc_running = 0;
63 +               char procfn[256] = "";
64 +
65 +               if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
66 +                       if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) {
67 +                               snprintf(procfn,256,"/proc/%u",dhcpid);
68 +                               dhc_running = (access(procfn, F_OK) == 0);          
69 +                       }
70 +
71 +                       fclose(pidfp);
72 +               }
73 +
74 +               if (dhc_running) {
75 +                       log_fatal("dhclient(%u) is already running - exiting. ", dhcpid);
76 +                       return(1);
77                 }
78         }
79  
80 +       write_client_pid_file();
81 +
82         if (!quiet) {
83                 log_info ("%s %s", message, DHCP_VERSION);
84                 log_info (copyright);
This page took 0.030963 seconds and 3 git commands to generate.