summaryrefslogtreecommitdiffstats
path: root/ebtablesu.c
blob: 234d4f6ca436c4cac05b556586426fb9e600629d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc, char *argv[])
{
	char *arguments, *pos;
	int i, writefd, len = 0;

	if ((writefd = open(EBTD_PIPE, O_WRONLY, 0)) == -1) {
		perror("open");
		return -1;
	}

	if (argc > EBTD_ARGC_MAX) {
		printf("ebtablesd accepts at most %d arguments, %d arguments "
		       "were specified. If you need this many arguments, "
		       "recompile this tool with a higher value for "
		       "EBTD_ARGC_MAX.\n", EBTD_ARGC_MAX - 1, argc - 1);
		return -1;
	} else if (argc == 1) {
		printf("At least one argument is needed.\n");
		return -1;
	}

	for (i = 0; i < argc; i++)
		len += strlen(argv[i]);
	/* Don't forget '\0' */
	len += argc;
	if (len > EBTD_CMDLINE_MAXLN) {
		printf("ebtablesd has a maximum command line argument length "
		       "of %d, an argument length of %d was received. If a "
		       "smaller length is unfeasible, recompile this tool "
		       "with a higher value for EBTD_CMDLINE_MAXLN.\n",
		       EBTD_CMDLINE_MAXLN, len);
		return -1;
	}

	if (!(arguments = (char *)malloc(len))) {
		printf("ebtablesu: out of memory.\n");
		return -1;
	}

	pos = arguments;
	for (i = 0; i < argc; i++) {
		strcpy(pos, argv[i]);
		pos += strlen(argv[i]) + 1;
	}

	*(pos-1) = '\n';
	if (write(writefd, arguments, len) == -1) {
		perror("write");
		return -1;
	}
	return 0;
}