jay@gdx.UUCP (Jay A. Snyder) (01/17/91)
Submitted-by: root@gdx Archive-name: gdxbbs/part03 ---- Cut Here and unpack ---- #!/bin/sh # this is gdxbbs.03 (part 3 of gdxbbs) # do not concatenate these parts, unpack them in order with /bin/sh # file mail.c continued # if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi if test ! -r @shar_seq_.tmp; then echo "Please unpack part 1 first!" exit 1 fi (read Scheck if test "$Scheck" != 3; then echo "Please unpack part $Scheck next!" exit 1 else exit 0 fi ) < @shar_seq_.tmp || exit 1 echo "x - Continuing file mail.c" sed 's/^X//' << 'SHAR_EOF' >> mail.c && X case 'p': /* read mail from current public message area */ X if ((msg_area=cur_msg_area)==NULL) X return(-1); X priv_mail=0; X break; X case 'a': /* select message area */ X strcpy(marea,optarg); X stripquote(marea); X if ((msg_area=(AREA *) find_msg_area(marea))==NULL) X return(-1); X if (!area_priv(msg_area)) X return(-1); X priv_mail=0; X break; X default: break; X } X } X i=1;ii=0; X send_list[0]=0; X while (i<argc && ii<80) X { X if (argv[i][0]!='-') X { X strcpy(&send_list[ii],argv[i]); X ii=ii+strlen(argv[i]); X send_list[ii++]=' '; X send_list[ii]=0; X } X ++i; X } X while (send_list[0]==0) X { X portsout("\rTo: "); X if (getline(send_list,160)==3) return(1); X portout('\n'); X if (send_list[0]==0) X { X if (!priv_mail) X strcpy(send_list,"All"); X else X { X portsout("You must specify who to send to.\n"); X portsout("or hit Control-C to cancel.\n"); X } X } X } X if (subject[0]==0) X { X portsout("\rSubject: "); X if (getline(subject,79)==3) return(1); X portout('\n'); X } X sprintf(filename,"/tmp/mtmp.%s",thistty); X remove(filename); X if ((fp=fopen(filename,"w"))==NULL) X return(1); X fprintf(fp,"To: %s\n",send_list); X fprintf(fp,"Subject: %s\n",subject); X fprintf(fp,"==== text follows this line ====\n"); X fclose(fp); X if (terminfo_mode && fsedit[0]) X { X sprintf(str,"%s %s",fsedit,filename); X systemx(str); X } X else X { X sprintf(str,"cat >>%s",filename); X portsout("Enter message, then end with ^D\n"); X systemx(str); X } X portsout("\n[sending message]"); X sendmailfile(filename,msg_area); X portsout("\r[message sent] \n"); X remove(filename); X} /* sendmail */ X X/* X process message X filename == file where message is stored X marea == message area to send it in ("" for private mail) X*/ Xsendmailfile(filename,msg_area) X char *filename; X AREA *msg_area; X{ X FILE *fp,*fp1; X char filename1[60],s[255],*to_ptr,to[160],subject[66]; X char msg_file[80],*mfptr,c; X sprintf(filename1,"/tmp/mtmp2.%s",thistty); X remove(filename1); X if ((fp=fopen(filename,"r"))==NULL) X return(1); X if ((fp1=fopen(filename1,"w"))==NULL) X return(1); X s[0]=0; X fscanf(fp,"%[^:\n]",s); X c=fgetc(fp); X fscanf(fp,"%*[ \n]"); X if (!strcmp(s,"To") && c==':') X { X myfgets(to,159,fp); X } X s[0]=0; X fscanf(fp,"%*[ \n]"); X fscanf(fp,"%[^:\n]",s); X c=fgetc(fp); X subject[0]=0; X if (!strcmp(s,"Subject") && c==':') X { X myfgets(subject,79,fp); X } X else if (c==':') fscanf(fp,"%*[^\n]"); /* skip reset of line */ X mail_header(s,to,subject); X fprintf(fp1,"%s\n",s); X while(!feof(fp)) /* skip the "==== text.." */ X { X s[0]=0; X fscanf(fp,"%[^\n]",s); X fgetc(fp); X if ((s[0]=='=' && s[1]=='=' && s[2]=='=' && s[3]=='=')) X break; X } X while(!feof(fp)) X { X s[0]=0; X fgets(s,254,fp); X if (!feof(fp)) X fputs(s,fp1); X } X fclose(fp); X fclose(fp1); X if (msg_area!=NULL) X { X strcpy(to,msg_area->file); X } X to_ptr=to; X while (*to_ptr) X { X mfptr=msg_file; X while(*to_ptr && isspace(*to_ptr)) ++to_ptr; /* skip white space */ X while(*to_ptr && *to_ptr!=',') /* skip to comma */ X { X *mfptr++=*to_ptr++; X } X if (*to_ptr==',') ++to_ptr; X *mfptr=0; X if (msg_area==NULL) X { X kill_trailing_space(msg_file); X if (chk_name(msg_file)==NULL) X { X portsout("\nInvalid username in send list: \""); X portsout(msg_file); X portsout("\"\n"); X mfptr=NULL; X } X else X { X cvt_spc(msg_file); X sprintf(s,"%s/%s",mail_dir,msg_file); X mfptr=s; X } X } X else mfptr=msg_file; X if (mfptr!=NULL) X if (append_file(filename1,mfptr)) X { X return(1); X } X } /* end while */ X/* pause(); */ X remove(filename1); X} X Xint chk_mail_cmd(str) Xchar *str; X{ X char *s,**p; X p=(char **) bsearch(&str,mailcmds,MAILCMDCOUNT,sizeof(char *),str_cmp); X if (p==NULL) return(-1); X return ((int) (p-mailcmds)); X} X X Xindex_msg_file(fp) X FILE *fp; X{ X int index; X char q; X index=0; X q=0; X while (!feof(fp) && (index<MAXMSG) && !q) X { X q=mail_seek(fp,1); X if (q || feof(fp)) break; X msg_ptrs[index]=(long int) ftell(fp); X ++index; X } X msg_count=index; X fseek(fp,msg_ptrs[0],SEEK_SET); /* goto beginning of file */ X cur_msg=0; X} X XFILE *mailopen(filename,access) X char *filename,*access; X{ X FILE *fp; X if (msg_ptrs!=NULL) X { X errorsout("mailopen: mail file already open\n"); X return(NULL); X } X if ((msg_ptrs=(long int *) calloc(MAXMSG,sizeof(long int)))==NULL) X { X errorsout("! mailopen: calloc failed.\n"); X fatal_error(MALLOC_ERROR); X } X if ((fp=fopen(filename,access))==NULL) /* re-write pointer at beginning of file */ X { X free(msg_ptrs); X msg_ptrs=NULL; X return(NULL); X } X index_msg_file(fp); X return(fp); X} X Xmailclose(fp) X{ X fclose(fp); X free(msg_ptrs); X msg_ptrs=NULL; X} X Xmail(argc,argv) X int argc; X char **argv; X{ X int x; X x=22; X while (x==22) X x=_mail(argc,argv); X return(x); X} X X/* X mail user --> send private mail to user X mail --> read/send private mail X mail -w message area --> read/send messages in message area X mail -q check for mail X*/ X_mail(argc,argv) X int argc; X char **argv; X{ X FILE *fp; X m_entry_ptr entry; X char s[80],q,input[80],marea[80]; X char *av[20]; X AREA *msg_area; X char msg_file[80],priv_mail; X extern char *optarg; X extern int optind; X char sendmail_flag,hdr_only; X int ac,sel,i,tmp; X X cur_msg=0; /* set current message to first message */ X priv_mail=1; X sendmail_flag=0; X hdr_only=0; X msg_area=NULL; X optind=1; X while ((i=getopt(argc,argv,"S:shpa:q"))!=EOF) X { X switch (i) X { X case 's': /* send mail */ X sendmail_flag=1; X break; X case 'q': /* check for mail */ X if (filesize(priv_mail_file(msg_file))>0) X rprintf("You have mail.\n"); X return(0); X break; X case 'h': /* list headers only */ X hdr_only=1; X break; X case 'p': /* read mail from current public message area */ X msg_area=cur_msg_area; X if (msg_area==NULL) X { X ac=1; X av[0]="chma"; X chma(ac,av); X return(22); X } X priv_mail=0; X break; X case 'a': /* select message area */ X strcpy(marea,optarg); X stripquote(marea); X msg_area=(AREA *) find_msg_area(marea); X if (msg_area==NULL) X { X portsout("Invalid message area.\n"); X return(-1); X } X if (!area_priv(msg_area)) X { X portsout("Sorry, you don't have access to message base: "); X boldon(); X portsout(msg_area->name); X boldoff(); X portout('\n'); X return(-1); X } X priv_mail=0; X break; X default: break; X } X } X if (sendmail_flag) X { X sendmail(argc,argv); X return(0); X } X /* else the user is attempting to read his/her private mail */ X if (priv_mail) X { X priv_mail_file(msg_file); X mdate=&maildate; X } X else X { X strcpy(msg_file,msg_area->file); X mdate=(&msg_area->tm); X } X if ((fp=mailopen(msg_file,"r+"))==NULL) X { X sprintf(s,"! Cannot open mail file:%s\n",msg_file); X errorsout(s); X return(-1); X } X if (priv_mail) print_headers(fp,priv_mail,maildate); X /* don't go into interactive if headers only */ X if (hdr_only) X { X mailclose(fp); X return(0); X } X q=0; X cur_msg=-1; /* so N)ext will read the first message */ X while (!q) X { X print_menu((priv_mail) ? mail_menu_ptr : pubmsg_menu_ptr); X boldoff(); X setcolor(BRWHITE,BLACK); X portsout(prompt); X boldon(); X setcolor(YELLOW,BLACK); X input[0]=0; X while (getline(input,79)==3) X { X setcolor(BRWHITE,BLACK); X portsout(prompt); X boldon(); X setcolor(YELLOW,BLACK); X input[0]=0; X } X boldoff(); X setcolor(LTGREEN,BLACK); X if (input[0]==0) X strcpy(s,"n"); /* default next */ X else X strcpy(s,input); X portout('\n'); X /* if (strlen(input)>3 && line_change) X push_line(input); */ X parse_line(&ac,av,s); X if ((entry=chk_entry(av[0][0],((priv_mail) ? mail_menu_ptr : pubmsg_menu_ptr)))!=NULL) X /* process menu selection */ X { X av[0]=entry->cmd; X } X if (av[0][0]=='!') X { X unparse_line(ac,av,input); X run_line(&input[1]); X } X else X { X sel=chk_mail_cmd(av[0]); X switch(sel) X { X case 0: /* '*' reread current message */ X if (cur_msg<0) cur_msg=0; X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X disp_msg(fp,priv_mail); X break; X case 1: /* chma, change message area */ X mailclose(fp); X chma(ac,av); X return(22); /* 22 is code to reenter read mail */ X break; X case 2: /* delete message */ X tmp=cur_msg; X if (ac>1) X tmp=atoi(av[1])-1; X if (tmp<0) X portsout("No current message.\n"); X else if (tmp<msg_count) X { X if (priv_mail || chk_del_perm(fp,tmp)) X /* check if message is to or from user */ X { X delmarkmsg(fp,tmp); X rprintf("Message %d deleted.\n",tmp+1); X } X else X { X portsout("Sorry, you cannot delete a message than isn't\n"); X portsout("from you or exclusively to you.\n"); X } X } X else X portsout("Invalid message number.\n"); X break; X case 3: /* headers */ X print_headers(fp,priv_mail,(time_t) 0); X break; X case 4: /* help */ X ac=2; X av[0]=("help"); X av[1]=("mail"); X help(ac,av); X break; X case 5: /* logout */ X q=2; X break; X case 6: /* newscan */ X print_headers(fp,priv_mail,*mdate); X break; X case 7: /* next */ X if (ac<2) /* display next msg */ X { X if (cur_msg==-1) X { X cur_msg=0; X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X while ((cur_msg<msg_count) && (msg_date(fp) <= *mdate)) X { X ++cur_msg; X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X } X if (cur_msg==msg_count) X { X portsout("No new messages.\n"); X break; X } X else X { X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X disp_msg(fp,priv_mail); X break; X } X } X if (cur_msg<msg_count-1) X { X ++cur_msg; X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X disp_msg(fp,priv_mail); X } X else X portsout("No more messages.\n"); X } X else /* take argument as msg # */ X { X tmp=atoi(av[1]); X if (!(tmp>msg_count) && tmp) X { X cur_msg=tmp; X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X disp_msg(fp,priv_mail); X } X else X portsout("Invalid message number\n"); X } X break; X case 8: /* prev */ X if (cur_msg<1) X portsout("No previous message\n"); X else X { X disp_msg(fp,priv_mail); X --cur_msg; X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X disp_msg(fp,priv_mail); X } X break; X case 9: /* quit */ X q=1; X break; X case 10: /* reply */ X if (cur_msg<0) X portsout("No current message.\n"); X else X { X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X replymail(fp,msg_area); X } X break; X case 11: /* send */ X if (priv_mail) sendmail(ac,av); X else X { X sprintf(str,"mail -s -a%s",msg_area->name); X run_line(str); X } X break; X default: X if (ac!=0) X { X tmp=atoi(av[0]); X if (tmp<=msg_count && tmp) X { X cur_msg=tmp-1; X fseek(fp,msg_ptrs[cur_msg],SEEK_SET); X disp_msg(fp,priv_mail); X } X else X portsout("Invalid message number\n"); X } X } X } /* else */ X } /* while */ X mailclose(fp); X if (priv_mail) /* don't pack a public message base */ X pack_msgfile(msg_file); X if (q==2) logout(ac,av); X} X Xchar *priv_mail_file(s) /* return path name of user's mail file */ X char *s; X{ X char tmp[80]; X strcpy(tmp,MYNAME); X cvt_spc(tmp); X sprintf(s,"%s/%s",mail_dir,tmp); X return(s); X} X Xcvt_spc(sp) X char *sp; X{ X char q; X q=0; X strdncase(sp); X *sp=toupper(*sp); X *sp=(char) toupper((char) *sp); X while (*sp) X { X if (*sp==' ') X { X if (!q) X { X *sp='_'; X q=1; X if (sp[1]) sp[1]=toupper(sp[1]); X } X else X { X *sp=0; X break; X } X } X ++sp; X } X} X X Xmscan(argc,argv) X int argc; X char *argv[]; X{ X} SHAR_EOF echo "File mail.c is complete" && $TOUCH -am 0107001191 mail.c && chmod 0644 mail.c || echo "restore of mail.c failed" set `wc -c mail.c`;Wc_c=$1 if test "$Wc_c" != "20376"; then echo original size 20376, current size $Wc_c fi # ============= packmsg.c ============== echo "x - extracting packmsg.c (Text)" sed 's/^X//' << 'SHAR_EOF' > packmsg.c && X/* X GDX-BBS V1.0 Beta X (C) 1990 X Jay A. Snyder X*/ X X#ifndef PACKMAIN X#include "inc.h" X#endif X X_pack_msgfile(fpin,fpout) X FILE *fpin, *fpout; X{ X char s[255]; X while (!feof(fpin)) X { X s[0]=0; X fgets(s,254,fpin); X if (!strcmp(s,"####~~~~\n")) /* deleted message */ X { X if (mail_seek(fpin,1)!=EOF) X fseek(fpin,-4L,SEEK_CUR); X else break; X } X else X fputs(s,fpout); X } X} X Xpack_msgfile(filename) X char *filename; X{ X FILE *fpin, *fpout; X char tmpfile[50],s[50]; X /* note that temporary file must be in same directory as X mail file, so that they are guarenteed to be on the X same filesystem, so that rename() will work properly X */ X sprintf(tmpfile,"%s/mtmp.%s",dirname(filename,s),thistty); X if ((fpout=fopen(tmpfile,"w"))==NULL) X { X#ifdef PACKMAIN X printf(stderr,"! cannot open temporyary file!\n"); X#else X errorsout("! cannot open temporyary file!\n"); X#endif X return(1); X } X if ((fpin=fopen(filename,"r"))!=NULL) X { X _pack_msgfile(fpin,fpout); X fclose(fpin); X fclose(fpout); X remove(filename); X rename(tmpfile,filename); X return(0); X } X else X { X sprintf(str1,"! Cannot open mail file %s\n",filename); X#ifdef PACKMAIN X printf(stderr,str1); X#else X errorsout(str1); X#endif X fclose(fpout); X return(-1); X } X} X X SHAR_EOF $TOUCH -am 0507213390 packmsg.c && chmod 0644 packmsg.c || echo "restore of packmsg.c failed" set `wc -c packmsg.c`;Wc_c=$1 if test "$Wc_c" != "1355"; then echo original size 1355, current size $Wc_c fi # ============= atout.c ============== echo "x - extracting atout.c (Text)" sed 's/^X//' << 'SHAR_EOF' > atout.c && X/* X GDX-BBS V1.0 Beta X (C) 1990 X Jay A. Snyder X*/ X X#include "inc.h" X Xint str_cmp(); X Xchar *colors[]={"black","blue","brown","brwhite","cyan","gray", X "green","ltblue","ltcyan","ltgreen","ltmagenta", X "ltred","magenta","red","white","yellow","\377\377"}; Xchar color_nums[]={0,4,3,15,6,8,2,12,14,10,13,9,5,1,7,11}; X#define COLORCOUNT 17 /* 16 + the \377\377 */ X Xchar *atcmds[]={ X "$", /* @$(variable) display value of envinronment variable */ X "blink", /* @blink(text) display text in blinking type */ X "bold", /* @bold(text) display text in bold type */ X "clear", /* clear screen */ X "color", /* @color(forecolor,backcolor) set screen color */ X "curfilearea", /* show current file area */ X "curmsgarea", /* show current message area */ X "date", /* show current date and time */ X "myname", /* show user's name */ X "normal", /* return to normal vidmode */ X "pause", /* do a more prompt */ X "reverse", /* @reverse(text) display text in reverse video */ X "sysop", /* sysop's name */ X "version", /* logo and version of program */ X "\377\377" X}; X#define ATCMDCOUNT (int) sizeof(atcmds)/sizeof(char *) X Xint color_num(str) X char *str; X{ X char *s,**p; X p=(char **) bsearch(&str,colors,COLORCOUNT,sizeof(char *),str_cmp); X if (p==NULL) return(-1); X return (color_nums[(int) (p-colors)]); X} X Xat_set_color(s) X char *s; X{ X int f,b; X char fc[20],bc[20]; X if (!color_mode) return; X fc[0]=0;bc[0]=0; X sscanf(s,"%[^ ,)]%*[ ,]%[^ )]",fc,bc); X if (fc[0]!=0) X f=color_num(fc); X else f=cur_forecolor; X if (bc[0]!=0) X b=color_num(bc); X else b=cur_backcolor; X setcolor(f,b); X} X Xchar *scan_arg(s,rs) X char *s,*rs; X{ X int nest; X nest=1; X if (*s!='(') X { X rs[0]=0; X return(s); X } X ++s; X while (nest) X { X if (*s=='(') ++nest; X if (*s==')') --nest; X if (nest) X *rs++=*s++; X } X *rs=0; X ++s; X return(s); X} X Xint chk_at_cmd(str) Xchar *str; X{ X char *s,**p; X p=(char **) bsearch(&str,atcmds,ATCMDCOUNT,sizeof(char *),str_cmp); X if (p==NULL) return(-1); X return ((int) (p-atcmds)); X} X X X X/* X output a string to the port, translating @commands X*/ Xatout(s) X char *s; X{ X int x; X char ss[80]; X char atcmd[80],*sptr; X while (*s) X { X if (*s !='@') fputc(*s++,stdout); X else X { X ++s; X if ((*s)=='@') fputc(*s++,stdout); X else X { X sptr=atcmd; X while (*s!='(' && !isspace(*s) && !ispunct(*s) && *s) X { X *sptr++=*s++; X } X *sptr=0; X x=chk_at_cmd(atcmd); X switch(x) X { X case 0: /* env var */ X if (*s=='(') X { X s=scan_arg(s,ss); X if ((sptr=getenv(ss))!=NULL) X atout(sptr); X } X break; X case 1: /* blink */ X blinkon(); X if (*s=='(') X { X s=scan_arg(s,ss); X atout(ss); X blinkoff(); X } X break; X case 2: /* bold */ X xboldon(); X if (*s=='(') X { X s=scan_arg(s,ss); X atout(ss); X boldoff(); X } X break; X case 3: /* clear */ X cls(); X break; X case 4: /* color */ X s=scan_arg(s,ss); X at_set_color(ss); X break; X case 5: /* cur-file-area */ X if (cur_file_area!=NULL) X portsout(cur_file_area->name); X break; X case 6: /* cur-msg-area */ X if (cur_msg_area!=NULL) X portsout(cur_msg_area->name); X break; X case 7: /* date */ X portsout((char *) timestr()); X break; X case 8: /* myname */ X portsout(MYNAME); X break; X case 9: /* normal */ X normattr(); X break; X case 10: /* pause */ X pause(); X break; X case 11: /* reverse */ X reverseon(); X if (*s=='(') X { X s=scan_arg(s,ss); X atout(ss); X reverseoff(); X } X break; X case 12: X portsout(sysop_name); X break; X case 13: X ver(); X break; X default: X portsout("[invalid @command:"); X portsout(atcmd); X portsout("]"); X } X } X } X } X} X SHAR_EOF $TOUCH -am 0514161690 atout.c && chmod 0644 atout.c || echo "restore of atout.c failed" set `wc -c atout.c`;Wc_c=$1 if test "$Wc_c" != "3833"; then echo original size 3833, current size $Wc_c fi # ============= term.c ============== echo "x - extracting term.c (Text)" sed 's/^X//' << 'SHAR_EOF' > term.c && X/* X GDX-BBS V1.0 Beta X (C) 1990 X Jay A. Snyder X*/ X X#include "inc.h" X Xextern rawortout(); Xshort ospeed; X Xrawportout(c) X char c; X{ X putchar(c); X if (monitor_on) X fputc(c,monfp); X} X Xrawportsout(s) X char *s; X{ X while (*s) rawportout(*s++); X} X X X Xportsout(s) X char *s; X{ X#ifdef USECURSES Xif (curses_init) X { X /* printw("%s",s); */ X addstr(s); X refresh(); X } Xelse X#endif X rawportsout(s); X} X X Xportout(c) Xchar c; X{ X#ifdef USECURSES X if (curses_init) X { X addch(c); X refresh(); X } Xelse X#endif X rawportout(c); X} X Xchar portin() X{ X char c; X c=-1; X idletime=0; X alarm_on(); X#ifdef SCO || XENIX X while (c<=0) X#endif X { X#ifdef USECURSES X if (curses_init) c=(wgetch(stdscr)); X else X#endif X c=fgetc(stdin); X } X alarm_off(); X return(c); X} X X X Xgetcaps() X{ X char *area; X char err; X area=capbuf; X termset=1; X err=tgetent(tb,term); X if (err!=1) X { X error_message(BAD_TERM); X portsout("Terminal cannot support cursor movement.\n"); X portsout("Full screen options cannot be used.\n"); X termset=0; X return; X } X AL=tgetstr("al",&area); X BC=tgetstr("bc",&area); X CD=tgetstr("cd",&area); X CE=tgetstr("ce",&area); X CL=tgetstr("cl",&area); X CO=tgetnum("co"); X CM=tgetstr("cm",&area); X DC=tgetstr("dc",&area); X DL=tgetstr("dl",&area); X DM=tgetstr("dm",&area); X ED=tgetstr("ed",&area); X EI=tgetstr("ei",&area); X IC=tgetstr("ic",&area); X IM=tgetstr("im",&area); X IP=tgetstr("ip",&area); X LI=tgetnum("li"); X MB=tgetstr("mb",&area); X MD=tgetstr("md",&area); X ME=tgetstr("me",&area); X MR=tgetstr("mr",&area); X PCstr=tgetstr("pc",&area); X SE=tgetstr("se",&area); X SO=tgetstr("so",&area); X TE=tgetstr("te",&area); X TI=tgetstr("ti",&area); X UP=tgetstr("up",&area); X VE=tgetstr("ve",&area); X VS=tgetstr("vs",&area); X if (PCstr!=NULL) X PC=PCstr[0]; X else X PC='\0'; X if (LI==-1) X { X portsout("Terminal cannot support cursor movement.\n"); X portsout("Full screen options cannot be used.\n"); X termset=0; X LI=24; X return(1); X } X/* now we fix up for those terminals that do not have specific caps */ X if (MD[0]==0 && SO[0]!=0) /* make bold=standout */ X MD=SO; X if (MR[0]==0 && SO[0]!=0) /* make reverse=standout */ X MR=SO; X if (MB[0]==0 && SO[0]!=0) /* make blink=standout */ X MB=SO; X if (ME[0]==0 && SE[0]!=0) /* make attrib off=standoff */ X ME=SE; X} X Xcls() X{ X#ifdef USECURSES X if (curses_init) X { X clear(); X refresh(); X } X else X#endif X if (terminfo_mode) X { X tputs(CL,1,rawportout); X } X} X Xclreol() X{ X#ifdef USECURSES X if (curses_init) X { X clrtoeol(); X refresh(); X } X else X#endif X if (terminfo_mode) X { X tputs(CE,1,rawportout); X } X} X X_setcolor(forecolor,backcolor) Xint forecolor,backcolor; X{ Xchar s[10]; Xif (!color_mode) return; Xif (forecolor<0) return; Xif (backcolor<0) /* no change in background */ X sprintf(s,"\033[%dm",30+(forecolor & 7)); Xelse X sprintf(s,"\033[%d;%dm",30+(forecolor & 7),40+(backcolor & 7)); X_normattr(); Xrawportsout(s); Xif ((forecolor&8)==8) X tputs(MD,1,rawportout); X} X Xsetcolor(forecolor,backcolor) Xint forecolor,backcolor; X{ X cur_forecolor=forecolor; X cur_backcolor=backcolor; X _setcolor(forecolor,backcolor); X} X Xfixcolor() X{ X _setcolor(cur_forecolor,cur_backcolor); X} X Xboldon() X{ X#ifdef USECURSES X if (curses_init) X { X attron(A_BOLD); X refresh(); X } X else X#endif X if (terminfo_mode) X { X tputs(MD,1,rawportout); X } X} X Xxboldon() /* use BRWHITE if already a bold color */ X{ X if (color_mode) X { X if ((cur_forecolor && 8)==0) X _setcolor(cur_forecolor|8,cur_backcolor); X else if (cur_forecolor==BRWHITE) X _setcolor(cur_backcolor,cur_forecolor); X else _setcolor(BRWHITE,cur_backcolor); X } X else X boldon(); X} X X_normattr() X{ X#ifdef USECURSES X if (curses_init) X { X attrset(0); X refresh(); X } X else X#endif X if (terminfo_mode) X { X tputs(ME,1,rawportout); X } X} X X Xnormattr() X{ X if (terminfo_mode) X { X if (color_mode) fixcolor(); X else _normattr(); X } X} X Xboldoff() X{ X#ifdef USECURSES X if (curses_init) X { X attroff(A_BOLD); X refresh(); X } X else X#endif X if (terminfo_mode) X { X tputs(ME,1,rawportout); X } Xfixcolor(); X} X Xreverseon() X{ X#ifdef USECURSES X if (curses_init) X { X attron(A_REVERSE); X refresh(); X } X else X#endif X if (terminfo_mode) X { X if (color_mode) X _setcolor(cur_backcolor,cur_forecolor); X else X tputs(MR,1,rawportout); X } X} X Xreverseoff() X{ X#ifdef USECURSES X if (curses_init) X { X attroff(A_REVERSE); X refresh(); X } X else X#endif X if (terminfo_mode) X { X if (color_mode) X fixcolor; X else X tputs(ME,1,rawportout); X } Xfixcolor(); X} X Xblinkon() X{ X#ifdef USECURSES X if (curses_init) X { X attron(A_BLINK); X refresh(); X } X else X#endif X if (terminfo_mode) X { X tputs(MB,1,rawportout); X } X} X Xblinkoff() X{ X#ifdef USECURSES X if (curses_init) X { X attroff(A_BLINK); X refresh(); X } X else X#endif X if (terminfo_mode) X { X tputs(ME,1,rawportout); X } Xfixcolor(); X} X Xenter_terminfo() X{ X setupterm((char *)0,1,(int *)0); X terminfo_mode=1; X} X Xexit_terminfo() X{ X if (terminfo_mode) X { X reset_shell_mode(); X terminfo_mode=0; X } X} X X/* setraw() --> put terminal in raw mode */ Xvoid setraw() X{ X#ifndef MSDOS X#ifdef OLDTTY X struct sgttyb tbuf; X#else X struct termio tbuf; X#endif X if (now_raw) return; X#ifdef OLDTTY X if (ioctl(0,TIOCGETP, &tbuf) == -1) /* may be pipe */ X return; X if (ioctl(0,TIOCGETP, &tbufsave) == -1) X errorsout("setraw - ioctl"); X ospeed = tbuf.sg_ospeed; X tbuf.sg_flags |= RAW | CBREAK; X tbuf.sg_flags &= (~(CRMOD | ECHO)); X if (ioctl(0, TIOCSETP, &tbuf) == 01) X errorsout("setraw - ioctl2"); X#else X if (ioctl(0, TCGETA, &tbuf) == -1) /* may be pipe */ X return; X tbufsave = tbuf; X ospeed = tbuf.c_cflag & CBAUD; X tbuf.c_iflag &= ~(INLCR | ICRNL | IUCLC | ISTRIP | IXON | BRKINT); X tbuf.c_oflag |= OPOST; X tbuf.c_lflag &= ~(ICANON | ECHO); X tbuf.c_lflag |= (ISIG); X tbuf.c_cc[VMIN]=20; /* min */ X tbuf.c_cc[VTIME]=2; /* time */ X if (ioctl(0, TCSETAF, &tbuf) == -1) X errorsout("setraw - ioctl"); X#endif X now_raw=TRUE; X#endif /* MSDOS */ X} X X Xvoid unsetraw() /* restore terminal flags */ X{ X#ifndef MSDOS X static char first = TRUE; X if (!now_raw) X return; X#ifdef OLDTTY X (void) ioctl(0,TIOCSETP,&tbufsave); /* may be pipe */ X#else X (void) ioctl(0,TCSETAF,&tbufsave); /* may be pipe */ X#endif X#ifndef XENIX X/* setblock(0,TRUE); */ X#endif X now_raw=FALSE; X#endif /* MSDOS */ X} X Xset_isig(isig) /* enable/disable keyboard interrupt */ X int isig; X{ X#ifndef MSDOS X#ifdef OLDTTY X struct sgttyb tbuf; X#else X struct termio tbuf; X#endif X#ifdef OLDTTY X if (ioctl(0,TIOCGETP, &tbuf) == -1) /* may be pipe */ X return; X#else X if (ioctl(0, TCGETA, &tbuf) == -1) /* may be pipe */ X return; X tbuf.c_lflag &= (~ISIG); X if (isig) X tbuf.c_lflag |= (ISIG); X if (ioctl(0, TCSETAF, &tbuf) == -1) X errorsout("set_isig - ioctl"); X#endif X#endif /* MSDOS */ X} X Xset_ctrl_chars() X{ X#ifndef MSDOS X#ifdef OLDTTY X struct sgttyb tbuf; X#else X struct termio tbuf; X#endif X#ifdef OLDTTY X if (ioctl(0,TIOCGETP, &tbuf) == -1) /* may be pipe */ X return; X#else X if (ioctl(0, TCGETA, &tbuf) == -1) /* may be pipe */ X return; X tbuf.c_cc[VINTR]='\003'; /* ^C */ X tbuf.c_cc[VEOF]='\004'; /* ^D */ X/* tbuf.c_cc[VERASE]='\010';*/ /* ^H */ X tbuf.c_cc[VKILL]='\025'; /* ^U */ X if (ioctl(0, TCSETAF, &tbuf) == -1) X errorsout("set_ctrl_chars: ioctl error!\n"); X#endif X#endif /* MSDOS */ X} X SHAR_EOF $TOUCH -am 1215083790 term.c && chmod 0644 term.c || echo "restore of term.c failed" set `wc -c term.c`;Wc_c=$1 if test "$Wc_c" != "7639"; then echo original size 7639, current size $Wc_c fi # ============= env.c ============== echo "x - extracting env.c (Text)" sed 's/^X//' << 'SHAR_EOF' > env.c && X/* X GDX-BBS V1.0 Beta X (C) 1990 X Jay A. Snyder X*/ X X#include "inc.h" X X/* X copy current environment into local one. X*/ Xinit_env() X{ X int i; X X i=0; X local_env[0]=NULL; X while (environ[i]!=NULL) X { X setenv(environ[i]); X ++i; X } X environ=local_env; X} X Xdisp_env() X{ X int i; X X i=0; X while (local_env[i]!=NULL) X { X portsout(local_env[i++]); X portout('\n'); X } X} X Xenvcmp(s1,s2) X char *s1,*s2; X{ X char i; X while (!(i=*s1 - *s2) && *s1 && *s2 && *s1!='=' && *s2!='=') {++s1;++s2;} X return(i); X} X Xchar **searchenv(value) X char *value; X{ X int i; X i=0; X while (local_env[i]!=NULL) X { X if (!envcmp(local_env[i],value)) return(&local_env[i]); X ++i; X } X return(NULL); X} X Xsetenv(value) X char *value; X{ X int i; X char **oldvalue; X if (strchr(value,'=')==NULL) return; X X if ((oldvalue=searchenv(value))!=NULL) X { X free(*oldvalue); X } X else X { X i=0; X while (local_env[i]!=NULL && i<MAXENV-1) ++i; /* get next available X variable pointer */ X if (i>=MAXENV-1) return(-1); X oldvalue=&local_env[i]; X local_env[i+1]=NULL; X } X if ((*oldvalue=malloc(strlen(value)+1))==NULL) X { X error_message(MALLOC_ERROR); X assert(0); X quit(); X } X strcpy(*oldvalue,value); X return(0); X} X Xsub_env(strin,strout) X char *strin,*strout; X{ X char var[40],*v,*v1; X char sstr[LINE_SIZE],*str,brace; X int i; X i=0; X str=sstr; X while (*strin && ++i<LINE_SIZE) X { X if (*strin=='$') X { X ++strin; X brace=0; X v=var; X if (*strin=='{') X { X brace=1; X ++strin; X } X while (*strin && !isspace(*strin) && !(*strin=='}' && brace)) X { X *v++=*strin++; X } X if (*strin=='}' && brace) X { X brace=0; X ++strin; X } X *v=0; X v1=(char *) getenv(var); X if (v1!=NULL) X { X strcpy(str,v1); X str=&str[strlen(str)]; X } X } X else (*str++=*strin++); X } X *str=0; X strcpy(strout,sstr); X} X Xset(argc,argv) X int argc; X char *argv[]; X{ X int i; X char s[LINE_SIZE]; X if (argc==1) X { X disp_env(); X return(0); X } X unparse_line(argc-1,&argv[1],s); X setenv(s); X return(0); X} SHAR_EOF $TOUCH -am 0507213490 env.c && chmod 0644 env.c || echo "restore of env.c failed" set `wc -c env.c`;Wc_c=$1 if test "$Wc_c" != "2171"; then echo original size 2171, current size $Wc_c fi # ============= areas.c ============== echo "x - extracting areas.c (Text)" sed 's/^X//' << 'SHAR_EOF' > areas.c && X/* X GDX-BBS V1.0 Beta X (C) 1990 X Jay A. Snyder X*/ X X/* X (C) 1990 X Jay A. Snyder X*/ X X#include "inc.h" X Xchar *area_tok[]={"desc","dir","file","group", X "owner","priv","udir","\377\377"}; X#define AREATOKCOUNT (int) sizeof(area_tok)/sizeof(char *) X Xint nbsearch(); Xint scmp(); X X X/* X find_area(name,area) --> find <name> area start searching with <area> X*/ XAREA *find_area(name,area) X char *name; X AREA *area; X{ X if (area==NULL) return(NULL); X while (area!=NULL) X { X if (!ncstrcmp(name,area->name)) return(area); X area=area->next; X } X return(NULL); X} X X/* X find_msg_area() --> find the named message area X return it's pointer if found, NULL if not X*/ XAREA *find_msg_area(name) X char *name; X{ X AREA *area; X return(find_area(name,first_msg_area)); X} X X/* X find_file_area() --> find the named file area X return it's pointer if found, NULL if not X*/ XAREA *find_file_area(name) X char *name; X{ X AREA *area; X return(find_area(name,first_file_area)); X} X XAREA *last_area(first) X AREA *first; X{ X AREA *cur; X if (first==NULL) return (NULL); X cur=first; X while (cur->next!=(AREA *) NULL) cur=(AREA *) cur->next; X return(cur); X} X XAREA *malloc_area() X{ X AREA *cur; X if ((cur=(AREA *) malloc(sizeof(AREA)))==NULL) X { X error_message(MALLOC_ERROR); X assert(0); X quit(); X } X return(cur); X} X XAREA *new_area(first) X AREA *first; X{ X AREA *cur,*last; X cur=malloc_area(); X if (first==(AREA *)NULL) X first=cur; X else X { X last=last_area(first); X last->next=(AREA *) cur; X } X cur->next=NULL; X cur->name[0]=0; X cur->desc[0]=0; X cur->dir[0]=0; X cur->owner[0]=0; X cur->file[0]=0; X cur->group[0]=0; X cur->priv=0; X cur->udir[0]=0; X return(cur); X} X X X/* X set_area_values(area) --> set values of area from file X*/ Xset_area_values(area,fp) X AREA *area; X FILE *fp; X{ Xchar *p,c,token[20],value[80]; Xint i; Xwhile (!feof(fp)) X { X if (read_tokstr(fp,token,value)==-1) return; X p=token; X i=nbsearch(&p, area_tok, AREATOKCOUNT, sizeof(char *), scmp); X if (debug>2) printf("token %d:%s=%s\n",i,token,value); X switch (i) X { X case 0: /* desc */ X sprintf(area->desc,"%.60s",value); X break; X case 1: /* dir */ X sprintf(area->dir,"%.80",value); X break; X case 2: /* file */ X sprintf(area->file,"%.80s",value); X break; X case 3: /* group */ X sprintf(area->group,"%.20s",value); X break; X case 4: /* owner */ X sprintf(area->owner,"%.20s",value); X break; X case 5: /* priv */ X area->priv=strtol(value,NULL,16); X break; X case 6: /* udir */ X sprintf(area->udir,"%.80",value); X break; X default: X printf("Illegal token in area configuration\n"); X break; X } X } X} X X Xload_areas_file(filename,first_ptr) X char *filename; X AREA **first_ptr; X{ X int i; X char c,*p,token[20],value[80]; X AREA *cur; X FILE *fp; X char s[254]; X if ((fp=fopen(filename,"r"))==NULL) X { X return(-1); X } X while (!feof(fp)) X { X fscanf(fp,"%*[ \t\n]"); /* skip white space */ X if (feof(fp)) break; X myfgets(s,70,fp); /* get line */ X if (s[0]!='#') X { X if (feof(fp)) break; X cur=new_area(*first_ptr); X if (*first_ptr==NULL) *first_ptr=cur; X fscanf(fp,"%*[ \t\n]"); /* skip white space */ X sprintf(cur->name,"%.19s",s); X if ((c=fgetc(fp))=='{') X { X set_area_values(cur,fp); X } X else ungetc(c,fp); X if (debug) X printf("\nname=%s\nfile=%s\nowner=%s\ngroup=%s\ndesc=%s\npriv=%d\n", X cur->name,cur->file,cur->owner,cur->group,cur->desc,cur->priv); X if (cur->dir[0]==0) X dirname(cur->file,cur->dir); X } X } X fclose(fp); X return(0); X} X X/* X load_areas() --> load file and message areas X*/ Xload_areas() X{ X if (load_areas_file(msgareas_file,&first_msg_area)) X { X error_message(MSGAREA_FILE_ERROR); X } X if (load_areas_file(filelibs_file,&first_file_lib)) X { X error_message(AREALIB_FILE_ERROR); X } X if (load_areas_file(areas_file,&first_file_area)) X { X error_message(AREA_FILE_ERROR); X } X} X X X X/* X cha() --> change area: X argc, argv are passed directly from chfa, and chma X desc is a char string of the description of what we are choosing X first is an AREA ptr to the first area of linked list X cur is a ptr to the AREA ptr of the current area of that list X*/ Xint cha(argc,argv,desc,first,cur) X int argc; X char **argv; X char *desc; X AREA *first,**cur; X{ X AREA *area; X char s[LINE_SIZE]; X int i; X area=NULL; X if (argc>1) X { /* is arg is a number use it */ X if ((i=atoi(argv[1]))>0) X { X area=first; X while((--i)>0 && area!=NULL) X { X area=area->next; X } X } X /* if arg isn't a number, or out of range, try by name */ X if (area==NULL) X area=find_area(argv[1],first); X /* if still no success, then print error message and return */ X if (area!=NULL) X if (area_priv(area)) X { X *cur=area; X return(0); X } /* if user doesn't have access, just report invalid msg base */ X rprintf("%s: Invalid %s base name or number: %s\n",argv[0],desc,argv[1]); X rprintf("Type %s alone to list available %ss.\n",argv[0],desc); X return(-1); X } X rprintf("%ss:\n",desc); X rprintf(" %-20s %-56.59s\n","Area Name","Description"); X disp_areas(first); X rprintf("Select %s:",desc); X str[0]=0; X if (getline(str,20)==3) return(-1); X portout('\n'); Xif (debug) printf("getline done\n"); X if (str[0]==0) return(-1); X sprintf(s,"%s %s",argv[0],str); Xif (debug) X{ Xprintf("sprintf done\n"); Xprintf("s=%s\n",s); X} X i=run_line(s); Xif (debug) printf("runline done\n"); X return(i); X} X Xdisp_areas(area) X AREA *area; X{ X char s[82]; X int i,page_lines; X i=0;page_lines=1; X while (area!=NULL && !ctrlc()) X { X ++i; X if (area_priv(area)) X { X rprintf("%2d %-20s %-55.55s\n",i,area->name,area->desc); X if (++page_lines==LI-3 && pagemode) X pause(); X } X area=area->next; X } X} X Xchma(argc,argv) X char *argv[]; X int argc; X{ X cha(argc,argv,"Message Area",first_msg_area,&cur_msg_area); X} X Xchfa(argc,argv) X char *argv[]; X int argc; X{ X cha(argc,argv,"File Area",first_file_area,&cur_file_area); X} X Xchfal(argc,argv) X char *argv[]; X int argc; X{ X cha(argc,argv,"File Area Library",first_file_lib,&cur_file_lib); X} X SHAR_EOF $TOUCH -am 1230235690 areas.c && chmod 0644 areas.c || echo "restore of areas.c failed" set `wc -c areas.c`;Wc_c=$1 if test "$Wc_c" != "6355"; then echo original size 6355, current size $Wc_c fi # ============= sig.c ============== echo "x - extracting sig.c (Text)" sed 's/^X//' << 'SHAR_EOF' > sig.c && X/* X GDX-BBS V1.0 Beta X (C) 1990 X Jay A. Snyder X*/ X X#include "inc.h" X X Xctrlc() X{ X if (!ctrlc_stat) return(0); X ctrlc_stat=0; X return(1); X} X Xint ctrlc_sig() X{ X portout('\n'); X if (color_mode) _setcolor(BRWHITE,BLUE); X else reverseon(); X portsout(" INTERRUPT "); X if (color_mode) fixcolor(); X else reverseoff(); X portout('\n'); X ctrlc_stat=1; X signal(SIGINT,ctrlc_sig); X} X Xctrlc_on() X{ X signal(SIGINT,ctrlc_sig); X set_isig(1); X ctrlc_stat=0; X} X Xctrlc_off() X{ X signal(SIGINT,SIG_IGN); X set_isig(0); X ctrlc_stat=0; X} X Xalarm_sig() X{ Xchar x[80]; X ++idletime; X if (idletime>=idleout && !sysop) X { X logout(-1); X } X if (idletime>=idlewarn && !sysop) X { X portsout("\nPlease Respond.\007\n"); X } X alarm_on(); X} X Xalarm_on() X{ X signal(SIGALRM,alarm_sig); X alarm(alarm_interval); X} X Xalarm_off() X{ X signal(SIGALRM,SIG_IGN); X} X SHAR_EOF $TOUCH -am 0507213390 sig.c && chmod 0644 sig.c || echo "restore of sig.c failed" set `wc -c sig.c`;Wc_c=$1 if test "$Wc_c" != "871"; then echo original size 871, current size $Wc_c fi # ============= priv.c ============== echo "x - extracting priv.c (Text)" sed 's/^X//' << 'SHAR_EOF' > priv.c && X#include "inc.h" X X/* X priveledges: X file and message areas, commands, and menu entries can all have a privledge X requirement. Each bit in the priv fields is associated with a privledge. X If priv=0, then any user can access the resouce. If it is non-zero, then the X user must have at least one non-zero bit in common with priv. X*/ X X/* X chk_priv() return TRUE if user meets privlege specified in priv X*/ Xchk_priv(priv) X PRIV priv; X{ X if (sysop) return(TRUE); X if (priv==0) return(TRUE); X return(priv & logged_user.priv); X} X X/* X check user's permission of command. X return TRUE is permission granted, FLASE otherwise X*/ Xchk_cmd_priv(c) X COMMAND *c; X{ X return(chk_priv(c->priv)); X} X X/* X area_priv() --> check the user's access of a message base or file area X*/ Xarea_priv(area) X AREA *area; X{ X return(chk_priv(area->priv)); X} X X Xchk_menu_priv(ptr) X m_entry_ptr ptr; X{ X return(chk_priv(ptr->priv)); X} Xchk_menu_header_priv(ptr) X m_header_ptr ptr; X{ X return(chk_priv(ptr->priv)); X} SHAR_EOF $TOUCH -am 1231001690 priv.c && chmod 0644 priv.c || echo "restore of priv.c failed" set `wc -c priv.c`;Wc_c=$1 if test "$Wc_c" != "1013"; then echo original size 1013, current size $Wc_c fi # ============= config.h ============== echo "x - extracting config.h (Text)" sed 's/^X//' << 'SHAR_EOF' > config.h && X/* config.h : custom configuration of program */ X X/* maximum number of password trys */ X#define MAXTRY 3 X X#define ALARM_INTERVAL 60 /* seconds */ X#define DEF_IDLEWARN 2 /* minutes */ X#define DEF_IDLEOUT 3 /* minutes */ X#define DEF_MAXTIME 60 /* minutes */ X X/* default sysop name */ X#define SYSOP "sysop" X X/* support files */ X#define MENU_FILE menu_file X#define DEF_MENU_FILE "menu.mcl" X#define ERRORLOG_FILE errorlog_file X#define DEF_ERRORLOG_FILE "error.log" X#define USER_FILE user_file X#define TMP_USER_FILE "userfile.tmp" X#define DEF_USER_FILE "users.bbs" X#define UTMP_FILE utmp_file X#define DEF_UTMP_FILE "utmp.bbs" X#define LOG_FILE log_file X#define DEF_LOG_FILE "callers.bbs" X#define AREAS_FILE areas_file X#define DEF_AREAS_FILE "areas.bbs" X#define FILELIBS_FILE filelibs_file X#define DEF_FILELIBS_FILE "filelibs.bbs" X#define MSGAREAS_FILE msgareas_file X#define DEF_MSGAREAS_FILE "msgareas.bbs" X#define CONFIG_FILE config_file X#define DEF_CONFIG_FILE "config.bbs" X#define QUEST_FILE quest_file X#define DEF_QUEST_FILE "question.bbs" X#define QUEST_OUT_FILE quest_out_file X#define DEF_QUEST_OUT_FILE "answer.bbs" X#define NEWUSER_FILE newuser_file X#define DEF_NEWUSER_FILE "newuser.src" X#define STARTUP_FILE startup_file X#define DEF_STARTUP_FILE "startup.src" X#define DEF_BUL_FILE X#define BUL_FILE bul_file X#define DEF_MAIL_DIR "mail" X#define DEF_HOME_DIR "." X#define DEF_PROMPT "GDX-BBS>" X#define DEF_MONDEV "/dev/null" X#define DEF_UL_PATH "*/upload" SHAR_EOF $TOUCH -am 1228000890 config.h && chmod 0600 config.h || echo "restore of config.h failed" set `wc -c config.h`;Wc_c=$1 if test "$Wc_c" != "1455"; then echo original size 1455, current size $Wc_c fi # ============= defs2.h ============== echo "x - extracting defs2.h (Text)" sed 's/^X//' << 'SHAR_EOF' > defs2.h && XUSER *chk_name(); Xchar *ttyname(); Xextern int optind; Xextern char *optarg; Xextern int errno; Xextern char **environ; X Xchar *eatnl(); Xchar *timestr(); Xchar *myfgets(); Xchar *basename(); Xchar *dirname(); X X/* external declarations */ X/* extern char *tgetstr(); */ X X X#ifdef F_SYSV Xint rename(); X#define remove unlink X#endif X X#define fatal_error(errnum) { \ X errorsout("FATAL: "); \ X error_message(errnum); \ X assert(0); \ X exitprog(errnum); \ X } X SHAR_EOF $TOUCH -am 0324035690 defs2.h && chmod 0600 defs2.h || echo "restore of defs2.h failed" set `wc -c defs2.h`;Wc_c=$1 if test "$Wc_c" != "492"; then echo original size 492, current size $Wc_c fi # ============= inc.h ============== echo "x - extracting inc.h (Text)" sed 's/^X//' << 'SHAR_EOF' > inc.h && X#include <stdio.h> X#ifdef HAVE_STDLIB X#include <stdlib.h> X#endif X#include <ctype.h> X#include <signal.h> X#include <search.h> X#include <termio.h> X/* #include <term.h> */ X#include <string.h> X#include <fcntl.h> X#include <time.h> X#include <malloc.h> X#include <sys/param.h> X#include <sys/poll.h> X#include <sys/types.h> X#include <sys/stat.h> X#ifdef OLDTTY X#include <sgtty.h> X#else X#ifdef F_BSD X#include <sys/ioctl.h> X#endif X/* #include <termio.h> */ X#endif X#include <errno.h> X#include <assert.h> X#include "defs.h" X#include "structs.h" X#include "defs2.h" X#include "global.h" X#include "termdefs.h" X#include "config.h" SHAR_EOF $TOUCH -am 1225234290 inc.h && chmod 0644 inc.h || echo "restore of inc.h failed" set `wc -c inc.h`;Wc_c=$1 if test "$Wc_c" != "611"; then echo original size 611, current size $Wc_c fi # ============= termdefs.h ============== echo "x - extracting termdefs.h (Text)" sed 's/^X//' << 'SHAR_EOF' > termdefs.h && XPUBEXT int CO,LI; /* columns, lines */ XPUBEXT char X *AL, /* insert line */ X *BC, /* backspace */ X *CD, /* clear to end of display */ X *CE, /* clear eol */ X *CL, /* clear screen */ X *CM, /* cursor motion */ X *DC, /* delete character */ X *DL, /* delete line */ X *DM, /* enter delete mode */ X *ED, /* end delete mode */ X *EI, /* end insert mode */ X *IC, /* insert character */ X *IM, /* enter insert mode */ X *IP, /* post-insert padding */ X *MB, /* blink attribute */ X *MD, /* bold attribute */ X *ME, /* end attribute */ X *MR, /* reverse attribute */ X PC, *PCstr, /* pad character and string */ X *SE, /* end standout mode */ X *SO, /* enter standout mode */ X *TE, /* end cursor addressing mode */ X *TI, /* enter cursor addressing mode */ X *UP, /* cursor up */ X *VE, /* end visual mode */ X *VS /* enter visual mdoe */ X ; X X SHAR_EOF $TOUCH -am 0314003690 termdefs.h && chmod 0600 termdefs.h || echo "restore of termdefs.h failed" set `wc -c termdefs.h`;Wc_c=$1 if test "$Wc_c" != "853"; then echo original size 853, current size $Wc_c fi # ============= defs.h ============== echo "x - extracting defs.h (Text)" sed 's/^X//' << 'SHAR_EOF' > defs.h && X#define BLACK 0 X#define RED 1 X#define GREEN 2 X#define BROWN 3 X#define BLUE 4 X#define MAGENTA 5 X#define CYAN 6 X#define WHITE 7 X#define GREY 8 X#define LTRED 9 X#define LTGREEN 10 X#define YELLOW 11 X#define LTBLUE 12 X#define LTMAGENTA 13 X#define LTCYAN 14 X#define BRWHITE 15 X X X/* error constants */ X#define MENU_FILE_ERROR 1 X#define UTMP_FILE_ERROR 2 X#define MALLOC_ERROR 3 X#define BAD_TERM 4 X#define BAD_MENU_TAG 5 X#define ERRORLOG_ERROR 6 X#define USER_FILE_ERROR 7 X#define LOG_FILE_ERROR 8 X#define CONFIG_FILE_ERROR 9 X#define PRIV_ERROR 10 X#define QUEST_FILE_ERROR 11 X#define TMP_USER_FILE_ERROR 12 X#define INVALID_USER 13 X#define FORK_ERROR 14 X#define EXEC_ERROR 15 X#define MSGAREA_FILE_ERROR 16 X#define AREA_FILE_ERROR 17 X#define AREALIB_FILE_ERROR 17 X X#ifdef SCO X#define cbreak crmode X#endif X#define CR 13 X#define BS 8 X#define NL 10 X#define ESC 27 X#define DEL 127 Xtypedef int(*fptr)(); X X#define MYNAME logged_user.name X#ifndef ANSI X/* seek stuff */ X#define SEEK_SET 0 X#define SEEK_CUR 1 X#define SEEK_END 2 X#endif X X/* maximum number of messages per base */ X#define MAXMSG 200 X X/* maximum number of envinronment variables */ X#define MAXENV 200 X X/* maximum command line size */ X#define LINE_SIZE 1024 X#define BUFSIZE 1024 X X#define TRUE 1 X#define FALSE 0 X X/* sysop priv is bit 31 of the priv field */ X#define SYSOP_PRIV 0x80000000 SHAR_EOF $TOUCH -am 1230230990 defs.h && chmod 0600 defs.h || echo "restore of defs.h failed" set `wc -c defs.h`;Wc_c=$1 if test "$Wc_c" != "1327"; then echo original size 1327, current size $Wc_c fi # ============= global.h ============== echo "x - extracting global.h (Text)" sed 's/^X//' << 'SHAR_EOF' > global.h && X#ifndef MAIN X#define PUBEXT extern X#else X#define PUBEXT /* */ X#endif XPUBEXT m_header_ptr mail_menu_ptr; XPUBEXT m_header_ptr pubmsg_menu_ptr; XPUBEXT m_header_ptr proto_menu_ptr; XPUBEXT char ul_exe[80],dl_exe[80]; XPUBEXT m_header_ptr first_menu_ptr X#ifdef MAIN X =NULL; X#else X ; X#endif XPUBEXT char str[LINE_SIZE], input[LINE_SIZE]; XPUBEXT char str1[LINE_SIZE],buf[BUFSIZE]; X/* mode flags */ XPUBEXT char debug,sysop,sysop_login,termset,term[20], X capbuf[512],tb[1024],*t,prompt[20], X expert_mode,ansi,color_mode,echo_mode; X/* PUBEXT struct sgttyb t_mode, c_mode; */ XPUBEXT char *cmd_stack,*cmdptr,*rcmdptr; XPUBEXT int cmd_stack_size X#ifdef MAIN X =0x800; X#else X ; X#endif XPUBEXT int line_change; XPUBEXT m_header_ptr current_menu; XPUBEXT pagemode; XPUBEXT USER *first_user_ptr; XPUBEXT USER *tmp_user; XPUBEXT USERREC logged_user; XPUBEXT char chkpriv; XPUBEXT char doing_source; XPUBEXT char menu_file[63], errorlog_file[63], user_file[63], config_file[63], X utmp_file[63], log_file[63],areas_file[63],msgareas_file[63], X quest_file[63],quest_out_file[63],newuser_file[63], X filelibs_file[63],startup_file[63]; XPUBEXT char sysop_name[30]; XPUBEXT int maxtry; XPUBEXT int cmdcount; XPUBEXT char thistty[15]; XPUBEXT utmpentry *first_utmp,*last_utmp; XPUBEXT int logged_users; XPUBEXT char who_switch; XPUBEXT char sys_home_dir[81]; XPUBEXT char mail_dir[81]; XPUBEXT time_t maildate,logdate,*mdate; /* time/date that mail was last read */ XPUBEXT char home_dir[81]; XPUBEXT AREA *cur_msg_area,*first_msg_area; XPUBEXT AREA *cur_file_area,*first_file_area; XPUBEXT AREA *cur_file_lib,*first_file_lib; XPUBEXT char curses_init; XPUBEXT char terminfo_mode; X#ifdef OLDTTY XPUBEXT struct sgttyb tbufsave; X#else XPUBEXT struct termio tbufsave; X#endif XPUBEXT char now_raw X#ifdef MAIN X =FALSE; X#else X ; X#endif XPUBEXT cur_forecolor,cur_backcolor; XPUBEXT char defterm[12]; XPUBEXT long int *msg_ptrs; XPUBEXT int cur_msg,msg_count; XPUBEXT char fsedit[120]; XPUBEXT char *local_env[MAXENV]; XPUBEXT int kbd_pid; XPUBEXT ctrlc_stat; XPUBEXT char user_is_logged; XPUBEXT int alarm_interval, idlewarn, idleout, maxtime, idletime; XPUBEXT char def_ul_path[81]; X X/* monitor stuff */ XPUBEXT char mondev[21]; XPUBEXT int monitor_on; XPUBEXT FILE *monfp; SHAR_EOF $TOUCH -am 1228011690 global.h && chmod 0600 global.h || echo "restore of global.h failed" set `wc -c global.h`;Wc_c=$1 if test "$Wc_c" != "2245"; then echo original size 2245, current size $Wc_c fi # ============= structs.h ============== echo "x - extracting structs.h (Text)" sed 's/^X//' << 'SHAR_EOF' > structs.h && Xtypedef unsigned long PRIV; X Xstruct m_entry { X char name[19]; X char actkey; X char cmd[60]; X PRIV priv; /* permission bits */ X struct m_entry *next; X }; X Xtypedef struct m_entry *m_entry_ptr; X Xstruct m_header { X char tag[13]; X char name[40]; X PRIV priv; /* permission bits */ X int count; X char one_shot; X struct m_entry *first_entry; X struct m_header *next; X }; X Xtypedef struct m_header *m_header_ptr; X Xstruct COMMAND_STRUCT { X char *name; X fptr func; X int fnum; X PRIV priv; /* permission bits */ SHAR_EOF echo "End of gdxbbs part 3" echo "File structs.h is continued in part 4" echo "4" > @shar_seq_.tmp exit 0