home *** CD-ROM | disk | FTP | other *** search
- /* JOQ.C */
- static char sccsid[] = "@(#)joq.c 1.24 93/06/09 Copyright (c)1993 thalerd";
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include "config.h"
- #include "struct.h"
- #include "lib.h"
- #include "globals.h"
- #include "joq.h"
- #include "item.h"
- #include "sum.h"
- #include "xalloc.h"
- #include "files.h"
- #include "stats.h"
-
- static int pdebug = 0;
-
- /******************************************************************************/
- /* DISPATCH CONTROL TO APPROPRIATE JOQ COMMAND FUNCTION */
- /******************************************************************************/
- char /* RETURNS: 0 on abort, 1 else */
- joq_cmd_dispatch(argc,argv) /* ARGUMENTS: */
- int argc; /* Number of arguments */
- char **argv; /* Argument list */
- {
- char **ulst,file[MAX_LINE_LENGTH],buff[MAX_LINE_LENGTH];
- short j;
- char **config;
-
- if (match(argv[0],"r_egister")
- || match(argv[0],"j_oin")
- || match(argv[0],"p_articipate")) {
- if (confidx>=0) leave(0,(char**)0);
- write_part((char *)NULL);
- st_new.c_status |= CS_JUSTJOINED;
- mode=M_OK;
-
- /* Add login to ulist */
- if (config = get_config(joinidx)) {
- char sec;
- sec=(xsizeof(config)>CF_SECURITY)? atoi(config[CF_SECURITY]) : 0;
- if (!(sec & CT_READONLY)
- && (sec & CT_BASIC)!=CT_PRESELECT
- && (sec & CT_BASIC)!=CT_PARANOID) {
-
- sprintf(file,"%s/%s",conflist[joinidx].location,"ulist");
- sprintf(buff,"%s\n",login);
- if (!(ulst=grab_file(conflist[joinidx].location,"ulist",
- GF_SILENT|GF_WORD|GF_IGNCMT)))
- write_file(file,buff);
- else {
- for (j=xsizeof(ulst)-1;
- j>=0 && strcmp(ulst[j],login) && uid!=atoi(ulst[j]);
- j--);
- if (j<0)
- write_file(file,buff);
- xfree(ulst);
- }
- }
- }
-
- } else if (match(argv[0],"o_bserver")) {
- sumentry_t sum2[MAX_ITEMS];
- short i;
-
- if (confidx>=0) leave(0,(char**)0);
- st_new.c_status |= (CS_OBSERVER|CS_JUSTJOINED);
- mode=M_OK;
-
- /* Initialize part[] */
- for (i=0; i<MAX_ITEMS; i++) part[i].nr=part[i].last=0;
- get_status(&st_new,sum2,part,joinidx);
- st_new.sumtime = 0;
- for (i=st_new.i_first+1; i<st_new.i_last; i++) time(&(part[i-1].last));
- } else if (match(argv[0],"h_elp")) help(argc,argv);
- else if (match(argv[0],"q_uit")) { status |= S_QUIT; mode=M_OK; }
- else {
- printf("I don't understand \"%s\" - type HELP for help\n",argv[0]);
- }
- return 1;
- }
-
- /******************************************************************************/
- /* WRITE OUT A USER PARTICIPATION FILE FOR THE CURRENT CONFERENCE */
- /******************************************************************************/
- void /* RETURNS: (nothing) */
- write_part(partfile) /* ARGUMENTS: */
- char *partfile; /* Filename */
- {
- char buff[MAX_LINE_LENGTH],*file;
- FILE *fp;
- short i,cpid,wpid;
- status_t *stt;
- sumentry_t sum2[MAX_ITEMS],*sum3;
-
- if (st_glob.c_status & CS_OBSERVER)
- return;
-
- if (partfile) {
- file=partfile;
- sum3 = sum;
- stt = &st_glob;
- } else {
- char **config;
-
- if (!(config = get_config(joinidx)))
- return;
- file = config[CF_PARTFILE];
- sum3 = sum2;
- stt = &st_new;
-
- /* Initialize part[] */
- for (i=0; i<MAX_ITEMS; i++) part[i].nr=part[i].last=0;
- get_status(stt,sum2,part,joinidx);
- for (i=st_new.i_first+1; i<st_new.i_last; i++)
- time(&(part[i-1].last));
- stt->sumtime = 0;
- }
-
- /* Create WORK/.name.cf */
- sprintf(buff,"%s/%s",work,file);
- if (flags & O_DEBUG) printf("join: Partfile=%s\n",buff);
- if (pdebug) printf("WRITING %s\n",buff);
-
- /* FORK */
- if (cpid=fork()) { /* parent */
- if (cpid<0) return; /* error: couldn't fork */
- while ((wpid = wait((int *)0)) != cpid && wpid != -1);
- } else { /* child */
- setuid(getuid());
- setgid(getgid());
-
- /* KKK*** in the future, allocate string array of #items+2,
- save lines in there, call dump_file, and free the array */
- if ((fp=mopen(buff,O_W))==NULL) /* "w" */
- exit(1);
- fprintf(fp,"!<pr03>\n%s\n",st_glob.fullname);
-
- if (pdebug) printf("first %d last %d\n",stt->i_first, stt->i_last);
- for (i=stt->i_first; i<=stt->i_last; i++) {
- if (pdebug) printf("sum3[%d]=%d ",i-1,sum3[i-1].nr);
- if (sum3[i-1].nr || part[i-1].last) {
- fprintf(fp,"%d %d %X\n",i,part[i-1].nr,part[i-1].last);
- if (pdebug) printf(": %d %d %X",i,part[i-1].nr,part[i-1].last);
- fflush(fp);
- }
- if (pdebug) printf("\n");
- }
- mclose(fp);
- exit(0);
- } /* ENDFORK */
-
- if (flags & O_DEBUG) printf("write_part: fullname=%s\n",st_glob.fullname);
- }
-
- /******************************************************************************/
- /* READ IN A USER PARTICIPATION FILE FOR SOME CONFERENCE */
- /******************************************************************************/
- char /* RETURNS: (nothing) */
- read_part(partfile,part,stt,idx) /* ARGUMENTS: */
- char *partfile; /* Filename */
- partentry_t part[MAX_ITEMS]; /* Array to fill in */
- status_t *stt;
- short idx;
- {
- char **partf,buff[MAX_LINE_LENGTH];
- short sz,i,a,b;
- long d;
- struct stat st;
- sumentry_t sum2[MAX_ITEMS];
-
- for (i=0; i<MAX_ITEMS; i++) part[i].nr=part[i].last=0;
- strcpy(stt->fullname,st_glob.fullname);
- if (!(partf=grab_file(work,partfile,GF_SILENT))) {
-
- /* Newly joined, Initialize part[] */
- for (i=0; i<MAX_ITEMS; i++) part[i].nr=part[i].last=0;
- get_status(stt,sum2,part,idx);
- stt->sumtime = 0;
- for (i=stt->i_first+1; i<stt->i_last; i++) time(&(part[i-1].last));
-
- return 0;
- }
- sz=xsizeof(partf);
- if (!sz || strcmp(partf[0],"!<pr03>"))
- printf("UNK Invalid participation file format.\n");
- else if (sz>1)
- strcpy(stt->fullname,partf[1]);
- for (i=2; i<xsizeof(partf); i++) {
- sscanf(partf[i],"%hd %hd %lx",&a,&b,&d);
- part[a-1].nr = b;
- part[a-1].last = d;
- }
- xfree(partf);
-
- sprintf(buff,"%s/%s",work,partfile);
- if (!stat(buff,&st) && st.st_size>0)
- stt->parttime = st.st_mtime;
-
- if (flags & O_DEBUG) printf("read_part: fullname=%s\n",st_glob.fullname);
- return 1;
- }
-