X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/c2be255cd40339f27791697f949dfa13bd78e614..7ac48069b111a991ee5975cb6088c4563b57b670:/clients/moira/main.c diff --git a/clients/moira/main.c b/clients/moira/main.c index 3d2929bd..3507931f 100644 --- a/clients/moira/main.c +++ b/clients/moira/main.c @@ -1,131 +1,165 @@ -#if (!defined(lint) && !defined(SABER)) - static char rcsid_module_c[] = "$Header$"; -#endif lint - -/* This is the file main.c for the SMS Client, which allows a nieve - * user to quickly and easily maintain most parts of the SMS database. - * It Contains: The main driver for the SMS Client. - * +/* $Id $ + * + * This is the file main.c for the Moira Client, which allows users + * to quickly and easily maintain most parts of the Moira database. + * It Contains: The main driver for the Moira Client. + * * Created: 4/12/88 * By: Chris D. Peterson * - * $Source$ - * $Author$ - * $Header$ - * - * Copyright 1988 by the Massachusetts Institute of Technology. - * - * For further information on copyright and distribution - * see the file mit-copyright.h + * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology. + * For copying and distribution information, please see the file + * . */ -#include -#include -#include -#include -#include -#include -#include - -#include "mit-copyright.h" +#include +#include #include "defs.h" #include "f_defs.h" #include "globals.h" -char * whoami; /* used by menu.c ugh!!! */ +#include +#include +#include +#include +#include + +RCSID("$Header$"); -extern Menu sms_top_menu, list_menu, user_menu, dcm_menu; +static void ErrorExit(char *buf, int status); +static void Usage(void); +static void Signal_Handler(void); +static void CatchInterrupt(void); -#ifndef DEBUG -static void SignalHandler(); -#endif DEBUG +char *whoami; /* used by menu.c ugh!!! */ +char *moira_server; +int interrupt = 0; -static void ErrorExit(), Usage(); -char *getlogin(); -uid_t getuid(); -struct passwd *getpwuid(); +extern Menu moira_top_menu, list_menu, user_menu, dcm_menu; Bool use_menu = TRUE; /* whether or not we are using a menu. */ /* Function Name: main - * Description: The main driver for the SMS Client. + * Description: The main driver for the Moira Client. * Arguments: argc, argv - standard command line args. * Returns: doesn't return. */ -void -main(argc, argv) - int argc; - char ** argv; +void main(int argc, char **argv) { - int status; - Menu *menu; - - if ((user = getlogin()) == NULL) - user = getpwuid((int) getuid())->pw_name; - user = (user && strlen(user)) ? Strsave(user) : ""; - - program_name = Strsave(program_name); - whoami = Strsave(program_name); /* used by menu.c, ugh !!! */ - - init_sms_err_tbl(); - init_krb_err_tbl(); - verbose = TRUE; - - switch (argc) { - case 2: - if (strcmp(argv[1], "-nomenu") == 0) - use_menu = FALSE; - else - Usage(); - /* Fall Through. */ - case 1: - if ((program_name = rindex(argv[0], '/')) == NULL) - program_name = argv[0]; - else - program_name++; - break; - default: - Usage(); - break; + int status; + Menu *menu; + char *motd, **arg; + struct sigaction act; + + if (!(user = getlogin())) + user = getpwuid(getuid())->pw_name; + user = (user && strlen(user)) ? strdup(user) : ""; + + if (!(program_name = strrchr(argv[0], '/'))) + program_name = argv[0]; + else + program_name++; + program_name = strdup(program_name); + whoami = strdup(program_name); /* used by menu.c, ugh !!! */ + + verbose = TRUE; + arg = argv; + moira_server = NULL; + + while (++arg - argv < argc) + { + if (**arg == '-') + { + if (!strcmp(*arg, "-nomenu")) + use_menu = FALSE; + else if (!strcmp(*arg, "-menu")) + use_menu = TRUE; + else if (!strcmp(*arg, "-db")) + { + if (arg - argv < argc - 1) + { + ++arg; + moira_server = *arg; + } else + Usage(); + } + else + Usage(); + } } - if ( status = sms_connect() ) - ErrorExit("\nConnection to SMS server failed", status); + if ((status = mr_connect(moira_server))) + ErrorExit("\nConnection to Moira server failed", status); + + if ((status = mr_motd(&motd))) + ErrorExit("\nUnable to check server status", status); + if (motd) + { + fprintf(stderr, "The Moira server is currently unavailable:\n%s\n", + motd); + mr_disconnect(); + exit(1); + } - if ( status = sms_auth(program_name) ) - ErrorExit("\nAuthorization failed -- please run kinit", status); + if ((status = mr_auth(program_name))) + { + if (status == MR_USER_AUTH) + { + char buf[BUFSIZ]; + com_err(program_name, status, "\nPress [RETURN] to continue"); + fgets(buf, BUFSIZ, stdin); + } + else + { + if (status >= ERROR_TABLE_BASE_krb && + status <= ERROR_TABLE_BASE_krb + 256) + ErrorExit("\nAuthorization failed -- please run kinit", status); + else + ErrorExit("\nAuthorization failed.", status); + } + } -/* - * These signals should not be set until just before we fire up the menu - * system. - */ + /* + * These signals should not be set until just before we fire up the menu + * system. + */ + + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + act.sa_handler = Signal_Handler; + sigaction(SIGHUP, &act, NULL); + sigaction(SIGQUIT, &act, NULL); + if (use_menu) + sigaction(SIGINT, &act, NULL); + else + { + act.sa_handler = CatchInterrupt; + sigaction(SIGINT, &act, NULL); + } -#ifndef DEBUG - (void) signal(SIGHUP, SignalHandler); - (void) signal(SIGINT, SignalHandler); - (void) signal(SIGQUIT, SignalHandler); -#endif DEBUG - - if (!strcmp(program_name, "listmaint")) - menu = &list_menu; - else if (!strcmp(program_name, "usermaint")) - menu = &user_menu; - else if (!strcmp(program_name, "dcmmaint")) - menu = &dcm_menu; - else - menu = &sms_top_menu; - - if (use_menu) { /* Start menus that execute program */ - Start_paging(); - Start_menu(menu); - Stop_paging(); + initialize_gdss_error_table(); + + if (!strcmp(program_name, "listmaint")) + menu = &list_menu; + else if (!strcmp(program_name, "usermaint")) + menu = &user_menu; + else if (!strcmp(program_name, "dcmmaint")) + menu = &dcm_menu; + else + menu = &moira_top_menu; + + if (use_menu) /* Start menus that execute program */ + { + Start_paging(); + Start_menu(menu); + Stop_paging(); } - else /* Start program without menus. */ - Start_no_menu(menu); + else /* Start program without menus. */ + Start_no_menu(menu); - sms_disconnect(); - exit(0); + mr_disconnect(); + exit(0); } /* Function Name: ErrorExit @@ -135,14 +169,11 @@ main(argc, argv) * Returns: doesn't return. */ -static void -ErrorExit(buf,status) -int status; -char * buf; +static void ErrorExit(char *buf, int status) { - com_err(program_name, status, buf); - sms_disconnect(); - exit(1); + com_err(program_name, status, buf); + mr_disconnect(); + exit(1); } /* Function Name: usage @@ -151,27 +182,31 @@ char * buf; * Returns: doesn't return. */ -static void -Usage() +static void Usage(void) { - fprintf(stderr, "Usage: %s [-nomenu]\n", program_name); - exit(1); + fprintf(stderr, "Usage: %s [-nomenu | -menu] [-db server[:port]]\n", + program_name); + exit(1); } -#ifndef DEBUG -/* Function Name: SignalHandler +/* Function Name: Signal_Handler * Description: This function cleans up from a signal interrupt. * Arguments: none. * Returns: doesn't */ -static void -SignalHandler() +static void Signal_Handler(void) +{ + Put_message("Signal caught - exiting"); + if (use_menu) + Cleanup_menu(); + mr_disconnect(); + exit(1); +} + + +static void CatchInterrupt(void) { - Put_message("Signal caught - exiting"); - if (use_menu) - Cleanup_menu(); - sms_disconnect(); - exit(1); + Put_message("Interrupt! Press RETURN to continue"); + interrupt = 1; } -#endif DEBUG