This is menu.c in view mode; [Download] [Up]
/* menu-functions */ #include <curses.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/file.h> #include "prototypes.h" #include "global.h" #define INFOTEXT "info" #define MAXWIDTH 256 #define SUBJECTMAXLEN 256 #define USERMAXLEN 256 #define REALNAMEMAXLEN 256 #define PWMAXLEN 256 struct filelist { char fname[FILENAME_MAX]; struct filelist *next; }; typedef struct filelist flist; struct menentry mentab[] = { "Info about this system", &sysinfo, "who is currently logged in ?",&who, #ifdef MAILANYLOCAL "send a mail to local user",&mailpm, #else "send a mail to postmaster",&mailpm, #endif "chat with postmaster",&chat, "transfer a file",&filetrans, "change emulation",&chemu, "logoff",&logout }; /* internal prototyping */ void sendfile(flist *flp); void getfile( void ); void directory( void ); bool lookupaccess(char *pw, int *raccessp, int *waccessp, int *daccess, flist **flp); static void centertext(int line, char *text); static int drawkey(int i); /* menu-functions */ #ifdef RESTRICTEDACCESS char *rmfield(char *p) { while(isspace(*p)) p++; while(*p && !isspace(*p)) p++; while(isspace(*p)) p++; return p; } bool lookupaccess(char *pw, int *raccessp, int *waccessp, int *daccessp, flist **flp) { FILE *h; char line[256], *p=line, *q; flist *actflp=0L; if(((h=fopen(FILEPWD,"r"))==0L) || (strlen(pw)<2)) return FALSE; while(fgets(line, sizeof(line), h)!=0L) if((*line!='#') && (strncmp(line, pw, strlen(pw))==0L) && isspace(*(line+strlen(pw)))) { p=rmfield(p); /* remove comments */ for(q=p; *q!='\0'; q++) if(*q=='#') *q='\0'; for(q=p+strlen(p)-1; isspace(*q); *q--='\0') ; *raccessp=atoi(p); *waccessp=atoi(p=rmfield(p)); *daccessp=atoi(p=rmfield(p)); while(*(p=rmfield(p))) { if(!actflp) *flp=actflp=malloc(sizeof(flist)); else { actflp->next=malloc(sizeof(flist)); actflp=actflp->next; } strcpy(actflp->fname, p); /* the following part may cause length- problems */ for(q=actflp->fname; *q!='\0'; q++) if(isspace(*q)) *q='\0'; } if(actflp) actflp->next=0L; return TRUE; } fclose(h); return FALSE; } #endif void sendfile(flist *flp) { char fname[FILENAME_MAX], shcmd[SHCMDLEN]; char *strrchr(); flist *p; sprintf(fname, "%s/", PUBDIR); if((flp!=0L) && (flp->next==0L)) { strcat(fname, flp->fname); printf("\n\nfile to be transmitted: %s.\n\n", fname); } else { if(flp!=0L) { printf("\n\navailable files:"); p=flp; while(p) { printf("\n%s", p->fname); p=p->next; } } printf("\n\nname of file to be sent >"); refresh(); gets(fname+strlen(fname)); if(flp!=0L) { p=flp; while(p) { if(strcmp(strrchr(fname,'/')+1, p->fname)==0L) break; p=p->next; } if(!p) { printf("\n\nillegal file requested.\n\n" "> key <"); refresh(); readchar(); return; } } } if(access(fname,R_OK)==-1) { printf("\n\nerror - file doesn't exist.\n\n"); refresh(); readchar(); } else { printf("\n\ngive your local %s-receive command now !\n\n", PROTNAME); refresh(); sprintf(shcmd,"%s %s", SENDFILE, fname); if(system(shcmd)) perror("system"); log("sent file %s.", fname); readchar(); } } void getfile() { char shcmd[SHCMDLEN], currdir[FILENAME_MAX]; #ifdef RECNEEDSFNAME char fname[FILENAME_MAX]; sprintf(fname, "%s/", PUBDIR); printf("\n\nname of file to be received >"); refresh(); gets(fname+strlen(fname)); if(access(fname,F_OK)==0) { printf("\n\nerror - file already exists.\n\n"); refresh(); readchar(); } #endif getwd(currdir); chdir(PUBDIR); printf("\n\ngive your local %s-send command now !\n\n", PROTNAME); refresh(); #ifdef RECNEEDSFNAME sprintf(shcmd,"%s %s", RECFILE, fname); #else strcpy(shcmd, RECFILE); #endif if(system(shcmd)) perror("system"); #ifdef RECNEEDSFNAME log("received file %s.", fname); #else log("received a file."); #endif chdir(currdir); readchar(); } void directory() { char shcmd[SHCMDLEN]; printf("\n\n"); sprintf(shcmd,"%s -l %s", LS, PUBDIR); system(shcmd); printf("\n\n> key <"); refresh(); readchar(); } void filetrans() { char name[REALNAMEMAXLEN], pw[PWMAXLEN], tmp[256]; char c; int raccess=TRUE, waccess=TRUE, daccess=TRUE; flist *flp=0L, *fltmp; erasescreen(); if(*FILEMSG!='\0') { printf("%s\n\n> key <",FILEMSG); refresh(); readchar(); } #ifdef RESTRICTEDACCESS erasescreen(); endwin(); centertext(2,"Filetransfer"); centertext(3,"--------------"); printf("\n\n"); printf("please enter your REAL name >"); if(!*gets(name)) return; printf("please enter your password >"); gets(pw); if(lookupaccess(pw, &raccess, &waccess, &daccess, &flp)) { printf("\n\nOk...\n\n"); log("'%s' entered filetransfer-menu. access-flags: %d %d %d", name, raccess, waccess, daccess); } else { printf("\n\naccess denied.\n\n> key <"); log("filetransfer-access denied to '%s'", name); readchar(); return; } initscr(); refresh(); #endif erasescreen(); centertext(2,"Filetransfer"); centertext(3,"--------------"); sprintf(tmp,"Transfer-Protocol: %s", PROTNAME); centertext(5,tmp); if(raccess) centertext(8,"1 --> receive file ( download )"); if(waccess) centertext(10,"2 --> send file ( upload )"); if(daccess) centertext(12,"3 --> list available files"); centertext(15,"your choice ? >"); refresh(); endwin(); c=readchar(); switch(c) { case '1' : if(raccess) sendfile(flp); break; case '2' : if(waccess) getfile(); break; case '3' : if(daccess) directory(); break; } if(flp!=0L) { fltmp=flp->next; free(flp); flp=fltmp; } initscr(); refresh(); } void chat() { char shcmd[SHCMDLEN]; erasescreen(); if(*CHATMSG!='\0') { printf("%s\n\n> key <",CHATMSG); refresh(); readchar(); } endwin(); sprintf(shcmd,"%s %s",TALKBIN, POSTMASTER); system(shcmd); initscr(); refresh(); } void chemu() { erasescreen(); setemu(TRUE); } void mailpm() { char subject[SUBJECTMAXLEN], tmpfile[FILENAME_MAX]; char shcmd[SHCMDLEN]; char user[USERMAXLEN]; strcpy(user, POSTMASTER); erasescreen(); if(*MAILMSG!='\0') { printf("%s\n\n> key <",MAILMSG); refresh(); readchar(); } strcpy(tmpfile,tmpnam(0L)); remove(tmpfile); endwin(); #ifdef MAILANYLOCAL do { printf("\nMail to which local user ? ( CR = postmaster ) >"); gets(user); } while(((strpbrk(user,NETWORKCHARS)!=0L) || (getpwnam(user)==0L)) && (*user!='\0')); if(*user=='\0') strcpy(user,POSTMASTER); #endif log("user send's mail to '%s'.", user); #ifdef USEEDITOR sprintf(shcmd,"%s %s",EDITORBIN,tmpfile); if(system(shcmd)) perror("system"); #else initscr(); erasescreen(); endwin(); printf("enter your text now. ^D to end.\n\n"); refresh(); sprintf(shcmd,"%s >%s",CATBIN,tmpfile); if(system(shcmd)) perror("system"); #endif erasescreen(); /* Curses turned off here ! */ printf("Mail to %s\n\n\nSubject: ", user); gets(subject); if(*subject=='\0') strcpy(subject,DEFAULTSUBJECT); printf("\n\nreally send mail ? (Y/n) >"); refresh(); if(toupper(readchar())!='N') { sprintf(shcmd, "%s -s '%s' %s <%s", MAILBIN, subject, user, tmpfile); if(system(shcmd)) perror("system"); } else printf("\n\nmail not send..."); initscr(); refresh(); } void sysinfo() { showfile(INFOTEXT); } void logout() { erasescreen(); centertext(3,"Shure to quit ? (Y/n) >"); refresh(); if(toupper(readchar())!='N') { printf("\n\n\n%s\n",GOODBYETXT); refresh(); endwin(); exit(EXIT_SUCCESS); } } void who() { int i; erasescreen(); if(*WHOHEADLINE!='\0') { printf("%s\n",WHOHEADLINE); for(i=1;i<=strlen(WHOHEADLINE);i++) putchar('-'); putchar('\n'); refresh(); } endwin(); if(system(WHOBIN)) perror("system"); printf("\n\n> key <"); refresh(); readchar(); initscr(); } void centertext(int line, char *text) { mvcur(stdscr->_cury, stdscr->_curx, line, (COLS-strlen(text))/2); printf("%s",text); } void drawmenu() { char outstr[MAXWIDTH]; int i; erasescreen(); centertext(0,HEADLINE); centertext(2,MENUTITLE); for(i=1;i<=(sizeof(mentab)/sizeof(struct menentry));i++) { sprintf(outstr,"%d --> %s",i,mentab[i-1].text); centertext(i*2+2,outstr); } centertext(LINES-2,"your choice >"); refresh(); } int drawkey(int i) { return i; } int getmenukey() { int i; while( ((i=(readchar()&0xf))<1) || (i>(sizeof(mentab)/sizeof(struct menentry))) ) drawmenu(); refresh(); return(drawkey(i)); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.