?? pcomm_cmd.c
字號:
/* * An external command facility for Pcomm. All of the "sanity checking" * is done at this end, so virtually no checking is done at Pcomm's end. */#include <stdio.h>#include <ctype.h>#include "config.h"#include "cmd.h"#ifdef BSD#include <sys/file.h>#else /* BSD */#include <fcntl.h>#endif /* BSD */int cmd_ipc;main(argc, argv)int argc;char *argv[];{ static char *cmds[] = {"SET", "QUERY", "IF", "DIAL", "REDIAL", "EXIT", "CLEAR_SCREEN", "CHG_DIR", "HANG_UP", "PRINTER", "MODEM_BREAK", "SEND", "RECEIVE", "SCREEN_DUMP", "DATA_LOG", 0}; static char *set_args[] = {"BAUD", "PARITY", "DATA_BITS", "STOP_BITS", "DUPLEX", "AUX", "HOT_KEY", "ASCII_HOT", "FLOW_CTRL", "CR_IN", "CR_OUT", "LOGFILE", "DUMPFILE", "STRIP", "LOCAL_ECHO", "EXPAND", "CR_DELAY", "PACE", "CR_UP", "LF_UP", "TIMER", "CR_DN", "LF_DN", 0}; static char *qry_args[] = {"TTY_NAME", "MODEM_NAME", 0}; static char *if_args[] = {"CONNECTED", "LOG_STATUS", "PRINTER_STATUS", 0}; static char *xfer_args[] = {"XMODEM", "XMODEM_1K", "MODEM7", "YMODEM", "YMODEM_G", "ASCII", "EXT_1", "EXT_2", "EXT_3", 0}; char *command, buf[40], *mkupper(), *arg1, *arg2, *s, *strchr(); char *pcomm_cmd, *getenv(); int cmd_num, i, arg_num, got_it; unsigned int ui; void send_cmd(), get_value(), exit(), cmd_exit(); /* get the environmental variable */ pcomm_cmd = getenv("PCOMM_CMD"); if (argc == 1 || pcomm_cmd == NULL || *pcomm_cmd == '\0') { fprintf(stderr, "%s: This is a Pcomm support program. It is intended for use inside\n", argv[0]); fprintf(stderr, "an auto-login shell script\n"); exit(1); } /* parse the command line */ command = mkupper(argv[1]); if (argc > 2) arg1 = mkupper(argv[2]); else arg1 = ""; if (argc > 3) arg2 = mkupper(argv[3]); else arg2 = ""; /* convert command to a number */ cmd_num = 0; while (cmds[cmd_num] != NULL) { if (!strcmp(command, cmds[cmd_num])) break; cmd_num++; } /* attach to the IPC channel */ if ((cmd_ipc = ipc_attach(pcomm_cmd, O_RDWR)) < 0) { fprintf(stderr, "%s: Can't attach to IPC channel\n", argv[0]); exit(1); } /* do it! */ switch(cmd_num) { case SET: if (argc < 4) { fprintf(stderr, "%s: SET command requires 2 arguments\n", argv[0]); cmd_exit(1); } arg_num = 0; while (set_args[arg_num] != NULL) { if (!strcmp(arg1, set_args[arg_num])) break; arg_num++; } switch(arg_num) { case BAUD: ui = (unsigned int) atoi(arg2); switch(ui) { case 300: case 1200: case 2400: case 4800: case 9600: case 19200: case 38400: break; default: fprintf(stderr, "%s: bad value '%s' for SET BAUD command\n", argv[0], argv[3]); cmd_exit(1); } sprintf(buf, "%d", ui); send_cmd(SET, BAUD, buf); break; case PARITY: if (strcmp(arg2, "EVEN") && strcmp(arg2, "ODD") && strcmp(arg2, "NONE")) { fprintf(stderr, "%s: bad value '%s' for SET PARITY command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, PARITY, arg2); break; case DATA_BITS: i = atoi(arg2); if (i != 7 && i != 8) { fprintf(stderr, "%s: bad value '%s' for SET DATA_BITS command\n", argv[0], argv[3]); cmd_exit(1); } sprintf(buf, "%d", i); send_cmd(SET, DATA_BITS, buf); break; case STOP_BITS: i = atoi(arg2); if (i != 1 && i != 2) { fprintf(stderr, "%s: bad value '%s' for SET STOP_BITS command\n", argv[0], argv[3]); cmd_exit(1); } sprintf(buf, "%d", i); send_cmd(SET, STOP_BITS, buf); break; case DUPLEX: if (strcmp(arg2, "FULL") && strcmp(arg2, "HALF")) { fprintf(stderr, "%s: bad value '%s' for SET DUPLEX command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, DUPLEX, arg2); break; case AUX: send_cmd(SET, AUX, argv[3]); break; case HOT_KEY: i = atoi(arg2); if (i <= 0 || i > 256) { fprintf(stderr, "%s: bad value '%s' for SET HOT_KEY command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, HOT_KEY, arg2); break; case ASCII_HOT: send_cmd(SET, ASCII_HOT, argv[3]); break; case FLOW_CTRL: if (strcmp(arg2, "XON/XOFF") && strcmp(arg2, "NONE")) { fprintf(stderr, "%s: bad value '%s' for SET FLOW_CTRL command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, FLOW_CTRL, arg2); break; case CR_IN: if (strcmp(arg2, "CR") && strcmp(arg2, "CR/LF")) { fprintf(stderr, "%s: bad value '%s' for SET CR_IN command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, CR_IN, arg2); break; case CR_OUT: if (strcmp(arg2, "CR") && strcmp(arg2, "CR/LF")) { fprintf(stderr, "%s: bad value '%s' for SET CR_OUT command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, CR_OUT, arg2); break; case LOGFILE: send_cmd(SET, LOGFILE, argv[3]); break; case DUMPFILE: send_cmd(SET, DUMPFILE, argv[3]); break; case STRIP: if (strcmp(arg2, "YES") && strcmp(arg2, "NO")) { fprintf(stderr, "%s: bad value '%s' for SET STRIP command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, STRIP, arg2); break; case LOCAL_ECHO: if (strcmp(arg2, "YES") && strcmp(arg2, "NO")) { fprintf(stderr, "%s: bad value '%s' for SET LOCAL_ECHO command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, LOCAL_ECHO, arg2); break; case EXPAND: if (strcmp(arg2, "YES") && strcmp(arg2, "NO")) { fprintf(stderr, "%s: bad value '%s' for SET EXPAND command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, EXPAND, arg2); break; case CR_DELAY: i = atoi(arg2); if (i != 0 && i != 100 && i != 150) { fprintf(stderr, "%s: bad value '%s' for SET CR_DELAY command\n", argv[0], argv[3]); cmd_exit(1); } sprintf(buf, "%d", i); send_cmd(SET, CR_DELAY, buf); break; case PACE: if (strcmp(arg2, "YES") && strcmp(arg2, "NO")) { fprintf(stderr, "%s: bad value '%s' for SET PACE command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, PACE, arg2); break; case CR_UP: if (strcmp(arg2, "NONE") && strcmp(arg2, "ADD_LF") && strcmp(arg2, "STRIP")) { fprintf(stderr, "%s: bad value '%s' for SET CR_UP command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, CR_UP, arg2); break; case LF_UP: if (strcmp(arg2, "NONE") && strcmp(arg2, "ADD_CR") && strcmp(arg2, "STRIP")) { fprintf(stderr, "%s: bad value '%s' for SET LF_UP command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, LF_UP, arg2); break; case TIMER: i = atoi(arg2); if (i < 5 || i > 150) { fprintf(stderr, "%s: bad value '%s' for SET TIMER command\n", argv[0], argv[3]); cmd_exit(1); } sprintf(buf, "%d", i); send_cmd(SET, CR_DN, buf); break; case CR_DN: if (strcmp(arg2, "NONE") && strcmp(arg2, "ADD_LF") && strcmp(arg2, "STRIP")) { fprintf(stderr, "%s: bad value '%s' for SET CR_DN command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, CR_DN, arg2); break; case LF_DN: if (strcmp(arg2, "NONE") && strcmp(arg2, "ADD_CR") && strcmp(arg2, "STRIP")) { fprintf(stderr, "%s: bad value '%s' for SET LF_DN command\n", argv[0], argv[3]); cmd_exit(1); } send_cmd(SET, LF_DN, arg2); break; default: fprintf(stderr, "%s: Illegal argument '%s' for SET command\n", argv[0], argv[2]); cmd_exit(1); break; } break; case QUERY: /* the QUERY commands */ if (argc < 3) { fprintf(stderr, "%s: QUERY command requires an argument\n", argv[0]); cmd_exit(1); } arg_num = 0; while (qry_args[arg_num] != NULL) { if (!strcmp(arg1, qry_args[arg_num])) break; arg_num++; } switch(arg_num) { case TTY_NAME: send_cmd(QUERY, TTY_NAME, "dummy"); get_value(); break; case MODEM_NAME: send_cmd(QUERY, MODEM_NAME, "dummy"); get_value(); break; default: fprintf(stderr, "%s: Illegal argument '%s' for QUERY command\n", argv[0], argv[2]); cmd_exit(1); break; } break; case IF: /* the IF commands */ if (argc < 3) { fprintf(stderr, "%s: IF command requires an argument\n", argv[0]); cmd_exit(1); } arg_num = 0; while (if_args[arg_num] != NULL) { if (!strcmp(arg1, if_args[arg_num])) break; arg_num++; } switch(arg_num) { case CONNECTED: send_cmd(IF, CONNECTED, "dummy"); break; case LOG_STATUS: send_cmd(IF, LOG_STATUS, "dummy"); break; case PRINTER_STATUS: send_cmd(IF, PRINTER_STATUS, "dummy"); break; default: fprintf(stderr, "%s: Illegal argument '%s' for IF command\n", argv[0], argv[2]); cmd_exit(1); break; } break; case DIAL: if (argc < 3) { fprintf(stderr, "%s: DIAL command requires an argument\n", argv[0]); cmd_exit(1); } if (!strcmp(arg1, "MANUAL")) { if (argc < 4) { fprintf(stderr, "%s: DIAL MANUAL command requires an argument\n", argv[0]); cmd_exit(1); } send_cmd(DIAL, 1, argv[3]); } else { if (s = strchr("+-@#", *argv[2])) i = atoi(++s); else i = atoi(argv[2]); if (i < 1 || i > 100) { fprintf(stderr, "%s: bad value '%s' for DIAL command\n", argv[0], argv[2]); cmd_exit(1); } send_cmd(DIAL, 0, argv[2]); } break; case REDIAL: if (argc < 3) { fprintf(stderr, "%s: REDIAL command requires at least 1 argument\n", argv[0]); cmd_exit(1); } send_cmd(REDIAL, 0, argv[2]); break; case EXIT: send_cmd(EXIT, 0, "dummy"); /* * Don't wait for a return code... Pcomm won't be * around to send it! So, assume it got there OK. */ cmd_exit(0); break; case CLEAR_SCREEN: send_cmd(CLEAR_SCREEN, 0, "dummy"); break; case CHG_DIR: if (argc < 3) { fprintf(stderr, "%s: CHG_DIR command requires an argument\n", argv[0]); cmd_exit(1); } send_cmd(CHG_DIR, 0, argv[2]); break; case HANG_UP: send_cmd(HANG_UP, 0, "dummy"); break; case PRINTER: if (argc < 3) { fprintf(stderr, "%s: PRINTER command requires an argument\n", argv[0]); cmd_exit(1); } if (strcmp(arg1, "ON") && strcmp(arg1, "OFF")) { fprintf(stderr, "%s: bad value '%s' for PRINTER command\n", argv[0], argv[2]); cmd_exit(1); } if (!strcmp(arg1, "ON")) send_cmd(PRINTER, 1, "dummy"); else send_cmd(PRINTER, 0, "dummy"); break; case MODEM_BREAK: send_cmd(MODEM_BREAK, 0, "dummy"); break; case SEND: if (argc < 4) { fprintf(stderr, "%s: SEND command requires 2 arguments\n", argv[0]); cmd_exit(1); } arg_num = 0; got_it = 0; while (xfer_args[arg_num] != NULL) { if (!strcmp(xfer_args[arg_num], arg1)) { got_it++; break; } arg_num++; } if (!got_it) { fprintf(stderr, "%s: Illegal argument '%s' for SEND command\n", argv[0], argv[2]); cmd_exit(1); } send_cmd(SEND, ++arg_num, argv[3]); break; case RECEIVE: if (argc < 3) { fprintf(stderr, "%s: RECEIVE command requires at least 1 argument\n", argv[0]); cmd_exit(1); } arg_num = 0; got_it = 0; while (xfer_args[arg_num] != NULL) { if (!strcmp(xfer_args[arg_num], arg1)) { got_it++; break; } arg_num++; } if (!got_it) { fprintf(stderr, "%s: Illegal argument '%s' for RECEIVE command\n", argv[0], argv[2]); cmd_exit(1); } if (argc < 4) send_cmd(RECEIVE, ++arg_num, "dummy"); else send_cmd(RECEIVE, ++arg_num, argv[3]); break; case SCREEN_DUMP: send_cmd(SCREEN_DUMP, 0, "dummy"); break; case DATA_LOG: if (!strcmp(arg1, "ON")) send_cmd(DATA_LOG, 1, "dummy"); else send_cmd(DATA_LOG, 0, "dummy"); break; default: fprintf(stderr, "%s: Illegal command '%s'\n", argv[0], argv[1]); cmd_exit(1); break; } /* get the return status */ if (ipc_read(cmd_ipc, buf, 256)) {#ifndef sparc fprintf(stderr, "Can't read from IPC\n");#endif /* sparc */ cmd_exit(1); } cmd_exit(atoi(buf));}/* * Copy and convert a string to all upper case */char *mkupper(string)char *string;{ int i; char buf[80], *ans, *strcpy(), *malloc(); void exit(); i = 0; while (*string != '\0') { if (islower(*string)) buf[i++] = toupper(*string); else buf[i++] = *string; string++; if (i == 79) break; } buf[i] = '\0'; if ((ans = malloc((unsigned int) strlen(buf)+1)) == NULL) { fprintf(stderr, "out of memory!\n"); exit(1); } strcpy(ans, buf); return(ans);}/* * Get a return value from a command, (and therefore exit prematurely). */void get_value(){ char *s, *strchr(), buf[256]; void cmd_exit(); if (ipc_read(cmd_ipc, buf, 256)) { fprintf(stderr, "Can't read from IPC\n"); cmd_exit(1); } if (s = strchr(buf, '\n')) *++s = '\0'; printf("%s", buf); cmd_exit(0);}/* * Send a command to the Pcomm process */voidsend_cmd(cmd, arg1, arg2)int cmd, arg1;char *arg2;{ char buf[256]; void cmd_exit(); sprintf(buf, "%d %d %249.249s\n", cmd, arg1, arg2); if (ipc_write(cmd_ipc, buf, 256)) { fprintf(stderr, "Can't write to IPC\n"); cmd_exit(1); } return;}/* * Clean up and go home... */voidcmd_exit(n)int n;{ void exit(); ipc_detach(cmd_ipc); exit(n);}#define MAIN#include IPC
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -