This is daction.c in view mode; [Download] [Up]
/* $Id: daction.c,v 1.2 1995/12/19 19:30:47 eilts Exp eilts $ */ #include "bbs.h" #ifdef NNTPNEWS int dgetnewsrc(const int sockd, const confrecordtyp *confrecord) { int rw=0; SIZE_T len; char newsrc[PATH_MAX+1], str[S_STRLEN+1]; FILE *fp; boolean no_newsrc = FALSE; struct stat stats; recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)str,len,0); sprintf(newsrc,"%s/%s.newsrc",confrecord->maildir,str); if (stat(newsrc,&stats) < 0) { if (errno != ENOENT) { bgerror("dgetnewsrc","stat %s: %m",newsrc); rw = -1; } no_newsrc = TRUE; } if (no_newsrc || stats.st_size == 0) { len = 0; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); return rw; } if ((fp=fopen(newsrc,"r")) == NULL) { bgerror("dgetnewsrc","fopen newsrc file %s: %m", newsrc); rw = -1; } else { while (fgetnln(str,S_STRLEN,fp) >= 0) { len = strlen(str) + 1; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); sendn(sockd,(void *)str,len,0); } } len = 0; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); return rw; } int dsavenewsrc(const int sockd, const confrecordtyp *confrecord) { int rw=0; SIZE_T len; char newsrc[PATH_MAX+1], scratch[PATH_MAX+1], str[S_STRLEN+1]; FILE *sfp; recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)str,len,0); scratchfilename(scratch,"dsnewsrc-",str,confrecord->scratchdir); sprintf(newsrc,"%s/%s.newsrc",confrecord->maildir,str); unlink(scratch); if ((sfp=fopen(scratch,"w")) == NULL) { bgerror("dsavenewsrc","fopen scratchfile %s: %m", scratch); sfp = fopen("/dev/null","w"); rw = -1; } recvn(sockd,(void *)&len,sizeof(SIZE_T),0); while (len > 0) { recvn(sockd,(void *)str,len,0); fputs(str,sfp); putc('\n',sfp); recvn(sockd,(void *)&len,sizeof(SIZE_T),0); } fclose(sfp); if (len != 0) rw = -1; if (rw == 0) { if ((rw=rename(scratch,newsrc)) < 0) { bgerror("dsavenewsrc","rename %s -> %s: %m",scratch,newsrc); } chmod(newsrc,0600); } return rw; } int dgetallnewsgroups(const int sockd, const bbsddbtyp *bbsddb, const confrecordtyp *confrecord) { int mask; SIZE_T len, c_len; char group[S_STRLEN+1], count[S_STRLEN+1], str[2*S_STRLEN+4]; recvn(sockd,(void *)&mask,(SIZE_T)sizeof(int),0); while (getkeysbbsddb(bbsddb,NEWSGROUPS_DB,group,&len,count,&c_len, confrecord) == 0) { if ((mask & GROUPNAME_MASK) && (mask & GROUPCOUNT_MASK)) { sprintf(str,"%s %s",group,count); } else if (mask & GROUPNAME_MASK) { strcpy(str,group); } else if (mask & GROUPCOUNT_MASK) { strcpy(str,count); } else { *str = '\0'; } len = strlen(str) + 1; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); sendn(sockd,(void *)str,len,0); } len = 0; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); return(0); } int dcheckgroup(const int sockd, const bbsddbtyp *bbsddb, const confrecordtyp *confrecord) { int n; SIZE_T len; char group[S_STRLEN+1]; boolean grp_exists = FALSE; recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)group,len,0); n = lookupbbsddb(bbsddb,group,0,NEWSGROUPS_DB,NULL,&len,confrecord); if (n == 0) { grp_exists = TRUE; } else if (n > 0) n = 0; sendn(sockd,(void *)&grp_exists,sizeof(boolean),0); return n; } #endif int dlistmessages(const int sockd, const confrecordtyp *confrecord) { int rw=0; SIZE_T len; char mbox[PATH_MAX+1], str[STRLEN+1], hdrlines[3*STRLEN+4], *hdrbuf; FILE *fp; boolean no_mbox = FALSE; mailheadertyp mailhdr; struct stat stats; recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)str,len,0); sprintf(mbox,"%s/%s",confrecord->maildir,str); if (stat(mbox,&stats) < 0) { if (errno != ENOENT) { bgerror("dlistmessages","stat %s: %m",mbox); rw = -1; } no_mbox = TRUE; } if (no_mbox || stats.st_size == 0) { len = 0; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); return rw; } if ((fp=fopen(mbox,"r")) == NULL) { bgerror("dlistmessages","fopen mailbox %s: %m", mbox); rw = -1; } else { fgetnln(str,6,fp); do { if (testmailbegin(str) && (hdrbuf=parsemailheader(&mailhdr,fp,confrecord)) != NULL) { if (strlen(mailhdr.from) + strlen(mailhdr.subject) + strlen(mailhdr.msg_id) < 3*STRLEN) { sprintf(hdrlines,"%s\n%s\n%s",mailhdr.from,mailhdr.subject, mailhdr.msg_id); } else { strcpy(hdrlines,""); } len = strlen(hdrlines) + 1; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); sendn(sockd,(void *)hdrlines,len,0); free(hdrbuf); } } while(fgetnln(str,6,fp) >= 0); fclose(fp); } len = 0; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); return rw; } int dremovemessage(const int sockd, const confrecordtyp *confrecord) { int k, nr, rw=0; char mbox[PATH_MAX+1], scratch[PATH_MAX+1], sstr[6], zeile[STRLEN+1], msg_id[STRLEN+1]; char *hdrbuf = NULL; SIZE_T len; boolean found = FALSE; FILE *fp, *sfp; mailheadertyp mailhdr; recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)zeile,len,0); sprintf(mbox,"%s/%s",confrecord->maildir,zeile); recvn(sockd,(void *)&nr,sizeof(int),0); recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)msg_id,len,0); if ((fp=fopen(mbox,"r")) == NULL) { bgerror("dremovemessage","fopen mailbox %s: %m", mbox); return -1; } scratchfilename(scratch,zeile,NULL,confrecord->maildir); if ((sfp=fopen(scratch,"w")) == NULL) { bgerror("dremovemessage","fopen scratchfile %s: %m", scratch); fclose(fp); return -1; } k = 0; while (fgetnln(zeile,STRLEN,fp) >= 0) { strmaxcpy(sstr,zeile,5); if (testmailbegin(sstr)) { if (k == nr) { if ((hdrbuf=parsemailheader(&mailhdr,fp,confrecord)) == NULL) { bgerror("dremovemessage","corrupt mailheader"); break; } if (strcmp(msg_id,mailhdr.msg_id) == 0 || *msg_id == '\0') { found = TRUE; } else { bgerror("dremovemessage","Mailbox mismatch: Nr. %d != MsgId %s", nr,msg_id); } if (hdrbuf != NULL) free(hdrbuf); break; } k++; } fputs(zeile,sfp); putc('\n',sfp); } if (found) { while ((k=fgetnln(zeile,STRLEN,fp)) >= 0) { strmaxcpy(sstr,zeile,5); if (testmailbegin(sstr)) break; } if (k >= 0) { do { fputs(zeile,sfp); putc('\n',sfp); } while (fgetnln(zeile,STRLEN,fp) >= 0); } } fclose(sfp); fclose(fp); if (found) { rename(scratch,mbox); chmod(mbox,0600); } else { unlink(scratch); bgerror("dremovemessage","Message Nr. %d not found",nr,msg_id); rw = -1; } return rw; } int dgetmessage(const int sockd, const confrecordtyp *confrecord) { int nr, k, rw=0; char mbox[PATH_MAX+1], str[STRLEN+1], name[STRLEN+1], msg_id[STRLEN+1]; char *hdrbuf = NULL; SIZE_T len; boolean found = FALSE; FILE *fp, *sfp; mailheadertyp mailhdr; recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)name,len,0); recvn(sockd,(void *)&nr,sizeof(int),0); recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)msg_id,len,0); sprintf(mbox,"%s/%s",confrecord->maildir,name); if ((fp=fopen(mbox,"r")) == NULL) { bgerror("dgetmessage","fopen mailbox %s: %m", mbox); len = 0; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); return -1; } k = 0; while (fgetnln(str,STRLEN,fp) >= 0) { if (testmailbegin(str)) { if (k == nr) { if ((hdrbuf=parsemailheader(&mailhdr,fp,confrecord)) == NULL) { bgerror("dgetmessage","corrupt mailheader"); break; } if (strcmp(msg_id,mailhdr.msg_id) == 0 || *msg_id == '\0') { found = TRUE; } else { bgerror("dgetmessage","Mailbox mismatch: Nr. %d != MsgId %s", nr,msg_id); } break; } k++; } } if (found) { scratchfilename(mbox,"dgm-",name,confrecord->scratchdir); unlink(mbox); len = strlen(mbox) + 1; if ((sfp=fopen(mbox,"w")) == NULL) { bgerror("dgetmessage","fopen scratchfile %s: %m", mbox); rw = -1; } fprintf(sfp,"From: %s\n",mailhdr.from); fprintf(sfp,"Subject: %s\n",mailhdr.subject); fprintf(sfp,"Date: %s\n",mailhdr.date); fprint_mailheaderline(mailhdr.to,"To",sfp); if (*mailhdr.cc != '\0') { fprint_mailheaderline(mailhdr.to,"Cc",sfp); } if (*mailhdr.reply_to != '\0') fprintf(sfp,"Reply_To: %s\n", mailhdr.reply_to); putc('\n',sfp); while (fgetnln(str,STRLEN,fp) >= 0 && strncmp(str,"From ",5) != 0) { fputs(str,sfp); putc('\n',sfp); } if (sfp != NULL) fclose(sfp); chmod(mbox,0444); } else { len = 0; rw = -1; } fclose(fp); sendn(sockd,(void *)&len,sizeof(SIZE_T),0); if (len > 0) { sendn(sockd,(void *)&mbox,len,0); } if (hdrbuf != NULL) free(hdrbuf); return rw; } int dsendmessage(const int sockd, const bbsddbtyp *bbsddb, const confrecordtyp *confrecord) { int k, n, rw=0; char *sp, *splits[MAXARGS+1], mbox[PATH_MAX+1], scratch[PATH_MAX+1], name[S_STRLEN+1], realname[S_STRLEN+1], from[2*S_STRLEN+4], subject[STRLEN+1], addr[ARG_MAX+1], astr[ARG_MAX+1], msgstr[S_STRLEN+1]; static char c1 = 'A'-1; SIZE_T len; SSIZE_T bytes; FILE *sfp, *mboxfp; recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)&from,len,0); recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)&addr,len,0); recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)&subject,len,0); parseaddrline(name,realname,from); scratchfilename(scratch,"dsm-",name,confrecord->scratchdir); unlink(scratch); if ((sfp=fopen(scratch,"w+")) == NULL) { bgerror("dsendmessage","fopen scratchfile %s: %m", scratch); sfp = fopen("/dev/null","w+"); rw = -1; } unlink(scratch); sp = gettime(); fprintf(sfp,"From %s %s\n",name,sp); fprintf(sfp,"Date: %s\n",sp); fprintf(sfp,"From: %s\n",from); fprintf(sfp,"Subject: %s\n",subject); strcpy(astr,addr); if (fprint_mailheaderline(astr,"To",sfp) < 1) { bgerror("dsendmessage","no recipients given"); rw = -1; } splitstring(splits,addr,',',MAXARGS); gethostname(mbox,PATH_MAX); c1++; if (c1 > 'Z') c1 = 'A'; fprintf(sfp,"Message-Id: <%ld.%c@%s>\n\n",(long)time((TIME_T)0),c1,mbox); recvn(sockd,(void *)&len,sizeof(SIZE_T),0); bytes = 0; while (bytes >= 0 && len > 0) { bytes = len > PATH_MAX ? PATH_MAX : len; bytes = recvn(sockd,(void *)mbox,(SIZE_T)bytes,0); for (k=0,sp=mbox; k<bytes; k++,sp++) putc(*sp,sfp); len -= bytes; } if (bytes < 0) rw = -1; for (k=0; splits[k] != NULL; k++) { parseaddrline(name,realname,splits[k]); if (lookupbbsddb(bbsddb,name,0,USERNAME_DB,NULL,&len,confrecord) > 0) { sprintf(msgstr,"Sendmessage: BBS-User %s unknown",name); n = (int)strlen(msgstr) + 1; sendn(sockd,(void *)&n,sizeof(int),0); sendn(sockd,(void *)msgstr,(SIZE_T)n,0); continue; } sprintf(mbox,"%s/%s",confrecord->maildir,name); if ((mboxfp=fopen(mbox,"a")) == NULL) { bgerror("dsendmessage","fopen mailbox %s: %m", mbox); rw = -1; n = 1; sendn(sockd,(void *)&n,sizeof(int),0); continue; } chmod(mbox,0600); rewind(sfp); from_quotestream(FALSE,sfp,mboxfp); putc('\n',mboxfp); putc('\n',mboxfp); fclose(mboxfp); n = 1; sendn(sockd,(void *)&n,sizeof(int),0); } fclose(sfp); return rw; } int dreceivemail(const int sockd, const bbsddbtyp *bbsddb, const confrecordtyp *confrecord) { int k, z, rw = 0; SIZE_T len; SSIZE_T bytes; char *sp, recipient[S_STRLEN+1], mbox[PATH_MAX+1], scratch[PATH_MAX+1]; FILE *sfp, *mboxfp; recvn(sockd,(void *)&len,sizeof(SIZE_T),0); recvn(sockd,(void *)recipient,len,0); z = lookupbbsddb(bbsddb,recipient,0,USERNAME_DB,NULL,&len,confrecord); sendn(sockd,(void *)&z,sizeof(int),0); if (z != 0) { bgerror("dreceivemail","recipient %s not found",recipient); return -1; } scratchfilename(scratch,"drecm-",recipient,confrecord->scratchdir); unlink(scratch); if ((sfp=fopen(scratch,"w+")) == NULL) { bgerror("dreceivemail","fopen scratchfile %s: %m", scratch); sfp = fopen("/dev/null","w+"); rw = -1; } unlink(scratch); recvn(sockd,(void *)&len,sizeof(SIZE_T),0); bytes = 0; while (bytes >= 0 && len > 0) { bytes = len > PATH_MAX ? PATH_MAX : len; bytes = recvn(sockd,(void *)mbox,(SIZE_T)bytes,0); for (k=0,sp=mbox; k<bytes; k++,sp++) putc(*sp,sfp); len -= bytes; } if (bytes < 0) rw = -1; sprintf(mbox,"%s/%s",confrecord->maildir,recipient); if ((mboxfp=fopen(mbox,"a")) == NULL) { bgerror("dreceivemail","fopen mailbox %s: %m", mbox); mboxfp = fopen("/dev/null","w"); rw = -1; } chmod(mbox,0600); rewind(sfp); from_quotestream(FALSE,sfp,mboxfp); putc('\n',mboxfp); putc('\n',mboxfp); fclose(mboxfp); fclose(sfp); return rw; } int dgetallusernames(const int sockd, const bbsddbtyp *bbsddb, const confrecordtyp *confrecord) { int mask; SIZE_T len, r_len; char name[S_STRLEN+1], realname[S_STRLEN+1], str[2*S_STRLEN+4]; recvn(sockd,(void *)&mask,(SIZE_T)sizeof(int),0); while (getkeysbbsddb(bbsddb,USERNAME_DB,name,&len,realname,&r_len, confrecord) == 0) { if (r_len == 0) *realname = '\0'; if ((mask & USERNAME_MASK) && (mask & REALNAME_MASK)) { sprintf(str,"%s <%s>",realname,name); } else if (mask & USERNAME_MASK) { strcpy(str,name); } else if (mask & REALNAME_MASK) { strcpy(str,realname); } else { *str = '\0'; } len = strlen(str) + 1; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); sendn(sockd,(void *)str,len,0); } len = 0; sendn(sockd,(void *)&len,sizeof(SIZE_T),0); return(0); } int dsendstatustodaemon(sessionrecordtyp sessionrecords[], const confrecordtyp *confrecord, const int sockd) { int n, status; PID_T pid, spid; if (recvn(sockd,(void *)&pid,(SIZE_T)sizeof(PID_T),0)<0 || recvn(sockd,(void *)&status,(SIZE_T)sizeof(int),0)<0 ) { bgerror("dsendstatustodaemon","recv: %m"); return(-1); } n = -1; do { n++; spid = sessionrecords[n].pid; } while (pid!=spid && spid!=0); if (spid == 0) { bgerror("dsendstatustodaemon","cannot found user %ld",(long)pid); return(-1); } sessionrecords[n].status = status; return(0); } int diniconnecttouser(sessionrecordtyp sessionrecords[], const confrecordtyp *confrecord, const int sockd) /* Socket fuer talk einrichten Returnwerte: 1, wenn Partner besetzt 0, wenn Partner frei <0 bei Fehler */ { PID_T inipid, recpid, pid; int n; boolean inifound, recfound; char path[TALKSOCKNAMELEN+1]; if (recvn(sockd,(void *)&inipid,(SIZE_T)sizeof(PID_T),0)<0 || recvn(sockd,(void *)&recpid,(SIZE_T)sizeof(PID_T),0)<0 ) { bgerror("diniconnecttouser","recv: %m"); return(-1); } n = 0; inifound = FALSE; recfound = FALSE; do { pid = sessionrecords[n].pid; if (pid == inipid) { sessionrecords[n].talking_to = recpid; inifound = TRUE; } else if (pid == recpid) { if (sessionrecords[n].talking_to > 0) { return(1); } sessionrecords[n].talking_to = inipid; recfound = TRUE; } n++; } while (!(inifound && recfound) && pid!=0); if (pid == 0) { bgerror("diniconnecttouser","cannot found both parties"); return(-1); } n = 0; sendn(sockd,(void *)&n,(SIZE_T)sizeof(int),0); sprintf(path,"talk-%ld-%ld",(long)inipid,(long)recpid); sendn(sockd,(void *)path,(SIZE_T)TALKSOCKNAMELEN,0); return(0); } int dabortconnecttouser(sessionrecordtyp sessionrecords[], const confrecordtyp *confrecord, const int sockd) { PID_T inipid, recpid, pid; int n; boolean inifound, recfound; if (recvn(sockd,(void *)&inipid,(SIZE_T)sizeof(PID_T),0)<0 || recvn(sockd,(void *)&recpid,(SIZE_T)sizeof(PID_T),0)<0 ) { bgerror("dabortconnecttouser","recv: %m"); return(-1); } n = 0; inifound = FALSE; recfound = FALSE; do { pid = sessionrecords[n].pid; if (pid == inipid) { sessionrecords[n].talking_to = 0; inifound = TRUE; } else if (pid == recpid) { sessionrecords[n].talking_to = 0; recfound = TRUE; } n++; } while (!(inifound && recfound) && pid!=0); if (pid == 0) { bgerror("dabortconnecttouser","cannot found both parties %ld and %ld", (long)inipid,(long)recpid); return(-1); } return(0); } int dremconnecttouser(const sessionrecordtyp sessionrecords[], const confrecordtyp *confrecord, const int sockd) /* Returnwerte: 1, wenn Partner besetzt 0, wenn Partner frei <0 bei Fehler */ { PID_T rempid; int n, snr; boolean inifound; char path[TALKSOCKNAMELEN+1]; if (recvn(sockd,(void *)&rempid,(SIZE_T)sizeof(PID_T),0) < 0) { bgerror("dremconnecttouser","recv: %m"); return(-1); } snr = 0; inifound = FALSE; while (sessionrecords[snr].pid!=0 && !inifound) { if (rempid == sessionrecords[snr].talking_to) { inifound = TRUE; } else { snr++; } } if (! inifound) { bgerror("dremconnecttouser","cannot found caller %ld",(long)rempid); return(-1); } n = 0; sendn(sockd,(void *)&n,(SIZE_T)sizeof(int),0); sprintf(path,"talk-%ld-%ld",(long)sessionrecords[snr].pid,(long)rempid); sendn(sockd,(void *)path,(SIZE_T)TALKSOCKNAMELEN,0); sendn(sockd,(void *)&(sessionrecords[snr]),(SIZE_T)sizeof(sessionrecordtyp),0); return(0); } int dputinlog(const int logfilefd, const int sockd) /* Logtext vom Client empfangen und in Logfile schreiben */ { SIZE_T nleft, nanz, n; SSIZE_T nread; char buf[BUFSIZE]; if (recvn(sockd,(void *)&n,(SIZE_T)sizeof(SIZE_T),0)<0) { bgerror("dputinlog","recv: %m"); return(-1); } nleft = n; while (nleft > 0) { nanz = nleft > BUFSIZE ? BUFSIZE : nleft; if ((nread=recvn(sockd,(void *)buf,nanz,0)) < 0) { return(-1); } if ((nread=writen(logfilefd,(void *)buf,(SIZE_T)nread)) < 0) { return(-1); } nleft -= (SIZE_T)nread; } return (int)n; } int dgetsessions(sessionrecordtyp sessionrecords[], const int sockd) /* Clients auf Existenz pruefen und sessionrecords senden */ { int k, n; n = rmdeadsessions(sessionrecords); for (k=0; k<n; k++) { sendn(sockd,(void *)&(sessionrecords[k]),(SIZE_T)sizeof(sessionrecordtyp),0); } sendn(sockd,(void *)&(sessionrecords[n]),(SIZE_T)sizeof(sessionrecordtyp),0); return n; } int daddsession(sessionrecordtyp sessionrecords[], const int sockd) /* sessionrecord vom Client empfangen und in sessionrecords speichern */ { int k=0; sessionrecordtyp sr; if (recvn(sockd,(void *)&sr,(SIZE_T)sizeof(sessionrecordtyp),0) != (SSIZE_T)sizeof(sessionrecordtyp)) { bgerror("daddsession","recv: %m"); return -1; } while (sessionrecords[k].pid!=0) { k++; } cpysr(&(sessionrecords[k]), &sr); sessionrecords[k].talking_to = 0; sessionrecords[++k].pid = 0; return 0; } int dremovesession(sessionrecordtyp sessionrecords[], const int sockd) /* Pid vom Client empfangen und zugehoerige session entfernen */ { PID_T pid; int k=0; if (recvn(sockd,(void *)&pid,(SIZE_T)sizeof(PID_T),0) != (SSIZE_T)sizeof(PID_T)) { bgerror("dremovesession","recv: %m"); return -1; } while (sessionrecords[k].pid!=pid && sessionrecords[k].pid!=0) { k++; } while (sessionrecords[k].pid!=0) { cpysr(&(sessionrecords[k]), &(sessionrecords[k+1])); k++; } return 0; } int dgetuserrecord(const int sockd, const confrecordtyp *confrecord) /* Usernamen vom Client empfangen, dazugehoerigen Record aus dem Userfile lesen und an den Client senden. Wird kein passender Userrecord gefunden, so wird 1 zuruckgegeben und userrecord.user==NOUSER */ { int g=1, znr=1, z=2; char zeile[PATH_MAX+S_STRLEN+1], username[S_STRLEN+1], *key, *arg; userrecordtyp userrecord; FILE *fd; /* Defaultwerte */ strcpy(userrecord.name,NOUSER); strcpy(userrecord.passwd,NOPASSWORD); strcpy(userrecord.realname,""); userrecord.loglevel = DEFLOGLEVEL; userrecord.seclevel = HIGHSECURITY; strcpy(userrecord.permittions,""); userrecord.kermitok = DEFKERMITOK; userrecord.protokoll = ZMODEMPROTO; userrecord.autozmodem = DEFAUTOZMODEM; userrecord.fullist_on_cd = DEFFULLIST; strcpy(userrecord.home,DEFHOME); strcpy(userrecord.uploaddir,DEFUPLOADDIR); strcpy(userrecord.shell,NOSHELL); strcpy(userrecord.path,NOPATH); strcpy(userrecord.term,DEFTERM); userrecord.lines = DEFLINES; userrecord.columns = DEFCOLUMNS; userrecord.lang = DEFLANGUAGE; strcpy(userrecord.charset,DEFCHARSET); if (recvn(sockd,(void *)username,(SIZE_T)S_STRLEN,0)<0) { bgerror("dgetuserrecord","recv: %m"); return -1; } if ((fd=fopen(confrecord->usersfile,"r"))==NULL) { bgerror("dgetuserrecord","fopen %s: %m",confrecord->usersfile); return -1; } do { z = fgetnln(zeile,PATH_MAX+S_STRLEN,fd); znr++; if (z>=PATH_MAX+S_STRLEN) { bgerror("dgetuserrecord","line %i too long",znr); fclose(fd); return -1; } if (z>0 && zeile[0]!='#') { split2key_arg(zeile,&key,&arg); lowercases(key); if (strncmp("user",key,4) != 0) { bgerror("dgetuserrecord","line %i: 'User:' must be first entry in any record",znr); fclose(fd); return -1; } if ((g=strcmp(arg,username))!=0) { do { z = fgetnln(zeile,PATH_MAX,fd); znr++; } while (z>=0 && z<PATH_MAX && zeile[0]!='$'); } } } while (z>=0 && z<PATH_MAX && g!=0); if (g==0) { strcpy(userrecord.name,username); do { z = fgetnln(zeile,PATH_MAX,fd); znr++; if (z<0 && z>=PATH_MAX) { bgerror("dgetuserrecord","error in userfile %s, line %i", confrecord->usersfile, znr); fclose(fd); return -1; } split2key_arg(zeile,&key,&arg); lowercases(key); if (*key=='\0' || *key=='#') { /* */ } else if (strncmp("pass",key,4)==0) { strcpy(userrecord.passwd,arg); } else if (strncmp("real",key,4)==0) { strcpy(userrecord.realname,arg); } else if (strncmp("loglevel",key,4)==0) { userrecord.loglevel = atoi(arg); } else if (strncmp("seclevel",key,4)==0) { userrecord.seclevel = atoi(arg); } else if (strncmp("perm",key,4)==0) { strcpy(userrecord.permittions,arg); } else if (strncmp("kermitok",key,4)==0) { userrecord.kermitok = atoi(arg); } else if (strncmp("protokoll",key,4)==0) { userrecord.protokoll = atoi(arg); } else if (strncmp("autozmodem",key,5)==0) { userrecord.autozmodem = atoi(arg); } else if (strncmp("fullist_on_cd",key,8)==0) { userrecord.fullist_on_cd = atoi(arg); } else if (strncmp("home",key,4)==0) { strcpy(userrecord.home,arg); } else if (strncmp("upload",key,4)==0) { strcpy(userrecord.uploaddir,arg); } else if (strncmp("shell",key,4)==0) { strcpy(userrecord.shell,arg); } else if (strncmp("path",key,4)==0) { strcpy(userrecord.path,arg); } else if (strncmp("term",key,4)==0) { strcpy(userrecord.term,arg); } else if (strncmp("lines",key,4)==0) { userrecord.lines = atoi(arg); } else if (strncmp("columns",key,4)==0) { userrecord.columns = atoi(arg); } else if (strncmp("lang",key,4)==0) { userrecord.lang = atoi(arg); } else if (strncmp("char",key,4)==0) { strcpy(userrecord.charset,arg); } } while (zeile[0] != '$'); z = 0; } else { z = 1; } fclose(fd); sendn(sockd,(char *)&userrecord,sizeof(userrecordtyp),0); return z; } int dsaveuserrecord(const int sockd, const confrecordtyp *confrecord) /* Empfaengt vom Client einen Userrecord und speichert ihn im Userfile ab */ { int k; char zeile[PATH_MAX+S_STRLEN+1], tempfile[PATH_MAX+1], str[PATH_MAX+S_STRLEN+1], *username, *key, *arg, *sp; userrecordtyp userrecord; FILE *infd, *outfd; if (recvn(sockd,(char *)&userrecord,sizeof(userrecordtyp),0)<0) { bgerror("dsaveuserrecord","recvn: %m"); return -1; } if ((infd=fopen(confrecord->usersfile,"r"))==NULL) { bgerror("dsaveuserrecord","fopen %s: %m",confrecord->usersfile); return -1; } sprintf(tempfile,"%s-%ld",confrecord->usersfile,(long)getpid()); if ((outfd=fopen(tempfile,"w"))==NULL) { bgerror("dsaveuserrecord","fopen %s: %m",tempfile); fclose(infd); return -1; } username = userrecord.name; do { if(fgetnln(zeile,PATH_MAX+S_STRLEN,infd)<0) { fclose(infd); return -1; } strmaxcpy(str,zeile,STRLEN); split2key_arg(str,&key,&arg); if (strcmp(arg,username) == 0) break; if (fprintf(outfd,"%s\n",zeile)<0) { bgerror("dsaveuserrecord","fprintf: %m"); fclose(infd); return -1; } } while (TRUE); do { strcpy(str,zeile); split2key_arg(zeile,&key,&arg); lowercases(key); sp = strchr(str,'#'); if (sp != NULL && sp > str) { do { sp--; } while (sp > str && (*sp == ' ' || *sp == '\t')); sp++; } else { sp = ""; } if (*arg == '\0' && *sp == ' ') sp++; if (strncmp("user",key,4)==0) { fprintf(outfd,"User: %s%s\n",username,sp); } else if (strncmp("pass",key,4)==0) { fprintf(outfd,"Password: %s%s\n",userrecord.passwd,sp); } else if (strncmp("real",key,4)==0) { fprintf(outfd,"Realname: \"%s\"%s\n",userrecord.realname,sp); } else if (strncmp("loglevel",key,4)==0) { fprintf(outfd,"Loglevel: %d%s\n",userrecord.loglevel,sp); } else if (strncmp("seclevel",key,4)==0) { fprintf(outfd,"Seclevel: %d%s\n",userrecord.seclevel,sp); } else if (strncmp("perm",key,4)==0) { fprintf(outfd,"Permittions: %s%s\n",userrecord.permittions,sp); } else if (strncmp("kermitok",key,4)==0) { fprintf(outfd,"Kermitok: %d%s\n",userrecord.kermitok,sp); } else if (strncmp("protokoll",key,4)==0) { fprintf(outfd,"Protokoll: %d%s\n",userrecord.protokoll,sp); } else if (strncmp("autozmodem",key,5)==0) { fprintf(outfd,"Autozmodem: %d%s\n",userrecord.autozmodem,sp); } else if (strncmp("fullist_on_cd",key,8)==0) { fprintf(outfd,"Fullist_on_cd: %d%s\n",userrecord.fullist_on_cd,sp); } else if (strncmp("home",key,4)==0) { fprintf(outfd,"Home: %s%s\n",userrecord.home,sp); } else if (strncmp("upload",key,4)==0) { fprintf(outfd,"Uploaddir: %s%s\n",userrecord.uploaddir,sp); } else if (strncmp("shell",key,4)==0) { fprintf(outfd,"Shell: %s%s\n",userrecord.shell,sp); } else if (strncmp("path",key,4)==0) { fprintf(outfd,"Path: %s%s\n",userrecord.path,sp); } else if (strncmp("term",key,4)==0) { fprintf(outfd,"Term: %s%s\n",userrecord.term,sp); } else if (strncmp("lines",key,4)==0) { fprintf(outfd,"Lines: %d%s\n",userrecord.lines,sp); } else if (strncmp("columns",key,4)==0) { fprintf(outfd,"Columns: %d%s\n",userrecord.columns,sp); } else if (strncmp("lang",key,4)==0) { fprintf(outfd,"Lang: %d%s\n",userrecord.lang,sp); } else if (strncmp("char",key,4)==0) { fprintf(outfd,"Charset: %s%s\n",userrecord.charset,sp); } if(fgetnln(zeile,PATH_MAX+S_STRLEN,infd)<0) { fclose(infd); return -1; } } while(zeile[0]!='$'); if (fprintf(outfd,"$\n")<0) { bgerror("dsaveuserrecord","fprintf: %m"); fclose(infd); return -1; } while ((k=fgetnln(zeile,PATH_MAX+S_STRLEN,infd))>=0) { if (fprintf(outfd,"%s\n",zeile)<0) { bgerror("dsaveuserrecord","fprintf: %m"); fclose(infd); return -1; } } fclose(infd); k = -1; if (fclose(outfd)>=0) { if (unlink(confrecord->usersfile)==0) { k = rename(tempfile,confrecord->usersfile); } } return k; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.