/* * SPDsoft 1996 * Sun Sep 29 01:58:29 DST 1996 */ #include #include #include #include #include #include #include #include #include #define PATH_SEP '/' #define LOCK_F "allow.die" /*#define LOCK_F "/etc/allow.die"*/ #define TEXT "\ Seguro que desea apagar esta maquina?\n\ \n\ Por favor, asegurese antes de que no hay\n\ procesos importantes corriendo\n\ \n\ " typedef struct { char *app; Widget dialog; XtAppContext app_context; } tstatus; Boolean quit=FALSE; void Ok(Widget w, XtPointer client_data, XtPointer call_data); void Cancel(Widget w, XtPointer client_data, XtPointer call_data); int main(int argc, char **argv); void usage(tstatus st); void usage(tstatus st) { fprintf(stderr,"Use: %s\n", st.app); exit(0); } void Ok(Widget w, XtPointer client_data, XtPointer call_data) { char *cmd[] = { "/usr/ucb/echo", "/usr/ucb/shutdown","-y","-g300","-i5", "Apagado para botar MessDOS", NULL }; XtUnmanageChild(w); system("/usr/bin/id"); execve( cmd[0], cmd, NULL ); perror("execve"); exit(-2); } void Cancel(Widget w, XtPointer client_data, XtPointer call_data) { XtUnmanageChild(w); quit=TRUE; } int main(int argc, char **argv) { Widget app_shell; Widget dialog; XtAppContext app_context; XEvent event_return; Arg args[10]; tstatus status; struct stat sbp; int p; char *nenv[]={ "PATH=/bin:/etc", /* "DISPLAY=:0.0",*/ "DISPLAY=daphne:0.0", "IFS=", NULL }; int opt; extern char *optarg; extern int optind,opterr; system("/usr/bin/id"); if ((status.app = strrchr(argv[0], PATH_SEP)) != NULL) status.app = status.app+1; else status.app = argv[0]; if ( argc != 1 ) usage(status); if(0!=stat(LOCK_F,&sbp)) { fprintf(stderr, "%s: Sorry, %s locked by root. Try again later\n", status.app, status.app); exit(EACCES); } for( p=0; nenv[p]!=NULL; p++) { if ( 0 != putenv (nenv[p])) { fprintf( stderr, "putenv failed for \"%s\" (%d)\n", nenv[p], errno); exit(1); } } app_shell = XtAppInitialize(&app_context, "Die", (XrmOptionDescList) NULL, 0 , &argc, argv, (String *) NULL, (ArgList) NULL, 0); p=0; XtSetArg(args[p], XmNmessageString, XmStringCreateLocalized(TEXT)); p++; XtSetArg(args[p], XmNcancelLabelString, XmStringCreateLocalized("Apagar")); p++; XtSetArg(args[p], XmNcancelLabelString, XmStringCreateLocalized("Cancelar")); p++; XtSetArg(args[p], XmNdefaultButtonType, XmDIALOG_CANCEL_BUTTON); p++; dialog = XmCreateMessageDialog( app_shell, argv[0], args, p); XtAddCallback(dialog, XmNcancelCallback, Cancel, NULL); XtAddCallback(dialog, XmNokCallback, Ok, NULL); status.app_context=app_context; status.dialog=dialog; XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); XtManageChild(dialog); while(!quit) { XtAppNextEvent(app_context, &event_return); XtDispatchEvent(&event_return); } exit(0); }