summaryrefslogtreecommitdiff
path: root/clients/zctl/zctl.c
diff options
context:
space:
mode:
authorGravatar Robert S. French <rfrench@mit.edu>1987-11-01 12:42:59 +0000
committerGravatar Robert S. French <rfrench@mit.edu>1987-11-01 12:42:59 +0000
commit7fef65777c5d10fbdd9365dd18e8b0fe27f852ba (patch)
treed7cf8d5c507085c362c1706bcd389875d1b72717 /clients/zctl/zctl.c
parent5343a0ab3f8531518f86723f165a41fa78d9bb06 (diff)
Added variables, hm, and zwgc control
Diffstat (limited to 'clients/zctl/zctl.c')
-rw-r--r--clients/zctl/zctl.c286
1 files changed, 261 insertions, 25 deletions
diff --git a/clients/zctl/zctl.c b/clients/zctl/zctl.c
index 3efb89f..29bf818 100644
--- a/clients/zctl/zctl.c
+++ b/clients/zctl/zctl.c
@@ -14,7 +14,8 @@
#include <zephyr/mit-copyright.h>
#include <zephyr/zephyr.h>
-#include "ss.h"
+#include <ctype.h>
+#include <ss.h>
#include <pwd.h>
#include <netdb.h>
@@ -27,12 +28,16 @@ static char rcsid_zctl_c[] = "$Header$";
#define UNSUB 1
#define LIST 2
-#define DEFAULT_SUBS "/etc/athena/windowgram.subs"
+#define DEFAULT_SUBS "/etc/athena/zephyr.subs"
+#define USERS_SUBS "/.zephyr.subs"
+#define OLD_SUBS "/.subscriptions"
#define TOKEN_HOSTNAME "%host%"
#define TOKEN_CANONNAME "%canon%"
#define TOKEN_ME "%me%"
+#define _toupper(c) (islower(c)?toupper(c):c)
+
char *index(),*malloc();
int wgport,sci_idx;
@@ -48,7 +53,7 @@ main(argc,argv)
struct passwd *pwd;
struct hostent *hent;
FILE *fp;
- char ssline[BUFSIZ],buf[BUFSIZ],*envptr;
+ char ssline[BUFSIZ],buf[BUFSIZ],oldsubsname[BUFSIZ],*envptr;
int retval,code,i;
if ((retval = ZInitialize()) != ZERR_NONE) {
@@ -56,18 +61,6 @@ main(argc,argv)
exit (1);
}
- envptr = (char *)getenv("WGFILE");
- if (!envptr) {
- sprintf(buf,"/tmp/wg.%d",getuid());
- envptr = buf;
- }
- if (!(fp = fopen(envptr,"r"))) {
- fprintf(stderr,"Can't find WindowGram subscription port\n");
- exit (1);
- }
- fscanf(fp,"%d",&wgport);
- fclose(fp);
-
envptr = (char *)getenv("HOME");
if (envptr)
strcpy(subsname,envptr);
@@ -78,9 +71,16 @@ main(argc,argv)
}
strcpy(subsname,pwd->pw_dir);
- }
- strcat(subsname,"/.subscriptions");
-
+ }
+ strcpy(oldsubsname,subsname);
+ strcat(oldsubsname,OLD_SUBS);
+ strcat(subsname,USERS_SUBS);
+ if (!access(oldsubsname,0)) {
+ printf("The .subscriptions file in your home directory is no longer\n");
+ printf("being used. I will rename it to .zephyr.subs for you.\n");
+ rename(oldsubsname,subsname);
+ }
+
if (gethostname(ourhost,BUFSIZ) == -1) {
com_err(argv[0],errno,"while getting host name");
exit (1);
@@ -121,23 +121,239 @@ set_file(argc,argv)
fprintf(stderr,"Usage: %s filename\n",argv[0]);
return;
}
+
if (argc == 1)
printf("Current file: %s\n",subsname);
else
strcpy(subsname,argv[1]);
}
-cancel_subs(argc,argv)
+flush_locations(argc,argv)
int argc;
char *argv[];
{
int retval;
+
+ if (argc > 1) {
+ fprintf(stderr,"Usage: %s\n",argv[0]);
+ return;
+ }
+
+ if ((retval = ZFlushMyLocations()) != ZERR_NONE)
+ ss_perror(sci_idx,retval,"while flushing locations");
+}
+
+wgc_control(argc,argv)
+ int argc;
+ char *argv[];
+{
+ int retval,newport;
+ struct sockaddr_in newsin,oldsin;
+ 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 = newport;
+ if ((retval = ZSetDestAddr(&newsin)) != ZERR_NONE) {
+ ss_perror(sci_idx,retval,"while setting destination address");
+ return;
+ }
+
+ 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;
+
+ notice.z_sender = 0;
+ notice.z_recipient = "";
+ notice.z_default_format = "";
+ notice.z_message_len = 0;
+
+ if ((retval = ZSendNotice(&notice,ZNOAUTH)) != ZERR_NONE)
+ ss_perror(sci_idx,retval,"while sending notice");
+
+ if ((retval = ZInitialize()) != ZERR_NONE)
+ ss_perror(sci_idx,retval,
+ "while reinitializing");
+}
+
+hm_control(argc,argv)
+ int argc;
+ char *argv[];
+{
+ int retval;
+ ZNotice_t notice;
+
+ if (argc > 1) {
+ fprintf(stderr,"Usage: %s\n",argv[0]);
+ return;
+ }
+
+ 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;
+
+ notice.z_sender = 0;
+ notice.z_recipient = "";
+ notice.z_default_format = "";
+ notice.z_message_len = 0;
+
+ if ((retval = ZSendNotice(&notice,ZNOAUTH)) != ZERR_NONE)
+ ss_perror(sci_idx,retval,"while sending notice");
+}
+
+show_var(argc,argv)
+ int argc;
+ char *argv[];
+{
+ int i;
+ char *value;
+
+ if (argc < 2) {
+ fprintf(stderr,"Usage: %s <varname> <varname> ...\n",argv[0]);
+ return;
+ }
+
+ for (i=1;i<argc;i++) {
+ value = ZGetVariable(argv[i]);
+ if (value)
+ printf("%s: %s\n",argv[i],value);
+ else
+ printf("%s: not defined\n",argv[i]);
+ }
+}
+
+set_var(argc,argv)
+ int argc;
+ char *argv[];
+{
+ int retval,setting_exp;
+ char *exp_level,*newargv[1];
+
+ if (argc != 2 && argc != 3) {
+ fprintf(stderr,"Usage: %s <varname> [value]\n",
+ argv[0]);
+ return;
+ }
+
+ setting_exp = 0;
+
+ if (!cistrcmp(argv[1],"exposure")) {
+ setting_exp = 1;
+ if (argc != 3) {
+ fprintf(stderr,"An exposure setting must be specified.\n");
+ return;
+ }
+ exp_level = (char *)0;
+ if (!cistrcmp(argv[2],"none"))
+ exp_level = EXPOSE_NONE;
+ if (!cistrcmp(argv[2],"operations"))
+ exp_level = EXPOSE_OPSTAFF;
+ if (!cistrcmp(argv[2],"realm-visible"))
+ exp_level = EXPOSE_REALMVIS;
+ if (!cistrcmp(argv[2],"realm-announced"))
+ exp_level = EXPOSE_REALMANN;
+ if (!cistrcmp(argv[2],"net-visible"))
+ exp_level = EXPOSE_NETVIS;
+ if (!cistrcmp(argv[2],"net-announced"))
+ exp_level = EXPOSE_NETANN;
+ if (!exp_level) {
+ fprintf(stderr,"The exposure setting must be one of:\n");
+ fprintf(stderr,"none, operations, realm-visible, realm-announced, net-visible, net-announced.\n");
+ return;
+ }
+ }
+ if (argc == 2)
+ retval = ZSetVariable(argv[1],"");
+ else
+ retval = ZSetVariable(argv[1],argv[2]);
+
+ if (retval != ZERR_NONE) {
+ ss_perror(sci_idx,retval,"while setting variable value");
+ return;
+ }
+
+ /* Side-effects? Naw, us? */
+
+ 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);
+ }
+ return;
+ }
+}
+
+cistrcmp(s1,s2)
+ char *s1,*s2;
+{
+ while (*s1 && *s2) {
+ if (_toupper(*s1) != _toupper(*s2))
+ return 1;
+ s1++;
+ s2++;
+ }
+ return (*s1 || *s2);
+}
+
+unset_var(argc,argv)
+ int argc;
+ char *argv[];
+{
+ int retval,i;
+
+ if (argc < 2) {
+ fprintf(stderr,"Usage: %s <varname> <varname> ...\n",
+ argv[0]);
+ return;
+ }
+
+ for (i=1;i<argc;i++)
+ if ((retval = ZUnsetVariable(argv[i])) != ZERR_NONE)
+ ss_perror(sci_idx,retval,
+ "while unsetting variable value");
+}
+
+cancel_subs(argc,argv)
+ int argc;
+ char *argv[];
+{
+ int retval,wgport;
if (argc != 1) {
fprintf(stderr,"Usage: %s\n",argv[0]);
return;
}
+ if ((wgport = ZGetWGPort()) == -1) {
+ ss_perror(sci_idx,errno,"while finding WindowGram port");
+ return;
+ }
if ((retval = ZCancelSubscriptions((u_short)wgport)) != ZERR_NONE)
ss_perror(sci_idx,retval,"while cancelling subscriptions");
}
@@ -146,7 +362,7 @@ subscribe(argc,argv)
int argc;
char *argv[];
{
- int retval;
+ int retval,wgport;
ZSubscription_t sub,sub2;
if (argc > 4 || argc < 3) {
@@ -160,6 +376,11 @@ subscribe(argc,argv)
fix_macros(&sub,&sub2,1);
+ if ((wgport = ZGetWGPort()) == -1) {
+ ss_perror(sci_idx,errno,"while finding WindowGram port");
+ return;
+ }
+
retval = (*argv[0] == 's') ? ZSubscribeTo(&sub2,1,(u_short)wgport) :
ZUnsubscribeTo(&sub2,1,(u_short)wgport);
@@ -175,7 +396,7 @@ sub_file(argc,argv)
FILE *fp,*fpout;
char errbuf[BUFSIZ],subline[BUFSIZ],ourline[BUFSIZ];
char backup[BUFSIZ];
- int delflag,retval;
+ int delflag,retval,wgport;
if (argc > 4 || argc < 3) {
fprintf(stderr,"Usage: %s class instance [*]\n",argv[0]);
@@ -186,6 +407,11 @@ sub_file(argc,argv)
sub.classinst = argv[2];
sub.recipient = (argc == 3)?ZGetSender():argv[3];
+ if ((wgport = ZGetWGPort()) == -1) {
+ ss_perror(sci_idx,errno,"while finding WindowGram port");
+ return;
+ }
+
if (!strcmp(argv[0],"add")) {
if (make_exist(subsname))
return;
@@ -252,7 +478,7 @@ load_subs(argc,argv)
{
ZSubscription_t subs[SUBSATONCE],subs2[SUBSATONCE];
FILE *fp;
- int ind,lineno,i,retval,type;
+ int ind,lineno,i,retval,type,wgport;
char *comma,*comma2,*file,subline[BUFSIZ],errbuf[BUFSIZ];
if (argc > 2) {
@@ -260,6 +486,11 @@ load_subs(argc,argv)
return;
}
+ if ((wgport = ZGetWGPort()) == -1) {
+ ss_perror(sci_idx,errno,"while finding WindowGram port");
+ return;
+ }
+
file = (argc == 1) ? subsname : argv[1];
if (!(fp = fopen(file,"r")))
@@ -320,7 +551,7 @@ load_subs(argc,argv)
ss_perror(sci_idx,retval,(type == SUB)?
"while subscribing":
"while unsubscribing");
- exit(1);
+ return;
}
}
}
@@ -341,7 +572,7 @@ load_subs(argc,argv)
ss_perror(sci_idx,retval,(type == SUB)?
"while subscribing":
"while unsubscribing");
- exit(1);
+ return;
}
}
@@ -355,7 +586,7 @@ current(argc,argv)
FILE *fp;
char errbuf[BUFSIZ];
ZSubscription_t subs;
- int i,nsubs,retval,save,one;
+ int i,nsubs,retval,save,one,wgport;
char *file,backup[BUFSIZ];
save = 0;
@@ -368,6 +599,11 @@ current(argc,argv)
return;
}
+ if ((wgport = ZGetWGPort()) == -1) {
+ ss_perror(sci_idx,errno,"while finding WindowGram port");
+ return;
+ }
+
retval = ZRetrieveSubscriptions((u_short)wgport,&nsubs);
if (retval == ZERR_TOOMANYSUBS) {