home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
CCP
/
LOGON12.LBR
/
LOGON.CQ
/
LOGON.C
Wrap
Text File
|
2000-06-30
|
6KB
|
284 lines
/* logon.c
note: must link REL to newlib/s
*/
#include "b:printf.h"
#define KAYPRO /* conditional for video attribute definitions */
#define TITLE "Logon Version 1.2, by David C. Oshel"
#define BDRIV 14 /* bdos select disk */
#define BUSER 32 /* bdos set user code */
#define MAXUSERS 64
#define TRUE 1
#define FALSE 0
#define USERFILE "LOGON.USR"
#define UFD 0
#define UFU 15 /* selects A15: for userfile */
static struct users {
char uname[20];
char passw[20];
char progr[20];
char parms[80];
int usdr, uusr;
}
*login[MAXUSERS],
*log;
main( argc, argv ) int argc; char *argv[]; {
char name[20], pw[20];
init_lib();
OFFinterrupt(); /* kill control-c */
pw[0] = '\0';
name[0] = '\0';
getable();
clr_screen();
printf("%s\n\nType \"?\" and hit <Return> for assistance.\n\n",TITLE);
lookup( name, pw );
execut();
} /* end: main */
assume(p,q,lim) char *p,*q; int lim; { /* copies lim bytes from q to p */
int i;
i = 0;
while (*q && (i < lim)) {
*p = *q;
p++; q++; i++;
}
*p = '\0';
} /* end: assume */
lookup(p,q) char *p,*q; {
int good;
zoo: good = 0;
while (!good) {
while (getwho(p) < 0) {
printf("\nLogon: ");
getu(p,15);
if ((index(p,"HELP") >= 0) || (index(p,"?") >= 0)) {
help();
p[0] = '\0';
goto zoo;
}
}
good = passmatch(q);
p[0] = '\0';
}
} /* end: lookup */
execut() {
char *p, *q, *r, *s, inbuf[80], parmbuff[128];
int a, i, warmboot;
struct subrec {
char lenbyte;
char cmd[127];
}
subway;
/* prompt for variable parameter(s) & expand user command line, if needed */
p = parmbuff; q = log->parms; a = 0;
if (index(q,"$") < 0) strcpy(p,q); /* default case */
else {
help2();
while ( (i = index(log->parms,"$")) >= 0) {
*(log->parms + i) = '\0'; /* erase the $ */
while (*q) *p++ = *q++;
++a;
loo: printf("%s $%d? ",log->uname,a);
r = inbuf;
getu(r,79);
if (index(r,"?") >= 0) { help2(); goto loo; }
while (*r && isspace(*r)) r++; /* strip leading spaces */
strcpy(p,r);
r = p;
while (*p) p++; --p; /* skip to eol and back up one */
while (isspace(*p) && (p > r)) *p-- = '\0'; /* strip trailing spaces */
++p; /* point to the null */
*q = ' '; /* erase 0, was $, generate separating space in */
/* case the LOGON.USR parmfield contains $$$... */
}
printf("\n");
}
clr_screen();
printf("One moment, please. Loading %s %s...\n\n",log->progr,parmbuff);
/* set the CP/M du byte so CCP will find the chainback SUB file on warm boot */
bdos(BDRIV,log->usdr);
bdos(BUSER,log->uusr);
s = 0x04; /* page 0 drive/user byte, active on warm boot */
*s = (char) ( log->uusr * 16 + log->usdr );
/* write the $$$.SUB file (chains back to logon) in the user's own area */
warmboot = fopen("A:$$$.SUB","wb");
strcpy(subway.cmd,"logon");
subway.lenbyte = strlen(subway.cmd);
s = (char *) &subway;
for (i = 0; i < 128; i++) putc( s[i], warmboot);
fclose(warmboot);
/* finally, do it ...! */
exec(log->progr,parmbuff); /* does not return, restarts via SUB */
} /* end: execut */
passmatch(q) char *q; {
if ( strlen(log->passw) == 0 ) return 1; /* no password required */
if ( index(log->passw,"*") >= 0) return 1; /* hidden, no password */
printf("\nPassword: ");
getu(q,15);
printf("\n");
if ( strcmp(q,log->passw) == 0 ) return TRUE; else return FALSE;
} /* end: passmatch */
getwho(p) char *p; {
int i;
if (strlen(p) == 0) return (-1);
for (i = 0; i < MAXUSERS; i++) {
log = login[i];
if ( strcmp(p,log->uname) == 0 ) {
break;
}
}
if (i == MAXUSERS) return (-1); else return (i);
} /* end: getwho */
getable() {
int i, j, k, file;
char *dlog;
bdos(BDRIV,UFD);
bdos(BUSER,UFU);
if (rename(USERFILE,USERFILE) == -1) {
printf("\007*** ERROR: Users list not found!\n");
while (TRUE) ;
}
file = fopen(USERFILE,"rb");
k = sizeof( struct users );
for (i = 0; i < MAXUSERS; i++) {
login[i] = alloc( k );
dlog = (char *) login[i];
for (j = 0; j < k; j++) *dlog++ = getc(file);
}
fclose( file );
} /* end: getable */
getu(p,len) char *p; int len; {
gets(p,len);
while (*p) *p = toupper(*p++);
} /* end: getu */
help() {
int i, j, u; struct users *q; char *dazzle, *normal;
#ifndef KAYPRO
dazzle = "";
normal = "";
#else
dazzle = "\033B0\033B1";
normal = "\033C0\033C1";
#endif
clr_screen();
printf("%s\n\n",TITLE);
printf("To LOGOFF (and quit) type LOGOFF, QUIT or BYE, and hit <Return>.\n");
printf("To RUN A PROGRAM, select one of these User/Program names:\n\n");
for (u = i = 0; i < MAXUSERS; i++) {
q = login[i];
if (strlen(q->uname) > 0 && index(q->passw,"*") < 0) {
if (strlen(q->passw) == 0) {
printf("%21s%3d. %-15s%s\n",dazzle,++u,q->uname,normal);
if (!(u % 16)) {
printf("%21s","(more)");
while (!getc(0))
;
for (j=0; j<21; j++) putc(08,0);
}
}
}
}
printf("\n");
} /* end: help */
help2() {
printf("%s accepts an optional name or expression, e.g., the name of a game\n",log->uname);
printf("to continue playing (Adventure), or a document to edit (WordStar).\n\n");
printf("Enter an expression that %s may use, or hit <Return> ",log->uname);
printf("to IGNORE this step.\n\n");
} /* end: help2 */
#include "exec.c"