int intdhcrelay(char *ifname, int ifs, int argc, char **argv) { char *cmd[] = { DHCRELAY, "-i", ifname, NULL, '\0' }; char fname[SIZE_CONF_TEMP]; int set; if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; argc--; argv++; if ((!set && argc > 1) || (set && argc != 1)) { printf("%% dhcrelay <relayserver>\n"); printf("%% no dhcrelay [relayserver]\n"); return(0); } cmd[3] = argv[0]; snprintf(fname, sizeof(fname), "/var/run/dhcrelay.%s", ifname); if (set) { flag_x(fname, X_ENABLE, argv[0]); cmdargs(DHCRELAY, cmd); } else { char server[24], argue[SIZE_CONF_TEMP]; char *killcmd[] = { PKILL, "-xf", NULL, '\0' }; if (conf_dhcrelay(ifname, server, sizeof(server)) == NULL) { if (errno == ENOENT) printf("%% No relay configured for %s\n", ifname); else printf("%% int_dhcrelay: conf_dhcrelay failed: %s\n", strerror(errno)); return(0); } /* if dhcrelay not relaying to specified dhcp server, bail out */ if (argc && strcmp(server, argv[0]) != 0) { printf("%% Server expected: %s (not %s)\n", server, argv[0]); return(0); } /* delete .enabled file */ flag_x(fname, X_DISABLE, NULL); /* setup argument list as one argument for pkill -xf */ snprintf(argue, sizeof(argue), "%s %s %s %s", cmd[0], cmd[1], cmd[2], server); killcmd[2] = argue; cmdargs(PKILL, killcmd); } return(0); }
int intdhcrelay(char *ifname, int ifs, int argc, char **argv) { char *cmd[] = { DHCRELAY, "-i", ifname, NULL, '\0' }; int set, alen; struct in_addr notused; if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; argc--; argv++; if ((!set && argc > 1) || (set && argc != 1)) { printf("%% dhcrelay <relayserver>\n"); printf("%% no dhcrelay [relayserver]\n"); return(0); } if (inet_pton(AF_INET, argv[0], ¬used)) { cmd[3] = argv[0]; } else { printf("%% Not a valid IPv4 address: %s\n", argv[0]); return 0; } if (set) { flag_x("dhcrelay", ifname, DB_X_ENABLE, argv[0]); cmdargs(DHCRELAY, cmd); } else { char server[24], argue[SIZE_CONF_TEMP]; char *killcmd[] = { PKILL, "-xf", NULL, '\0' }; if ((alen = conf_dhcrelay(ifname, server, sizeof(server))) < 1) { if (alen == 0) printf("%% No relay configured for %s\n", ifname); else printf("%% int_dhcrelay: conf_dhcrelay failed:" " %d\n", alen); return(0); } /* bail if dhcrelay not relaying to specified dhcp server */ if (argc && strcmp(server, argv[0]) != 0) { printf("%% Server expected: %s (not %s)\n", server, argv[0]); return(0); } flag_x("dhcrelay", ifname, DB_X_REMOVE, NULL); /* setup argument list as one argument for pkill -xf */ snprintf(argue, sizeof(argue), "%s %s %s %s", cmd[0], cmd[1], cmd[2], server); killcmd[3] = argue; cmdargs(PKILL, killcmd); } return(0); }