dispatch.c revision 23588
1/* 2 * The new sysinstall program. 3 * 4 * This is probably the last program in the `sysinstall' line - the next 5 * generation being essentially a complete rewrite. 6 * 7 * $Id: dispatch.c,v 1.10 1997/02/22 14:11:26 peter Exp $ 8 * 9 * Copyright (c) 1995 10 * Jordan Hubbard. All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer, 17 * verbatim and that no modifications are made prior to this 18 * point in the file. 19 * 2. Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in the 21 * documentation and/or other materials provided with the distribution. 22 * 23 * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 */ 36 37#include "sysinstall.h" 38#include <ctype.h> 39 40static int _shutdown(dialogMenuItem *unused); 41 42static struct _word { 43 char *name; 44 int (*handler)(dialogMenuItem *self); 45} resWords[] = { 46 { "configAnonFTP", configAnonFTP }, 47 { "configApache", configApache }, 48 { "configRouter", configRouter }, 49 { "configNFSServer", configNFSServer }, 50 { "configSamba", configSamba }, 51 { "configRegister", configRegister }, 52 { "configPackages", configPackages }, 53 { "diskPartitionEditor", diskPartitionEditor }, 54 { "diskPartitionWrite", diskPartitionWrite }, 55 { "diskLabelEditor", diskLabelEditor }, 56 { "diskLabelCommit", diskLabelCommit }, 57 { "distReset", distReset }, 58 { "distSetDeveloper", distSetDeveloper }, 59 { "distSetXDeveloper", distSetXDeveloper }, 60 { "distSetKernDeveloper", distSetKernDeveloper }, 61 { "distSetUser", distSetUser }, 62 { "distSetXUser", distSetXUser }, 63 { "distSetMinimum", distSetMinimum }, 64 { "distSetEverything", distSetEverything }, 65 { "distSetDES", distSetDES }, 66 { "distSetSrc", distSetSrc }, 67 { "distSetXF86", distSetXF86 }, 68 { "distExtractAll", distExtractAll }, 69 { "docBrowser", docBrowser }, 70 { "docShowDocument", docShowDocument }, 71 { "installCommit", installCommit }, 72 { "installExpress", installExpress }, 73 { "installUpgrade", installUpgrade }, 74 { "installFixup", installFixup }, 75 { "installFilesystems", installFilesystems }, 76 { "mediaSetCDROM", mediaSetCDROM }, 77 { "mediaSetFloppy", mediaSetFloppy }, 78 { "mediaSetDOS", mediaSetDOS }, 79 { "mediaSetTape", mediaSetTape }, 80 { "mediaSetFTP", mediaSetFTP }, 81 { "mediaSetFTPActive", mediaSetFTPActive }, 82 { "mediaSetFTPPassive", mediaSetFTPPassive }, 83 { "mediaSetUFS", mediaSetUFS }, 84 { "mediaSetNFS", mediaSetNFS }, 85 { "mediaSetFTPUserPass", mediaSetFTPUserPass }, 86 { "mediaSetCPIOVerbosity", mediaSetCPIOVerbosity }, 87 { "mediaGetType", mediaGetType }, 88 { "optionsEditor", optionsEditor }, 89 { "addGroup", userAddGroup }, 90 { "addUser", userAddUser }, 91 { "shutdown", _shutdown }, 92 { NULL, NULL }, 93}; 94 95static int 96call_possible_resword(char *name, dialogMenuItem *value, int *status) 97{ 98 int i, rval; 99 100 rval = 0; 101 for (i = 0; resWords[i].name; i++) { 102 if (!strcmp(name, resWords[i].name)) { 103 *status = resWords[i].handler(value); 104 rval = 1; 105 break; 106 } 107 } 108 return rval; 109} 110 111/* Just convenience */ 112static int _shutdown(dialogMenuItem *unused) 113{ 114 systemShutdown(0); 115 return DITEM_FAILURE; 116} 117 118/* For a given string, call it or spit out an undefined command diagnostic */ 119int 120dispatchCommand(char *str) 121{ 122 int i; 123 char *cp; 124 125 if (!str || !*str) { 126 msgConfirm("Null or zero-length string passed to dispatchCommand"); 127 return DITEM_FAILURE; 128 } 129 /* If it's got a newline, trim it */ 130 if ((cp = index(str, '\n')) != NULL) 131 *cp = '\0'; 132 133 /* A command might be a pathname if it's encoded in argv[0], as we also support */ 134 if (index(str, '=')) { 135 variable_set(str); 136 i = DITEM_SUCCESS; 137 } 138 else { 139 if ((cp = index(str, '/')) != NULL) 140 str = cp + 1; 141 if (!call_possible_resword(str, NULL, &i)) { 142 msgConfirm("No such command: %s", str); 143 i = DITEM_FAILURE; 144 } 145 } 146 return i; 147} 148