Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
Arquivo: if.c Projeto: yellowman/nsh
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], &notused)) {
		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);
}