diff options
Diffstat (limited to 'clients/zctl/zctl.c')
-rw-r--r-- | clients/zctl/zctl.c | 1012 |
1 files changed, 500 insertions, 512 deletions
diff --git a/clients/zctl/zctl.c b/clients/zctl/zctl.c index 629f53c..e124b4a 100644 --- a/clients/zctl/zctl.c +++ b/clients/zctl/zctl.c @@ -3,8 +3,7 @@ * * Created by: Robert French * - * $Source$ - * $Author$ + * $Id$ * * Copyright (c) 1987,1988 by the Massachusetts Institute of Technology. * For copying and distribution information, see the file @@ -13,46 +12,50 @@ #include <sysdep.h> #include <zephyr/zephyr.h> -#ifdef HAVE_SS_SS_H #include <ss/ss.h> -#else -# ifdef HAVE_KRB5_SS_H -# include <krb5/ss.h> -# endif -#endif #include <com_err.h> #include <pwd.h> #include <netdb.h> -#include <errno.h> #ifndef lint static const char *rcsid_zctl_c = "$Id$"; #endif -#include "zutils.h" +#define SUBSATONCE 7 +#define SUB 0 +#define UNSUB 1 +#define LIST 2 #define USERS_SUBS "/.zephyr.subs" #define OLD_SUBS "/.subscriptions" +#define TOKEN_HOSTNAME "%host%" +#define TOKEN_CANONNAME "%canon%" +#define TOKEN_ME "%me%" +#define TOKEN_WILD "*" + +#define ALL 0 +#define UNSUBONLY 1 +#define SUBONLY 2 + #define ERR (-1) #define NOT_REMOVED 0 #define REMOVED 1 int purge_subs(); -void add_file(char *fn, char *galaxy, short wgport, ZSubscription_t *subs, - int mode); -void del_file(char *fn, char *galaxy, short wgport, ZSubscription_t *subs, - int mode); - int sci_idx; char subsname[BUFSIZ]; +char ourhost[MAXHOSTNAMELEN],ourhostcanon[MAXHOSTNAMELEN]; extern ss_request_table zctl_cmds; +void add_file(), del_file(), fix_macros(), fix_macros2(); + main(argc,argv) int argc; char *argv[]; { struct passwd *pwd; + struct hostent *hent; char ssline[BUFSIZ],oldsubsname[BUFSIZ],*envptr,*tty = NULL; int retval,code,i; #ifdef HAVE_SYS_UTSNAME @@ -98,6 +101,24 @@ main(argc,argv) } } +#ifdef HAVE_SYS_UTSNAME + uname(&name); + strcpy(ourhost, name.nodename); +#else + if (gethostname(ourhost,MAXHOSTNAMELEN) == -1) { + com_err(argv[0],errno,"while getting host name"); + exit (1); + } +#endif + + if (!(hent = gethostbyname(ourhost))) { + fprintf(stderr,"%s: Can't resolve hostname %s; %s may be " + "wrong in subscriptions",argv[0],ourhost, + TOKEN_CANONNAME); + strncpy(ourhostcanon,ourhost,sizeof(ourhostcanon)-1); + } else + strncpy(ourhostcanon,hent->h_name,sizeof(ourhostcanon)-1); + sci_idx = ss_create_invocation("zctl","",0,&zctl_cmds,&code); if (code) { ss_perror(sci_idx,code,"while creating invocation"); @@ -118,9 +139,9 @@ main(argc,argv) printf("ZCTL $Revision$ (Protocol %s%d.%d) - Type '?' for a list of commands.\n\n", ZVERSIONHDR, - ZVERSIONMAJOR,ZVERSIONMINOR_GALAXY); + ZVERSIONMAJOR,ZVERSIONMINOR); - code = ss_listen(sci_idx); + ss_listen(sci_idx); exit(0); } @@ -145,136 +166,113 @@ flush_locations(argc,argv) int argc; char *argv[]; { - int retval; - char *galaxy; - int cnt, i; + int retval; - if (argc > 2) { - fprintf(stderr,"Usage: %s [galaxy]\n",argv[0]); - return; - } - - galaxy = (argc > 1)?argv[1]:NULL; - - if (galaxy && strcmp(galaxy, "*") == 0) { - if (retval = ZGetGalaxyCount(&cnt)) { - ss_perror(sci_idx, retval, "while getting galaxy count"); - return; - } - - for (i=0; i<cnt; i++) { - if (retval = ZGetGalaxyName(i, &galaxy)) { - ss_perror(sci_idx, retval, "while getting galaxy name"); - return; - } - - if ((retval = ZFlushMyLocations(galaxy)) != ZERR_NONE) { - ss_perror(sci_idx, retval, "while flushing locations"); + if (argc > 1) { + fprintf(stderr,"Usage: %s\n",argv[0]); return; - } - } - } else { - if ((retval = ZFlushMyLocations(galaxy)) != ZERR_NONE) { - ss_perror(sci_idx, retval, "while flushing locations"); - return; } - } + + if ((retval = ZFlushMyLocations()) != ZERR_NONE) + ss_perror(sci_idx,retval,"while flushing locations"); } void wgc_control(argc,argv) int argc; - char *argv[]; + register char **argv; { - Code_t retval; + int retval; + short newport; + struct sockaddr_in newsin; + ZNotice_t notice; + + newsin = ZGetDestAddr(); if (argc > 1) { fprintf(stderr,"Usage: %s\n",argv[0]); return; } + + if ((newport = ZGetWGPort()) == -1) { + ss_perror(sci_idx,errno,"while getting WindowGram port"); + return; + } + + newsin.sin_port = (u_short) newport; + if ((retval = ZSetDestAddr(&newsin)) != ZERR_NONE) { + ss_perror(sci_idx,retval,"while setting destination address"); + return; + } - if (!strcmp(argv[0],"wg_read")) { - retval = send_wgc_control(USER_REREAD, NULL, 0); - } else if (!strcmp(argv[0],"wg_shutdown")) { - retval = send_wgc_control(USER_SHUTDOWN, NULL, 0); - } else if (!strcmp(argv[0],"wg_startup")) { - retval = send_wgc_control(USER_STARTUP, NULL, 0); - } else if (!strcmp(argv[0],"wg_exit")) { - retval = send_wgc_control(USER_EXIT, NULL, 0); - } else { + (void) memset((char *)¬ice, 0, sizeof(notice)); + notice.z_kind = UNSAFE; + notice.z_port = 0; + notice.z_class = WG_CTL_CLASS; + notice.z_class_inst = WG_CTL_USER; + + if (!strcmp(argv[0],"wg_read")) + notice.z_opcode = USER_REREAD; + if (!strcmp(argv[0],"wg_shutdown")) + notice.z_opcode = USER_SHUTDOWN; + if (!strcmp(argv[0],"wg_startup")) + notice.z_opcode = USER_STARTUP; + if (!strcmp(argv[0],"wg_exit")) + notice.z_opcode = USER_EXIT; + if (!notice.z_opcode) { fprintf(stderr, "unknown WindowGram client control command %s\n", argv[0]); return; } + notice.z_sender = 0; + notice.z_recipient = ""; + notice.z_default_format = ""; + notice.z_message_len = 0; - if (retval) - ss_perror(sci_idx, retval, - "while sending WindowGram control message"); -} + if ((retval = ZSendNotice(¬ice,ZNOAUTH)) != ZERR_NONE) + ss_perror(sci_idx,retval,"while sending notice"); + + if ((retval = ZInitialize()) != ZERR_NONE) + ss_perror(sci_idx,retval, + "while reinitializing"); +} void hm_control(argc,argv) int argc; char *argv[]; { - int retval; - ZNotice_t notice; - char *galaxy; - int cnt, i; - - if (argc > 2) { - fprintf(stderr,"Usage: %s [galaxy]\n",argv[0]); - return; - } - - galaxy = (argc > 1)?argv[1]:NULL; - - (void) memset((char *)¬ice, 0, sizeof(notice)); - notice.z_kind = HMCTL; - notice.z_port = 0; - notice.z_class = HM_CTL_CLASS; - notice.z_class_inst = HM_CTL_CLIENT; - - if (!strcmp(argv[0],"hm_flush")) - notice.z_opcode = CLIENT_FLUSH; - if (!strcmp(argv[0],"new_server")) - notice.z_opcode = CLIENT_NEW_SERVER; - if (!notice.z_opcode) { - fprintf(stderr, "unknown HostManager control command %s\n", - argv[0]); - return; - } - notice.z_sender = 0; - notice.z_recipient = ""; - notice.z_default_format = ""; - notice.z_message_len = 0; + int retval; + ZNotice_t notice; - if (galaxy && strcmp(galaxy, "*") == 0) { - if (retval = ZGetGalaxyCount(&cnt)) { - ss_perror(sci_idx, retval, "while getting galaxy count"); - return; + if (argc > 1) { + fprintf(stderr,"Usage: %s\n",argv[0]); + return; } - - for (i=0; i<cnt; i++) { - if (retval = ZGetGalaxyName(i, &galaxy)) { - ss_perror(sci_idx, retval, "while getting galaxy name"); + + (void) memset((char *)¬ice, 0, sizeof(notice)); + notice.z_kind = HMCTL; + notice.z_port = 0; + notice.z_class = HM_CTL_CLASS; + notice.z_class_inst = HM_CTL_CLIENT; + + if (!strcmp(argv[0],"hm_flush")) + notice.z_opcode = CLIENT_FLUSH; + if (!strcmp(argv[0],"new_server")) + notice.z_opcode = CLIENT_NEW_SERVER; + if (!notice.z_opcode) { + fprintf(stderr, "unknown HostManager control command %s\n", + argv[0]); return; - } - - notice.z_dest_galaxy = galaxy; + } + notice.z_sender = 0; + notice.z_recipient = ""; + notice.z_default_format = ""; + notice.z_message_len = 0; - if ((retval = ZSendNotice(¬ice,ZNOAUTH)) != ZERR_NONE) { + if ((retval = ZSendNotice(¬ice,ZNOAUTH)) != ZERR_NONE) ss_perror(sci_idx,retval,"while sending notice"); - return; - } - } - } else { - if ((retval = ZSendNotice(¬ice,ZNOAUTH)) != ZERR_NONE) { - ss_perror(sci_idx,retval,"while sending notice"); - return; - } - } } void @@ -304,55 +302,79 @@ set_var(argc,argv) int argc; register char **argv; { - int retval,setting_exp,i; - char *galaxy; - char varcat[BUFSIZ]; + int retval,setting_exp,i; + char *exp_level,*newargv[1]; + char varcat[BUFSIZ]; - if (argc < 2) { - fprintf(stderr,"Usage: %s <varname> [value]\n", - argv[0]); - return; - } - - setting_exp = 0; - - if (strncasecmp(argv[1],"exposure",8) == 0) { - setting_exp = 1; - if (argc != 3) { - fprintf(stderr, "An exposure setting must be specified.\n"); - return; - } - if (strlen(argv[1]) == 8) { - galaxy = NULL; /* the default */ - } else if ((strlen(argv[1]) == 9) || - (ZGetRhs(argv[1]+9) == NULL)) { - fprintf(stderr, "The exposure variable's galaxy name was empty or invalid.\nUse a variable of the form exposure-GALAXYNAME.\n"); - return; - } else { - galaxy = argv[1]+9; - } - } - - if (argc == 2) - retval = ZSetVariable(argv[1],""); - else { - (void) strcpy(varcat,argv[2]); - for (i=3;i<argc;i++) { - (void) strcat(varcat," "); - (void) strcat(varcat,argv[i]); + if (argc < 2) { + fprintf(stderr,"Usage: %s <varname> [value]\n", + argv[0]); + return; + } + + setting_exp = 0; + + if (!strcasecmp(argv[1],"exposure")) { + setting_exp = 1; + if (argc != 3) { + fprintf(stderr,"An exposure setting must be specified.\n"); + return; + } + exp_level = (char *)0; + if (!strcasecmp(argv[2],EXPOSE_NONE)) + exp_level = EXPOSE_NONE; + if (!strcasecmp(argv[2],EXPOSE_OPSTAFF)) + exp_level = EXPOSE_OPSTAFF; + if (!strcasecmp(argv[2],EXPOSE_REALMVIS)) + exp_level = EXPOSE_REALMVIS; + if (!strcasecmp(argv[2],EXPOSE_REALMANN)) + exp_level = EXPOSE_REALMANN; + if (!strcasecmp(argv[2],EXPOSE_NETVIS)) + exp_level = EXPOSE_NETVIS; + if (!strcasecmp(argv[2],EXPOSE_NETANN)) + exp_level = EXPOSE_NETANN; + if (!exp_level) { + fprintf(stderr,"The exposure setting must be one of:\n"); + fprintf(stderr,"%s, %s, %s, %s, %s, %s.\n", + EXPOSE_NONE, + EXPOSE_OPSTAFF, + EXPOSE_REALMVIS, + EXPOSE_REALMANN, + EXPOSE_NETVIS, + EXPOSE_NETANN); + return; + } + } + if (argc == 2) + retval = ZSetVariable(argv[1],""); + else { + (void) strcpy(varcat,argv[2]); + for (i=3;i<argc;i++) { + (void) strcat(varcat," "); + (void) strcat(varcat,argv[i]); + } + retval = ZSetVariable(argv[1],varcat); } - retval = ZSetVariable(argv[1],varcat); - } - if (retval != ZERR_NONE) { - ss_perror(sci_idx,retval,"while setting variable value"); - return; - } + if (retval != ZERR_NONE) { + ss_perror(sci_idx,retval,"while setting variable value"); + return; + } - /* Side-effects? Naw, us? */ + /* Side-effects? Naw, us? */ - if (setting_exp) - set_exposure(galaxy?galaxy:"*", argv[2]); + if (setting_exp) { + if ((retval = ZSetLocation(exp_level)) != ZERR_NONE) + ss_perror(sci_idx,retval,"while changing exposure status"); + if (!strcmp(exp_level,EXPOSE_NONE)) { + newargv[0] = "wg_shutdown"; + wgc_control(1,newargv); + } else { + newargv[0] = "wg_startup"; + wgc_control(1,newargv); + } + return; + } } void @@ -360,32 +382,20 @@ do_hide(argc,argv) int argc; char *argv[]; { - char *exp_level; - char *galaxy; - int cnt, i; - Code_t code; + char *exp_level = NULL; + Code_t retval; - if (argc > 2) { - fprintf(stderr, "Usage: %s [galaxy]\n",argv[0]); - return; - } - - if (strcmp(argv[0], "unhide") == 0) { - exp_level = ZGetVariable("exposure"); - if (exp_level) - exp_level = ZParseExposureLevel(exp_level); - if (!exp_level) - exp_level = EXPOSE_REALMVIS; - } else { - exp_level = EXPOSE_OPSTAFF; - } - - galaxy = (argc > 1)?argv[1]:NULL; - - if (code = set_exposure(galaxy, exp_level)) { - ss_perror(sci_idx, code, "while setting exposures"); + if (argc != 1) { + fprintf(stderr, "Usage: %s\n",argv[0]); + return; + } + if (!strcmp(argv[0],"unhide")) + exp_level = EXPOSE_REALMVIS; + else + exp_level = EXPOSE_OPSTAFF; + if ((retval = ZSetLocation(exp_level)) != ZERR_NONE) + ss_perror(sci_idx,retval,"while changing exposure status"); return; - } } void @@ -406,54 +416,26 @@ unset_var(argc,argv) ss_perror(sci_idx,retval, "while unsetting variable value"); } - + void cancel_subs(argc,argv) int argc; char *argv[]; { - int retval; - short wgport; - int i, cnt; - char *galaxy; - - if (argc > 2) { - fprintf(stderr,"Usage: %s [galaxy]\n",argv[0]); - return; - } - - if ((wgport = ZGetWGPort()) == -1) { - ss_perror(sci_idx,errno,"while finding WindowGram port"); - return; - } - - galaxy = (argc > 1)?argv[1]:NULL; - - if (galaxy && strcmp(galaxy, "*") == 0) { - if (retval = ZGetGalaxyCount(&cnt)) { - ss_perror(sci_idx, retval, "while getting galaxy count"); - return; - } + int retval; + short wgport; - for (i=0; i<cnt; i++) { - if (retval = ZGetGalaxyName(i, &galaxy)) { - ss_perror(sci_idx, retval, "while getting galaxy name"); + if (argc != 1) { + fprintf(stderr,"Usage: %s\n",argv[0]); return; - } + } - if ((retval = ZCancelSubscriptions(galaxy, (u_short)wgport)) - != ZERR_NONE) { - ss_perror(sci_idx,retval,"while cancelling subscriptions"); + if ((wgport = ZGetWGPort()) == -1) { + ss_perror(sci_idx,errno,"while finding WindowGram port"); return; - } - } - } else { - if ((retval = ZCancelSubscriptions(galaxy, (u_short)wgport)) - != ZERR_NONE) { - ss_perror(sci_idx,retval,"while cancelling subscriptions"); - return; - } - } + } + if ((retval = ZCancelSubscriptions((u_short)wgport)) != ZERR_NONE) + ss_perror(sci_idx,retval,"while cancelling subscriptions"); } void @@ -464,35 +446,15 @@ subscribe(argc,argv) int retval; short wgport; ZSubscription_t sub,sub2; - char *galaxy; - int mode; - if (argc > 5 || argc < 3) { - fprintf(stderr,"Usage: %s class instance [* [galaxy]]\n", - argv[0]); + if (argc > 4 || argc < 3) { + fprintf(stderr,"Usage: %s class instance [*]\n",argv[0]); return; } - if (strncmp(argv[0], "sub", 3) == 0) { - mode = SUB; - } else if (strncmp(argv[0], "unsub", 5) == 0) { - mode = UNSUB; - } else if ((strncmp(argv[0], "punt", 4) == 0) || - (strncmp(argv[0], "sup", 3) == 0)) { - mode = PUNT; - } else if ((strncmp(argv[0], "unpunt", 6) == 0) || - (strncmp(argv[0], "unsup", 5) == 0)) { - mode = UNPUNT; - } else { - ss_perror(sci_idx, 0, "internal error in subscribe"); - exit(1); - } - sub.zsub_class = argv[1]; sub.zsub_classinst = argv[2]; - sub.zsub_recipient = (argc > 3)?argv[3]: - (((mode == PUNT) || (mode == UNPUNT))?"":ZGetSender()); - galaxy = (argc > 4)?argv[4]:NULL; + sub.zsub_recipient = (argc == 3)?ZGetSender():argv[3]; fix_macros(&sub,&sub2,1); @@ -501,26 +463,12 @@ subscribe(argc,argv) return; } - switch (mode) { - case SUB: - if (retval = ZSubscribeTo(galaxy, &sub2, 1, (u_short) wgport)) - ss_perror(sci_idx, retval, "while subscribing"); - break; - case UNSUB: - if (retval = ZUnsubscribeTo(galaxy, &sub2, 1, (u_short) wgport)) - ss_perror(sci_idx, retval, "while subscribing"); - break; - case PUNT: - if (retval = xpunt(sub2.zsub_class, sub2.zsub_classinst, - sub2.zsub_recipient, PUNT)) - ss_perror(sci_idx, retval, "while suppressing"); - break; - case UNPUNT: - if (retval = xpunt(sub2.zsub_class, sub2.zsub_classinst, - sub2.zsub_recipient, UNPUNT)) - ss_perror(sci_idx, retval, "while unsuppressing"); - break; - } + retval = (*argv[0] == 's') ? + ZSubscribeToSansDefaults(&sub2,1,(u_short)wgport) : + ZUnsubscribeTo(&sub2,1,(u_short)wgport); + + if (retval != ZERR_NONE) + ss_perror(sci_idx,retval,"while subscribing"); } void @@ -530,145 +478,69 @@ sub_file(argc,argv) { ZSubscription_t sub; short wgport; - char fn[MAXPATHLEN]; - char *arggalaxy, *galaxy; - int cnt, i; - Code_t retval; - int del, mode; - if (argc > 5 || argc < 3) { - fprintf(stderr,"Usage: %s class instance [* [galaxy]]\n", - argv[0]); + if (argc > 4 || argc < 3) { + fprintf(stderr,"Usage: %s class instance [*]\n",argv[0]); return; } - if (!strcmp(argv[0],"add")) { - del = 0; - mode = SUB; - } else if (!strcmp(argv[0],"add_unsubscription") || - !strcmp(argv[0],"add_un")) { - del = 0; - mode = UNSUB; - } else if (!strcmp(argv[0],"add_suppression") || - !strcmp(argv[0],"add_punt")) { - del = 0; - mode = PUNT; - } else if (!strcmp(argv[0],"delete") || - !strcmp(argv[0],"del") || - !strcmp(argv[0],"dl")) { - del = 1; - mode = SUB; - } else if (!strcmp(argv[0],"delete_unsubscription") || - !strcmp(argv[0],"del_un")) { - del = 1; - mode = UNSUB; - } else if (!strcmp(argv[0],"delete_suppression") || - !strcmp(argv[0],"del_punt")) { - del = 1; - mode = PUNT; - } else { - ss_perror(sci_idx,0,"unknown command name"); - } - if (argv[1][0] == '!') { - ss_perror(sci_idx,0, (mode == UNSUB)? + ss_perror(sci_idx,0, + (!strcmp(argv[0],"add_unsubscription") || + !strcmp(argv[0],"add_un") || + !strcmp(argv[0],"delete_unsubscription") || + !strcmp(argv[0],"del_un")) ? "Do not use `!' as the first character of a class.\n\tIt is automatically added before modifying the subscription file." : "Do not use `!' as the first character of a class.\n\tIt is reserved for internal use with un-subscriptions."); return; - } else if (argv[1][0] == '-') { - ss_perror(sci_idx,0, (mode == PUNT)? - "Do not use `-' as the first character of a class.\n\tIt is automatically added before modifying the subscription file." : - "Do not use `-' as the first character of a class.\n\tIt is reserved for internal use with suppressions."); - return; } - sub.zsub_class = argv[1]; sub.zsub_classinst = argv[2]; - sub.zsub_recipient = (argc > 3)?argv[3]: - (((mode == PUNT) || (mode == UNPUNT))?"":TOKEN_ME); - arggalaxy = (argc > 4)?argv[4]:NULL; + sub.zsub_recipient = (argc == 3)?TOKEN_ME:argv[3]; - if (arggalaxy) { - if (retval = ZGetGalaxyCount(&cnt)) { - ss_perror(sci_idx, retval, "while getting galaxy count"); + if (make_exist(subsname)) return; - } - - for (i=0; i<cnt; i++) { - if (retval = ZGetGalaxyName(i, &galaxy)) { - ss_perror(sci_idx, retval, "while getting galaxy name"); - return; - } - - if (strcasecmp(galaxy, arggalaxy) == 0) - break; - } - - if (i == cnt) { - ss_perror(sci_idx, 0, - "unknown galaxy specified while modifying subscripion file"); - return; - } - } else { - galaxy = ZGetDefaultGalaxy(); - } - if ((wgport = ZGetWGPort()) == -1) { ss_perror(sci_idx,errno,"while finding WindowGram port"); return; } - strcpy(fn, subsname); - strcat(fn, "-"); - strcat(fn, galaxy); - - if (!strcmp(argv[0],"add")) { - add_file(fn, galaxy, wgport, &sub, SUB); - } else if (!strcmp(argv[0],"add_unsubscription") || - !strcmp(argv[0],"add_un")) { - add_file(fn, galaxy, wgport, &sub, UNSUB); - } else if (!strcmp(argv[0],"add_suppression") || - !strcmp(argv[0],"add_punt")) { - add_file(fn, galaxy, wgport, &sub, PUNT); - } else if (!strcmp(argv[0],"delete") || - !strcmp(argv[0],"del") || - !strcmp(argv[0],"dl")) { - del_file(fn, galaxy, wgport, &sub, SUB); - } else if (!strcmp(argv[0],"delete_unsubscription") || - !strcmp(argv[0],"del_un")) { - del_file(fn, galaxy, wgport, &sub, UNSUB); - } else if (!strcmp(argv[0],"delete_suppression") || - !strcmp(argv[0],"del_punt")) { - del_file(fn, galaxy, wgport, &sub, PUNT); - } else { + if (!strcmp(argv[0],"add")) + add_file(wgport,&sub,0); + else if (!strcmp(argv[0],"add_unsubscription") || + !strcmp(argv[0],"add_un")) + add_file(wgport,&sub,1); + else if (!strcmp(argv[0],"delete") || + !strcmp(argv[0],"del") || + !strcmp(argv[0],"dl")) + del_file(wgport,&sub,0); + else if (!strcmp(argv[0],"delete_unsubscription") || + !strcmp(argv[0],"del_un")) { + del_file(wgport,&sub,1); + } else ss_perror(sci_idx,0,"unknown command name"); - } return; } void -add_file(fn,galaxy,wgport,subs,mode) - char *fn; - char *galaxy; - short wgport; - ZSubscription_t *subs; - int mode; +add_file(wgport,subs,unsub) +short wgport; +ZSubscription_t *subs; +int unsub; { FILE *fp; char errbuf[BUFSIZ]; ZSubscription_t sub2; Code_t retval; - (void) purge_subs(fn,subs,ALL); /* remove copies in the subs file */ - if (!(fp = fopen(fn,"a"))) { - (void) sprintf(errbuf,"while opening %s for append", fn); + (void) purge_subs(subs,ALL); /* remove copies in the subs file */ + if (!(fp = fopen(subsname,"a"))) { + (void) sprintf(errbuf,"while opening %s for append",subsname); ss_perror(sci_idx,errno,errbuf); return; } fprintf(fp,"%s%s,%s,%s\n", - ((mode == UNSUB) ? "!" : - ((mode == PUNT) ? "*" : - "")), + unsub ? "!" : "", subs->zsub_class, subs->zsub_classinst, subs->zsub_recipient); if (fclose(fp) == EOF) { (void) sprintf(errbuf, "while closing %s", subsname); @@ -676,70 +548,53 @@ add_file(fn,galaxy,wgport,subs,mode) return; } fix_macros(subs,&sub2,1); - if (mode == UNSUB) { - if (retval = ZUnsubscribeTo(galaxy, &sub2,1,(u_short)wgport)) - ss_perror(sci_idx, retval, "while subscribing"); - } else if (mode == PUNT) { - if (retval = xpunt(sub2.zsub_class, sub2.zsub_classinst, - sub2.zsub_recipient, PUNT)) - ss_perror(sci_idx, retval, "while unsubscribing"); - } else { - if (retval = ZSubscribeTo(galaxy, &sub2,1,(u_short)wgport)) - ss_perror(sci_idx, retval, "while suppressing"); - } - + if (retval = (unsub ? ZUnsubscribeTo(&sub2,1,(u_short)wgport) : + ZSubscribeToSansDefaults(&sub2,1,(u_short)wgport))) + ss_perror(sci_idx,retval, + unsub ? "while unsubscribing" : + "while subscribing"); return; } void -del_file(fn,galaxy,wgport,subs,mode) - char *fn; - char *galaxy; - short wgport; - ZSubscription_t *subs; - int mode; +del_file(wgport,subs,unsub) +short wgport; +register ZSubscription_t *subs; +int unsub; { ZSubscription_t sub2; int retval; - retval = purge_subs(fn, subs, mode); + retval = purge_subs(subs, unsub ? UNSUBONLY : SUBONLY); if (retval == ERR) return; if (retval == NOT_REMOVED) fprintf(stderr, "Couldn't find %sclass %s instance %s recipient %s in\n\tfile %s\n", - ((mode == UNSUB) ? "un-subscription " : - ((mode == PUNT) ? "suppression " : - "")), + unsub ? "un-subscription " : "", subs->zsub_class, subs->zsub_classinst, subs->zsub_recipient, subsname); fix_macros(subs,&sub2,1); - if (mode == PUNT) { - if (retval = xpunt(sub2.zsub_class, sub2.zsub_classinst, - sub2.zsub_recipient, UNPUNT)) - ss_perror(sci_idx,retval,"while unsuppressing"); - } else if ((retval = ZUnsubscribeTo(galaxy, &sub2,1,(u_short)wgport)) != - ZERR_NONE) { + if ((retval = ZUnsubscribeTo(&sub2,1,(u_short)wgport)) != + ZERR_NONE) ss_perror(sci_idx,retval,"while unsubscribing"); - } + return; } int -purge_subs(fn, subs, mode) - char *fn; - register ZSubscription_t *subs; - int mode; +purge_subs(subs,which) +register ZSubscription_t *subs; +int which; { FILE *fp,*fpout; char errbuf[BUFSIZ],subline[BUFSIZ]; char backup[BUFSIZ],ourline[BUFSIZ]; int delflag = NOT_REMOVED; - int purge; + int keep; - switch (mode) { - case SUB: - case UNSUB: - case PUNT: + switch (which) { + case SUBONLY: + case UNSUBONLY: case ALL: break; default: @@ -752,16 +607,12 @@ purge_subs(fn, subs, mode) subs->zsub_classinst, subs->zsub_recipient); - if (!(fp = fopen(fn,"r"))) { - if (errno == ENOENT) - /* if the filw doesn't exist, then the sub - is clearly purged */ - return(delflag); - (void) sprintf(errbuf,"while opening %s for read", fn); + if (!(fp = fopen(subsname,"r"))) { + (void) sprintf(errbuf,"while opening %s for read",subsname); ss_perror(sci_idx,errno,errbuf); return(ERR); } - (void) strcpy(backup, fn); + (void) strcpy(backup, subsname); (void) strcat(backup, ".temp"); (void) unlink(backup); if (!(fpout = fopen(backup,"w"))) { @@ -775,34 +626,28 @@ purge_subs(fn, subs, mode) break; if (*subline) subline[strlen(subline)-1] = '\0'; /* nuke newline */ - switch (mode) { - case SUB: - purge = (strcmp(subline,ourline) == 0); - break; - case UNSUB: - purge = (*subline == '!' && - (strcmp(subline+1,ourline) == 0)); + switch (which) { + case SUBONLY: + keep = strcmp(subline,ourline); break; - case PUNT: - purge = (*subline == '-' && - (strcmp(subline+1,ourline) == 0)); + case UNSUBONLY: + keep = (*subline != '!' || strcmp(subline+1,ourline)); break; case ALL: - purge = ((strcmp(subline,ourline) == 0) || - (((*subline == '!') || (*subline == '-')) && - (strcmp(subline+1, ourline) == 0))); + keep = (strcmp(subline,ourline) && + (*subline != '!' || strcmp(subline+1, + ourline))); break; } - if (purge) { - delflag = REMOVED; - } else { + if (keep) { fputs(subline, fpout); if (ferror(fpout) || (fputc('\n', fpout) == EOF)) { (void) sprintf(errbuf, "while writing to %s", backup); ss_perror(sci_idx, errno, errbuf); } - } + } else + delflag = REMOVED; } (void) fclose(fp); /* open read-only, ignore errs */ if (fclose(fpout) == EOF) { @@ -810,9 +655,9 @@ purge_subs(fn, subs, mode) ss_perror(sci_idx, errno, errbuf); return(ERR); } - if (rename(backup, fn) == -1) { + if (rename(backup,subsname) == -1) { (void) sprintf(errbuf,"while renaming %s to %s\n", - backup, fn); + backup,subsname); ss_perror(sci_idx,errno,errbuf); return(ERR); } @@ -824,78 +669,177 @@ load_subs(argc,argv) int argc; char *argv[]; { - int type, cnt, i; - char *file; - char *arggalaxy, *galaxy; - Code_t code; + ZSubscription_t subs[SUBSATONCE],subs2[SUBSATONCE],unsubs[SUBSATONCE]; + FILE *fp; + int ind,unind,lineno,i,retval,type; + short wgport; + char *comma,*comma2,*file,subline[BUFSIZ]; - if (argc > 3) { - fprintf(stderr,"Usage: %s [file [galaxy]]\n",argv[0]); + if (argc > 2) { + fprintf(stderr,"Usage: %s [file]\n",argv[0]); return; } if (*argv[0] == 'u') type = UNSUB; - else if (!strcmp(argv[0],"list") || !strcmp(argv[0],"ls")) - type = LIST; else - type = SUB; - - file = (argc > 1)?argv[1]:subsname; - arggalaxy = (argc > 2)?argv[2]:NULL; - - if (arggalaxy) { - if (code = ZGetGalaxyCount(&cnt)) { - ss_perror(sci_idx, code, "while getting galaxy count"); - return; - } + if (!strcmp(argv[0],"list") || !strcmp(argv[0],"ls")) + type = LIST; + else + type = SUB; - for (i=0; i<cnt; i++) { - if (code = ZGetGalaxyName(i, &galaxy)) { - ss_perror(sci_idx, code, "while getting galaxy name"); - return; - } + if (type != LIST) + if ((wgport = ZGetWGPort()) == -1) { + ss_perror(sci_idx,errno, + "while finding WindowGram port"); + return; + } - if (strcasecmp(galaxy, arggalaxy) == 0) - break; - } + file = (argc == 1) ? subsname : argv[1]; + + fp = fopen(file,"r"); - if (i == cnt) { - ss_perror(sci_idx, 0, - "unknown galaxy specified while loading subscription file"); + if (fp == NULL) { + ss_perror(sci_idx,errno, + "while loading subscription file"); return; - } - } else { - galaxy = NULL; } - - if (code = load_sub_file(type, file, galaxy)) - ss_perror(sci_idx, code, - "while loading subscription file"); - -} - -void -loadall(argc,argv) - int argc; - char *argv[]; -{ - int retval; - char *galaxy; - int type, cnt, i; - char fn[MAXPATHLEN]; - if (argc > 1) { - fprintf(stderr,"Usage: %s\n",argv[0]); - return; - } - - if (!strcmp(argv[0],"list") || !strcmp(argv[0],"ls")) - type = LIST; - else - type = SUB; + ind = unind = 0; + lineno = 1; + + for (;;lineno++) { + if (!fgets(subline,sizeof subline,fp)) + break; + if (*subline == '#' || !*subline) + continue; + subline[strlen(subline)-1] = '\0'; /* nuke newline */ + comma = strchr(subline,','); + if (comma) + comma2 = strchr(comma+1,','); + else + comma2 = 0; + if (!comma || !comma2) { + fprintf(stderr, + "Malformed subscription at line %d of %s:\n%s\n", + lineno,file,subline); + continue; + } + *comma = '\0'; + *comma2 = '\0'; + if (type == LIST) { + if (*subline == '!') + printf("(Un-subscription) Class %s instance %s recipient %s\n", + subline+1, comma+1, comma2+1); + else + printf("Class %s instance %s recipient %s\n", + subline, comma+1, comma2+1); + continue; + } + if (*subline == '!') { /* an un-subscription */ + /* if we are explicitly un-subscribing to + the contents of a subscription file, ignore + any un-subscriptions in that file */ + if (type == UNSUB) + continue; + unsubs[unind].zsub_class = + (char *)malloc((unsigned)(strlen(subline))); + /* XXX check malloc return */ + /* skip the leading '!' */ + (void) strcpy(unsubs[unind].zsub_class,subline+1); + unsubs[unind].zsub_classinst = + (char *)malloc((unsigned)(strlen(comma+1)+1)); + /* XXX check malloc return */ + (void) strcpy(unsubs[unind].zsub_classinst,comma+1); + unsubs[unind].zsub_recipient = + (char *)malloc((unsigned)(strlen(comma2+1)+1)); + /* XXX check malloc return */ + (void) strcpy(unsubs[unind].zsub_recipient,comma2+1); + unind++; + } else { + subs[ind].zsub_class = + (char *)malloc((unsigned)(strlen(subline)+1)); + /* XXX check malloc return */ + (void) strcpy(subs[ind].zsub_class,subline); + subs[ind].zsub_classinst = + (char *)malloc((unsigned)(strlen(comma+1)+1)); + /* XXX check malloc return */ + (void) strcpy(subs[ind].zsub_classinst,comma+1); + subs[ind].zsub_recipient = + (char *)malloc((unsigned)(strlen(comma2+1)+1)); + /* XXX check malloc return */ + (void) strcpy(subs[ind].zsub_recipient,comma2+1); + ind++; + } + if (ind == SUBSATONCE) { + fix_macros(subs,subs2,ind); + if ((retval = (type == SUB)? + ZSubscribeTo(subs2,ind,(u_short)wgport): + ZUnsubscribeTo(subs2,ind,(u_short)wgport)) != + ZERR_NONE) { + ss_perror(sci_idx,retval,(type == SUB)? + "while subscribing": + "while unsubscribing"); + goto cleanup; + } + for (i=0;i<ind;i++) { + free(subs[i].zsub_class); + free(subs[i].zsub_classinst); + free(subs[i].zsub_recipient); + } + ind = 0; + } + if (unind == SUBSATONCE) { + fix_macros(unsubs,subs2,unind); + if ((retval = ZUnsubscribeTo(subs2,unind,(u_short)wgport)) != ZERR_NONE) { + ss_perror(sci_idx,retval, + "while unsubscribing to un-subscriptions"); + goto cleanup; + } + for (i=0;i<unind;i++) { + free(unsubs[i].zsub_class); + free(unsubs[i].zsub_classinst); + free(unsubs[i].zsub_recipient); + } + unind = 0; + } + } + + if (type != LIST) { + /* even if we have no subscriptions, be sure to send + an empty packet to trigger the default subscriptions */ + fix_macros(subs,subs2,ind); + if ((retval = (type == SUB)?ZSubscribeTo(subs2,ind,(u_short)wgport): + ZUnsubscribeTo(subs2,ind,(u_short)wgport)) != ZERR_NONE) { + ss_perror(sci_idx,retval,(type == SUB)? + "while subscribing": + "while unsubscribing"); + goto cleanup; + } + if (unind) { + fix_macros(unsubs,subs2,unind); + if ((retval = + ZUnsubscribeTo(subs2,unind,(u_short)wgport)) != ZERR_NONE) { + ss_perror(sci_idx,retval, + "while unsubscribing to un-subscriptions"); + goto cleanup; + } + } + } +cleanup: + for (i=0;i<ind;i++) { + free(subs[i].zsub_class); + free(subs[i].zsub_classinst); + free(subs[i].zsub_recipient); + } + for (i=0;i<unind;i++) { + free(unsubs[i].zsub_class); + free(unsubs[i].zsub_classinst); + free(unsubs[i].zsub_recipient); + } - load_all_sub_files(type, subsname); + (void) fclose(fp); /* ignore errs--file is read-only */ + return; } void @@ -908,7 +852,7 @@ current(argc,argv) ZSubscription_t subs; int i,nsubs,retval,save,one,defs; short wgport; - char *galaxy, *file, backup[BUFSIZ]; + char *file,backup[BUFSIZ]; save = 0; defs = 0; @@ -918,22 +862,9 @@ current(argc,argv) else if (!strcmp(argv[0], "defaults") || !strcmp(argv[0], "defs")) defs = 1; - if (save) { - if (argc > 3) { - fprintf(stderr,"Usage: %s [filename [galaxy]]\n", - argv[0]); - return; - } else { - file = (argc > 1)?argv[1]:subsname; - galaxy = (argc > 2)?argv[2]:NULL; - } - } else { - if (argc > 2) { - fprintf(stderr,"Usage: %s [galaxy]\n",argv[0]); - return; - } else { - galaxy = (argc > 1)?argv[1]:NULL; - } + if (argc != 1 && !(save && argc == 2)) { + fprintf(stderr,"Usage: %s%s\n",argv[0],save?" [filename]":""); + return; } if (!defs) @@ -944,9 +875,9 @@ current(argc,argv) } if (defs) - retval = ZRetrieveDefaultSubscriptions(galaxy, &nsubs); + retval = ZRetrieveDefaultSubscriptions(&nsubs); else - retval = ZRetrieveSubscriptions(galaxy,(u_short)wgport,&nsubs); + retval = ZRetrieveSubscriptions((u_short)wgport,&nsubs); if (retval == ZERR_TOOMANYSUBS) { fprintf(stderr,"Too many subscriptions -- some have not been returned.\n"); @@ -962,6 +893,7 @@ current(argc,argv) } if (save) { + file = (argc == 1)?subsname:argv[1]; (void) strcpy(backup,file); (void) strcat(backup,".temp"); if (!(fp = fopen(backup,"w"))) { @@ -1006,3 +938,59 @@ current(argc,argv) } } } + +int +make_exist(filename) + char *filename; +{ + char errbuf[BUFSIZ]; + FILE *fpout; + + if (!access(filename,F_OK)) + return (0); + + if (!(fpout = fopen(filename,"w"))) { + (void) sprintf(errbuf,"while opening %s for write",filename); + ss_perror(sci_idx,errno,errbuf); + return (1); + } + + if (fclose(fpout) == EOF) { + (void) sprintf(errbuf, "while closing %s", filename); + ss_perror(sci_idx, errno, errbuf); + return(1); + } + return (0); +} + +void +fix_macros(subs,subs2,num) + ZSubscription_t *subs,*subs2; + int num; +{ + int i; + + for (i=0;i<num;i++) { + subs2[i] = subs[i]; + fix_macros2(subs[i].zsub_class,&subs2[i].zsub_class); + fix_macros2(subs[i].zsub_classinst,&subs2[i].zsub_classinst); + fix_macros2(subs[i].zsub_recipient,&subs2[i].zsub_recipient); + } +} + +void +fix_macros2(src,dest) + register char *src; + char **dest; +{ + if (!strcmp(src,TOKEN_HOSTNAME)) { + *dest = ourhost; + return; + } + if (!strcmp(src,TOKEN_CANONNAME)) { + *dest = ourhostcanon; + return; + } + if (!strcmp(src,TOKEN_ME)) + *dest = ZGetSender(); +} |