File: ipx_configure.c

package info (click to toggle)
ipx 1.0-5
  • links: PTS
  • area: main
  • in suites: potato
  • size: 148 kB
  • ctags: 55
  • sloc: ansic: 1,054; sh: 76; makefile: 72
file content (134 lines) | stat: -rw-r--r-- 2,579 bytes parent folder | download
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*  Copyright (c) 1995-1996 Caldera, Inc.  All Rights Reserved.
 *
 *  See file COPYING for details.
 */

#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include <getopt.h>
#include <strings.h>
#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 0)
#include <netipx/ipx.h>
#else
#include <linux/ipx.h>
#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>

struct option	options[] = {
	{ "auto_primary", required_argument, NULL, 1 },
	{ "auto_interface", required_argument, NULL, 2 },
	{ "help", no_argument, NULL, 3},
	{ NULL, 0, NULL, 0 }
};

char	*progname;

void
usage(void)
{
	fprintf(stderr, 
	"Usage: %s --auto_primary=[on|off]\n\
Usage: %s --auto_interface=[on|off]\n\
Usage: %s --help\n\
Usage: %s\n", progname, progname, progname, progname);
}

int
map_string_to_bool(char *optarg)
{
	if ((strcasecmp(optarg, "ON") == 0) ||
			(strcasecmp(optarg, "TRUE") == 0) || 
			(strcasecmp(optarg, "SET") == 0) ||
			(strcasecmp(optarg, "YES") == 0)) {
		return 1;
	} else if ((strcasecmp(optarg, "OFF") == 0) ||
			(strcasecmp(optarg, "FALSE") == 0) || 
			(strcasecmp(optarg, "CLEAR") == 0) ||
			(strcasecmp(optarg, "NO") == 0)) {
		return 0;
	} 

	return -1;
}

int
main(int argc, char **argv)
{
	int	s;
	int	result;
	char	errmsg[80];
	char	val;
	int	option_index = 0;
	int	got_auto_pri = 0;
	int	got_auto_itf = 0;
	ipx_config_data	data;

	progname = argv[0];
	
	s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
	if (s < 0) {
		sprintf(errmsg, "%s: socket", progname);
		perror(errmsg);
		exit(-1);
	}

	sprintf(errmsg, "%s: ioctl", progname);
	while ((result = getopt_long(argc, argv, "", options, 
			&option_index)) != -1) {
		switch (result) {
		case 1: 
			if (got_auto_pri)
				break;
			got_auto_pri++;
				
			val = map_string_to_bool(optarg);
			if (val < 0) {
				usage();
				exit(-1);
			}

			result = ioctl(s, SIOCAIPXPRISLT, &val);
			if (result < 0) {
				perror(errmsg);
				exit(-1);
			}
			break;
		case 2:
			if (got_auto_itf) 
				break;
			got_auto_itf++;

			val = map_string_to_bool(optarg);
			if (val < 0) {
				usage();
				exit(-1);
			}

			result = ioctl(s, SIOCAIPXITFCRT, &val);
			if (result < 0) {
				perror(errmsg);
				exit(-1);
			}
			break;
		case 3:
			usage();
			break;
		}
	}
	result = ioctl(s, SIOCIPXCFGDATA, &data);
	if (result < 0) {
		perror(errmsg);
		exit(-1);
	}
	if (argc == 1) {
		fprintf(stdout, "Auto Primary Select is %s\n\
Auto Interface Create is %s\n", 
			(data.ipxcfg_auto_select_primary) ? "ON" : "OFF",
			(data.ipxcfg_auto_create_interfaces) ? "ON" : "OFF");
	}
	exit(0);
}