/* * $Id: main.c,v 1.9 2002/10/17 20:16:14 ljb Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include /* Global config file information struct * (See read_conf.c) */ config_info_t ci; trace_t *default_trace; FILE *fin; /*, *dfile = stderr;*/ /* JW take out FILE *tmp; */ int main(int argc, char *argv[]) { char *name = argv[0], *config_fname = "/usr/local/etc/irrd.conf"; char *file_name = NULL; char *web_origin_str = NULL; int errors, c /*, JW take out ret_code, ack_lock*/; int NULL_NOTIFICATIONS, DAEMON_FLAG, RPS_DIST_FLAG; /* JW take out FILE *trans_fp = NULL; int lock_fp; */ extern int optind; src_t sstart; source_t *obj; char *usage = "Usage: %s [options] [filename]\n -v verbose logging, turn on debugging\n -c (default 'foo')\n -E DB admin address for new maintainer requests\n -f (default '/usr/local/etc/irrd.conf')\n -h (default 'localhost')\n -l (default 'irrd_directory')\n -p (default 43)\n -r (default is ~/.pgp)\n -s source is authoritative\n The file is chosen by irr_submit\n -R RPS Dist mode\n -D Inetd mode, read/write to STDIN/STDOUT\n -x do not send notifications\n The '-x' flag will cause updates to be sent to IRRd only.\n The default is to send all notifications.\n\n Command line options will override irrd.conf options.\n -F \" enclosed response footer string.\n -O \" enclosed host/IP web origin string.\n"; /* Initialization */ default_trace = New_Trace2 ("irr_rpsl_submit"); errors = NULL_NOTIFICATIONS = DAEMON_FLAG = RPS_DIST_FLAG = 0; sstart.first = sstart.last = NULL; memset (&ci, 0, sizeof (config_info_t)); /* Loop and process the command line flags */ while ((c = getopt (argc, argv, "vc:RDxtf:p:h:l:r:s:E:F:O:")) != -1) switch (c) { case 'c': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing encrypted password for -c option\n", optarg); errors++; } else ci.super_passwd = optarg; break; case 'E': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing email address for -E option\n", optarg); errors++; } else ci.db_admin = optarg; break; case 'F': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing value for -F option\n", optarg); errors++; } else ci.footer_msg = strdup (optarg); break; case 'h': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing IRRd host name for -h option\n", optarg); errors++; } else ci.irrd_host = optarg; break; case 'l': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing directory name for -l option\n", optarg); errors++; } else ci.log_dir = optarg; break; case 'O': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing web origin value for -O option\n", optarg); errors++; } else web_origin_str = strdup (optarg); break; case 'p': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing port number for -p option\n", optarg); errors++; } else ci.irrd_port = atoi (optarg); break; case 'r': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing directory name for -r option\n", optarg); errors++; } else ci.pgp_dir = optarg; break; case 's': if (*optarg == '-') { fprintf (stderr, "\"%s\" missing source database name for -s option\n", optarg); errors++; } else { obj = create_source_obj (optarg, 1); add_src_obj (&sstart, obj); } break; case 'R': RPS_DIST_FLAG = 1; break; case 'x': NULL_NOTIFICATIONS = 1; break; case 'f': if (!strcasecmp (optarg, "stderr") || !strcasecmp (optarg, "stdout")) { fprintf (stderr, "Invalid IRRd configuration file!\n"); errors++; } else if (*optarg == '-') { fprintf (stderr, "\"%s\" missing IRRd configuration file for -f option\n", optarg); errors++; } else config_fname = optarg; break; case 'd': case 'D': DAEMON_FLAG = 1; break; case 'v': /* turn on debugging */ set_trace (default_trace, TRACE_FLAGS, TR_ALL, TRACE_LOGFILE, "stdout", NULL); break; default: errors++; break; } /* input file */ if (!errors) for (; optind < argc; optind++) { if (file_name == NULL) file_name = argv[optind]; else { errors++; break; } } if (DAEMON_FLAG && file_name != NULL) { fprintf (stderr, "Two input sources specified: '-d/D' option and %s!\n", file_name); errors++; } if (errors) { fprintf (stderr, usage, name); fprintf (stderr,"\nirr_submit compiled on %s\n",__DATE__); exit (0); } if (DAEMON_FLAG || file_name == NULL) fin = stdin; else if ((fin = fopen (file_name, "r")) == NULL) { fprintf (stderr, "Error opening input file \"%s\": %s\n", file_name, strerror(errno)); exit (0); } /* Parse the irrd.conf file */ ci.srcs = sstart.first; if (parse_irrd_conf_file (config_fname, default_trace) < 0) fprintf (stderr, "Warning: could not open the IRRd conf file!\n"); /* JW debug { source_t *obj; printf ("JW: source list...\n"); for (obj = ci.srcs; obj != NULL; obj = obj->next) { printf ("\n---------\nname (%s)\n", obj->source); printf (" authoritative (%d)\n", obj->authoritative); printf (" rpsdist flag (%d)\n", obj->rpsdist_flag); printf (" rpsdist trusted (%d)\n", obj->rpsdist_trusted); printf (" rpsdist auth (%d)\n", obj->rpsdist_auth); printf (" rpsdist host (%s)\n", ((obj->rpsdist_host == NULL) ? "NULL" : obj->rpsdist_host)); printf (" rpsdist port (%s)\n", ((obj->rpsdist_port == NULL) ? "NULL" : obj->rpsdist_port)); printf (" rpsdist hexid (%s)\n", ((obj->rpsdist_hexid == NULL) ? "NULL" : obj->rpsdist_hexid)); printf (" rpsdist accept host (%s)\n", ((obj->rpsdist_accept_host == NULL) ? "NULL" : obj->rpsdist_accept_host)); printf (" rpsdist pgppass (%s)\n", ((obj->rpsdist_pgppass == NULL) ? "NULL" : obj->rpsdist_pgppass)); } } */ /* Successful invokation and good irrd.conf file. * Now we can process DB submission */ call_pipeline (default_trace, fin, web_origin_str, NULL_NOTIFICATIONS, DAEMON_FLAG, RPS_DIST_FLAG); trace (NORM, default_trace, "\n\n"); exit(0); }