home *** CD-ROM | disk | FTP | other *** search
- /* MISC.C */
- static char sccsid[] = "@(#)misc.c 1.4 93/06/07 Copyright (c)1993 thalerd";
- #include <stdio.h>
- #include <sys/param.h>
- #include <time.h>
- #include <limits.h>
- #include <string.h>
- #ifndef NeXT
- #include <unistd.h> /* for X_OK */
- #endif
- #include "config.h"
- #include "struct.h"
- #include "globals.h"
- #include "misc.h"
- #include "change.h"
- #include "help.h"
- #include "system.h"
- #include "macro.h"
- #include "range.h"
- #include "item.h"
- #include "sum.h"
- #include "sep.h"
- #include "files.h"
- #include "arch.h"
- #include "driver.h" /* for open_pipe */
- #include "lib.h" /* for noquote() */
-
- /* Misc. commands available at all modes */
- static dispatch_t misc_cmd[]={
- "c_hange", change,
- "se_t", change,
- "?", help,
- "h_elp", help,
- "exp_lain", help,
- "al_ias", define,
- "def_ine", define,
- "una_lias", define,
- "und_efine", define,
- "ec_ho", echo,
- "echoe", echo,
- "echon", echo,
- "echoen", echo,
- "echone", echo,
- "m_ail", mail,
- "t_ransmit", mail,
- "sen_dmail", mail,
- "d_isplay", display,
- "que_ry", display,
- "sh_ow", display,
- "t_est", test,
- "cd", cd,
- "chd_ir", cd,
- "uma_sk", do_umask,
- "cdate", date,
- "da_te", date,
- "clu_ster", cluster,
- "cfdir", set_cfdir,
- "eval_uate", eval,
- "source", do_source,
- /* ex_it q_uit st_op good_bye log_off log_out h_elp exp_lain sy_stem unix al_ias
- * def_ine una_lias und_efine ec_ho echoe echon echoen echone so_urce m_ail
- * t_ransmit sen_dmail chat write d_isplay que_ry p_articipants w_hoison
- * am_superuser resign chd_ir uma_sk sh_ell f_iles dir_ectory ty_pe e_dit
- * cdate da_te t_est clu_ster
- */
- 0, 0
- };
-
- /******************************************************************************/
- /* DISPATCH CONTROL TO APPROPRIATE MISC. COMMAND FUNCTION */
- /******************************************************************************/
- char /* RETURNS: 0 to quit, 1 else */
- misc_cmd_dispatch(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- int i;
-
- for (i=0; misc_cmd[i].name; i++)
- if (match(argv[0],misc_cmd[i].name))
- return misc_cmd[i].func(argc,argv);
-
- /* Command dispatch */
- if (match(argv[0],"q_uit")
- || match(argv[0],"st_op")
- || match(argv[0],"ex_it")) {
- status |= S_STOP;
- return 0;
- } else if (match(argv[0],"unix_cmd")) {
- char buff[MAX_LINE_LENGTH],i;
- if (argc<2) printf("syntax: unix_cmd \"command\"\n");
- else {
- /* implode(buff,argv," ",1); */
- strcpy(buff,noquote(argv[1],0));
- for (i=2; i<argc; i++) {
- strcat(buff," ");
- strcat(buff,noquote(argv[i],0));
- }
- /* Undone at request of sno and jep
- if (mode==M_SANE) printf("Conference rc cannot exec: %s\n",buff);
- else
- */
- unix_cmd(buff);
- }
- /* if (argc==2) unix_cmd(argv[1]); */
- } else if (argc) {
- printf("Invalid command: %s\n",argv[0]);
- }
- return 1;
- }
-
- /******************************************************************************/
- /* SET UMASK VALUE */
- /******************************************************************************/
- int /* RETURNS: (nothing) */
- do_umask(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- int i;
-
- if (argc<2) {
- umask(i=umask(0));
- printf("%03o\n",i);
- } else if (!isdigit(argv[1][0])) {
- printf("UNK Bad umask \"%s\"specified (must be octal)\n",argv[1]);
- } else {
- sscanf(argv[1],"%o",&i);
- umask(i);
- }
- return 1;
- }
-
- /******************************************************************************/
- /* SEND MAIL TO ANOTHER USER */
- /******************************************************************************/
- int /* RETURNS: (nothing) */
- mail(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- char buff[MAX_LINE_LENGTH],buff2[MAX_LINE_LENGTH];
-
- if (argc<2) {
- unix_cmd("mail");
- } else if (flags & O_MAILTEXT) {
- sprintf(buff,"mail %s",argv[1]);
- unix_cmd(buff);
- } else {
- if (text_loop(0,1)) { /* dont clear buffer, for reply cmd */
- strcpy(buff,argv[1]);
- while (strlen(buff)) {
- sprintf(buff2,"mail %s < %s/cf.buffer",buff,work);
- unix_cmd(buff2);
- printf("Mail sent to %s.\nMore recipients (or <return>)? ",buff);
- ngets(buff, st_glob.inp);
- }
- }
- sprintf(buff,"%s/cf.buffer",work);
- rm(buff,SL_USER);
- }
- return 1;
- }
-
- /******************************************************************************/
- /* CHANGE CURRENT WORKING DIRECTORY */
- /******************************************************************************/
- int /* RETURNS: (nothing) */
- cd(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- if (argc>2) {
- printf("Bad parameters near \"%s\"\n",argv[2]);
- return 2;
- } else if (chdir((argc>1)?argv[1]:home))
- error("cd'ing to ",argv[1]);
- return 1;
- }
-
- /******************************************************************************/
- /* ECHO ARGUMENTS TO OUTPUT */
- /******************************************************************************/
- int /* RETURNS: (nothing) */
- echo(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- short i;
- FILE *fp;
-
- if (match(argv[0],"echoe") || match(argv[0],"echoen")
- || match(argv[0],"echone"))
- fp = stderr;
- else {
- open_pipe();
- fp = st_glob.outp;
- if (!fp) fp = stdout;
- }
-
- for (i=1; i<argc; i++) {
- wfputs(argv[i],fp);
- wfputc(' ',fp);
- }
- if (!strchr(argv[0],'n'))
- wfputc('\n',fp);
- return 1;
- }
-
- /******************************************************************************/
- /* CHECK THE DATE */
- /******************************************************************************/
- int /* RETURNS: (nothing) */
- date(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- short i;
- time_t t;
-
- i=0;
- t = since(argc,argv,&i);
- if (t<LONG_MAX) {
- if (argv[0][0]=='c')
- printf("%X\n",t); /* cdate command */
- else
- printf("\nDate is: %s\n",get_date(t,13));
- }
- return 1;
- }
-
- /******************************************************************************/
- /* SOURCE A FILE OF COMMANDS */
- /******************************************************************************/
- int /* RETURNS: (nothing) */
- do_source(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- short i;
- char arg[10];
-
- if (argc<2)
- printf("usage: source filename [arg ...]\n");
- else {
- for (i=1; i<argc; i++) {
- sprintf(arg,"arg%d",i-1);
- def_macro(arg,DM_VAR,argv[i]);
- }
-
- if (!source(argv[1],NIL))
- printf("Cannot access %s\n",argv[1]);
-
- for (i=1; i<argc; i++) {
- sprintf(arg,"arg%d",i-1);
- undef_name(arg);
- }
- }
- return 1;
- }
-
- /******************************************************************************/
- /* TEST RANGES */
- /******************************************************************************/
- int /* RETURNS: (nothing) */
- test(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- int i;
- char act[MAX_ITEMS];
- short j,k=0,fl=0;
-
- rangeinit(&st_glob,act);
- refresh_sum(0,confidx,sum,part,&st_glob);
-
- if (argc>1) /* Process argc */
- range(argc,argv,&fl,act,sum,&st_glob,0);
- if (!(fl & OF_RANGE)) {
- printf("Error, no item specified! (try HELP RANGE)\n");
- return 1;
- }
-
- j = A_SKIP;
- for (i=0; i<MAX_ITEMS; i++) {
- if (act[i] == A_SKIP && j==A_COVER) printf("%d]",i);
- if (act[i] == A_FORCE) printf("%s%d",(k++)?",":"",i+1);
- if (act[i] == A_COVER && j!=A_COVER) printf("%s[%d-",(k++)?",":"",i+1);
- j = act[i];
- }
- if (j==A_COVER) printf("%d]",i);
- printf(".\n");
- printf("newflag: %d\n",fl);
- printf("since date is %s",ctime(&(st_glob.since)));
- printf("before date is %s",ctime(&(st_glob.before)));
- if (st_glob.string[0]) printf("String is: %s\n",st_glob.string);
- if (st_glob.author[0]) printf("Author is: %s\n",st_glob.author);
-
- return 1;
- }
-
- int /* RETURNS: (nothing) */
- set_cfdir(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- char buff[MAX_LINE_LENGTH],cmd[MAX_LINE_LENGTH];
-
- printf("User name: ");
- ngets(buff, st_glob.inp);
- sprintf(cmd,"%s/%s",home,buff);
- if (access(cmd,X_OK))
- printf("No such directory.\n");
- else
- strcpy(work,cmd);
- return 1;
- }
-
- /* PROCESS A NEW SEP */
- int /* RETURNS: (nothing) */
- eval(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- int i;
- char act[MAX_ITEMS],buff[MAX_LINE_LENGTH];
- short i_s,i_i, i_lastseen, shown=0, rfirst=0;
- FILE *fp;
-
- refresh_sum(0,confidx,sum,part,&st_glob);
- for (i=0; i<MAX_ITEMS; i++) act[i]=0;
- st_glob.string[0] ='\0';
- st_glob.since = st_glob.before = st_glob.r_first = 0;
- st_glob.opt_flags = 0;
-
- if (argc>1) /* Process argc */
- range(argc,argv,&st_glob.opt_flags,act,sum,&st_glob,0);
- if (!st_glob.string[0]) {
- printf("UNK usage: eval [range] \"string\"\n");
- return 1;
- }
-
- open_pipe();
- if (!(st_glob.opt_flags & OF_RANGE)) {
-
- if (mode==M_OK || mode==M_SANE || mode==M_SUPERSANE)
- confsep(st_glob.string,confidx,&st_glob,part,0);
- else if (mode==M_RFP)
- itemsep(st_glob.string,0);
- else
- printf("UNK bad mode\n");
-
- } else {
-
- strcpy(buff,st_glob.string);
-
- if (mode==M_OK || mode==M_SANE || mode==M_SUPERSANE) {
-
- st_glob.string[0]='\0';
- if (st_glob.opt_flags & OF_REVERSE) {
- i_s = st_glob.i_last;
- i_i = -1;
- } else {
- i_s = st_glob.i_first;
- i_i = 1;
- }
-
- /* Process items */
- sepinit(IS_START); fp = NULL;
- for (st_glob.i_current = i_s;
- st_glob.i_current >= st_glob.i_first
- && st_glob.i_current <= st_glob.i_last
- && !(status & S_INT);
- st_glob.i_current += i_i) {
- if (cover(st_glob.i_current,confidx,st_glob.opt_flags,
- act[st_glob.i_current-1],sum, part, &st_glob)) {
- st_glob.r_first = rfirst;
- itemsep(buff,0);
- shown++;
- }
- }
- if (!shown && (st_glob.opt_flags & (OF_BRANDNEW|OF_NEWRESP)))
- wputs("No new items matched.\n");
-
- } else if (mode==M_RFP) {
- /* Open file */
- sprintf(buff,"%s/_%d",conflist[confidx].location,st_glob.i_current);
- if (!(fp=mopen(buff,O_R))) return 1;
-
- i_lastseen = st_glob.i_current-1;
- if (st_glob.opt_flags & (OF_NEWRESP|OF_NORESPONSE))
- st_glob.r_first = part[i_lastseen].nr;
- else if (st_glob.since) {
- st_glob.r_first=0;
- while (st_glob.since > re[st_glob.r_first].date) {
- st_glob.r_first++;
- get_resp(fp,&(re[st_glob.r_first]),(short)GR_HEADER,st_glob.r_first);
- if (st_glob.r_first>=sum[i_lastseen].nr) break;
- }
- }
- st_glob.r_last = MAX_RESPONSES;
- st_glob.r_max=sum[i_lastseen].nr-1;
-
- /* For each response */
- for (st_glob.r_current = st_glob.r_first;
- st_glob.r_current<= st_glob.r_last
- && st_glob.r_current<=st_glob.r_max
- && !(status & S_INT);
- st_glob.r_current++) {
- get_resp(fp,&(re[st_glob.r_current]),(short)GR_HEADER,st_glob.r_current);
- itemsep(st_glob.string,0);
- }
-
- mclose(fp);
- } else
- printf("UNK bad mode\n");
- }
- return 1;
- }
-
- /* CHANGE CLUSTER */
- int /* RETURNS: (nothing) */
- cluster(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- leave(0,(char**)0);
- open_cluster(argv[1],HELPDIR);
- return 1;
- }
-