|
|
1.1 ! root 1: /* paramc.c ! 2: Handle protocol-parameter 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_paramc_rcsid[] = "$Id: paramc.c,v 1.1 93/07/30 08:07:26 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: #include <errno.h> ! 33: ! 34: /* Handle protocol-parameter commands by inserting them into an array ! 35: of structures. The return value may include UUCONF_CMDTABRET_KEEP ! 36: and UUCONF_CMDTABRET_EXIT, if appropriate. */ ! 37: ! 38: int ! 39: _uuconf_iadd_proto_param (qglobal, argc, argv, pqparam, pblock) ! 40: struct sglobal *qglobal; ! 41: int argc; ! 42: char **argv; ! 43: struct uuconf_proto_param **pqparam; ! 44: pointer pblock; ! 45: { ! 46: struct uuconf_proto_param *q; ! 47: size_t c; ! 48: struct uuconf_proto_param_entry *qentry; ! 49: ! 50: if (argc < 2) ! 51: return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT; ! 52: ! 53: /* The first argument is the protocol character. */ ! 54: if (argv[0][1] != '\0') ! 55: return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT; ! 56: ! 57: if (*pqparam == NULL) ! 58: { ! 59: *pqparam = ((struct uuconf_proto_param *) ! 60: uuconf_malloc (pblock, ! 61: 2 * sizeof (struct uuconf_proto_param))); ! 62: if (*pqparam == NULL) ! 63: { ! 64: qglobal->ierrno = errno; ! 65: return (UUCONF_MALLOC_FAILED ! 66: | UUCONF_ERROR_ERRNO ! 67: | UUCONF_CMDTABRET_EXIT); ! 68: } ! 69: (*pqparam)[1].uuconf_bproto = '\0'; ! 70: q = *pqparam; ! 71: q->uuconf_bproto = argv[0][0]; ! 72: q->uuconf_qentries = NULL; ! 73: } ! 74: else ! 75: { ! 76: c = 0; ! 77: for (q = *pqparam; q->uuconf_bproto != '\0'; q++) ! 78: { ! 79: if (q->uuconf_bproto == argv[0][0]) ! 80: break; ! 81: ++c; ! 82: } ! 83: ! 84: if (q->uuconf_bproto == '\0') ! 85: { ! 86: struct uuconf_proto_param *qnew; ! 87: ! 88: qnew = ((struct uuconf_proto_param *) ! 89: uuconf_malloc (pblock, ! 90: ((c + 2) ! 91: * sizeof (struct uuconf_proto_param)))); ! 92: if (qnew == NULL) ! 93: { ! 94: qglobal->ierrno = errno; ! 95: return (UUCONF_MALLOC_FAILED ! 96: | UUCONF_ERROR_ERRNO ! 97: | UUCONF_CMDTABRET_EXIT); ! 98: } ! 99: ! 100: memcpy ((pointer) qnew, (pointer) *pqparam, ! 101: c * sizeof (struct uuconf_proto_param)); ! 102: qnew[c + 1].uuconf_bproto = '\0'; ! 103: ! 104: uuconf_free (pblock, *pqparam); ! 105: *pqparam = qnew; ! 106: ! 107: q = qnew + c; ! 108: q->uuconf_bproto = argv[0][0]; ! 109: q->uuconf_qentries = NULL; ! 110: } ! 111: } ! 112: ! 113: if (q->uuconf_qentries == NULL) ! 114: { ! 115: qentry = ((struct uuconf_proto_param_entry *) ! 116: uuconf_malloc (pblock, ! 117: 2 * sizeof (struct uuconf_proto_param_entry))); ! 118: if (qentry == NULL) ! 119: { ! 120: qglobal->ierrno = errno; ! 121: return (UUCONF_MALLOC_FAILED ! 122: | UUCONF_ERROR_ERRNO ! 123: | UUCONF_CMDTABRET_EXIT); ! 124: } ! 125: ! 126: qentry[1].uuconf_cargs = 0; ! 127: q->uuconf_qentries = qentry; ! 128: } ! 129: else ! 130: { ! 131: struct uuconf_proto_param_entry *qnewent; ! 132: ! 133: c = 0; ! 134: for (qentry = q->uuconf_qentries; qentry->uuconf_cargs != 0; qentry++) ! 135: ++c; ! 136: ! 137: qnewent = ((struct uuconf_proto_param_entry *) ! 138: uuconf_malloc (pblock, ! 139: ((c + 2) * ! 140: sizeof (struct uuconf_proto_param_entry)))); ! 141: if (qnewent == NULL) ! 142: { ! 143: qglobal->ierrno = errno; ! 144: return (UUCONF_MALLOC_FAILED ! 145: | UUCONF_ERROR_ERRNO ! 146: | UUCONF_CMDTABRET_EXIT); ! 147: } ! 148: ! 149: memcpy ((pointer) qnewent, (pointer) q->uuconf_qentries, ! 150: c * sizeof (struct uuconf_proto_param_entry)); ! 151: qnewent[c + 1].uuconf_cargs = 0; ! 152: ! 153: uuconf_free (pblock, q->uuconf_qentries); ! 154: q->uuconf_qentries = qnewent; ! 155: ! 156: qentry = qnewent + c; ! 157: } ! 158: ! 159: qentry->uuconf_cargs = argc - 1; ! 160: qentry->uuconf_pzargs = (char **) uuconf_malloc (pblock, ! 161: ((argc - 1) ! 162: * sizeof (char *))); ! 163: if (qentry->uuconf_pzargs == NULL) ! 164: { ! 165: qglobal->ierrno = errno; ! 166: qentry->uuconf_cargs = 0; ! 167: return (UUCONF_MALLOC_FAILED ! 168: | UUCONF_ERROR_ERRNO ! 169: | UUCONF_CMDTABRET_EXIT); ! 170: } ! 171: memcpy ((pointer) qentry->uuconf_pzargs, (pointer) (argv + 1), ! 172: (argc - 1) * sizeof (char *)); ! 173: ! 174: return UUCONF_CMDTABRET_KEEP; ! 175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.