|
|
1.1 ! root 1: /* syssub.c ! 2: System information subroutines. ! 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_syssub_rcsid[] = "$Id: syssub.c,v 1.1 93/07/30 08:07:35 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: #include <errno.h> ! 33: ! 34: /* This macro operates on every string (char *) field in struct ! 35: uuconf_system. */ ! 36: #define SYSTEM_STRINGS(OP) \ ! 37: do \ ! 38: { \ ! 39: OP (uuconf_zname); \ ! 40: OP (uuconf_zalternate); \ ! 41: OP (uuconf_zdebug); \ ! 42: OP (uuconf_zmax_remote_debug); \ ! 43: OP (uuconf_zphone); \ ! 44: OP (uuconf_zcall_login); \ ! 45: OP (uuconf_zcall_password); \ ! 46: OP (uuconf_zcalled_login); \ ! 47: OP (uuconf_zprotocols); \ ! 48: OP (uuconf_zpubdir); \ ! 49: OP (uuconf_zlocalname); \ ! 50: } \ ! 51: while (0) ! 52: ! 53: /* This macro operates on every string array (char **) field in struct ! 54: uuconf_system. */ ! 55: #define SYSTEM_STRING_ARRAYS(OP) \ ! 56: do \ ! 57: { \ ! 58: OP (uuconf_pzalias); \ ! 59: OP (uuconf_pzlocal_send); \ ! 60: OP (uuconf_pzremote_send); \ ! 61: OP (uuconf_pzlocal_receive); \ ! 62: OP (uuconf_pzremote_receive); \ ! 63: OP (uuconf_pzpath); \ ! 64: OP (uuconf_pzcmds); \ ! 65: OP (uuconf_pzforward_from); \ ! 66: OP (uuconf_pzforward_to); \ ! 67: OP (uuconf_schat.uuconf_pzchat); \ ! 68: OP (uuconf_schat.uuconf_pzprogram); \ ! 69: OP (uuconf_schat.uuconf_pzfail); \ ! 70: OP (uuconf_scalled_chat.uuconf_pzchat); \ ! 71: OP (uuconf_scalled_chat.uuconf_pzprogram); \ ! 72: OP (uuconf_scalled_chat.uuconf_pzfail); \ ! 73: } \ ! 74: while (0) ! 75: ! 76: /* This macro operations on every timespan pointer (struct ! 77: uuconf_timespan *) in struct uuconf_system. */ ! 78: #define SYSTEM_TIMESPANS(OP) \ ! 79: do \ ! 80: { \ ! 81: OP (uuconf_qtimegrade); \ ! 82: OP (uuconf_qcalltimegrade); \ ! 83: OP (uuconf_qcall_local_size); \ ! 84: OP (uuconf_qcall_remote_size); \ ! 85: OP (uuconf_qcalled_local_size); \ ! 86: OP (uuconf_qcalled_remote_size); \ ! 87: } \ ! 88: while (0) ! 89: ! 90: /* This macro operates on every boolean value (of type int, although ! 91: some type int are not boolean) field in uuconf_system. */ ! 92: #define SYSTEM_BOOLEANS(OP) \ ! 93: do \ ! 94: { \ ! 95: OP (uuconf_fcall); \ ! 96: OP (uuconf_fcalled); \ ! 97: OP (uuconf_fcallback); \ ! 98: OP (uuconf_fsequence); \ ! 99: OP (uuconf_fsend_request); \ ! 100: OP (uuconf_frec_request); \ ! 101: OP (uuconf_fcall_transfer); \ ! 102: OP (uuconf_fcalled_transfer); \ ! 103: OP (uuconf_schat.uuconf_fstrip); \ ! 104: OP (uuconf_scalled_chat.uuconf_fstrip); \ ! 105: } \ ! 106: while (0) ! 107: ! 108: /* This macro operates on every generic integer (type int or long) in ! 109: uuconf_system. */ ! 110: #define SYSTEM_INTEGERS(OP) \ ! 111: do \ ! 112: { \ ! 113: OP (uuconf_cmax_retries); \ ! 114: OP (uuconf_csuccess_wait); \ ! 115: OP (uuconf_ibaud); \ ! 116: OP (uuconf_ihighbaud); \ ! 117: OP (uuconf_cfree_space); \ ! 118: OP (uuconf_schat.uuconf_ctimeout); \ ! 119: OP (uuconf_scalled_chat.uuconf_ctimeout); \ ! 120: } \ ! 121: while (0) ! 122: ! 123: /* There is no macro for uuconf_qalternate, uuconf_zport, ! 124: uuconf_qport, uuconf_qproto_params, or uuconf_palloc. */ ! 125: ! 126: /* Clear the contents of a struct uuconf_system. */ ! 127: ! 128: void ! 129: _uuconf_uclear_system (q) ! 130: struct uuconf_system *q; ! 131: { ! 132: #define CLEAR(x) q->x = (char *) &_uuconf_unset ! 133: SYSTEM_STRINGS (CLEAR); ! 134: #undef CLEAR ! 135: #define CLEAR(x) q->x = (char **) &_uuconf_unset ! 136: SYSTEM_STRING_ARRAYS (CLEAR); ! 137: #undef CLEAR ! 138: #define CLEAR(x) q->x = (struct uuconf_timespan *) &_uuconf_unset ! 139: SYSTEM_TIMESPANS (CLEAR); ! 140: #undef CLEAR ! 141: #define CLEAR(x) q->x = -1 ! 142: SYSTEM_BOOLEANS (CLEAR); ! 143: SYSTEM_INTEGERS (CLEAR); ! 144: #undef CLEAR ! 145: q->uuconf_qalternate = NULL; ! 146: q->uuconf_zport = (char *) &_uuconf_unset; ! 147: q->uuconf_qport = (struct uuconf_port *) &_uuconf_unset; ! 148: q->uuconf_qproto_params = (struct uuconf_proto_param *) &_uuconf_unset; ! 149: q->uuconf_palloc = NULL; ! 150: } ! 151: ! 152: /* Default the contents of one struct uuconf_system to the contents of ! 153: another. This default alternate by alternate. Any additional ! 154: alternates in q default to the last alternate of qdefault. If the ! 155: faddalternates arguments is TRUE, additional alternates or qdefault ! 156: are added to q; these alternates are copies of the first alternate ! 157: of q, and defaults are set from the additional alternates of ! 158: qdefault. */ ! 159: ! 160: int ! 161: _uuconf_isystem_default (qglobal, qset, qdefault, faddalternates) ! 162: struct sglobal *qglobal; ! 163: struct uuconf_system *qset; ! 164: struct uuconf_system *qdefault; ! 165: boolean faddalternates; ! 166: { ! 167: struct uuconf_system *qalt; ! 168: ! 169: if (qset->uuconf_palloc != qdefault->uuconf_palloc) ! 170: qset->uuconf_palloc = ! 171: _uuconf_pmalloc_block_merge (qset->uuconf_palloc, ! 172: qdefault->uuconf_palloc); ! 173: ! 174: /* If we are adding alternates from the default, make sure we have ! 175: at least as many alternates in qset as we do in qdefault. Each ! 176: new alternate we create gets initialized to the first alternate ! 177: of the system. */ ! 178: if (faddalternates) ! 179: { ! 180: struct uuconf_system **pq, *qdef; ! 181: ! 182: for (qdef = qdefault, pq = &qset; ! 183: qdef != NULL; ! 184: qdef = qdef->uuconf_qalternate, pq = &(*pq)->uuconf_qalternate) ! 185: { ! 186: if (*pq == NULL) ! 187: { ! 188: *pq = ((struct uuconf_system *) ! 189: uuconf_malloc (qset->uuconf_palloc, ! 190: sizeof (struct uuconf_system))); ! 191: if (*pq == NULL) ! 192: { ! 193: qglobal->ierrno = errno; ! 194: return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 195: } ! 196: **pq = *qset; ! 197: (*pq)->uuconf_qalternate = NULL; ! 198: } ! 199: } ! 200: } ! 201: ! 202: for (qalt = qset; qalt != NULL; qalt = qalt->uuconf_qalternate) ! 203: { ! 204: #define DEFAULT(x) \ ! 205: if (qalt->x == (char *) &_uuconf_unset) qalt->x = qdefault->x ! 206: SYSTEM_STRINGS (DEFAULT); ! 207: #undef DEFAULT ! 208: #define DEFAULT(x) \ ! 209: if (qalt->x == (char **) &_uuconf_unset) qalt->x = qdefault->x ! 210: SYSTEM_STRING_ARRAYS (DEFAULT); ! 211: #undef DEFAULT ! 212: #define DEFAULT(x) \ ! 213: if (qalt->x == (struct uuconf_timespan *) &_uuconf_unset) \ ! 214: qalt->x = qdefault->x ! 215: SYSTEM_TIMESPANS (DEFAULT); ! 216: #undef DEFAULT ! 217: #define DEFAULT(x) if (qalt->x < 0) qalt->x = qdefault->x ! 218: SYSTEM_BOOLEANS (DEFAULT); ! 219: SYSTEM_INTEGERS (DEFAULT); ! 220: #undef DEFAULT ! 221: ! 222: /* We only copy over zport if both zport and qport are NULL, ! 223: because otherwise a default zport would override a specific ! 224: qport. */ ! 225: if (qalt->uuconf_zport == (char *) &_uuconf_unset ! 226: && qalt->uuconf_qport == (struct uuconf_port *) &_uuconf_unset) ! 227: qalt->uuconf_zport = qdefault->uuconf_zport; ! 228: if (qalt->uuconf_qport == (struct uuconf_port *) &_uuconf_unset) ! 229: qalt->uuconf_qport = qdefault->uuconf_qport; ! 230: ! 231: if (qalt->uuconf_qproto_params ! 232: == (struct uuconf_proto_param *) &_uuconf_unset) ! 233: qalt->uuconf_qproto_params = qdefault->uuconf_qproto_params; ! 234: ! 235: if (qdefault->uuconf_qalternate != NULL) ! 236: qdefault = qdefault->uuconf_qalternate; ! 237: } ! 238: ! 239: return UUCONF_SUCCESS; ! 240: } ! 241: ! 242: /* Put in the basic defaults. This ensures that the fields are valid ! 243: on every uuconf_system structure. */ ! 244: ! 245: int ! 246: _uuconf_isystem_basic_default (qglobal, q) ! 247: struct sglobal *qglobal; ! 248: register struct uuconf_system *q; ! 249: { ! 250: int iret; ! 251: ! 252: iret = UUCONF_SUCCESS; ! 253: ! 254: for (; q != NULL && iret == UUCONF_SUCCESS; q = q->uuconf_qalternate) ! 255: { ! 256: /* The default of 26 allowable retries is traditional. */ ! 257: if (q->uuconf_cmax_retries < 0) ! 258: q->uuconf_cmax_retries = 26; ! 259: if (q->uuconf_schat.uuconf_pzchat == (char **) &_uuconf_unset) ! 260: { ! 261: q->uuconf_schat.uuconf_pzchat = NULL; ! 262: iret = _uuconf_iadd_string (qglobal, (char *) "\"\"", FALSE, ! 263: FALSE, ! 264: &q->uuconf_schat.uuconf_pzchat, ! 265: q->uuconf_palloc); ! 266: if (iret != UUCONF_SUCCESS) ! 267: return iret; ! 268: iret = _uuconf_iadd_string (qglobal, (char *) "\\r\\c", FALSE, ! 269: FALSE, ! 270: &q->uuconf_schat.uuconf_pzchat, ! 271: q->uuconf_palloc); ! 272: if (iret != UUCONF_SUCCESS) ! 273: return iret; ! 274: iret = _uuconf_iadd_string (qglobal, (char *) "ogin:", FALSE, ! 275: FALSE, ! 276: &q->uuconf_schat.uuconf_pzchat, ! 277: q->uuconf_palloc); ! 278: if (iret != UUCONF_SUCCESS) ! 279: return iret; ! 280: iret = _uuconf_iadd_string (qglobal, (char *) "-BREAK", FALSE, ! 281: FALSE, ! 282: &q->uuconf_schat.uuconf_pzchat, ! 283: q->uuconf_palloc); ! 284: if (iret != UUCONF_SUCCESS) ! 285: return iret; ! 286: iret = _uuconf_iadd_string (qglobal, (char *) "-ogin:", FALSE, ! 287: FALSE, ! 288: &q->uuconf_schat.uuconf_pzchat, ! 289: q->uuconf_palloc); ! 290: if (iret != UUCONF_SUCCESS) ! 291: return iret; ! 292: iret = _uuconf_iadd_string (qglobal, (char *) "-BREAK", FALSE, ! 293: FALSE, ! 294: &q->uuconf_schat.uuconf_pzchat, ! 295: q->uuconf_palloc); ! 296: if (iret != UUCONF_SUCCESS) ! 297: return iret; ! 298: iret = _uuconf_iadd_string (qglobal, (char *) "-ogin:", FALSE, ! 299: FALSE, ! 300: &q->uuconf_schat.uuconf_pzchat, ! 301: q->uuconf_palloc); ! 302: if (iret != UUCONF_SUCCESS) ! 303: return iret; ! 304: iret = _uuconf_iadd_string (qglobal, (char *) "\\L", FALSE, ! 305: FALSE, ! 306: &q->uuconf_schat.uuconf_pzchat, ! 307: q->uuconf_palloc); ! 308: if (iret != UUCONF_SUCCESS) ! 309: return iret; ! 310: iret = _uuconf_iadd_string (qglobal, (char *) "word:", FALSE, ! 311: FALSE, ! 312: &q->uuconf_schat.uuconf_pzchat, ! 313: q->uuconf_palloc); ! 314: if (iret != UUCONF_SUCCESS) ! 315: return iret; ! 316: iret = _uuconf_iadd_string (qglobal, (char *) "\\P", FALSE, ! 317: FALSE, ! 318: &q->uuconf_schat.uuconf_pzchat, ! 319: q->uuconf_palloc); ! 320: if (iret != UUCONF_SUCCESS) ! 321: return iret; ! 322: } ! 323: if (q->uuconf_schat.uuconf_ctimeout < 0) ! 324: q->uuconf_schat.uuconf_ctimeout = 10; ! 325: if (q->uuconf_schat.uuconf_fstrip < 0) ! 326: q->uuconf_schat.uuconf_fstrip = TRUE; ! 327: if (q->uuconf_scalled_chat.uuconf_ctimeout < 0) ! 328: q->uuconf_scalled_chat.uuconf_ctimeout = 60; ! 329: if (q->uuconf_scalled_chat.uuconf_fstrip < 0) ! 330: q->uuconf_scalled_chat.uuconf_fstrip = TRUE; ! 331: if (q->uuconf_fsend_request < 0) ! 332: q->uuconf_fsend_request = TRUE; ! 333: if (q->uuconf_frec_request < 0) ! 334: q->uuconf_frec_request = TRUE; ! 335: if (q->uuconf_fcall_transfer < 0) ! 336: q->uuconf_fcall_transfer = TRUE; ! 337: if (q->uuconf_fcalled_transfer < 0) ! 338: q->uuconf_fcalled_transfer = TRUE; ! 339: if (q->uuconf_pzlocal_send == (char **) &_uuconf_unset) ! 340: { ! 341: q->uuconf_pzlocal_send = NULL; ! 342: iret = _uuconf_iadd_string (qglobal, (char *) ZROOTDIR, FALSE, ! 343: FALSE, &q->uuconf_pzlocal_send, ! 344: q->uuconf_palloc); ! 345: if (iret != UUCONF_SUCCESS) ! 346: return iret; ! 347: } ! 348: if (q->uuconf_pzremote_send == (char **) &_uuconf_unset) ! 349: { ! 350: q->uuconf_pzremote_send = NULL; ! 351: iret = _uuconf_iadd_string (qglobal, (char *) "~", FALSE, FALSE, ! 352: &q->uuconf_pzremote_send, ! 353: q->uuconf_palloc); ! 354: if (iret != UUCONF_SUCCESS) ! 355: return iret; ! 356: } ! 357: if (q->uuconf_pzlocal_receive == (char **) &_uuconf_unset) ! 358: { ! 359: q->uuconf_pzlocal_receive = NULL; ! 360: iret = _uuconf_iadd_string (qglobal, (char *) "~", FALSE, FALSE, ! 361: &q->uuconf_pzlocal_receive, ! 362: q->uuconf_palloc); ! 363: if (iret != UUCONF_SUCCESS) ! 364: return iret; ! 365: } ! 366: if (q->uuconf_pzremote_receive == (char **) &_uuconf_unset) ! 367: { ! 368: q->uuconf_pzremote_receive = NULL; ! 369: iret = _uuconf_iadd_string (qglobal, (char *) "~", FALSE, FALSE, ! 370: &q->uuconf_pzremote_receive, ! 371: q->uuconf_palloc); ! 372: if (iret != UUCONF_SUCCESS) ! 373: return iret; ! 374: } ! 375: ! 376: if (q->uuconf_pzpath == (char **) &_uuconf_unset) ! 377: { ! 378: char *zdup; ! 379: char **pz; ! 380: size_t csplit; ! 381: int c; ! 382: ! 383: zdup = (char *) uuconf_malloc (q->uuconf_palloc, sizeof CMDPATH); ! 384: if (zdup == NULL) ! 385: { ! 386: qglobal->ierrno = errno; ! 387: return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 388: } ! 389: ! 390: memcpy ((pointer) zdup, (pointer) CMDPATH, sizeof CMDPATH); ! 391: pz = NULL; ! 392: csplit = 0; ! 393: if ((c = _uuconf_istrsplit (zdup, '\0', &pz, &csplit)) < 0) ! 394: { ! 395: qglobal->ierrno = errno; ! 396: return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 397: } ! 398: q->uuconf_pzpath = (char **) uuconf_malloc (q->uuconf_palloc, ! 399: ((c + 1) ! 400: * sizeof (char *))); ! 401: if (q->uuconf_pzpath == NULL) ! 402: { ! 403: qglobal->ierrno = errno; ! 404: return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 405: } ! 406: memcpy ((pointer) q->uuconf_pzpath, (pointer) pz, ! 407: c * sizeof (char *)); ! 408: q->uuconf_pzpath[c] = NULL; ! 409: free ((pointer) pz); ! 410: } ! 411: ! 412: if (q->uuconf_pzcmds == (char **) &_uuconf_unset) ! 413: { ! 414: q->uuconf_pzcmds = ((char **) ! 415: uuconf_malloc (q->uuconf_palloc, ! 416: 3 * sizeof (const char *))); ! 417: if (q->uuconf_pzcmds == NULL) ! 418: { ! 419: qglobal->ierrno = errno; ! 420: return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 421: } ! 422: q->uuconf_pzcmds[0] = (char *) "rnews"; ! 423: q->uuconf_pzcmds[1] = (char *) "rmail"; ! 424: q->uuconf_pzcmds[2] = NULL; ! 425: } ! 426: ! 427: if (q->uuconf_cfree_space < 0) ! 428: q->uuconf_cfree_space = DEFAULT_FREE_SPACE; ! 429: ! 430: if (q->uuconf_zpubdir == (const char *) &_uuconf_unset) ! 431: q->uuconf_zpubdir = qglobal->qprocess->zpubdir; ! 432: ! 433: #define SET(x) if (q->x == (char *) &_uuconf_unset) q->x = NULL ! 434: SYSTEM_STRINGS(SET); ! 435: #undef SET ! 436: #define SET(x) if (q->x == (char **) &_uuconf_unset) q->x = NULL ! 437: SYSTEM_STRING_ARRAYS(SET); ! 438: #undef SET ! 439: #define SET(x) \ ! 440: if (q->x == (struct uuconf_timespan *) &_uuconf_unset) q->x = NULL ! 441: SYSTEM_TIMESPANS (SET); ! 442: #undef SET ! 443: #define SET(x) if (q->x < 0) q->x = 0 ! 444: SYSTEM_BOOLEANS (SET); ! 445: SYSTEM_INTEGERS (SET); ! 446: #undef SET ! 447: ! 448: if (q->uuconf_zport == (char *) &_uuconf_unset) ! 449: q->uuconf_zport = NULL; ! 450: if (q->uuconf_qport == (struct uuconf_port *) &_uuconf_unset) ! 451: q->uuconf_qport = NULL; ! 452: if (q->uuconf_qproto_params ! 453: == (struct uuconf_proto_param *) &_uuconf_unset) ! 454: q->uuconf_qproto_params = NULL; ! 455: } ! 456: ! 457: return iret; ! 458: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.