|
|
1.1 ! root 1: /* chatc.c ! 2: Subroutines to handle chat script commands. ! 3: ! 4: Copyright (C) 1992 Ian Lance Taylor ! 5: ! 6: This file is part of the Taylor UUCP uuconf library. ! 7: ! 8: This library is free software; you can redistribute it and/or ! 9: modify it under the terms of the GNU Library General Public License ! 10: as published by the Free Software Foundation; either version 2 of ! 11: the License, or (at your option) any later version. ! 12: ! 13: This library is distributed in the hope that it will be useful, but ! 14: WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 16: Library General Public License for more details. ! 17: ! 18: You should have received a copy of the GNU Library General Public ! 19: License along with this library; if not, write to the Free Software ! 20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: The author of the program may be contacted at [email protected] or ! 23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254. ! 24: */ ! 25: ! 26: #include "uucnfi.h" ! 27: ! 28: #if USE_RCS_ID ! 29: const char _uuconf_chatc_rcsid[] = "$Id: chatc.c,v 1.1 93/07/30 08:07:03 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: #include <ctype.h> ! 33: #include <errno.h> ! 34: ! 35: static int icchat P((pointer pglobal, int argc, char **argv, ! 36: pointer pvar, pointer pinfo)); ! 37: static int icchat_fail P((pointer pglobal, int argc, char **argv, ! 38: pointer pvar, pointer pinfo)); ! 39: static int icunknown P((pointer pglobal, int argc, char **argv, ! 40: pointer pvar, pointer pinfo)); ! 41: ! 42: /* The chat script commands. */ ! 43: ! 44: static const struct cmdtab_offset asChat_cmds[] = ! 45: { ! 46: { "chat", UUCONF_CMDTABTYPE_FN, ! 47: offsetof (struct uuconf_chat, uuconf_pzchat), icchat }, ! 48: { "chat-program", UUCONF_CMDTABTYPE_FULLSTRING, ! 49: offsetof (struct uuconf_chat, uuconf_pzprogram), NULL }, ! 50: { "chat-timeout", UUCONF_CMDTABTYPE_INT, ! 51: offsetof (struct uuconf_chat, uuconf_ctimeout), NULL }, ! 52: { "chat-fail", UUCONF_CMDTABTYPE_FN | 2, ! 53: offsetof (struct uuconf_chat, uuconf_pzfail), icchat_fail }, ! 54: { "chat-seven-bit", UUCONF_CMDTABTYPE_BOOLEAN, ! 55: offsetof (struct uuconf_chat, uuconf_fstrip), NULL }, ! 56: { NULL, 0, 0, NULL } ! 57: }; ! 58: ! 59: #define CCHAT_CMDS (sizeof asChat_cmds / sizeof asChat_cmds[0]) ! 60: ! 61: /* Handle a chat script command. The chat script commands are entered ! 62: as UUCONF_CMDTABTYPE_PREFIX, and the commands are routed to this ! 63: function. We copy the command table onto the stack and repoint it ! 64: at qchat in order to make the function reentrant. The return value ! 65: can include UUCONF_CMDTABRET_KEEP, but should not include ! 66: UUCONF_CMDTABRET_EXIT. */ ! 67: ! 68: int ! 69: _uuconf_ichat_cmd (qglobal, argc, argv, qchat, pblock) ! 70: struct sglobal *qglobal; ! 71: int argc; ! 72: char **argv; ! 73: struct uuconf_chat *qchat; ! 74: pointer pblock; ! 75: { ! 76: char *zchat; ! 77: struct uuconf_cmdtab as[CCHAT_CMDS]; ! 78: int iret; ! 79: ! 80: /* This is only invoked when argv[0] will contain the string "chat"; ! 81: the specific chat script command comes after that point. */ ! 82: for (zchat = argv[0]; *zchat != '\0'; zchat++) ! 83: if ((*zchat == 'c' || *zchat == 'C') ! 84: && strncasecmp (zchat, "chat", sizeof "chat" - 1) == 0) ! 85: break; ! 86: if (*zchat == '\0') ! 87: return UUCONF_SYNTAX_ERROR; ! 88: argv[0] = zchat; ! 89: ! 90: _uuconf_ucmdtab_base (asChat_cmds, CCHAT_CMDS, (char *) qchat, as); ! 91: ! 92: iret = uuconf_cmd_args ((pointer) qglobal, argc, argv, as, pblock, ! 93: icunknown, 0, pblock); ! 94: return iret &~ UUCONF_CMDTABRET_EXIT; ! 95: } ! 96: ! 97: /* Handle the "chat" command. This breaks up substrings in expect ! 98: strings, and sticks the arguments into a NULL terminated array. */ ! 99: ! 100: static int ! 101: icchat (pglobal, argc, argv, pvar, pinfo) ! 102: pointer pglobal; ! 103: int argc; ! 104: char **argv; ! 105: pointer pvar; ! 106: pointer pinfo; ! 107: { ! 108: struct sglobal *qglobal = (struct sglobal *) pglobal; ! 109: char ***ppz = (char ***) pvar; ! 110: pointer pblock = pinfo; ! 111: int i; ! 112: ! 113: *ppz = NULL; ! 114: ! 115: for (i = 1; i < argc; i += 2) ! 116: { ! 117: char *z, *zdash; ! 118: int iret; ! 119: ! 120: /* Break the expect string into substrings. */ ! 121: z = argv[i]; ! 122: zdash = strchr (z, '-'); ! 123: while (zdash != NULL) ! 124: { ! 125: *zdash = '\0'; ! 126: iret = _uuconf_iadd_string (qglobal, z, TRUE, FALSE, ppz, ! 127: pblock); ! 128: if (iret != UUCONF_SUCCESS) ! 129: return iret; ! 130: *zdash = '-'; ! 131: z = zdash; ! 132: zdash = strchr (z + 1, '-'); ! 133: } ! 134: ! 135: iret = _uuconf_iadd_string (qglobal, z, FALSE, FALSE, ppz, pblock); ! 136: if (iret != UUCONF_SUCCESS) ! 137: return iret; ! 138: ! 139: /* Add the send string without breaking it up. If it starts ! 140: with a dash we must replace it with an escape sequence, to ! 141: prevent it from being interpreted as a subsend. */ ! 142: ! 143: if (i + 1 < argc) ! 144: { ! 145: if (argv[i + 1][0] != '-') ! 146: iret = _uuconf_iadd_string (qglobal, argv[i + 1], FALSE, ! 147: FALSE, ppz, pblock); ! 148: else ! 149: { ! 150: size_t clen; ! 151: ! 152: clen = strlen (argv[i + 1]); ! 153: z = uuconf_malloc (pblock, clen + 2); ! 154: if (z == NULL) ! 155: { ! 156: qglobal->ierrno = errno; ! 157: return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 158: } ! 159: z[0] = '\\'; ! 160: memcpy ((pointer) (z + 1), (pointer) argv[i + 1], clen + 1); ! 161: iret = _uuconf_iadd_string (qglobal, z, FALSE, FALSE, ppz, ! 162: pblock); ! 163: } ! 164: if (iret != UUCONF_SUCCESS) ! 165: return iret; ! 166: } ! 167: } ! 168: ! 169: return UUCONF_CMDTABRET_KEEP; ! 170: } ! 171: ! 172: /* Add a new chat failure string. */ ! 173: ! 174: /*ARGSUSED*/ ! 175: static int ! 176: icchat_fail (pglobal, argc, argv, pvar, pinfo) ! 177: pointer pglobal; ! 178: int argc; ! 179: char **argv; ! 180: pointer pvar; ! 181: pointer pinfo; ! 182: { ! 183: struct sglobal *qglobal = (struct sglobal *) pglobal; ! 184: char ***ppz = (char ***) pvar; ! 185: pointer pblock = pinfo; ! 186: ! 187: return _uuconf_iadd_string (qglobal, argv[1], TRUE, FALSE, ppz, pblock); ! 188: } ! 189: ! 190: /* Return a syntax error for an unknown command. */ ! 191: ! 192: /*ARGSUSED*/ ! 193: static int ! 194: icunknown (pglobal, argc, argv, pvar, pinfo) ! 195: pointer pglobal; ! 196: int argc; ! 197: char **argv; ! 198: pointer pvar; ! 199: pointer pinfo; ! 200: { ! 201: return UUCONF_SYNTAX_ERROR; ! 202: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.