|
|
1.1 ! root 1: /* service.c - */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/quipu/RCS/service.c,v 7.1 90/03/15 11:19:10 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/quipu/RCS/service.c,v 7.1 90/03/15 11:19:10 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: service.c,v $ ! 12: * Revision 7.1 90/03/15 11:19:10 mrose ! 13: * quipu-sync ! 14: * ! 15: * Revision 7.0 89/11/23 22:18:06 mrose ! 16: * Release 6.0 ! 17: * ! 18: */ ! 19: ! 20: /* ! 21: * NOTICE ! 22: * ! 23: * Acquisition, use, and distribution of this module and related ! 24: * materials are subject to the restrictions of a license agreement. ! 25: * Consult the Preface in the User's Manual for the full terms of ! 26: * this agreement. ! 27: * ! 28: */ ! 29: ! 30: ! 31: #include "quipu/util.h" ! 32: #include "quipu/commonarg.h" ! 33: #include "quipu/dua.h" ! 34: #include "quipu/sequence.h" ! 35: ! 36: #define MAXSERV 20 ! 37: static char default_service [BUFSIZ] = { 0 }; ! 38: static char * serv_vec [MAXSERV]; ! 39: static int serv_argc; ! 40: static int default_serv_set = 0; ! 41: extern DN user_name; ! 42: extern int chase_flag; ! 43: static char do_shuffle; ! 44: int copy_flag; ! 45: extern struct certificate *my_certificate; ! 46: char * result_sequence = NULLCP; ! 47: struct dua_sequence * current_sequence = NULL_DS; ! 48: struct dua_sequence * top_sequence = NULL_DS; ! 49: ! 50: ! 51: set_default_service (opt) ! 52: PS opt; ! 53: { ! 54: if (default_service [0] == 0) { ! 55: serv_argc = 0; ! 56: return (OK); ! 57: } ! 58: ! 59: if ((serv_argc = sstr2arg (default_service, MAXSERV, serv_vec, " \t")) == -1) { ! 60: ps_print (opt,"Invalid default service controls"); ! 61: return (NOTOK); ! 62: } else { ! 63: default_serv_set = 1; ! 64: return (OK); ! 65: } ! 66: } ! 67: ! 68: int get_default_service (ca) ! 69: CommonArgs * ca; ! 70: { ! 71: PS opt; ! 72: char buffer [LINESIZE]; ! 73: extern int sizelimit; ! 74: extern int timelimit; ! 75: static CommonArgs sca = default_common_args; ! 76: ! 77: *ca = sca; /* struct copy */ ! 78: ca->ca_servicecontrol.svc_sizelimit = sizelimit; ! 79: ca->ca_servicecontrol.svc_timelimit = timelimit; ! 80: ! 81: if ((opt = ps_alloc (str_open)) == NULLPS) { ! 82: (void) fprintf (stderr,"ps_alloc error\n"); ! 83: return (NOTOK); ! 84: } ! 85: ! 86: if (str_setup (opt, buffer, LINESIZE, 1) == NOTOK) { ! 87: (void) fprintf (stderr,"ps_setup error\n"); ! 88: return (NOTOK); ! 89: } ! 90: ! 91: if (! default_serv_set) ! 92: if (set_default_service (opt) != OK) { ! 93: (void) fprintf (stderr,"error (1) - %s\n",buffer); ! 94: ps_free (opt); ! 95: return (NOTOK); ! 96: ! 97: } ! 98: ! 99: do_shuffle = FALSE; ! 100: ! 101: if (do_service_control (opt,serv_argc, serv_vec, ca) < 0) { ! 102: (void) fprintf (stderr,"error (2) - %s\n",buffer); ! 103: ps_free (opt); ! 104: return (NOTOK); ! 105: } ! 106: ! 107: ps_free (opt); ! 108: return (OK); ! 109: ! 110: } ! 111: ! 112: int service_control (opt,argc, argv, ca) ! 113: PS opt; ! 114: int argc; ! 115: char **argv; ! 116: CommonArgs *ca; ! 117: { ! 118: ! 119: if (get_default_service (ca) != OK) { ! 120: ps_print (opt,"default service error - check quipurc\n"); ! 121: return (-1); ! 122: } ! 123: do_shuffle = TRUE; ! 124: return (do_service_control (opt,argc, argv, ca)); ! 125: } ! 126: ! 127: int do_service_control (opt,argc, argv, ca) ! 128: PS opt; ! 129: int argc; ! 130: char **argv; ! 131: CommonArgs *ca; ! 132: { ! 133: ! 134: ServiceControl *sc; ! 135: int shuffle_up (); ! 136: int x; ! 137: char shuffle; ! 138: ! 139: sc = &(ca->ca_servicecontrol); ! 140: copy_flag = TRUE; ! 141: ! 142: for (x = 0; x < argc; x++) { ! 143: shuffle = do_shuffle; ! 144: ! 145: if (test_arg (argv[x], "-preferchain",3)) ! 146: sc->svc_options |= SVC_OPT_PREFERCHAIN; ! 147: else if (test_arg (argv[x], "-nopreferchain",5)) ! 148: sc->svc_options &= ~SVC_OPT_PREFERCHAIN; ! 149: ! 150: else if (test_arg (argv[x], "-localscope",3)) ! 151: sc->svc_options |= SVC_OPT_LOCALSCOPE; ! 152: else if (test_arg (argv[x], "-nolocalscope",3)) ! 153: sc->svc_options &= (~SVC_OPT_LOCALSCOPE); ! 154: ! 155: else if (test_arg (argv[x], "-dontusecopy",5)) { ! 156: copy_flag = FALSE; ! 157: sc->svc_options |= SVC_OPT_DONTUSECOPY; ! 158: } else if (test_arg (argv[x], "-usecopy",1)) { ! 159: copy_flag = TRUE; ! 160: sc->svc_options &= (~SVC_OPT_DONTUSECOPY); ! 161: } ! 162: ! 163: else if (test_arg (argv[x], "-dontdereferencealias",5)) ! 164: sc->svc_options |= SVC_OPT_DONTDEREFERENCEALIAS; ! 165: else if (test_arg (argv[x], "-dereferencealias",3)) ! 166: sc->svc_options &= (~SVC_OPT_DONTDEREFERENCEALIAS); ! 167: ! 168: else if (test_arg (argv[x], "-low",3)) ! 169: sc->svc_prio = SVC_PRIO_LOW; ! 170: else if (test_arg (argv[x], "-medium",2)) ! 171: sc->svc_prio = SVC_PRIO_MED; ! 172: else if (test_arg (argv[x], "-high",1)) ! 173: sc->svc_prio = SVC_PRIO_HIGH; ! 174: ! 175: else if (test_arg (argv[x], "-timelimit",2)) { ! 176: if (x + 1 == argc) { ! 177: ps_printf (opt, "We need a number for timelimit.\n"); ! 178: return (-1); ! 179: } else { ! 180: if (shuffle) ! 181: shuffle_up (argc--, argv, x); ! 182: else ! 183: x++; ! 184: ! 185: if ((sc->svc_timelimit = atoi (argv[x])) < -1) { ! 186: ps_printf (opt, "We need a posative number for timelimit.\n"); ! 187: return (-1); ! 188: } ! 189: } ! 190: } else if (test_arg (argv[x], "-notimelimit",4)) ! 191: sc->svc_timelimit = -1; ! 192: ! 193: else if (test_arg (argv[x], "-sizelimit",3)) { ! 194: if (x + 1 == argc) { ! 195: ps_printf (opt, "We need a number for sizelimit.\n"); ! 196: return (-1); ! 197: } else { ! 198: if (shuffle) ! 199: shuffle_up (argc--, argv, x); ! 200: else ! 201: x++; ! 202: ! 203: if ((sc->svc_sizelimit = atoi (argv[x])) < -1) { ! 204: ps_printf (opt, "We need a posative number for sizelimit.\n"); ! 205: return (-1); ! 206: } ! 207: } ! 208: } else if (test_arg (argv[x], "-nosizelimit",4)) ! 209: sc->svc_sizelimit = -1; ! 210: ! 211: else if (test_arg (argv[x], "-nochaining",4)) ! 212: sc->svc_options |= SVC_OPT_CHAININGPROHIBIT; ! 213: else if (test_arg (argv[x], "-chaining",3)) ! 214: sc->svc_options &= (~SVC_OPT_CHAININGPROHIBIT); ! 215: ! 216: else if (test_arg (argv[x], "-norefer",5)) ! 217: chase_flag = 1; ! 218: else if (test_arg (argv[x], "-refer",3)) ! 219: chase_flag = 2; ! 220: ! 221: else if (test_arg(argv[x], "-strong", 3)) { ! 222: char *new_version(); ! 223: struct certificate *cert_cpy(); ! 224: ! 225: ca->ca_security = (struct security_parms *) ! 226: calloc(1, sizeof(struct security_parms)); ! 227: ca->ca_security->sp_name = NULLDN; ! 228: ca->ca_security->sp_time = new_version(); ! 229: ca->ca_security->sp_target = '\0'; ! 230: if (my_certificate != (struct certificate *) 0) { ! 231: ca->ca_security->sp_path = ! 232: (struct certificate_list *) ! 233: calloc(1, sizeof(struct certificate_list)); ! 234: if (ca->ca_security->sp_path != ! 235: (struct certificate_list *) 0) { ! 236: ca->ca_security->sp_path->next = ! 237: (struct certificate_list *) 0; ! 238: ca->ca_security->sp_path->superior = ! 239: (struct certificate_list *) 0; ! 240: ca->ca_security->sp_path->cert = ! 241: cert_cpy(my_certificate); ! 242: ca->ca_security->sp_path->reverse = ! 243: (struct certificate *) 0; ! 244: } ! 245: } ! 246: } ! 247: ! 248: else if (test_arg (argv[x], "-sequence",3)) { ! 249: if (x + 1 == argc) { ! 250: ps_printf (opt, "We need a sequence name.\n"); ! 251: return (-1); ! 252: } else { ! 253: if (shuffle) ! 254: shuffle_up (argc--, argv, x); ! 255: else ! 256: x++; ! 257: if (lexequ (argv[x],"result") == 0) { ! 258: if (x + 1 == argc) { ! 259: ps_printf (opt, "We need a result sequence name.\n"); ! 260: return (-1); ! 261: } ! 262: if (shuffle) ! 263: shuffle_up (argc--, argv, x); ! 264: else ! 265: x++; ! 266: result_sequence = strdup (argv[x]); ! 267: } else ! 268: set_sequence (argv[x]); ! 269: } ! 270: } else if (test_arg (argv[x], "-nosequence",5)) ! 271: unset_sequence(); ! 272: ! 273: else if (do_shuffle) ! 274: shuffle = FALSE; ! 275: else { ! 276: ps_printf (opt,"unknown service option %s\n",argv[x]); ! 277: return (-1); ! 278: } ! 279: ! 280: if (shuffle) ! 281: shuffle_up (argc--, argv, x--); ! 282: } ! 283: ! 284: return (argc); ! 285: } ! 286: ! 287: shuffle_up (argc, argv, start) ! 288: register int argc; ! 289: char **argv; ! 290: register int start; ! 291: { ! 292: register int x; ! 293: ! 294: for (x = start; x < argc; x++) ! 295: if (x == argc - 1) /* if it is the last one, then stick ! 296: * a 0 in */ ! 297: argv[x] = 0; ! 298: else /* oterwise put the next one in it's place. */ ! 299: argv[x] = argv[x + 1]; ! 300: } ! 301: ! 302: new_service (ptr) ! 303: char * ptr; ! 304: { ! 305: ! 306: if (ptr != 0) { ! 307: if (*default_service != 0) ! 308: (void) strcat (default_service," "); ! 309: (void) strcat (default_service,ptr); ! 310: } ! 311: } ! 312: ! 313: set_sequence (str) ! 314: char * str; ! 315: { ! 316: struct dua_sequence *ptr; ! 317: ! 318: if (lexequ (str,"reset") == 0) { ! 319: if (current_sequence == NULL_DS) ! 320: return; ! 321: current_sequence->ds_data = NULL_DE; ! 322: current_sequence->ds_last = NULL_DE; ! 323: return; ! 324: } ! 325: ! 326: for (ptr = top_sequence; ptr != NULL_DS; ptr=ptr->ds_next) ! 327: if (lexequ (ptr->ds_name,str) == 0) { ! 328: current_sequence = ptr; ! 329: return; ! 330: } ! 331: ! 332: ptr = ds_alloc(); ! 333: ptr->ds_name = strdup (str); ! 334: ptr->ds_data = NULL_DE; ! 335: ptr->ds_last = NULL_DE; ! 336: ptr->ds_next = top_sequence; ! 337: top_sequence = ptr; ! 338: current_sequence = ptr; ! 339: } ! 340: ! 341: unset_sequence () ! 342: { ! 343: current_sequence = NULL_DS; ! 344: } ! 345: ! 346: add_sequence (adn) ! 347: DN adn; ! 348: { ! 349: struct dua_seq_entry * ptr; ! 350: register int x=1; ! 351: ! 352: if (current_sequence == NULL_DS) ! 353: return (0); ! 354: ! 355: for (ptr=current_sequence->ds_data; ptr != NULL_DE; ptr=ptr->de_next,x++) ! 356: if (dn_cmp (adn,ptr->de_name) == 0) ! 357: return (x); ! 358: ! 359: ptr = de_alloc(); ! 360: ptr->de_name = dn_cpy (adn); ! 361: ptr->de_next = NULL_DE; ! 362: if (current_sequence->ds_data == NULL_DE) ! 363: current_sequence->ds_data = ptr; ! 364: else ! 365: current_sequence->ds_last->de_next = ptr; ! 366: current_sequence->ds_last = ptr; ! 367: ! 368: return (x); ! 369: } ! 370: ! 371: DN sequence_dn(y) ! 372: int y; ! 373: { ! 374: struct dua_seq_entry * ptr; ! 375: register int x = 1; ! 376: ! 377: if (current_sequence == NULL_DS) ! 378: return (NULLDN); ! 379: ! 380: for (ptr=current_sequence->ds_data; ! 381: (ptr != NULL_DE) && (x<y); ! 382: ptr=ptr->de_next,x++) ! 383: ; ! 384: ! 385: if (ptr == NULL_DE) ! 386: return (NULLDN); ! 387: if ( x == y ) ! 388: return (ptr->de_name); ! 389: return (NULLDN); ! 390: ! 391: } ! 392: ! 393: ! 394: show_sequence (RPS,str) ! 395: PS RPS; ! 396: char * str; ! 397: { ! 398: struct dua_seq_entry * ptr; ! 399: register int x = 1; ! 400: ! 401: if (str != NULLCP) ! 402: set_sequence (str); ! 403: ! 404: if (current_sequence == NULL_DS) { ! 405: ps_print (RPS,"No sequence set!\n"); ! 406: return; ! 407: } ! 408: ! 409: if (strcmp (current_sequence -> ds_name, "default")) ! 410: ps_printf (RPS,"Sequence %s contains:-\n", ! 411: current_sequence->ds_name); ! 412: ! 413: for (ptr=current_sequence->ds_data; ptr != NULL_DE; ptr=ptr->de_next, x++) { ! 414: ps_printf (RPS,"%-3d @",x); ! 415: dn_print (RPS,ptr->de_name,EDBOUT); ! 416: ps_print (RPS,"\n"); ! 417: } ! 418: } ! 419:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.