Merge snmp stuff into mirror.git
[dtbartle/mirror.git] / snmp / csc-snmp-subagent.c
1 /* generated from net-snmp-config */
2 #include <net-snmp/net-snmp-config.h>
3 #ifdef HAVE_SIGNAL
4 #include <signal.h>
5 #endif /* HAVE_SIGNAL */
6 #include <net-snmp/net-snmp-includes.h>
7 #include <net-snmp/agent/net-snmp-agent-includes.h>
8   #include "mirror-mib.h"
9 const char *app_name = "cscMIB";
10
11 extern int netsnmp_running;
12
13 #ifdef __GNUC__
14 #define UNUSED __attribute__((unused))
15 #else
16 #define UNUSED
17 #endif
18
19 RETSIGTYPE
20 stop_server(UNUSED int a) {
21     netsnmp_running = 0;
22 }
23
24 static void
25 usage(const char *prog)
26 {
27     fprintf(stderr,
28             "USAGE: %s [OPTIONS]\n"
29             "\n"
30             "OPTIONS:\n", prog);
31
32     fprintf(stderr,
33             "  -d\t\t\tdump all traffic\n"
34             "  -D TOKEN[,...]\tturn on debugging output for the specified "
35             "TOKENs\n"
36             "\t\t\t   (ALL gives extremely verbose debugging output)\n"
37             "  -f\t\t\tDo not fork() from the calling shell.\n"
38             "  -h\t\t\tdisplay this help message\n"
39             "  -H\t\t\tdisplay a list of configuration file directives\n"
40             "  -L LOGOPTS\t\tToggle various defaults controlling logging:\n");
41     snmp_log_options_usage("\t\t\t  ", stderr);
42 #ifndef DISABLE_MIB_LOADING
43     fprintf(stderr,
44             "  -m MIB[:...]\t\tload given list of MIBs (ALL loads "
45             "everything)\n"
46             "  -M DIR[:...]\t\tlook in given list of directories for MIBs\n");
47 #endif /* DISABLE_MIB_LOADING */
48 #ifndef DISABLE_MIB_LOADING
49     fprintf(stderr,
50             "  -P MIBOPTS\t\tToggle various defaults controlling mib "
51             "parsing:\n");
52     snmp_mib_toggle_options_usage("\t\t\t  ", stderr);
53 #endif /* DISABLE_MIB_LOADING */
54     fprintf(stderr,
55             "  -v\t\t\tdisplay package version number\n"
56             "  -x TRANSPORT\tconnect to master agent using TRANSPORT\n");
57     exit(1);
58 }
59
60 static void
61 version(void)
62 {
63     fprintf(stderr, "NET-SNMP version: %s\n", netsnmp_get_version());
64     exit(0);
65 }
66
67 int
68 main (int argc, char **argv)
69 {
70   int arg;
71   char* cp = NULL;
72   int dont_fork = 0, do_help = 0;
73
74   while ((arg = getopt(argc, argv, "dD:fhHL:"
75 #ifndef DISABLE_MIB_LOADING
76                        "m:M:"
77 #endif /* DISABLE_MIB_LOADING */
78                        "n:"
79 #ifndef DISABLE_MIB_LOADING
80                        "P:"
81 #endif /* DISABLE_MIB_LOADING */
82                        "vx:")) != EOF) {
83     switch (arg) {
84     case 'd':
85       netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,
86                              NETSNMP_DS_LIB_DUMP_PACKET, 1);
87       break;
88
89     case 'D':
90       debug_register_tokens(optarg);
91       snmp_set_do_debugging(1);
92       break;
93
94     case 'f':
95       dont_fork = 1;
96       break;
97
98     case 'h':
99       usage(argv[0]);
100       break;
101
102     case 'H':
103       do_help = 1;
104       break;
105
106     case 'L':
107       if (snmp_log_options(optarg, argc, argv) < 0) {
108         exit(1);
109       }
110       break;
111
112 #ifndef DISABLE_MIB_LOADING
113     case 'm':
114       if (optarg != NULL) {
115         setenv("MIBS", optarg, 1);
116       } else {
117         usage(argv[0]);
118       }
119       break;
120
121     case 'M':
122       if (optarg != NULL) {
123         setenv("MIBDIRS", optarg, 1);
124       } else {
125         usage(argv[0]);
126       }
127       break;
128 #endif /* DISABLE_MIB_LOADING */
129
130     case 'n':
131       if (optarg != NULL) {
132         app_name = optarg;
133         netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID,
134                               NETSNMP_DS_LIB_APPTYPE, app_name);
135       } else {
136         usage(argv[0]);
137       }
138       break;
139
140 #ifndef DISABLE_MIB_LOADING
141     case 'P':
142       cp = snmp_mib_toggle_options(optarg);
143       if (cp != NULL) {
144         fprintf(stderr, "Unknown parser option to -P: %c.\n", *cp);
145         usage(argv[0]);
146       }
147       break;
148 #endif /* DISABLE_MIB_LOADING */
149
150     case 'v':
151       version();
152       break;
153
154     case 'x':
155       if (optarg != NULL) {
156         netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
157                               NETSNMP_DS_AGENT_X_SOCKET, optarg);
158       } else {
159         usage(argv[0]);
160       }
161       break;
162
163     default:
164       fprintf(stderr, "invalid option: -%c\n", arg);
165       usage(argv[0]);
166       break;
167     }
168   }
169
170   if (do_help) {
171     netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
172                            NETSNMP_DS_AGENT_NO_ROOT_ACCESS, 1);
173   } else {
174     /* we are a subagent */
175     netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
176                            NETSNMP_DS_AGENT_ROLE, 1);
177
178     if (!dont_fork) {
179       if (netsnmp_daemonize(1, snmp_stderrlog_status()) != 0)
180         exit(1);
181     }
182
183     /* initialize tcpip, if necessary */
184     SOCK_STARTUP;
185   }
186
187   /* initialize the agent library */
188   init_agent(app_name);
189
190   /* initialize your mib code here */
191   init_mirror_mib();
192
193   /* cscMIB will be used to read cscMIB.conf files. */
194   init_snmp("cscMIB");
195
196   if (do_help) {
197     fprintf(stderr, "Configuration directives understood:\n");
198     read_config_print_usage("  ");
199     exit(0);
200   }
201
202   /* In case we received a request to stop (kill -TERM or kill -INT) */
203   netsnmp_running = 1;
204 #ifdef SIGTERM
205   signal(SIGTERM, stop_server);
206 #endif
207 #ifdef SIGINT
208   signal(SIGINT, stop_server);
209 #endif
210
211   /* main loop here... */
212   while(netsnmp_running) {
213     agent_check_and_process(1);
214   }
215
216   /* at shutdown time */
217   snmp_shutdown(app_name);
218   SOCK_CLEANUP;
219   exit(0);
220 }
221