cit301.part9
    Eric J. Nihill 
    eric at sactoh0.SAC.CA.US
       
    Mon Nov 26 08:37:48 AEST 1990
    
    
  
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	source
# This archive created: Sun Nov 25 13:03:54 1990
export PATH; PATH=/bin:/usr/bin:$PATH
if test ! -d 'source'
then
	echo shar: "creating directory 'source'"
	mkdir 'source'
fi
echo shar: "entering directory 'source'"
cd 'source'
echo shar: "extracting 'bsd.patches'" '(80248 characters)'
if test -f 'bsd.patches'
then
	echo shar: "will not over-write existing file 'bsd.patches'"
else
cat << \SHAR_EOF > 'bsd.patches'
Dcitadel.c   644    465   1770       51145  4472360466   6101 *** ORIG/citadel.c	Mon Aug 14 17:18:33 1989
--- citadel.c	Tue Aug 15 16:42:21 1989
***************
*** 7,13 ****
  
  #include <fcntl.h>
  #include <stdio.h>
! #include <ctype.h>
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
--- 7,13 ----
  
  #include <fcntl.h>
  #include <stdio.h>
! #include "ctype.h"
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
***************
*** 15,21 ****
--- 15,25 ----
  #include <signal.h>
  #include <pwd.h>
  #include <setjmp.h>
+ #ifdef BSD
+ #include <sgtty.h>
+ #else
  #include <termio.h>
+ #endif
  #define CITADEL_C
  #include "citadel.h"
  
***************
*** 40,51 ****
--- 44,65 ----
  int curr_rm;				/* Room NUMBER of current room.  */
  int hold_rm;				/* Temporary room number */
  					/* 0=Lobby 1=Mail 2=Aide 3-up=other */
+ #ifdef BSD
+ int newnow;
+ int upass;				/* Nonzero if pw is managed by UNIX */
+ #else
  char newnow;
  char upass;				/* Nonzero if pw is managed by UNIX */
+ #endif
  long yourpos;				/* position of your usersupp record */
  char temp[50];				/* Name of general temp file */
  int twitroom;				/* Room num of TWIT room (if enabled) */
+ #ifdef BSD
+ struct sgttyb stty0;			/* holds old flags settings */
+ struct tchars stty1;			/* holds old special settings */
+ #else
  struct termio stty0;			/* holds old termio settings */
+ #endif
  jmp_buf nextbuf;
  int ugnum; long uglsn;			/* holds <u>ngoto info */
  
***************
*** 52,57 ****
--- 66,74 ----
  int (*backnext())() {
  	signal(SIGINT,SIG_IGN);
  	signal(SIGQUIT,SIG_IGN);
+ #ifdef BSD
+ 	printf("\n\r");
+ #endif
  	longjmp(nextbuf,1);
  	}
  
***************
*** 58,73 ****
  int (*backstop())() {
  	signal(SIGQUIT,SIG_IGN);
  	signal(SIGINT,SIG_IGN);
  	longjmp(nextbuf,2);
  	}
  
  int (*sleeping())() {
  	struct calllog rtmp;
! 	printf("Sleeping? Call again.\n");
  	strcpy(rtmp.CLfullname,ttyname(0));
  	rtmp.CLflags=CL_SLEEPING;
  	rec_log(&rtmp);
! 	logoff(1); }
  
  int (*dropcarr())() {
  	struct calllog rtmp;
--- 75,94 ----
  int (*backstop())() {
  	signal(SIGQUIT,SIG_IGN);
  	signal(SIGINT,SIG_IGN);
+ #ifdef BSD
+ 	printf("\n\r");
+ #endif
  	longjmp(nextbuf,2);
  	}
  
  int (*sleeping())() {
  	struct calllog rtmp;
! 	printf("Sleeping? Call again.\n\r");
  	strcpy(rtmp.CLfullname,ttyname(0));
  	rtmp.CLflags=CL_SLEEPING;
  	rec_log(&rtmp);
! 	logoff(1);
! }
  
  int (*dropcarr())() {
  	struct calllog rtmp;
***************
*** 87,93 ****
--- 108,119 ----
  	}
  
  setsane() {
+ #ifdef BSD
+ 	ioctl(0,TIOCSETP,&stty0);
+ 	ioctl(0,TIOCSETC,&stty1);
+ #else
  	ioctl(0,TCSETA,&stty0);
+ #endif
  	}
  
  char *months[12]={
***************
*** 115,120 ****
--- 141,148 ----
  	sttybbs(1);
  	fmout(usersupp.screenwidth,aaa);
  	sttybbs(0);
+ 	signal(SIGINT,SIG_IGN);
+ 	signal(SIGQUIT,SIG_IGN);
  	return(0);
  }
  
***************
*** 188,199 ****
  char mtsflag,twit;
  
  chdir(BBSDIR);			/* go to the right directory */
  ioctl(0,TCGETA,&stty0);		/* Store the old terminal parameters and */
  sttybbs(0);			/* install the new ones                  */
  signal(SIGINT,SIG_IGN);
  signal(SIGQUIT,SIG_IGN);
  signal(SIGHUP,(*dropcarr));	/* Cleanup gracefully if carrier is dropped */
! printf("\nCitadel/UX release 3.01-1b\n");
  twit=0;				/* By default, user is not a problem user */
  usersupp.screenwidth=80;
  formout("messages/hello");	/* print the opening greeting */
--- 216,232 ----
  char mtsflag,twit;
  
  chdir(BBSDIR);			/* go to the right directory */
+ #ifdef BSD
+ ioctl(0,TIOCGETP,&stty0);	/* Store the old terminal parameters and */
+ ioctl(0,TIOCGETC,&stty1);	/* Store the old special parameters and */
+ #else
  ioctl(0,TCGETA,&stty0);		/* Store the old terminal parameters and */
+ #endif
  sttybbs(0);			/* install the new ones                  */
  signal(SIGINT,SIG_IGN);
  signal(SIGQUIT,SIG_IGN);
  signal(SIGHUP,(*dropcarr));	/* Cleanup gracefully if carrier is dropped */
! printf("\n\rCitadel/UX release 3.01-1b\n\r");
  twit=0;				/* By default, user is not a problem user */
  usersupp.screenwidth=80;
  formout("messages/hello");	/* print the opening greeting */
***************
*** 202,207 ****
--- 235,244 ----
  a=getuid();
  passwd=(struct passwd *)getpwuid(a);
  strcpy(fullname,passwd->pw_gecos);
+ #ifdef BSD
+ for (b=0; b<strlen(fullname); b++)
+ 	if (fullname[b] == ';') fullname[b]=0;
+ #endif
  upass=1; if (a==BBSUID) upass=0;
  
  twitroom=(-1);
***************
*** 254,268 ****
  		}
  
  	file=eopen("eternal",O_RDWR);	/* get a new user number */
! 	read(file,&aa,4);
  	usersupp.eternal=aa;
  	aa=aa+1L;
  	lseek(file,0L,0);
! 	write(file,&aa,4);
  	close(file);
  
  	formout("messages/newuser");
! 	printf("  (setting up an account. please wait)\n");
  						/* Add user to the        */
  	file=eopen("usersupp",O_RDONLY);	/* usersupp file, keeping */
  	file2=creat("/tmp/usersupp",0666);	/* the file in            */
--- 291,305 ----
  		}
  
  	file=eopen("eternal",O_RDWR);	/* get a new user number */
! 	read(file,&aa,sizeof(aa));
  	usersupp.eternal=aa;
  	aa=aa+1L;
  	lseek(file,0L,0);
! 	write(file,&aa,sizeof(aa));
  	close(file);
  
  	formout("messages/newuser");
! 	printf("  (setting up an account. please wait)\n\r");
  						/* Add user to the        */
  	file=eopen("usersupp",O_RDONLY);	/* usersupp file, keeping */
  	file2=creat("/tmp/usersupp",0666);	/* the file in            */
***************
*** 279,286 ****
--- 316,327 ----
  	close(file); close(file2);
  	signal(SIGHUP,SIG_IGN);
  	unlink("usersupp");
+ #ifdef BSD
+ 	system("mv /tmp/usersupp usersupp");
+ #else
  	link("/tmp/usersupp","usersupp");
  	unlink("/tmp/usersupp");
+ #endif
  	chmod("usersupp",0600);
  	signal(SIGHUP,(*dropcarr));
  	strcpy(calllog.CLfullname,usersupp.fullname);
***************
*** 298,305 ****
  
  USOK:	/* make sure that if it's a shell user, they log in from the shell */
  	if (upass==0) if (usersupp.USuid!=BBSUID) {
! 	printf("Please log in by running Citadel from the shell.\n");
! 	printf("(press any key to continue)\n");
  	inkey();
  	logoff(0);
  	}
--- 339,346 ----
  
  USOK:	/* make sure that if it's a shell user, they log in from the shell */
  	if (upass==0) if (usersupp.USuid!=BBSUID) {
! 	printf("Please log in by running Citadel from the shell.\n\r");
! 	printf("(press any key to continue)\n\r");
  	inkey();
  	logoff(0);
  	}
***************
*** 312,318 ****
  		pwcrypt(usersupp.password,PWCRYPT);
  		goto PWOK;
  		}
! 	printf("Wrong password...\n");
  	strcpy(calllog.CLfullname,usersupp.fullname);
  	calllog.CLflags=CL_BADPW;
  	rec_log(&calllog);
--- 353,359 ----
  		pwcrypt(usersupp.password,PWCRYPT);
  		goto PWOK;
  		}
! 	printf("Wrong password...\n\r");
  	strcpy(calllog.CLfullname,usersupp.fullname);
  	calllog.CLflags=CL_BADPW;
  	rec_log(&calllog);
***************
*** 346,357 ****
  	calllog.CLflags=CL_LOGIN;
  	rec_log(&calllog);
  
! 	printf("%s\nAccess level: %s\nUser #%ld / Call #%d\n",
  		usersupp.fullname,axdefs[usersupp.axlevel],
  		usersupp.eternal,usersupp.timescalled);
  if ((REGISCALL!=0)&&((usersupp.flags&US_REGIS)==0)
  		&&(usersupp.timescalled>=REGISCALL)) {
! 	printf("*** Registration is requested.\n");
  	formout("messages/register");
  	a=entregis(usersupp.eternal);
  	if (a==0) {
--- 387,398 ----
  	calllog.CLflags=CL_LOGIN;
  	rec_log(&calllog);
  
! 	printf("%s\n\rAccess level: %s\n\rUser #%ld / Call #%d\n\r",
  		usersupp.fullname,axdefs[usersupp.axlevel],
  		usersupp.eternal,usersupp.timescalled);
  if ((REGISCALL!=0)&&((usersupp.flags&US_REGIS)==0)
  		&&(usersupp.timescalled>=REGISCALL)) {
! 	printf("*** Registration is requested.\n\r");
  	formout("messages/register");
  	a=entregis(usersupp.eternal);
  	if (a==0) {
***************
*** 366,379 ****
  		read(file,&msgmain,sizeof(struct msgmain));
  		close(file);
  		if (msgmain.MMflags&MM_VALID)
! 			printf("*** New users need to be validated\n");
  		}
  
  	b=0;				/* check for mail */
  	for (a=0; a<MAILSLOTS; ++a)
  		if (usersupp.mailnum[a]>usersupp.lastseen[1]) ++b;
! 	if (b==1) printf("*** You have a new private message in Mail>\n");
! 	if (b>1)  printf("*** You have %d new private messages in Mail>\n",b);
  
  	sprintf(temp,"/tmp/cit%d",getpid()); /* make up a temp file name */
  
--- 407,420 ----
  		read(file,&msgmain,sizeof(struct msgmain));
  		close(file);
  		if (msgmain.MMflags&MM_VALID)
! 			printf("*** New users need to be validated\n\r");
  		}
  
  	b=0;				/* check for mail */
  	for (a=0; a<MAILSLOTS; ++a)
  		if (usersupp.mailnum[a]>usersupp.lastseen[1]) ++b;
! 	if (b==1) printf("*** You have a new private message in Mail>\n\r");
! 	if (b>1)  printf("*** You have %d new private messages in Mail>\n\r",b);
  
  	sprintf(temp,"/tmp/cit%d",getpid()); /* make up a temp file name */
  
***************
*** 403,409 ****
  MAIN:	signal(SIGINT,SIG_IGN);
  	signal(SIGQUIT,SIG_IGN);
  	a=room_prompt(&quickroom);
! 	printf("\n%s%c ",quickroom.QRname,a); /* room prompt */
  	getcmd(aaa);
  MAINFAKE:
  if (!strcmp(aaa,"h"))				goto HELP;
--- 444,450 ----
  MAIN:	signal(SIGINT,SIG_IGN);
  	signal(SIGQUIT,SIG_IGN);
  	a=room_prompt(&quickroom);
! 	printf("\n\r%s%c ",quickroom.QRname,a); /* room prompt */
  	getcmd(aaa);
  MAINFAKE:
  if (!strcmp(aaa,"h"))				goto HELP;
***************
*** 468,479 ****
  	a=fork();
  	if (a==0) {
  		execlp("chat","chat",usersupp.fullname,NULL);
! 		printf("Chat program not available.\n");
  		exit(0);
  		}
  	}
  	do {
  		b=wait();
  		} while((b!=a)&&(b!=(-1)));
  
  if (!strcmp(aaa,"*")) {
--- 509,524 ----
  	a=fork();
  	if (a==0) {
  		execlp("chat","chat",usersupp.fullname,NULL);
! 		printf("Chat program not available.\n\r");
  		exit(0);
  		}
  	}
  	do {
+ #ifdef BSD
+ 		b=wait(0);
+ #else
  		b=wait();
+ #endif
  		} while((b!=a)&&(b!=(-1)));
  
  if (!strcmp(aaa,"*")) {
***************
*** 515,521 ****
  		lseek(file,aa,0);
  		write(file,&tempUS,sizeof(struct usersupp));
  		}
! 	else printf("No such user.\n");
  	close(file);
  	}
  
--- 560,566 ----
  		lseek(file,aa,0);
  		write(file,&tempUS,sizeof(struct usersupp));
  		}
! 	else printf("No such user.\n\r");
  	close(file);
  	}
  
***************
*** 540,556 ****
  		if (usersupp.flags&US_NOPROMPT) goto RNEXT;
  		printf("<A>gain, <N>ext, <S>top -> ");
  RPROMPT2:	b=inkey(); b=(b&127); b=tolower(b);
! 		if (b=='a') { printf("Again\n");	goto RAGAIN; }
! 		if (b=='n') { printf("Next\n");		goto RNEXT; }
! 		if (b=='s') { printf("Stop\n");		goto RSTOP; }
  	if((usersupp.axlevel>=6)||(usersupp.eternal==quickroom.QRroomaide))
  		if ((b=='d')&&(curr_rm!=1)) {
! 			printf("Delete\n");
  			goto RDELETE;
  			}
  	if((usersupp.axlevel>=6)||(usersupp.eternal==quickroom.QRroomaide))
  		if ((b=='m')&&(curr_rm!=1)) {
! 			printf("Move\n");
  			move_message(fullroom.FRpos[a]);
  			delete_message(fullroom.FRnum[a]);
  			goto RNEXT;
--- 585,601 ----
  		if (usersupp.flags&US_NOPROMPT) goto RNEXT;
  		printf("<A>gain, <N>ext, <S>top -> ");
  RPROMPT2:	b=inkey(); b=(b&127); b=tolower(b);
! 		if (b=='a') { printf("Again\n\r");	goto RAGAIN; }
! 		if (b=='n') { printf("Next\n\r");		goto RNEXT; }
! 		if (b=='s') { printf("Stop\n\r");		goto RSTOP; }
  	if((usersupp.axlevel>=6)||(usersupp.eternal==quickroom.QRroomaide))
  		if ((b=='d')&&(curr_rm!=1)) {
! 			printf("Delete\n\r");
  			goto RDELETE;
  			}
  	if((usersupp.axlevel>=6)||(usersupp.eternal==quickroom.QRroomaide))
  		if ((b=='m')&&(curr_rm!=1)) {
! 			printf("Move\n\r");
  			move_message(fullroom.FRpos[a]);
  			delete_message(fullroom.FRnum[a]);
  			goto RNEXT;
***************
*** 583,597 ****
  		if (usersupp.flags & US_NOPROMPT) goto VNEXT;
  		printf("<A>gain, <N>ext, <S>top -> ");
  VPROMPT2:	b=inkey(); b=(b&127); b=tolower(b);
! 		if (b=='a') { printf("Again\n");	goto VAGAIN; }
! 		if (b=='n') { printf("Next\n");		goto VNEXT; }
! 		if (b=='s') { printf("Stop\n");		goto VSTOP; }
  	if((usersupp.axlevel>=6)||(usersupp.eternal==quickroom.QRroomaide))
  		if ((b=='d')&&(curr_rm!=1))
! 			{ printf("Delete\n"); goto VDELETE; }
  	if((usersupp.axlevel>=6)||(usersupp.eternal==quickroom.QRroomaide))
  		if ((b=='m')&&(curr_rm!=1)) {
! 			printf("Move\n");
  			move_message(fullroom.FRpos[a]);
  			delete_message(fullroom.FRnum[a]);
  			goto VNEXT;
--- 628,642 ----
  		if (usersupp.flags & US_NOPROMPT) goto VNEXT;
  		printf("<A>gain, <N>ext, <S>top -> ");
  VPROMPT2:	b=inkey(); b=(b&127); b=tolower(b);
! 		if (b=='a') { printf("Again\n\r");	goto VAGAIN; }
! 		if (b=='n') { printf("Next\n\r");	goto VNEXT; }
! 		if (b=='s') { printf("Stop\n\r");	goto VSTOP; }
  	if((usersupp.axlevel>=6)||(usersupp.eternal==quickroom.QRroomaide))
  		if ((b=='d')&&(curr_rm!=1))
! 			{ printf("Delete\n\r"); goto VDELETE; }
  	if((usersupp.axlevel>=6)||(usersupp.eternal==quickroom.QRroomaide))
  		if ((b=='m')&&(curr_rm!=1)) {
! 			printf("Move\n\r");
  			move_message(fullroom.FRpos[a]);
  			delete_message(fullroom.FRnum[a]);
  			goto VNEXT;
***************
*** 602,613 ****
  
  ENTMSG:
  	if ((usersupp.axlevel<2)&&(curr_rm!=1)) {
! 		printf("Need to be validated to enter\n");
! 		printf("(except in Mail> to Sysop)\n");
  		goto MAIN;
  		}
  	if ((usersupp.axlevel<4)&&(quickroom.QRflags&QR_NETWORK)) {
! 		printf("Need net privileges to enter here\n");
  		goto MAIN;
  		}
  	mtsflag=0;
--- 647,658 ----
  
  ENTMSG:
  	if ((usersupp.axlevel<2)&&(curr_rm!=1)) {
! 		printf("Need to be validated to enter\n\r");
! 		printf("(except in Mail> to Sysop)\n\r");
  		goto MAIN;
  		}
  	if ((usersupp.axlevel<4)&&(quickroom.QRflags&QR_NETWORK)) {
! 		printf("Need net privileges to enter here\n\r");
  		goto MAIN;
  		}
  	mtsflag=0;
***************
*** 623,645 ****
  		e=alias(buf);			/* alias and mail type */
  		if (buf[0]==0) goto MAIN;
  		if (e==M_ERROR) {
! 			printf("Bad address - can't send message\n");
  			goto MAIN;
  			}
  		if ((e!=M_LOCAL)&&(usersupp.axlevel<4)) {
! 			printf("Need net privileges for network mail\n");
  			goto MAIN;
  			}
  	if (!strucmp(buf,"sysop")) { mtsflag=1; goto SKFALL; }
  	if (e!=M_LOCAL) goto SKFALL;	/* don't search local file if remote */
  	if (!strucmp(buf,usersupp.fullname)) {
! 		printf("Can't send mail to yourself!\n");
  		goto MAIN; }
  
  	file=eopen("usersupp",O_RDONLY);	/* check to make sure the */
  	aa=finduser(file,buf);			/* user exists; also get  */
  	if (aa==(-1)) {				/* the right upper/lower  */
! 		printf("No such user.\n");	/* casing of the name     */
  		close(file);
  		goto MAIN; }
  	read(file,&tempUS,sizeof(struct usersupp));
--- 668,690 ----
  		e=alias(buf);			/* alias and mail type */
  		if (buf[0]==0) goto MAIN;
  		if (e==M_ERROR) {
! 			printf("Bad address - can't send message\n\r");
  			goto MAIN;
  			}
  		if ((e!=M_LOCAL)&&(usersupp.axlevel<4)) {
! 			printf("Need net privileges for network mail\n\r");
  			goto MAIN;
  			}
  	if (!strucmp(buf,"sysop")) { mtsflag=1; goto SKFALL; }
  	if (e!=M_LOCAL) goto SKFALL;	/* don't search local file if remote */
  	if (!strucmp(buf,usersupp.fullname)) {
! 		printf("Can't send mail to yourself!\n\r");
  		goto MAIN; }
  
  	file=eopen("usersupp",O_RDONLY);	/* check to make sure the */
  	aa=finduser(file,buf);			/* user exists; also get  */
  	if (aa==(-1)) {				/* the right upper/lower  */
! 		printf("No such user.\n\r");	/* casing of the name     */
  		close(file);
  		goto MAIN; }
  	read(file,&tempUS,sizeof(struct usersupp));
***************
*** 696,702 ****
  		}
  	if ( (curr_rm==0) && (b>0) ) {
  		for (c=0; c<MAXROOMS; ++c) if (skipping[c]==1) skipping[c]=0;
! 		curr_rm=0; printf("*** You have skipped rooms.\n");
  		}
  	if ( (curr_rm==0) && (d>0) ) {
  		for (c=0; c<MAXROOMS; ++c) if (skipping[c]==2) skipping[c]=0;
--- 741,747 ----
  		}
  	if ( (curr_rm==0) && (b>0) ) {
  		for (c=0; c<MAXROOMS; ++c) if (skipping[c]==1) skipping[c]=0;
! 		curr_rm=0; printf("*** You have skipped rooms.\n\r");
  		}
  	if ( (curr_rm==0) && (d>0) ) {
  		for (c=0; c<MAXROOMS; ++c) if (skipping[c]==2) skipping[c]=0;
***************
*** 716,722 ****
  	sttybbs(0);
  	signal(SIGINT,SIG_IGN);
  	signal(SIGQUIT,SIG_IGN);
! 	printf("\n");
  	goto MAIN;
  
  ZLIST:
--- 761,767 ----
  	sttybbs(0);
  	signal(SIGINT,SIG_IGN);
  	signal(SIGQUIT,SIG_IGN);
! 	printf("\n\r");
  	goto MAIN;
  
  ZLIST:
***************
*** 730,736 ****
  	sttybbs(0);
  	signal(SIGINT,SIG_IGN);
  	signal(SIGQUIT,SIG_IGN);
! 	printf("\n");
  	goto MAIN;
  
  DOTGOTO:	/* .Goto a new room */
--- 775,781 ----
  	sttybbs(0);
  	signal(SIGINT,SIG_IGN);
  	signal(SIGQUIT,SIG_IGN);
! 	printf("\n\r");
  	goto MAIN;
  
  DOTGOTO:	/* .Goto a new room */
***************
*** 738,744 ****
  	strcpy(aaa,&aaa[2]);
  	for (a=0; a<strlen(aaa); ++a) aaa[a]=tolower(aaa[a]);
  	IFNAIDE if(!strucmp(aaa,"aide")) {
! 		printf("Need aide access to enter Aide> room\n");
  		goto MAIN;
  		}
  
--- 783,789 ----
  	strcpy(aaa,&aaa[2]);
  	for (a=0; a<strlen(aaa); ++a) aaa[a]=tolower(aaa[a]);
  	IFNAIDE if(!strucmp(aaa,"aide")) {
! 		printf("Need aide access to enter Aide> room\n\r");
  		goto MAIN;
  		}
  
***************
*** 772,778 ****
  			printf("Enter room password: ");
  			getline(aaa,9);
  			if (strucmp(aaa,QRscratch.QRpasswd)) {
! 			   printf("Wrong password.\n"); goto MAIN; } }
   		curr_rm=a; goto DGFOUNDIT; }
  		}
  
--- 817,823 ----
  			printf("Enter room password: ");
  			getline(aaa,9);
  			if (strucmp(aaa,QRscratch.QRpasswd)) {
! 			   printf("Wrong password.\n\r"); goto MAIN; } }
   		curr_rm=a; goto DGFOUNDIT; }
  		}
  
***************
*** 795,801 ****
  		)	{ curr_rm=a; close(file); goto DGFOUNDIT; }
  		}
  	close(file);
! 	printf("No room '%s'.\n",aaa);
  	goto MAIN;
  
  DGFOUNDIT:	/* goto room currently in main() variable curr_rm */
--- 840,846 ----
  		)	{ curr_rm=a; close(file); goto DGFOUNDIT; }
  		}
  	close(file);
! 	printf("No room '%s'.\n\r",aaa);
  	goto MAIN;
  
  DGFOUNDIT:	/* goto room currently in main() variable curr_rm */
***************
*** 808,814 ****
  		if (fullroom.FRnum[a]>usersupp.lastseen[curr_rm]) ++c;
  	} }
  	if (f==1) printf("%s - ",quickroom.QRname);
! 	printf("%d new of %d messages.\n",c,b);
  	readyerself();
  	usersupp.forget[curr_rm]=(-1);
  	usersupp.generation[curr_rm]=quickroom.QRgen;
--- 853,859 ----
  		if (fullroom.FRnum[a]>usersupp.lastseen[curr_rm]) ++c;
  	} }
  	if (f==1) printf("%s - ",quickroom.QRname);
! 	printf("%d new of %d messages.\n\r",c,b);
  	readyerself();
  	usersupp.forget[curr_rm]=(-1);
  	usersupp.generation[curr_rm]=quickroom.QRgen;
***************
*** 822,831 ****
  	goto MAIN;
  
  TERMINATE:
! 	printf("%s logged out.\n",usersupp.fullname);
  	if (a==1) {
  		if (upass==0)
! 			printf("\n\nType 'off' to hang up, or next user...\n");
  		goto GSTA;
  		}
  	else {
--- 867,876 ----
  	goto MAIN;
  
  TERMINATE:
! 	printf("%s logged out.\n\r",usersupp.fullname);
  	if (a==1) {
  		if (upass==0)
! 			printf("\n\r\n\rType 'off' to hang up, or next user...\n\r");
  		goto GSTA;
  		}
  	else {
***************
*** 841,847 ****
  
  	/* will only change password if it's maintained by Citadel */
  PASSWD:	if (upass!=0) {
! 		printf("Use the shell 'passwd' command.\n");
  		goto MAIN; }
  	IFNEXPERT formout("messages/changepw");
  	printf("Enter new password: ");
--- 886,892 ----
  
  	/* will only change password if it's maintained by Citadel */
  PASSWD:	if (upass!=0) {
! 		printf("Use the shell 'passwd' command.\n\r");
  		goto MAIN; }
  	IFNEXPERT formout("messages/changepw");
  	printf("Enter new password: ");
***************
*** 849,861 ****
  	b=ccc[0]+ccc[6]+ccc[8];
  	pwcrypt(ccc,PWCRYPT);
  	if (ccc[0]==0) {
! 		printf("Password unchanged.\n");
  		goto MAIN; }
  	readyerself();
  	strcpy(usersupp.password,ccc);
  	if (b==256) usersupp.axlevel=6;
  	writeyerself();
! 	printf("Password changed.\n");
  	goto MAIN;
  
  }
--- 894,906 ----
  	b=ccc[0]+ccc[6]+ccc[8];
  	pwcrypt(ccc,PWCRYPT);
  	if (ccc[0]==0) {
! 		printf("Password unchanged.\n\r");
  		goto MAIN; }
  	readyerself();
  	strcpy(usersupp.password,ccc);
  	if (b==256) usersupp.axlevel=6;
  	writeyerself();
! 	printf("Password changed.\n\r");
  	goto MAIN;
  
  }
***************
*** 912,919 ****
  	if (mtsflag) goto ENTFIN;
  	if (mailtype!=M_LOCAL) {
  		if (fork()==0) {
  			execl("netmailer","netmailer",mtmp,&mailtype);
! 			printf("*** Netmailer not installed.\n");
  			exit(0);
  			}
  		}
--- 957,968 ----
  	if (mtsflag) goto ENTFIN;
  	if (mailtype!=M_LOCAL) {
  		if (fork()==0) {
+ #ifdef BSD
+ 			execl("netmailer","netmailer",mtmp,&mailtype,NULL);
+ #else
  			execl("netmailer","netmailer",mtmp,&mailtype);
! #endif
! 			printf("*** Netmailer not installed.\n\r");
  			exit(0);
  			}
  		}
***************
*** 961,967 ****
--- 1010,1020 ----
  	strcpy(wtmpsupp.WSname,"");
  	write(file,&wtmpsupp,sizeof(struct wtmpsupp));
  	close(file);
+ #ifdef BSD
+ 	while (wait(0)!=(-1)) ;	/* wait for child processes to finish */
+ #else
  	while (wait()!=(-1)) ;	/* wait for child processes to finish */
+ #endif
  	unlink(temp); /* remove temporary file, in case it's still around */
  	setsane();		/* return the old terminal settings   */
  	exit(code);		/* exit with the proper exit code     */
*******
*** 602,613 ****
  
  ENTMSG:
  	if ((usersupp.axlevel<2)&&(curr_rm!=1)) {
! 		printf("Need to be validated to enter\n");
! 		printf("(except in Mail> to Sysop)\n");
  		goto MAIN;
  		}
  	if ((usersupp.axlevel<4)&&(quickroom.QRflags&QR_NETWORK)) {
! 		printf("Need net privileges to enter here\n");
  		goto MAIN;
  		}
  	mtsflag=0;
--- 647,658 ----
  
  ENTMSG:
  	if ((usersupp.axlevel<2)&&(curr_rmDcommands.c   644    465   1770         555  4472360466   6234 *** ORIG/commands.c	Wed Aug  9 15:46:01 1989
--- commands.c	Tue Aug 15 13:26:02 1989
***************
*** 6,12 ****
   */
  
  #include <stdio.h>
! #include <ctype.h>
  #include "citadel.h"
  
  #define IFAIDE if(usersupp.axlevel>=6)
--- 6,12 ----
   */
  
  #include <stdio.h>
! #include "ctype.h"
  #include "citadel.h"
  
  #define IFAIDE if(usersupp.axlevel>=6)
**
  	sttybbs(0);
  	signal(SIGINT,SIG_IGN);
  	signal(SIGQUIT,SIG_IGN);
! 	printf("\n");
  	goto MAIN;
  
  DOTGOTO:	/* .Goto a new room */
--- 77Dmessages.c   644    465   1770       20310  4472360467   6272 *** ORIG/messages.c	Wed Aug  9 15:40:31 1989
--- messages.c	Wed Aug 16 13:42:23 1989
***************
*** 12,18 ****
  
  #include <fcntl.h>
  #include <stdio.h>
! #include <ctype.h>
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
--- 12,18 ----
  
  #include <fcntl.h>
  #include <stdio.h>
! #include "ctype.h"
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
***************
*** 20,26 ****
  #include <signal.h>
  #include <pwd.h>
  #include <setjmp.h>
- #include <termio.h>
  #include "citadel.h"
  
  #define IFEXPERT if (usersupp.flags&US_EXPERT)
--- 20,25 ----
***************
*** 47,53 ****
  	a=setjmp(nextbuf);
  	sttybbs(0);
  	if ((a==1)||(a==2)) {
! 		printf("\n\n");
  		return(a);
  		}
  	signal(SIGINT,(*backnext));
--- 46,52 ----
  	a=setjmp(nextbuf);
  	sttybbs(0);
  	if ((a==1)||(a==2)) {
! 		printf("\n\r\n\r");
  		return(a);
  		}
  	signal(SIGINT,(*backnext));
***************
*** 63,68 ****
--- 62,68 ----
  struct smreturn *retbuf;	/* return information */
  {
  
+ unsigned char ab;
  int file,a,c,d,file2;
  long bb,cc,templen,hibytes,origpos;
  char sbuf[BUFSIZ];
***************
*** 116,122 ****
  d=read(file2,sbuf,3);
  write(file,sbuf,d);
  write(file,mid,strlen(mid));
! d=0; write(file,&d,1);
  do {
  	d=read(file2,sbuf,BUFSIZ);
  	write(file,sbuf,d);
--- 116,122 ----
  d=read(file2,sbuf,3);
  write(file,sbuf,d);
  write(file,mid,strlen(mid));
! ab=0; write(file,&d,sizeof(ab));
  do {
  	d=read(file2,sbuf,BUFSIZ);
  	write(file,sbuf,d);
***************
*** 151,157 ****
  int mode;		/* 0 for normal, 1 for ASCII */
  { 
  	FILE *fp;
! 	int a,b,old;
  	long aa,beg,now;
  	char aaa[100],bbb[100]; 
  
--- 151,158 ----
  int mode;		/* 0 for normal, 1 for ASCII */
  { 
  	FILE *fp;
! 	unsigned char a,b,old;
! 	int bb;
  	long aa,beg,now;
  	char aaa[100],bbb[100]; 
  
***************
*** 161,170 ****
  	putc(type,fp);	/* Normal or anonymous, see MES_ flags */
  	putc(mode,fp);	/* Formatted or unformatted */
  	strcpy(aaa,author->fullname);
! 	for (a=0; a<strlen(aaa); ++a) {
! 		aaa[a]=tolower(aaa[a]);
! 		if (aaa[a]==32) aaa[a]='_';
! 		if (aaa[a]=='!') strcpy(&aaa[a],&aaa[a+1]);
  		}
  	fprintf(fp,"P%s",aaa); putc(0,fp);			/* path */
  	fprintf(fp,"T%ld",now); putc(0,fp);			/* date/time */
--- 162,171 ----
  	putc(type,fp);	/* Normal or anonymous, see MES_ flags */
  	putc(mode,fp);	/* Formatted or unformatted */
  	strcpy(aaa,author->fullname);
! 	for (bb=0; bb<strlen(aaa); ++bb) {
! 		aaa[bb]=tolower(aaa[bb]);
! 		if (aaa[bb]==32) aaa[bb]='_';
! 		if (aaa[bb]=='!') strcpy(&aaa[bb],&aaa[bb+1]);
  		}
  	fprintf(fp,"P%s",aaa); putc(0,fp);			/* path */
  	fprintf(fp,"T%ld",now); putc(0,fp);			/* date/time */
***************
*** 175,184 ****
  	fflush(fp);
  	msgform(usersupp.screenwidth,0L,filename);
  	putc('M',fp);
! 	if (mode==1) printf("(Press ctrl-d when finished)\n");
  	beg=ftell(fp); old=1;
  	if (mode==1) goto ME2;
  ME1:	a=inkey(); a=(a&127);
  	aa=ftell(fp);
  	if ((a==8)&&(aa>beg)) {
  		back(1); fseek(fp,-1L,1); goto ME1; }
--- 176,188 ----
  	fflush(fp);
  	msgform(usersupp.screenwidth,0L,filename);
  	putc('M',fp);
! 	if (mode==1) printf("(Press ctrl-d when finished)\n\r");
  	beg=ftell(fp); old=1;
  	if (mode==1) goto ME2;
  ME1:	a=inkey(); a=(a&127);
+ #ifdef BSD
+ 	if (a==10) a=13;
+ #endif
  	aa=ftell(fp);
  	if ((a==8)&&(aa>beg)) {
  		back(1); fseek(fp,-1L,1); goto ME1; }
***************
*** 198,209 ****
  MECR:	putc(0,fp); fseek(fp,-1L,1); fflush(fp);
  	printf("<A>bort <C>ontinue <P>rint <S>ave -> ");
  MECR2:	b=inkey(); b=(b&127); b=tolower(b);
! 	if (b=='a') { printf("Abort\n");	goto MEABT; }
! 	if (b=='c') { printf("Continue\n");
  		if (mode==0) goto ME1;
  		if (mode==1) goto ME2; }
! 	if (b=='s') { printf("Save buffer\n"); goto MEFIN; } 
! 	if (b=='p') { printf("Print formatted\n");
  		msgform(usersupp.screenwidth,0L,filename);
  		goto MECR; }
  	goto MECR2;
--- 202,213 ----
  MECR:	putc(0,fp); fseek(fp,-1L,1); fflush(fp);
  	printf("<A>bort <C>ontinue <P>rint <S>ave -> ");
  MECR2:	b=inkey(); b=(b&127); b=tolower(b);
! 	if (b=='a') { printf("Abort\n\r");	goto MEABT; }
! 	if (b=='c') { printf("Continue\n\r");
  		if (mode==0) goto ME1;
  		if (mode==1) goto ME2; }
! 	if (b=='s') { printf("Save buffer\n\r"); goto MEFIN; } 
! 	if (b=='p') { printf("Print formatted\n\r");
  		msgform(usersupp.screenwidth,0L,filename);
  		goto MECR; }
  	goto MECR2;
***************
*** 240,251 ****
  	fseek(fp,spos,0);
  	e=getc(fp);
  	if (e!=255) {
! 		printf("*** CANNOT LOCATE MESSAGE / pos=%ld\n",spos);
  		goto END;
  		}
  	mtype=getc(fp); aflag=getc(fp);
! 	printf("\n   ");
! 	if (mtype==MES_ANON) printf("****\n");
  	if (mtype==MES_AN2) printf("<anonymous> ");
  	goto BONFGM;
  A:	if (aflag==1) goto AFLAG;
--- 244,255 ----
  	fseek(fp,spos,0);
  	e=getc(fp);
  	if (e!=255) {
! 		printf("*** CANNOT LOCATE MESSAGE / pos=%ld\n\r",spos);
  		goto END;
  		}
  	mtype=getc(fp); aflag=getc(fp);
! 	printf("\n\r   ");
! 	if (mtype==MES_ANON) printf("****\n\r");
  	if (mtype==MES_AN2) printf("<anonymous> ");
  	goto BONFGM;
  A:	if (aflag==1) goto AFLAG;
***************
*** 255,273 ****
  	
  	if ( ((a==13)||(a==10)) && (old!=13) && (old!=10) ) a=32;
  	if ( ((old==13)||(old==10)) && ((real==32)||(real==13)||(real==10))) {
! 						printf("\n"); c=1; }
  	if (a!=32) {
  	if ( ((strlen(aaa)+c)>(width-4)) && (strlen(aaa)>(width-4)) )
! 		{ printf("\n%s",aaa); c=strlen(aaa); aaa[0]=0; }
  	 b=strlen(aaa); aaa[b]=a; aaa[b+1]=0; }
  	if (a==32) { 	if ((strlen(aaa)+c)>(width-5)) { 
! 							printf("\n");
  							c=1;
  							}
  			printf("%s ",aaa); ++c; c=c+strlen(aaa);
  			strcpy(aaa,""); goto A; }
  	if ((a==13)||(a==10)) {
! 				printf("%s\n",aaa); c=1;
  				strcpy(aaa,""); goto A; }
  	goto A;
  
--- 259,277 ----
  	
  	if ( ((a==13)||(a==10)) && (old!=13) && (old!=10) ) a=32;
  	if ( ((old==13)||(old==10)) && ((real==32)||(real==13)||(real==10))) {
! 						printf("\n\r"); c=1; }
  	if (a!=32) {
  	if ( ((strlen(aaa)+c)>(width-4)) && (strlen(aaa)>(width-4)) )
! 		{ printf("\n\r%s",aaa); c=strlen(aaa); aaa[0]=0; }
  	 b=strlen(aaa); aaa[b]=a; aaa[b+1]=0; }
  	if (a==32) { 	if ((strlen(aaa)+c)>(width-5)) { 
! 							printf("\n\r");
  							c=1;
  							}
  			printf("%s ",aaa); ++c; c=c+strlen(aaa);
  			strcpy(aaa,""); goto A; }
  	if ((a==13)||(a==10)) {
! 				printf("%s\n\r",aaa); c=1;
  				strcpy(aaa,""); goto A; }
  	goto A;
  
***************
*** 277,288 ****
  	goto AFLAG;
  
  END:	fclose(fp);
! 	printf("\n");
  	return(0);
  
  BONFGM:	b=getc(fp); if (b<0) goto END;
  	if (b=='M') {
! 		printf("\n");
  		goto A;
  		}
  	fpgetfield(fp,bbb);
--- 281,292 ----
  	goto AFLAG;
  
  END:	fclose(fp);
! 	printf("\n\r");
  	return(0);
  
  BONFGM:	b=getc(fp); if (b<0) goto END;
  	if (b=='M') {
! 		printf("\n\r");
  		goto A;
  		}
  	fpgetfield(fp,bbb);
***************
*** 321,328 ****
  long spos;			/* position in master file */
  char *flnm;			/* file to write to */
  {
! 	int a,b,c;
! 	int file,file2;
  	long cc;
  	char field[512];
  	char fwork[512];
--- 325,332 ----
  long spos;			/* position in master file */
  char *flnm;			/* file to write to */
  {
! 	unsigned char b,c;
! 	int file,file2,a;
  	long cc;
  	char field[512];
  	char fwork[512];
***************
*** 332,348 ****
  	lseek(file,spos,0);
  
  	for (a=0; a<3; ++a) {
! 		read(file,&b,1);
! 		write(file2,&b,1);
  		}
! PI:	b=0; read(file,&b,1);
  	if (b=='M') {
! 		write(file2,&b,1);
  		goto B;
  		}
  	getfield(file,field);
  	if (b!='I') {
! 		write(file2,&b,1);
  		write(file2,field,strlen(field)+1);
  		}
  	goto PI;
--- 336,352 ----
  	lseek(file,spos,0);
  
  	for (a=0; a<3; ++a) {
! 		read(file,&b,sizeof(b));
! 		write(file2,&b,sizeof(b));
  		}
! PI:	b=0; read(file,&b,sizeof(b));
  	if (b=='M') {
! 		write(file2,&b,sizeof(b));
  		goto B;
  		}
  	getfield(file,field);
  	if (b!='I') {
! 		write(file2,&b,sizeof(b));
  		write(file2,field,strlen(field)+1);
  		}
  	goto PI;
***************
*** 349,356 ****
  
  B:	cc=lseek(file,0L,1);
  C:	if (cc>=MM_FILELEN) cc=lseek(file,0L,0);
! 	c=0; read(file,&c,1); ++cc;
! 	write(file2,&c,1);
  	if (c!=0) goto C;
  
  	close(file); close(file2);
--- 353,360 ----
  
  B:	cc=lseek(file,0L,1);
  C:	if (cc>=MM_FILELEN) cc=lseek(file,0L,0);
! 	c=0; read(file,&c,sizeof(c)); ++cc;
! 	write(file2,&c,sizeof(c));
  	if (c!=0) goto C;
  
  	close(file); close(file2);
",O_RDONLY);	/* check to make sure the */
  	aa=finduser(file,buf);			/* user exists; also get  */
  	if (aa==(-1)) {				/* the right upper/lower  */
! 		printf("No such user.\n\r");	/* casing of the name     */
  		close(file);
  		goto MAIN; }
  	read(file,&tempUS,sizeof(struct usersupp));
***************
***Drooms.c   644    465   1770       40415  4472360470   5624 *** ORIG/rooms.c	Wed Aug  9 15:36:51 1989
--- rooms.c	Wed Aug 16 14:20:22 1989
***************
*** 2,8 ****
  
  #include <fcntl.h>
  #include <stdio.h>
! #include <ctype.h>
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
--- 2,8 ----
  
  #include <fcntl.h>
  #include <stdio.h>
! #include "ctype.h"
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
***************
*** 10,16 ****
  #include <signal.h>
  #include <pwd.h>
  #include <setjmp.h>
- #include <termio.h>
  #include "citadel.h"
  
  #define IFEXPERT if (usersupp.flags&US_EXPERT)
--- 10,15 ----
***************
*** 36,42 ****
  	struct quickroom QRscratch;
  
  	b=1;
! 	printf("\n   Rooms with unread messages:\n");
  	file=open("./quickroom",O_RDONLY); if (file<0) return(1);
  	for (a=0; a<MAXROOMS; ++a) {
  		c=read(file,&QRscratch,sizeof(struct quickroom));
--- 35,41 ----
  	struct quickroom QRscratch;
  
  	b=1;
! 	printf("\n\r   Rooms with unread messages:\n\r");
  	file=open("./quickroom",O_RDONLY); if (file<0) return(1);
  	for (a=0; a<MAXROOMS; ++a) {
  		c=read(file,&QRscratch,sizeof(struct quickroom));
***************
*** 59,74 ****
  
  		) {
  		if (d>=(USgiven->screenwidth)) {
! 			printf("\n"); b=1; }
  		c=room_prompt(&QRscratch);
  		printf("%s%c  ",QRscratch.QRname,c);
  		b=b+strlen(QRscratch.QRname)+3;
  		}
  	} 
! 	if (b!=1) printf("\n");
  
  	b=1;
! 	printf("\n   No unseen messages in:\n");
  	lseek(file,0L,0);
  	for (a=0; a<MAXROOMS; ++a) {
  		c=read(file,&QRscratch,sizeof(struct quickroom));
--- 58,73 ----
  
  		) {
  		if (d>=(USgiven->screenwidth)) {
! 			printf("\n\r"); b=1; }
  		c=room_prompt(&QRscratch);
  		printf("%s%c  ",QRscratch.QRname,c);
  		b=b+strlen(QRscratch.QRname)+3;
  		}
  	} 
! 	if (b!=1) printf("\n\r");
  
  	b=1;
! 	printf("\n\r   No unseen messages in:\n\r");
  	lseek(file,0L,0);
  	for (a=0; a<MAXROOMS; ++a) {
  		c=read(file,&QRscratch,sizeof(struct quickroom));
***************
*** 91,103 ****
  		) {
  		d=strlen(QRscratch.QRname)+3+b;
  		if (d>=(USgiven->screenwidth)) {
! 			printf("\n"); b=1; }
  		c=room_prompt(&QRscratch);
  		printf("%s%c  ",QRscratch.QRname,c);
  		b=b+strlen(QRscratch.QRname)+3;
  		}
  	}
! 	if (b!=1) printf("\n");
  
  	close(file);
  	return(0);
--- 90,102 ----
  		) {
  		d=strlen(QRscratch.QRname)+3+b;
  		if (d>=(USgiven->screenwidth)) {
! 			printf("\n\r"); b=1; }
  		c=room_prompt(&QRscratch);
  		printf("%s%c  ",QRscratch.QRname,c);
  		b=b+strlen(QRscratch.QRname)+3;
  		}
  	}
! 	if (b!=1) printf("\n\r");
  
  	close(file);
  	return(0);
***************
*** 110,116 ****
  	struct quickroom QRscratch;
  
  	b=1;
! 	printf("\n   Forgotten public rooms:\n");
  	file=open("./quickroom",O_RDONLY); if (file<0) return(1);
  	for (a=0; a<MAXROOMS; ++a) {
  		c=read(file,&QRscratch,sizeof(struct quickroom));
--- 109,115 ----
  	struct quickroom QRscratch;
  
  	b=1;
! 	printf("\n\r   Forgotten public rooms:\n\r");
  	file=open("./quickroom",O_RDONLY); if (file<0) return(1);
  	for (a=0; a<MAXROOMS; ++a) {
  		c=read(file,&QRscratch,sizeof(struct quickroom));
***************
*** 126,138 ****
  		) {
  		d=b+strlen(QRscratch.QRname)+3;
  		if (d>=(USgiven->screenwidth)) {
! 			printf("\n"); b=1; }
  		c=room_prompt(&QRscratch);
  		printf("%s%c  ",QRscratch.QRname,c);
  		b=b+strlen(QRscratch.QRname)+3;
  		}
  	} 
! 	if (b!=1) printf("\n");
  	close(file);
  	return(0);
  }
--- 125,137 ----
  		) {
  		d=b+strlen(QRscratch.QRname)+3;
  		if (d>=(USgiven->screenwidth)) {
! 			printf("\n\r"); b=1; }
  		c=room_prompt(&QRscratch);
  		printf("%s%c  ",QRscratch.QRname,c);
  		b=b+strlen(QRscratch.QRname)+3;
  		}
  	} 
! 	if (b!=1) printf("\n\r");
  	close(file);
  	return(0);
  }
***************
*** 142,157 ****
  	char aaa[50]; long aa;
  	struct usersupp tempUS;
  
  	if (curr_rm<3) {
! 		printf("Can't edit this room.\n");
  		return(0);
  		}
  	file=open("quickroom",O_RDWR);
  	if (file<0) interr(34);
  	lseek(file,(long)(curr_rm*sizeof(struct quickroom)),0);
  	a=read(file,&quickroom,sizeof(struct quickroom));
  	if (a<1) interr(35);
! 	printf("Room name is currently: %s\n",quickroom.QRname);
  	printf("New name <return=same>? ");
  	getline(aaa,19);
  	if (aaa[0]!=0) strcpy(quickroom.QRname,aaa);
--- 141,164 ----
  	char aaa[50]; long aa;
  	struct usersupp tempUS;
  
+ #ifdef TWITDETECT
+ 	if (curr_rm<4) {
+ 		printf("Can't edit this room.\n\r");
+ 		return(0);
+ 	}
+ #else
  	if (curr_rm<3) {
! 		printf("Can't edit this room.\n\r");
  		return(0);
  		}
+ #endif
+ 
  	file=open("quickroom",O_RDWR);
  	if (file<0) interr(34);
  	lseek(file,(long)(curr_rm*sizeof(struct quickroom)),0);
  	a=read(file,&quickroom,sizeof(struct quickroom));
  	if (a<1) interr(35);
! 	printf("Room name is currently: %s\n\r",quickroom.QRname);
  	printf("New name <return=same>? ");
  	getline(aaa,19);
  	if (aaa[0]!=0) strcpy(quickroom.QRname,aaa);
***************
*** 163,178 ****
  	printf(" room");
  	if ((quickroom.QRflags&QR_PASSWORDED)==QR_PASSWORDED)
  			printf(", password: %s",quickroom.QRpasswd);
! 	printf(".\n");
! if (quickroom.QRflags&QR_PREFONLY) printf("PREFERRED USERS ONLY.\n");
  if (quickroom.QRflags&QR_DIRECTORY) {
  	printf("Directory room");
  	if (quickroom.QRflags&QR_UPLOAD) printf(", uploading allowed");
  	if (quickroom.QRflags&QR_DOWNLOAD) printf(", downloading allowed");
  	if (quickroom.QRflags&QR_VISDIR) printf(", visible directory");
! 	printf(".\nDirectory name: %s\n",quickroom.QRdirname); }
  if (quickroom.QRflags&QR_ANONONLY)
! 	printf("Anonymous-only room.\n");
  
  quickroom.QRflags=(quickroom.QRflags|QR_PRIVATE|QR_PASSWORDED|QR_GUESSNAME);
  quickroom.QRflags=(quickroom.QRflags|QR_DIRECTORY|QR_UPLOAD|QR_DOWNLOAD);
--- 170,185 ----
  	printf(" room");
  	if ((quickroom.QRflags&QR_PASSWORDED)==QR_PASSWORDED)
  			printf(", password: %s",quickroom.QRpasswd);
! 	printf(".\n\r");
! if (quickroom.QRflags&QR_PREFONLY) printf("PREFERRED USERS ONLY.\n\r");
  if (quickroom.QRflags&QR_DIRECTORY) {
  	printf("Directory room");
  	if (quickroom.QRflags&QR_UPLOAD) printf(", uploading allowed");
  	if (quickroom.QRflags&QR_DOWNLOAD) printf(", downloading allowed");
  	if (quickroom.QRflags&QR_VISDIR) printf(", visible directory");
! 	printf(".\n\rDirectory name: %s\n\r",quickroom.QRdirname); }
  if (quickroom.QRflags&QR_ANONONLY)
! 	printf("Anonymous-only room.\n\r");
  
  quickroom.QRflags=(quickroom.QRflags|QR_PRIVATE|QR_PASSWORDED|QR_GUESSNAME);
  quickroom.QRflags=(quickroom.QRflags|QR_DIRECTORY|QR_UPLOAD|QR_DOWNLOAD);
***************
*** 182,188 ****
  	do {
  		b=inkey()-48;
  		} while ((b<1)||(b>4));
! 	printf("%d\n",b);
  	if (b!=2) quickroom.QRflags=(quickroom.QRflags-QR_GUESSNAME);
  	if (b!=3) quickroom.QRflags=(quickroom.QRflags-QR_PASSWORDED);
  	if (b==1) quickroom.QRflags=(quickroom.QRflags-QR_PRIVATE);
--- 189,195 ----
  	do {
  		b=inkey()-48;
  		} while ((b<1)||(b>4));
! 	printf("%d\n\r",b);
  	if (b!=2) quickroom.QRflags=(quickroom.QRflags-QR_GUESSNAME);
  	if (b!=3) quickroom.QRflags=(quickroom.QRflags-QR_PASSWORDED);
  	if (b==1) quickroom.QRflags=(quickroom.QRflags-QR_PRIVATE);
***************
*** 215,221 ****
  	do {
  		a=inkey()-48;
  		} while((a<1)||(a>3));
! 	printf("%d\n",a);
  if ((a==1)||(a==3)) quickroom.QRflags=(quickroom.QRflags-QR_ANONONLY);
  if ((a==1)||(a==2)) quickroom.QRflags=(quickroom.QRflags-QR_ANON2);
  RANSU:	file2=open("usersupp",O_RDONLY);	/* (gee, thanks a lot!) */
--- 222,228 ----
  	do {
  		a=inkey()-48;
  		} while((a<1)||(a>3));
! 	printf("%d\n\r",a);
  if ((a==1)||(a==3)) quickroom.QRflags=(quickroom.QRflags-QR_ANONONLY);
  if ((a==1)||(a==2)) quickroom.QRflags=(quickroom.QRflags-QR_ANON2);
  RANSU:	file2=open("usersupp",O_RDONLY);	/* (gee, thanks a lot!) */
***************
*** 224,233 ****
  			a=read(file2,&tempUS,sizeof(struct usersupp));
  			} while((a>0)&&(quickroom.QRroomaide!=tempUS.eternal));
  		close(file2);
! 		if (a>0) printf("Room aide is currently: %s\nNew ",
  			tempUS.fullname);
  		}
! 	else printf("No room aide.\n");
  	printf("Room aide (RETURN to leave unchanged): ");
  	getline(aaa,29);
  	if (aaa[0]!=0) {
--- 231,240 ----
  			a=read(file2,&tempUS,sizeof(struct usersupp));
  			} while((a>0)&&(quickroom.QRroomaide!=tempUS.eternal));
  		close(file2);
! 		if (a>0) printf("Room aide is currently: %s\n\rNew ",
  			tempUS.fullname);
  		}
! 	else printf("No room aide.\n\r");
  	printf("Room aide (RETURN to leave unchanged): ");
  	getline(aaa,29);
  	if (aaa[0]!=0) {
***************
*** 236,245 ****
  		read(file2,&tempUS,sizeof(struct usersupp));
  		close(file2);
  		if (aa==(-1L)) {
! 			printf("No such user.\n"); goto RANSU; }
  		quickroom.QRroomaide=tempUS.eternal;
  		}
! 	printf("\n\nSave changes (y/n)? ");
  	if (yesno()==0) {
  		lseek(file,(long)(curr_rm*sizeof(struct quickroom)),0);
  		b=read(file,&quickroom,sizeof(struct quickroom));
--- 243,252 ----
  		read(file2,&tempUS,sizeof(struct usersupp));
  		close(file2);
  		if (aa==(-1L)) {
! 			printf("No such user.\n\r"); goto RANSU; }
  		quickroom.QRroomaide=tempUS.eternal;
  		}
! 	printf("\n\r\n\rSave changes (y/n)? ");
  	if (yesno()==0) {
  		lseek(file,(long)(curr_rm*sizeof(struct quickroom)),0);
  		b=read(file,&quickroom,sizeof(struct quickroom));
***************
*** 287,293 ****
--- 294,304 ----
  	sprintf(bbb,"files/%s/%s",quickroom.QRdirname,aaa);
  	if (c==0) formout(bbb);
  	if (c==1) {
+ #ifdef BSD
+ 		sprintf(aaa,"download %s",bbb);
+ #else
  		sprintf(aaa,"wcsend %s",bbb);
+ #endif
  		system(aaa);
  		}
  	if (c==2) {
***************
*** 296,306 ****
  		sprintf(aaa,"cat <%s",bbb);
  		system(aaa);
  		sttybbs(0);
  		unlink("core");	/* just in case the core was dumped */
  		}
  	}
  	else
! 		printf("Not in this room.\n");
  	return(0);
  }
  
--- 307,320 ----
  		sprintf(aaa,"cat <%s",bbb);
  		system(aaa);
  		sttybbs(0);
+ #ifdef BSD
+ 		signal(SIGQUIT,SIG_IGN);
+ #endif
  		unlink("core");	/* just in case the core was dumped */
  		}
  	}
  	else
! 		printf("Not in this room.\n\r");
  	return(0);
  }
  
***************
*** 309,319 ****
  	if ((quickroom.QRflags&QR_DIRECTORY)
  	   &&(quickroom.QRflags&QR_VISDIR)) {
  		sprintf(aaa,"./files/%s",quickroom.QRdirname);
! 		printf("Directory of %s!%s/%s\n",NODENAME,BBSDIR,&aaa[2]);
  		directory(aaa);
  		}
  	else
! 		printf("Not in this room.\n");
  	return(0);
  }
  
--- 323,333 ----
  	if ((quickroom.QRflags&QR_DIRECTORY)
  	   &&(quickroom.QRflags&QR_VISDIR)) {
  		sprintf(aaa,"./files/%s",quickroom.QRdirname);
! 		printf("Directory of %s!%s/%s\n\r",NODENAME,BBSDIR,&aaa[2]);
  		directory(aaa);
  		}
  	else
! 		printf("Not in this room.\n\r");
  	return(0);
  }
  
***************
*** 323,329 ****
  	long aa;
  	struct usersupp USscratch;
  	if ((quickroom.QRflags&QR_PRIVATE)==0) {
! 		printf("Not a private room.\n");
  		return(0);
  		}
  	printf("Name of user? ");
--- 337,343 ----
  	long aa;
  	struct usersupp USscratch;
  	if ((quickroom.QRflags&QR_PRIVATE)==0) {
! 		printf("Not a private room.\n\r");
  		return(0);
  		}
  	printf("Name of user? ");
***************
*** 339,345 ****
  		USscratch.forget[curr_rm]=(-1);
  		write(file,&USscratch,sizeof(struct usersupp));
  		}
! 	else	printf("No such user.\n");
  	close(file);
  	return(0);
  
--- 353,359 ----
  		USscratch.forget[curr_rm]=(-1);
  		write(file,&USscratch,sizeof(struct usersupp));
  		}
! 	else	printf("No such user.\n\r");
  	close(file);
  	return(0);
  
***************
*** 351,357 ****
  	long aa;
  	struct usersupp USscratch;
  	if ((quickroom.QRflags&QR_PRIVATE)==0) {
! 		printf("Not a private room.\n");
  		return(0);
  		}
  	printf("Name of user? ");
--- 365,371 ----
  	long aa;
  	struct usersupp USscratch;
  	if ((quickroom.QRflags&QR_PRIVATE)==0) {
! 		printf("Not a private room.\n\r");
  		return(0);
  		}
  	printf("Name of user? ");
***************
*** 365,371 ****
  		USscratch.generation[curr_rm]=(-1);
  		write(file,&USscratch,sizeof(struct usersupp));
  		}
! 	else	printf("No such user.\n");
  	close(file);
  	return(0);
  }
--- 379,385 ----
  		USscratch.generation[curr_rm]=(-1);
  		write(file,&USscratch,sizeof(struct usersupp));
  		}
! 	else	printf("No such user.\n\r");
  	close(file);
  	return(0);
  }
***************
*** 374,380 ****
  	int file;
  	long aa;
  	char aaa[100];
! 	if (curr_rm<3) { printf("Can't kill this room.\n"); return(0); }
  	printf("Are you sure you want to kill this room? ");
  	if (yesno()==0) return(0);
  	file=open("quickroom",O_RDWR); if (file<0) interr(42);
--- 388,398 ----
  	int file;
  	long aa;
  	char aaa[100];
! #ifdef TWITDETECT
! 	if (curr_rm<4) { printf("Can't kill this room.\n\r"); return(0); }
! #else
! 	if (curr_rm<3) { printf("Can't kill this room.\n\r"); return(0); }
! #endif
  	printf("Are you sure you want to kill this room? ");
  	if (yesno()==0) return(0);
  	file=open("quickroom",O_RDWR); if (file<0) interr(42);
***************
*** 392,402 ****
  }
  
  forget() {	/* forget the current room */
  	if (curr_rm<3) {
! 		printf("Cannot forget this room.\n");
  		return(0);
  		}
! 	IFAIDE { printf("Aides cannot forget rooms.\n"); return(0); }
  	printf("Are you sure you want to forget this room? ");
  	if (yesno()==0) return(0);
  	readyerself();
--- 410,427 ----
  }
  
  forget() {	/* forget the current room */
+ #ifdef TWITDETECT
  	if (curr_rm<3) {
! 		printf("Cannot forget this room.\n\r");
  		return(0);
  		}
! #else
! 	if (curr_rm<3) {
! 		printf("Cannot forget this room.\n\r");
! 		return(0);
! 		}
! #endif
! 	IFAIDE { printf("Aides cannot forget rooms.\n\r"); return(0); }
  	printf("Are you sure you want to forget this room? ");
  	if (yesno()==0) return(0);
  	readyerself();
***************
*** 415,421 ****
  	struct quickroom QRscratch;
  
  	if (usersupp.axlevel<3) {
! 		printf("You need higher access to create rooms.\n");
  		return(0);
  		}
  
--- 440,446 ----
  	struct quickroom QRscratch;
  
  	if (usersupp.axlevel<3) {
! 		printf("You need higher access to create rooms.\n\r");
  		return(0);
  		}
  
***************
*** 432,438 ****
  			&& (!strucmp(QRscratch.QRname,aaa)) ) b=1; }
  	close(file);
  	if (b==1) {
! 		printf("'%s' already exists.\n",aaa);
  		return(0); }
  	bb=(-1L);	
  	file=open("quickroom",O_RDONLY); if (file<0) interr(64);
--- 457,463 ----
  			&& (!strucmp(QRscratch.QRname,aaa)) ) b=1; }
  	close(file);
  	if (b==1) {
! 		printf("'%s' already exists.\n\r",aaa);
  		return(0); }
  	bb=(-1L);	
  	file=open("quickroom",O_RDONLY); if (file<0) interr(64);
***************
*** 444,470 ****
  		}
  	close(file);
  	if (bb==(-1L)) {
! 		printf("No room space available.\n");
  		return(0);
  		}
  	IFNEXPERT formout("messages/roomaccess");
! ACSEL:	printf("<?>Help\n<1>Public room\n<2>Guess-name room\n");
! 	printf("<3>Passworded room\n<4>Invitation-only room\n");
  	printf("Enter room type: ");
  ACSE2:	b=inkey(); b=tolower(b);
! 	if (b=='?') { printf("?\n");
  		formout("messages/roomaccess"); goto ACSEL; }
  	b=b-48;
  	if ((b<1)||(b>4)) goto ACSE2;
  	if (b==3) {
! 		printf("Enter a room password: ");
! 		getline(bbb,9); }
! 	printf("%d\n\042%s\042, a",b,aaa);
! 	if (b==1) printf(" public room.");
! 	if (b==2) printf(" guess-name room.");
! 	if (b==3) printf(" passworded room, password: %s",bbb);
! 	if (b==4) printf("n invitation-only room.");
! 	printf("\nInstall it? (y/n) : ");
  	a=yesno();
  	if (a==0) return(0);
  	curr_rm=(int)(bb/sizeof(struct quickroom)); 
--- 469,495 ----
  		}
  	close(file);
  	if (bb==(-1L)) {
! 		printf("No room space available.\n\r");
  		return(0);
  		}
  	IFNEXPERT formout("messages/roomaccess");
! ACSEL:	printf("<?>Help\n\r<1>Public room\n\r<2>Guess-name room\n\r");
! 	printf("<3>Passworded room\n\r<4>Invitation-only room\n\r");
  	printf("Enter room type: ");
  ACSE2:	b=inkey(); b=tolower(b);
! 	if (b=='?') { printf("?\n\r");
  		formout("messages/roomaccess"); goto ACSEL; }
  	b=b-48;
  	if ((b<1)||(b>4)) goto ACSE2;
+ 	printf("%d\n\r\042%s\042, a",b,aaa);
+ 	if (b==1) printf(" public room.\n\r");
+ 	if (b==2) printf(" guess-name room.\n\r");
  	if (b==3) {
! 		printf(" pasworded room.");
! 		printf("  Enter a room password: ");
! 		getline(bbb,9); } 
! 	if (b==4) printf("n invitation-only room.\n\r");
! 	printf("Install it? (y/n) : ");
  	a=yesno();
  	if (a==0) return(0);
  	curr_rm=(int)(bb/sizeof(struct quickroom)); 
***************
*** 548,554 ****
     			||	(quickroom.QRgen==(temp.generation[curr_rm]))
     			)
  
! 		) printf("%s\n",temp.fullname);
  	close(file);
  	return(0);
  }
--- 573,579 ----
     			||	(quickroom.QRgen==(temp.generation[curr_rm]))
     			)
  
! 		) printf("%s\n\r",temp.fullname);
  	close(file);
  	return(0);
  }
if (aaa[0]!=0) {
***************
*** 236,245 ****
  		read(file2,&tempUS,sizeof(struct usersupp));
  		close(file2);
  		if (aa==(-1L)) {
! 			printf("No such user.\n"); goto RANSU; }
  		quickroom.QRroomaide=tempUS.eternal;
  		}
! 	printf("\Droutines.c   644    465   1770       26001  4472360470   6330 *** ORIG/routines.c	Wed Aug  9 15:44:42 1989
--- routines.c	Tue Aug 15 14:59:02 1989
***************
*** 2,8 ****
  
  #include <fcntl.h>
  #include <stdio.h>
! #include <ctype.h>
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
--- 2,8 ----
  
  #include <fcntl.h>
  #include <stdio.h>
! #include "ctype.h"
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
***************
*** 10,16 ****
--- 10,21 ----
  #include <signal.h>
  #include <pwd.h>
  #include <setjmp.h>
+ #ifdef BSD
+ #include <sys/dir.h>
+ #include <sgtty.h>
+ #else
  #include <termio.h>
+ #endif
  
  #define ROUTINES_C
  
***************
*** 53,60 ****
  int a;
  	while (1) {
  		a=inkey(); a=tolower(a);
! 		if (a=='y') { printf("Yes\n"); return(1); }
! 		if (a=='n') { printf("No\n");  return(0); }
  		}
  	}
  
--- 58,65 ----
  int a;
  	while (1) {
  		a=inkey(); a=tolower(a);
! 		if (a=='y') { printf("Yes\n\r"); return(1); }
! 		if (a=='n') { printf("No\n\r");  return(0); }
  		}
  	}
  
***************
*** 61,77 ****
  edituser(structure)
  struct usersupp *structure; {
  	int a,b;
! do {	printf("Current access level: %d [%s]\n",structure->axlevel,
  		axdefs[structure->axlevel]);
  	printf("New level (? to list them): ");
  	a=inkey();
  	if (a=='?') {
! 		printf("list\n");
! 		for (b=0; b<7; ++b) printf("%d %s\n",b,axdefs[b]);
  		}
  	a=a-48;
  	} while((a<0)||(a>6));
! 	printf("%d\n",a);
  	structure->axlevel=a;
  	return(0);
  	}
--- 66,82 ----
  edituser(structure)
  struct usersupp *structure; {
  	int a,b;
! do {	printf("Current access level: %d [%s]\n\r",structure->axlevel,
  		axdefs[structure->axlevel]);
  	printf("New level (? to list them): ");
  	a=inkey();
  	if (a=='?') {
! 		printf("list\n\r");
! 		for (b=0; b<7; ++b) printf("%d %s\n\r",b,axdefs[b]);
  		}
  	a=a-48;
  	} while((a<0)||(a>6));
! 	printf("%d\n\r",a);
  	structure->axlevel=a;
  	return(0);
  	}
***************
*** 83,89 ****
  		printf("Enter your screen width: ");
  		getline(aaa,3); a=atoi(aaa);
  		if ((a<20)||(a>132))
! 			printf("...must be between 20 and 132.\n");
  		} while((a<20)||(a>132));
  	structure->screenwidth=a;
  	printf("Are you an experienced Citadel user? ");
--- 88,94 ----
  		printf("Enter your screen width: ");
  		getline(aaa,3); a=atoi(aaa);
  		if ((a<20)||(a>132))
! 			printf("...must be between 20 and 132.\n\r");
  		} while((a<20)||(a>132));
  	structure->screenwidth=a;
  	printf("Are you an experienced Citadel user? ");
***************
*** 103,109 ****
  
  getfield(file,string)		/* Break out next null-terminated string */
  int file; char string[]; {
! int a,b,c;
  	strcpy(string,"");
  	a=0;
  	do {
--- 108,115 ----
  
  getfield(file,string)		/* Break out next null-terminated string */
  int file; char string[]; {
! int a,b;
! unsigned char c;
  	strcpy(string,"");
  	a=0;
  	do {
***************
*** 116,122 ****
  
  getstring(file,string)		/* get a line of text from a file */
  int file; char string[]; {	/* ignores lines beginning with # */
! int a,b,c;
  do {
  	strcpy(string,"");
  	a=0;
--- 122,129 ----
  
  getstring(file,string)		/* get a line of text from a file */
  int file; char string[]; {	/* ignores lines beginning with # */
! int a,b;
! unsigned char c;
  do {
  	strcpy(string,"");
  	a=0;
***************
*** 145,159 ****
  
  interr(errnum)	/* display internal error as defined in errmsgs */
  int errnum; {
! 	printf("INTERNAL ERROR %d\n",errnum);
! 	printf("(Press any key to continue)\n");
  	inkey();
  	logoff(errnum);
  }
  
  directory(path)
  char *path;
  {
  	struct directx {
  		int d_ino;
  		char d_name[15];
--- 152,205 ----
  
  interr(errnum)	/* display internal error as defined in errmsgs */
  int errnum; {
! 	printf("INTERNAL ERROR %d\n\r",errnum);
! 	printf("(Press any key to continue)\n\r");
  	inkey();
  	logoff(errnum);
  }
  
+ #ifdef BSD
  directory(path)
  char *path;
  {
+ struct direct *dp;
+ struct stat statbuf;
+ struct filecomment filecomment;
+ DIR *dirp;
+ char fname[20],tname[50];
+ int file,a;
+ long aa;
+ 	if ((dirp = opendir(path)) == NULL) return(1);
+ 	printf("   Filename      Size\n");
+ 	printf("-------------- --------\n");
+ 	sprintf(tname,"%s/filedir",path);
+ 	file=open(tname,O_RDONLY);
+ 	while ((dp = readdir(dirp)) != NULL) {
+ 		if (*dp->d_name == '.') continue;
+ 		strcpy(fname,dp->d_name);
+ 		if (strcmp("filedir",fname)==0) continue;
+ 		sprintf(tname,"%s/%s",path,fname);
+ 		stat(tname,&statbuf); aa=(long)statbuf.st_size;
+ 		if (file >= 0) {
+ 			lseek(file,0L,0);
+ 			do {
+ 			a=read(file,&filecomment,sizeof(struct filecomment));
+ 			} while ((a>0)&&(strucmp(filecomment.FCname,fname)));
+ 		} else a=0;
+ 
+ 		if (a<1)
+ 			filecomment.FCcomment[0]=0;
+ 		printf("%-14s %8ld %s\n",fname,aa,filecomment.FCcomment);
+ 	}
+ 	close(file);
+ 	closedir(dirp);
+ 	return(0);
+ }
+ #else
+ directory(path)
+ char *path;
+ {
+ 
  	struct directx {
  		int d_ino;
  		char d_name[15];
***************
*** 164,170 ****
  	FILE *fp;
  if ((fd=open(path,0))==(-1)) return(1);
  dlink.d_name[14]=0;
! printf("-----------------------\n");
  read(fd,&dlink,16); read(fd,&dlink,16);
  while ((nread=read(fd,&dlink,16)) > 0)
  	{
--- 210,216 ----
  	FILE *fp;
  if ((fd=open(path,0))==(-1)) return(1);
  dlink.d_name[14]=0;
! printf("-----------------------\n\r");
  read(fd,&dlink,16); read(fd,&dlink,16);
  while ((nread=read(fd,&dlink,16)) > 0)
  	{
***************
*** 184,195 ****
  			} while(!feof(fp));
  FND:		fclose(fp);
  		}
! printf("%-14s %8ld %s\n",dlink.d_name,aa,&comment[strlen(dlink.d_name)+1]);
  	}
  	}
  	close(fd);
  	return(0);
  }
  
  fpgetfield(fp,string)	/* level-2 break out next null-terminated string */
  FILE *fp;
--- 230,242 ----
  			} while(!feof(fp));
  FND:		fclose(fp);
  		}
! printf("%-14s %8ld %s\n\r",dlink.d_name,aa,&comment[strlen(dlink.d_name)+1]);
  	}
  	}
  	close(fd);
  	return(0);
  }
+ #endif
  
  fpgetfield(fp,string)	/* level-2 break out next null-terminated string */
  FILE *fp;
***************
*** 219,225 ****
  	
  	fp=fopen(flname,"rb");
  	if (fp==NULL) {
! 			printf("No file %s.\n",flname);
  			return(1); }
  
  	strcpy(aaa,""); old=255;
--- 266,272 ----
  	
  	fp=fopen(flname,"rb");
  	if (fp==NULL) {
! 			printf("\n\rNo file %s.\n\r",flname);
  			return(1); }
  
  	strcpy(aaa,""); old=255;
***************
*** 230,255 ****
  	
  	if ( ((a==13)||(a==10)) && (old!=13) && (old!=10) ) a=32;
  	if ( ((old==13)||(old==10)) && (isspace(real)) ) {
! 						printf("\n"); c=1; }
  	if (a>126) goto FMTA;
  
  	if (a>32) {
  	if ( ((strlen(aaa)+c)>(width-5)) && (strlen(aaa)>(width-5)) )
! 		{ printf("\n%s",aaa); c=strlen(aaa); aaa[0]=0; }
  	 b=strlen(aaa); aaa[b]=a; aaa[b+1]=0; }
  	if (a==32) { 	if ((strlen(aaa)+c)>(width-5)) { 
! 							printf("\n");
  							c=1;
  							}
  			printf("%s ",aaa); ++c; c=c+strlen(aaa);
  			strcpy(aaa,""); goto FMTA; }
  	if ((a==13)||(a==10)) {
! 				printf("%s\n",aaa); c=1;
  				strcpy(aaa,""); goto FMTA; }
  	goto FMTA;
  
  FMTEND:	fclose(fp);
! 	printf("\n");
  	return(0);
  }
  
--- 277,302 ----
  	
  	if ( ((a==13)||(a==10)) && (old!=13) && (old!=10) ) a=32;
  	if ( ((old==13)||(old==10)) && (isspace(real)) ) {
! 						printf("\n\r"); c=1; }
  	if (a>126) goto FMTA;
  
  	if (a>32) {
  	if ( ((strlen(aaa)+c)>(width-5)) && (strlen(aaa)>(width-5)) )
! 		{ printf("\n\r%s",aaa); c=strlen(aaa); aaa[0]=0; }
  	 b=strlen(aaa); aaa[b]=a; aaa[b+1]=0; }
  	if (a==32) { 	if ((strlen(aaa)+c)>(width-5)) { 
! 							printf("\n\r");
  							c=1;
  							}
  			printf("%s ",aaa); ++c; c=c+strlen(aaa);
  			strcpy(aaa,""); goto FMTA; }
  	if ((a==13)||(a==10)) {
! 				printf("%s\n\r",aaa); c=1;
  				strcpy(aaa,""); goto FMTA; }
  	goto FMTA;
  
  FMTEND:	fclose(fp);
! 	printf("\n\r");
  	return(0);
  }
  
***************
*** 293,300 ****
--- 340,370 ----
  	return(0);
  }
  
+ 
+ #ifdef BSD
  sttybbs(sflag) 
  int sflag;{
+ struct sgttyb live;
+ struct tchars special;
+ 
+ 	ioctl(0,TIOCGETP,&live);
+ 	live.sg_flags= CBREAK | CRMOD ;
+ 	if (sflag==1) {
+ 		printf("\n\r");
+ 		ioctl(0,TIOCFLUSH);
+ 	}
+ 	ioctl(0,TIOCSETP,&live);
+ /*
+ 	ioctl(0,TIOCGETC,&special);
+ 	special.t_intrc= -1;
+ 	special.t_quitc= -1;
+ 	ioctl(0,TIOCSETC,&special);
+ */
+ 	return(0);
+ }
+ #else
+ sttybbs(sflag) 
+ int sflag;{
  struct termio live;
  	ioctl(0,TCGETA,&live);
  	live.c_iflag=ISTRIP|IXON|IXANY;
***************
*** 313,318 ****
--- 383,389 ----
  	ioctl(0,TCSETA,&live);
  	return(0);
  }
+ #endif
  
  long finduser(file,name)	/* binary search for a user */
  int file;
***************
*** 345,354 ****
  	int file,a,b;
  	time(&record->CLtime);
  	file=open("calllog.pos",O_RDWR);
! 	read(file,&a,2);
  	b=a; ++a; if (a==CALLLOG) a=0;
  	lseek(file,0L,0);
! 	write(file,&a,2);
  	close(file);
  
  	file=open("calllog",O_RDWR);
--- 416,425 ----
  	int file,a,b;
  	time(&record->CLtime);
  	file=open("calllog.pos",O_RDWR);
! 	read(file,&a,sizeof(a));
  	b=a; ++a; if (a==CALLLOG) a=0;
  	lseek(file,0L,0);
! 	write(file,&a,sizeof(a));
  	close(file);
  
  	file=open("calllog",O_RDWR);
***************
*** 358,366 ****
--- 429,454 ----
  	return(0);
  }
  
+ 
+ #ifdef BSD
  log_carr()		/* use rec_log to record the connection */
  {
  	struct calllog temp;
+ 	struct sgttyb stty;
+ 	strcpy(temp.CLfullname,ttyname(0));
+ 	temp.CLflags=CL_INOTHER;
+ 	ioctl(0,TIOCGETP,&stty);
+ 	if ((stty.sg_ispeed&B300)==B300)	temp.CLflags=CL_IN300;
+ 	if ((stty.sg_ispeed&B1200)==B1200)	temp.CLflags=CL_IN1200;
+ 	if ((stty.sg_ispeed&B2400)==B2400)	temp.CLflags=CL_IN2400;
+ 	if ((stty.sg_ispeed&B9600)==B9600)	temp.CLflags=CL_INOTHER;
+ 	rec_log(&temp);
+ 	return(0);
+ }
+ #else
+ log_carr()		/* use rec_log to record the connection */
+ {
+ 	struct calllog temp;
  	struct termio stty;
  	strcpy(temp.CLfullname,ttyname(0));
  	temp.CLflags=CL_INOTHER;
***************
*** 372,377 ****
--- 460,466 ----
  	rec_log(&temp);
  	return(0);
  }
+ #endif
  
  alias(name)		/* process alias and routing info for mail */
  char name[]; {
***************
*** 399,411 ****
  	if (strucmp(name,aaa)) goto GNA;
  	fclose(fp);
  	strcpy(name,bbb);
! 	printf("*** Mail is being forwarded to %s\n",name);
  
  DETYPE:	/* determine local or remote type, see citadel.h */
  	for (a=0; a<strlen(name); ++a) if (name[a]=='!') return(M_UUCP);
  	b=0; for (a=0; a<strlen(name); ++a) if (name[a]=='@') ++b;
  	if (b>1) {
! 		printf("Too many @'s in address\n");
  		return(M_ERROR);
  		}
  	if (b==1) {
--- 488,500 ----
  	if (strucmp(name,aaa)) goto GNA;
  	fclose(fp);
  	strcpy(name,bbb);
! 	printf("*** Mail is being forwarded to %s\n\r",name);
  
  DETYPE:	/* determine local or remote type, see citadel.h */
  	for (a=0; a<strlen(name); ++a) if (name[a]=='!') return(M_UUCP);
  	b=0; for (a=0; a<strlen(name); ++a) if (name[a]=='@') ++b;
  	if (b>1) {
! 		printf("Too many @'s in address\n\r");
  		return(M_ERROR);
  		}
  	if (b==1) {
***************
*** 433,439 ****
  			sprintf(name,"%s @%s",aaa,bbb);
  			return(M_BINARY);
  			}
! 		printf("Error in network/mail.sysinfo file\n");
  		return(M_ERROR);
  		}
  	return(M_LOCAL);
--- 522,528 ----
  			sprintf(name,"%s @%s",aaa,bbb);
  			return(M_BINARY);
  			}
! 		printf("Error in network/mail.sysinfo file\n\r");
  		return(M_ERROR);
  		}
  	return(M_LOCAL);
("   Filename      Size\n");
+ 	printf("-------------- --------\n");
+ 	sprintf(tname,"%s/filedir",path);
+ 	file=open(tname,O_RDONLY);
+ 	while ((dp = readdir(dirp)) != NULL) {
+ 		if (*dp->d_name == '.') continue;
+ 		strcpy(fname,dp->d_name);
+ 		if (strcmp("filedir",fname)==0) continue;
+ 		sprintf(tname,"%s/%s",path,fname);
+ 		stat(tname,&statbuf); aa=(long)statbuf.st_size;
+ 		if (file >= 0) {
+ 			lseek(file,0L,0);
+ 			do {
+ 			a=read(file,&filecomment,sizeof(struct filecomment));
+ 			} while ((Droutines2.c   644    465   1770       23127  4472360471   6421 *** ORIG/routines2.c	Wed Aug  9 15:45:21 1989
--- routines2.c	Wed Aug 16 13:28:02 1989
***************
*** 4,10 ****
  
  #include <fcntl.h>
  #include <stdio.h>
! #include <ctype.h>
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
--- 4,10 ----
  
  #include <fcntl.h>
  #include <stdio.h>
! #include "ctype.h"
  #include <time.h>
  #include <sys/types.h>
  #include <sys/stat.h>
***************
*** 12,18 ****
  #include <signal.h>
  #include <pwd.h>
  #include <setjmp.h>
- #include <termio.h>
  #include "citadel.h"
  
  long atol();
--- 12,17 ----
***************
*** 82,88 ****
  			b=strlen(regis.RGphone);
  			regis.RGphone[b]=pbuf[a]; regis.RGphone[b+1]=0;
  			}
! 	printf("\n");
  	f=fork();			/* register in the background */
  	if (f<0) {
  		fprintf(stderr,"citadel: cannot fork-registration not filed\n");
--- 81,87 ----
  			b=strlen(regis.RGphone);
  			regis.RGphone[b]=pbuf[a]; regis.RGphone[b+1]=0;
  			}
! 	printf("\n\r");
  	f=fork();			/* register in the background */
  	if (f<0) {
  		fprintf(stderr,"citadel: cannot fork-registration not filed\n");
***************
*** 132,137 ****
--- 131,139 ----
  	if (lim<0) { lim=(0-lim); flag=1; }
  	strcpy(string,"");
  GLA:	a=inkey(); a=(a&127);
+ #ifdef BSD
+ 	if (a==10) a=13;
+ #endif
  	if ((a==8)&&(strlen(string)==0)) goto GLA;
  	if ((a!=13)&&(a!=8)&&(strlen(string)==lim)) goto GLA;
  	if ((a==8)&&(string[0]!=0)) {
***************
*** 152,158 ****
  	int file,a,b;
  	char aaa[100];
  	if (curr_rm==1) {
! 		printf("Can't delete mail.\n");
  		return(1); }
  	sprintf(aaa,"./rooms/fullrm%d",curr_rm);
  	file=eopen(aaa,O_RDWR);
--- 154,160 ----
  	int file,a,b;
  	char aaa[100];
  	if (curr_rm==1) {
! 		printf("Can't delete mail.\n\r");
  		return(1); }
  	sprintf(aaa,"./rooms/fullrm%d",curr_rm);
  	file=eopen(aaa,O_RDWR);
***************
*** 178,236 ****
  	b=write(file,&quickroom,sizeof(struct quickroom));
  	if (b<1) interr(83);
  	close(file);
! 	printf("Message deleted.\n");
  	return(0);
  }
  
  
  upload(c)	/* c = upload mode */
! int c; {
  	char buf[151],aaa[100],bbb[60],ccc[60];
! 	int a,b,file;
! 	long cc;
  	FILE *fp;
  
  	if ( ((quickroom.QRflags&QR_DIRECTORY)==0)
  		|| ((quickroom.QRflags&QR_UPLOAD)==0) ) {
! 			printf("Not in this room.\n");
  			return(1);
  			}
  
  	printf("Enter filename: ");
  	getline(aaa,15);
! 	for (a=0; a<strlen(aaa); ++a) aaa[a]=tolower(aaa[a]);
  	sprintf(bbb,"./files/%s/%s",quickroom.QRdirname,aaa);
! 	file=open(bbb,O_RDONLY);
! 	if (file>(-1)) {
! 		printf("There already is a file by that name.\n");
! 		close(file); return(1); }
! 	printf("Enter a short description of the file:\n: ");
! 	getline(buf,150);
! 	sprintf(ccc,"./files/%s/filedir",quickroom.QRdirname);
! 	fp=fopen(ccc,"r+");
! 	if (fp==NULL) fp=fopen(ccc,"w");
! 	fseek(fp,0L,2);
! 	fprintf(fp,"%s %s\n",aaa,buf);
! 	fclose(fp);
! 	file=creat(bbb,0666);
! 	if (file<0) {
! 		printf("Can't create that file?\n");
! 		return(1); }
! 	if (c>0) {
! 		close(file);
! 		goto ETUX;
  		}
! 	a=0;
! 	printf("Now recieving. ESC to end.\n");
! 	do {
! 		b=inkey(); 
! 		if (b==13) { b=10; printf("\r"); }
! 		if (b!=27) { printf("%c",b); write(file,&b,1); }
  		} while(b!=27);
  	close(file);
! ETPRF:	printf("File recieved.\n");
  	time(&cc);			/* put together an upload notice */
! 	fp=fopen(temp,"wb"); if (fp==NULL) interr(22);
  	putc(255,fp);
  	putc(MES_NORMAL,fp);
  	putc(0,fp);
--- 180,276 ----
  	b=write(file,&quickroom,sizeof(struct quickroom));
  	if (b<1) interr(83);
  	close(file);
! 	printf("Message deleted.\n\r");
  	return(0);
  }
  
  
  upload(c)	/* c = upload mode */
! int c;
! {
! 	struct stat statbuf;
! 	struct filecomment filecomment;
  	char buf[151],aaa[100],bbb[60],ccc[60];
! 	unsigned char b;
! 	int file,a;
! 	long aa,cc;
  	FILE *fp;
  
  	if ( ((quickroom.QRflags&QR_DIRECTORY)==0)
  		|| ((quickroom.QRflags&QR_UPLOAD)==0) ) {
! 			printf("Not in this room.\n\r");
  			return(1);
  			}
  
  	printf("Enter filename: ");
  	getline(aaa,15);
! 	for (a=0; a<strlen(aaa); ++a) {
! 		if (isupper(aaa[a])) aaa[a]=tolower(aaa[a]);
! 		if (aaa[a]<48)  aaa[a]='_';
! 		if (aaa[a]>122) aaa[a]='_';
! 		if ((aaa[a]>57) && (aaa[a]<65)) aaa[a]='_';
! 	}
  	sprintf(bbb,"./files/%s/%s",quickroom.QRdirname,aaa);
! 
! 	if (stat(bbb,&statbuf) == 0) {
! 		printf("There already is a file by that name.\n\r");
! 		return(1);
! 	}
! 	if (c==0) {
! 		file=creat(bbb,0666);
! 		if (file<0) {
! 			printf("Can't create that file?\n\r");
! 			return(1);
  		}
! 		a=0;
! 		printf("Now recieving. ESC to end.\n\r");
! 		do {
! 			b=inkey(); 
! 			if (b==13) { b=10; printf("\r"); }
! 			if (b!=27) { printf("%c",b); write(file,&b,sizeof(b)); }
  		} while(b!=27);
+ 		close(file);
+ 	}
+ 	if (c==1) {
+ #ifdef BSD
+ 		sprintf(ccc,"upload %s",bbb);
+ #else
+ 		sprintf(ccc,"wcreceive %s",bbb);
+ #endif
+ 		system(ccc);
+ 	}
+ 
+ 	stat(bbb,&statbuf);
+ 	aa=(long)statbuf.st_size;
+ 	if (aa==0) {
+ 		printf("\n\rFile was not recieved.\n\r");
+ 		sprintf(ccc,"rm %s",bbb);
+ 		system(ccc);
+ 		return(1);
+ 	}
+ 	printf("\n\rFile recieved.\n\r");
+ 
+ REASK:	printf("Enter a short description of the file:\n\r: ");
+ 	getline(buf,150);
+ 	if (strlen(buf) < 9) goto REASK;
+ 
+ 	bzero(filecomment.FCname,sizeof(filecomment.FCname));
+ 	bzero(filecomment.FCcomment,sizeof(filecomment.FCcomment));
+ 	strcpy(filecomment.FCname,aaa);
+ 	strcpy(filecomment.FCcomment,buf);
+ 
+ 	sprintf(ccc,"./files/%s/filedir",quickroom.QRdirname);
+ 	file=open(ccc,O_RDWR);
+ 	if (file<0)
+ 		file=creat(ccc,0644);
+ 	lseek(file,0L,2);
+ 	write(file,&filecomment,sizeof(struct filecomment));
  	close(file);
! 
  	time(&cc);			/* put together an upload notice */
! 	fp=fopen(temp,"wb");
! 	if (fp==NULL)
! 		interr(22);
  	putc(255,fp);
  	putc(MES_NORMAL,fp);
  	putc(0,fp);
***************
*** 244,255 ****
  	fclose(fp);
  	save_message(temp,buf,0,M_LOCAL);
  	return(0);
- 
- ETUX:	if (c==1) {
- 		sprintf(ccc,"wcreceive %s",bbb);
- 		system(ccc);
- 		}
- 	goto ETPRF;
  }
  
  move_message(pos)
--- 284,289 ----
***************
*** 309,315 ****
  	read(file,&MMtemp,sizeof(struct msgmain));
  	close(file);
  	if ((MMtemp.MMflags&MM_VALID)==0) {
! 		printf("There are no unvalidated users.\n");
  		return(0);
  		}
  	do {
--- 343,349 ----
  	read(file,&MMtemp,sizeof(struct msgmain));
  	close(file);
  	if ((MMtemp.MMflags&MM_VALID)==0) {
! 		printf("There are no unvalidated users.\n\r");
  		return(0);
  		}
  	do {
***************
*** 325,347 ****
  	file=eopen("usersupp",O_RDWR);
  	while(read(file,&UStemp,sizeof(struct usersupp))>0) {
  		if (UStemp.axlevel==1) {
! 			printf("\n\n\nUser #%-5ld %s ",
  			       UStemp.eternal,UStemp.fullname);
! 			if (usersupp.screenwidth<=40) printf("\n");
  			pwcrypt(UStemp.password,PWCRYPT);
! 			printf("PW: %s\n",UStemp.password);
  			dis_regis(&UStemp);
  			printf("Access level (? for list): ");
  			do {
  				a=inkey();
  				if (a=='?') {
! 					printf("list\n");
  					for (b=0; b<7; ++b)
! 						printf("%d %s\n",b,axdefs[b]);
  					}
  				a=a-48;
  				} while((a<0)||(a>6));
! 			printf("%d\n",a);
  			UStemp.axlevel=a;
  			pwcrypt(UStemp.password,PWCRYPT);
  			lseek(file,(0L-sizeof(struct usersupp)),1);
--- 359,381 ----
  	file=eopen("usersupp",O_RDWR);
  	while(read(file,&UStemp,sizeof(struct usersupp))>0) {
  		if (UStemp.axlevel==1) {
! 			printf("\n\r\n\r\n\rUser #%-5ld %s ",
  			       UStemp.eternal,UStemp.fullname);
! 			if (usersupp.screenwidth<=40) printf("\n\r");
  			pwcrypt(UStemp.password,PWCRYPT);
! 			printf("PW: %s\n\r",UStemp.password);
  			dis_regis(&UStemp);
  			printf("Access level (? for list): ");
  			do {
  				a=inkey();
  				if (a=='?') {
! 					printf("list\n\r");
  					for (b=0; b<7; ++b)
! 						printf("%d %s\n\r",b,axdefs[b]);
  					}
  				a=a-48;
  				} while((a<0)||(a>6));
! 			printf("%d\n\r",a);
  			UStemp.axlevel=a;
  			pwcrypt(UStemp.password,PWCRYPT);
  			lseek(file,(0L-sizeof(struct usersupp)),1);
***************
*** 349,355 ****
  			}
  		}
  	close(file);
! 	printf("\n*** End of registration.\n");
  	return(0);
  	}
  
--- 383,389 ----
  			}
  		}
  	close(file);
! 	printf("\n\r*** End of registration.\n\r");
  	return(0);
  	}
  
***************
*** 359,365 ****
  	int a,b,file;
  	char pbuf[20];
  	if (!((userdata->flags)&US_REGIS)) {
! 		printf("No registration online.\n");
  		return(1);
  		}
  	file=open("registration",O_RDONLY);
--- 393,399 ----
  	int a,b,file;
  	char pbuf[20];
  	if (!((userdata->flags)&US_REGIS)) {
! 		printf("No registration online.\n\r");
  		return(1);
  		}
  	file=open("registration",O_RDONLY);
***************
*** 366,374 ****
  	if (file<0) return(2);
  	while(read(file,®is,sizeof(struct registration))>0) {
  		if (userdata->eternal==regis.RGeternal) {
! 			printf("%-29s\n",regis.RGname);
! 			printf("%-29s\n",regis.RGaddr);
! 			printf("%-14s %2s %6s\n",
  				regis.RGcity,regis.RGstate,regis.RGzip);
  			strcpy(pbuf,regis.RGphone);
  			regis.RGphone[0]=0;
--- 400,408 ----
  	if (file<0) return(2);
  	while(read(file,®is,sizeof(struct registration))>0) {
  		if (userdata->eternal==regis.RGeternal) {
! 			printf("%-29s\n\r",regis.RGname);
! 			printf("%-29s\n\r",regis.RGaddr);
! 			printf("%-14s %2s %6s\n\r",
  				regis.RGcity,regis.RGstate,regis.RGzip);
  			strcpy(pbuf,regis.RGphone);
  			regis.RGphone[0]=0;
***************
*** 385,391 ****
  				strcat(regis.RGphone,pbuf);
  				}
  
! 			printf("(%c%c%c) %c%c%c-%c%c%c%c\n",
  				regis.RGphone[0],regis.RGphone[1],
  				regis.RGphone[2],regis.RGphone[3],
  				regis.RGphone[4],regis.RGphone[5],
--- 419,425 ----
  				strcat(regis.RGphone,pbuf);
  				}
  
! 			printf("(%c%c%c) %c%c%c-%c%c%c%c\n\r",
  				regis.RGphone[0],regis.RGphone[1],
  				regis.RGphone[2],regis.RGphone[3],
  				regis.RGphone[4],regis.RGphone[5],
 { 
! 							printf("\n");
  							c=1;
  							}
  			printf("%s ",aaa); ++c; c=c+strlen(aaa);
  			strcpy(aaa,""); goto FMTA; }
  	if ((a==13)||(a==10)) {
! 				printf("%s\n",aaa); c=1;
  				strcpy(aaa,""); goto FMTA; }
  	goto FMTA;
  
  FMTEND:	fclose(fp);
! 	printf("\n");
  	return(0);
  }
  
--- 277,302 ----
  	
  	if ( ((a==13)||(a==10)) && (old!=13) && (old!=10) ) a=32;
  	if ( ((old==13)||(old==10)) && (isspac		b=inkey(); 
! 		if (b==13) { b=10; printf("\r"); }
! 		if (b!=27) { printf("%c",b); write(file,&b,1); }
  		} while(b!=27);
  	close(file);
! ETPRF:	printf("File recieved.\n");
  	time(&cc);			/* put together an upload notice */
! 	fp=fopen(temp,"wb"); if (fp==NULL) interr(22);
  	putc(255,fp);
  	putc(MES_NORMAL,fp);
  	putc(0,fp);
--- 180,276 ----
  	b=write(file,&quickroom,sizeof(struct quickroom));
  	if (b<1) interr(83);
  	close(file);
! 	printf("Message deleted.\n\r");
  	return(0);
  }
  
  
  upload(c)	/* c = upload mode */
! int c;
! {
! 	struct stat statbuf;
! 	struct filecomment filecomment;
  	char buf[151],aaa[100],bbb[60],ccc[60];
! 	unsigned char b;
! 	int file,a;
! 	long aa,cc;
  	FILE *fp;
  
  	if ( ((quickroom.QRflags&QR_DIRECTORY)==0)
  		|| ((quickroom.QRflags&QR_UPLOAD)==0) ) {
! 			printf("Not in this room.\n\r");
  			return(1);
  			}
  
  	printf("Enter filename: ");
  	getline(aaa,15);
! 	for (a=0; a<strlen(aaa); ++a) {
! 		if (isupper(aaa[a])) aaa[a]=tolower(aaa[a]);
! 		if (aaa[a]<48)  aaa[a]='_';
! 		if (aaa[a]>122) aaa[a]='_';
! 		if ((aaa[a]>57) && (aaa[a]<65)) aaa[a]='_';
! 	}
  	sprintf(bbb,"./files/%s/%s",quickroom.QRdirname,aaa);
! 
! 	if (stat(bbb,&statbuf) == 0) {
! 		printf("There already is a file by that name.\n\r");
! 		return(1);
! 	}
! 	if (c==0) {
! 		file=creat(bbb,0666);
! 		if (file<0) {
! 			printf("Can't create that file?\n\r");
! 			return(1);
  		}
! 		a=0;
! 		printf("Now recieving. ESC to end.\n\r");
! 		do {
! 			b=inkey(); 
! 			if (b==13) { b=10; printf("\r"); }
! 			if (b!=27) { printf("%c",b); write(file,&b,sizeof(b)); }
  		} while(b!=27);
+ 		close(file);
+ 	}
+ 	if (c==1) {
+ #ifdef BSD
+ 		sprintf(ccc,"upload %s",bbb);
+ #else
+ 		sprintf(ccc,"wcreceive %s",bbb);
+ #endif
+ 		system(ccc);
+ 	}
+ 
+ 	stat(bbb,&statbuf);
+ 	aa=(long)statbuf.st_size;
+ 	if (aa==0) {
+ 		printf("\n\rFile was not recieved.\n\r");
+ 		sprintf(ccc,"rm %s",bbb);
+ 		system(ccc);
+ 		return(1);
+ 	}
+ 	printf("\n\rFile recieved.\n\r");
+ 
+ REASK:	printf("Enter a short description of the file:\n\r: ");
+ 	getline(buf,150);
+ 	if (strlen(buf) < 9) goto REASK;
+ 
+ 	bzero(filecomment.FCname,sizeof(filecomment.FCname));
+ 	bzero(filecomment.FCcomment,sizeof(filecomment.FCcomment));
+ 	strcpy(filecomment.FCname,aaa);
+ 	strcpy(filecomment.FCcomment,buf);
+ 
+ 	sprintf(ccc,"./files/%s/filedir",quickroom.QRdirname);
+ 	file=open(ccc,O_RDWR);
+ 	if (file<0)
+ 		file=creat(ccc,0644);
+ 	lseek(file,0L,2);
+ 	write(file,&filecomment,sizeof(struct filecomment));
  	close(file);
! 
  	time(&cc);			/* put together an upload notice */
! 	fp=fopen(temp,"wb");
! 	if (fp==NULL)
! 		interr(22);
  	putc(255,fp);
  	putc(MES_NORMAL,fp);
  	putc(0,fp);
***************
*** 244,255 ****
  	fclose(fp);
  	save_message(temp,buf,0,M_LOCAL);
  	return(0);
- 
- ETUX:	if (c==1) {
- 		sprintf(ccc,"wcreceive %s",bbb);
- 		system(ccc);
- 		}
- 	goto ETPRF;
  }
  
  move_message(pos)
--- 284,289 ----
***************
*** 309,315 ****
  	read(file,&MMtemp,sizeof(struct msgmain));
  	close(file);
  	if ((MMtemp.MMflags&MM_VALID)==0) {
! 		printf("There are no unvalidated users.\n");
  		return(0);
  		}
  	do {
--- 343,349 ----
  	read(file,&MMtemp,sizeof(struct msgmain));
  	close(file);
  	if ((MMtemp.MMflags&MM_VALID)==0) {
! 		printf("There are no unvalidated users.\n\r");
  		return(0);
  		}
  	do {
***************
*** 325,347 ****
  	file=eopen("usersupp",O_RDWR);
  	while(read(file,&UStemp,sizeof(struct usersupp))>0) {
  		if (UStemp.axlevel==1) {
! 			printf("\n\n\nUser #%-5ld %s ",
  			       UStemp.eternal,UStemp.fullname);
! 			if (usersupp.screenwidth<=40) printf("\n");
  			pwcrypt(UStemp.password,PWCRYPT);
! 			printf("PW: %s\n",UStemp.password);
  			dis_regis(&UStemp);
  			printf("Access level (? for list): ");
  			do {
  				a=inkey();
  				if (a=='?') {
! 					printf("list\n");
  					for (b=0; b<7; ++b)
! 						printf("%d %s\n",b,axdefs[b]);
  					}
  				a=a-48;
  				} while((a<0)||(a>6));
! 			printf("%d\n",a);
  			UStemp.axlevel=a;
  			pwcrypt(UStemp.password,PWCRYPT);
  			lseek(file,(0L-sizeof(struct usersupp)),1);
--- 359,381 ----
  	file=eopen("usersupp",O_RDWR);
  	while(read(file,&UStemp,sizeof(struct usersupp))>0) {
  		if (UStemp.axlevel==1) {
! 			printf("\n\r\n\r\n\rUser #%-5ld %s ",
  			       UStemp.eternal,UStemp.fullname);
! 			if (usersupp.screenwidth<=40) printf("\n\r");
  			pwcrypt(UStemp.password,PWCRYPT);
! 			printf("PW: %s\n\r",UStemp.password);
  			dis_regis(&UStemp);
  			printf("Access level (? for list): ");
  			do {
  				a=inkey();
  				if (a=='?') {
! 					printf("list\n\r");
  					for (b=0; b<7; ++b)
! 						printf("%d %s\n\r",b,axdefs[b]);
  					}
  				a=a-48;
  				} while((a<0)||(a>6));
! 			printf("%d\n\r",a);
  			UStemp.axlevel=a;
  			pwcrypt(UStemp.password,PWCRYPT);
  			lseek(file,(0L-sizeof(struct usersupp)),1);
***************
*** 349,355 ****
  			}
  		}
  	close(file);
! 	printf("\n*** End of registration.\n");
  	return(0);
  	}
  
--- 383,389 ----
  			}
  		}
  	close(file);
! 	printf("\n\r*** End of registration.\n\r");
  	return(0);
  	}
  
***************
*** 359,365 ****
  	int a,b,file;
  	char pbuf[20];
  	if (!((userdata->flags)&US_REGIS)) {
! 		printf("No registration online.\n");
  		return(1);
  		}
  	file=open("registration",O_RDONLY);
--- 393,399 ----
  	int a,b,file;
  	char pbuf[20];
  	if (!((userdata->flags)&US_REGIS)) {
! 		printf("No registration online.\n\r");
  		return(1);
  		}
  	file=open("registration",O_RDONLY);
***************
*** 366,374 ****
  	if (file<0) return(2);
  	while(read(file,®is,sizeof(struct registration))>0) {
  		if (userdata->eternal==regis.RGeternal) {
! 			printf("%-29s\n",regis.RGname);
! 			printf("%-29s\n",regis.RGaddr);
! 			printf("%-14s %2s %6s\n",
  				regis.RGcity,regis.RGstate,regis.RGzip);
  			strcpy(pbuf,regis.RGphone);
  			regis.RGphone[0]=0;
--- 400,408 ----
  	if (file<0) return(2);
  	while(read(file,®is,sizeof(struct registration))>0) {
  		if (userdata->eternal==regis.RGeternal) {
! 			printf("%-29s\n\r",regis.RGname);
! 			printf("%-29s\n\r",regis.RGaddr);
! 			printf("%-14s %2s %6s\n\r",
  				regis.RGcity,regis.RGstate,regis.RGzip);
  			strcpy(pbuf,regis.RGphone);
  			regis.RGphone[0]=0;
***************
*** 385,391 ****
  				strcat(regis.RGphone,pbuf);
  				}
  
! 			printf("(%c%c%c) %c%c%c-%c%c%c%c\n",
  				regis.RGphone[0],regis.RGphone[1],
  				regis.RGphone[2],regis.RGphone[3],
  				regis.RGphone[4],regis.RGphone[5],
--- 419,425 ----
  				strcat(regis.RGphone,pbuf);
  				}
  
! 			printf("(%c%c%c) %c%c%c-%c%c%c%c\n\r",
  				regis.RGphone[0],regis.RGphone[1],
  				regis.RGphone[2],regis.RGphone[3],
  				regis.RGphone[4],regis.RGphone[5],
 { 
! 							printf("\n");
  							c=1;
  							}
  			printf("%s ",aaa); ++c; c=c+strlen(aaa);
  			strcpy(aaa,""); goto FMTA; }
  	if ((a==13)||(a==10)) {
! 				printf("%s\n",aaa); c=1;
  				strcpy(aaa,""); goto FMTA; }
  	goto FMTA;
  
  FMTEND:	fclose(fp);
! 	printf("\n");
  	return(0);
  }
  
--- 277,302 ----
  	
  	if ( ((a==13)||(a==10)) && (old!=13) && (old!=10) ) a=32;
  	if ( ((old==13)||(old==10)) && (isspac
SHAR_EOF
fi
echo shar: "done with directory 'source'"
cd ..
exit 0
#	End of shell archive
-- 
     Some do, some don't.           |       eric at sactoh0.SAC.CA.US
    Some will, some won't.          |      ames!pacbell!sactoh0!eric
          I might!                  |      ucbvax!csusac!sactoh0!eric
                                    |     ( A Home For Unwanted 3B's )
    
    
More information about the Alt.sources
mailing list