void listasenaste(void) { int x,nummer,alla=TRUE,cnt=0,antal=MAXSENASTE; struct tm *ts; if(argument[0]=='-') { antal=atoi(&argument[1]); argument=hittaefter(argument); } if((nummer=parsenamn(argument))==-1) { puttekn("\r\n\nFinns ingen som heter så eller har det numret!\r\n",-1); return; } else if(nummer==-3) alla=TRUE; else alla=FALSE; puttekn("\r\n\n Namn Utloggad Tid Läst Skr Ul Dl\r\n\n",-1); for(x=0;x<MAXSENASTE;x++) { if(!Servermem->senaste[x].utloggtid || (!alla && nummer!=Servermem->senaste[x].anv)) continue; if(!userexists(Servermem->senaste[x].anv)) continue; cnt++; ts=localtime(&Servermem->senaste[x].utloggtid); sprintf(outbuffer,"%-35s %02d/%02d %02d:%02d %3dmin %4d %3d %2d %2d\r\n", getusername(Servermem->senaste[x].anv),ts->tm_mday,ts->tm_mon+1,ts->tm_hour,ts->tm_min, Servermem->senaste[x].tid_inloggad,Servermem->senaste[x].read, Servermem->senaste[x].write,Servermem->senaste[x].ul, Servermem->senaste[x].dl); if(puttekn(outbuffer,-1)) return; if(cnt>=antal) return; } }
int skickabrev(void) { int pers,editret; char *adr; if(!(adr=strchr(argument,'@'))) { if((pers=parsenamn(argument))==-1) { puttekn("\r\n\nFinns ingen som heter så eller har det numret\r\n\n",-1); return(0); } else if(pers==-3) { puttekn("\r\n\nSkriv: Brev <användare>\r\n\n",-1); return(0); } nu_skrivs=BREV; } else { nu_skrivs=BREV_FIDO; *adr='\0'; adr++; if(!getzone(adr) || !getnet(adr)) { puttekn("\n\n\rSkriv: Brev <användare>@<zon>:<nät>/<nod>[.<point>]\n\r",-1); return(0); } } if(nu_skrivs==BREV) editret=initbrevheader(pers); else if(nu_skrivs==BREV_FIDO) return(fido_brev(argument,adr,NULL)); else return(0); if(editret==1) return(1); if(editret==2) return(0); if((editret=edittext(NULL))==1) return(1); if(!editret) sparabrev(); return(0); }
int brev_kommentera(void) { BPTR fh; int nummer,editret,anv; char *brevpers,filnamn[50]; if(argument[0]) { nummer=atoi(argument); brevpers=hittaefter(argument); if(!brevpers[0]) anv=inloggad; else { anv=parsenamn(brevpers); if(anv==-1) { puttekn("\n\n\rAnvändaren finns inte!\n\r",-1); return(0); } } sprintf(filnamn,"NiKom:Users/%d/%d/%d.letter",anv/100,anv,nummer); if(!(fh=Open(filnamn,MODE_OLDFILE))) { puttekn("\r\n\nBrevet finns inte!\r\n\n",-1); return(0); } readletterheader(fh,&brevread); Close(fh); if(!strncmp(brevread.systemid,"Fido",4)) { if(anv!=inloggad) { puttekn("\n\n\rDu har inte rätt att kommentera det brevet\n\r",-1); return(0); } } else { if(anv!=inloggad && inloggad!=atoi(brevread.from) && Servermem->inne[nodnr].status<Servermem->cfg.st.brev) { puttekn("\r\n\nDu har inte skrivit det brevet!\r\n\n",-1); return(0); } } senast_text_typ=BREV; senast_brev_nr=nummer; senast_brev_anv=anv; } if(!strncmp(brevread.systemid,"Fido",4)) { nu_skrivs=BREV_FIDO; return(fido_brev(NULL,NULL,NULL)); } else { nu_skrivs=BREV; editret=initbrevheader(BREVKOM); } if(editret==1) return(1); if(editret==2) return(0); if((editret=edittext(NULL))==1) return(1); else if(!editret) sparabrev(); return(0); }
int sag(void) { int vem,x; char *quick; struct SayString *pekare,*oldpekare=NULL,*allocpekare; quick = strchr(argument,','); if(quick) *quick++ = 0; if((vem=parsenamn(argument))==-3) { puttekn("\r\n\nSkriv : Säg <användare>[,<meddelande>]\r\n\n",-1); return(0); } if(vem==-1) { puttekn("\r\n\nFinns ingen som heter så eller har det numret!\r\n\n",-1); return(0); } for(x=0;x<MAXNOD;x++) if(Servermem->inloggad[x]==vem) break; if(x==MAXNOD) { puttekn("\r\n\nPersonen är inte inloggad!\r\n",-1); return(0); } if(!quick) { puttekn("\r\n\nVad vill du säga?\r\n",-1); if(getstring(EKO,MAXSAYTKN-1,NULL)) return(1); if(!inmat[0]) return(0); if(Servermem->inloggad[x]==-1) { puttekn("\r\n\nTyvärr, personen har loggat ut.\r\n",-1); return(0); } } pekare=Servermem->say[x]; if(pekare) sprintf(outbuffer,"\r\n%s har olästa meddelanden. Skickar meddelandet ändå.\r\n",getusername(vem)); else sprintf(outbuffer,"\r\n%s meddelad\r\n",getusername(vem)); puttekn(outbuffer,-1); Forbid(); while(pekare) { oldpekare=pekare; pekare=oldpekare->NextSay; } if(!(allocpekare=(struct SayString *)AllocMem(sizeof(struct SayString),MEMF_PUBLIC | MEMF_CLEAR))) { Permit(); puttekn("\r\n\nKunde inte allokera minne till meddelandet!\r\n\n",-1); return(0); } allocpekare->fromuser=inloggad; if(quick) strcpy(allocpekare->text,quick); else strcpy(allocpekare->text,inmat); if(Servermem->say[x]) oldpekare->NextSay=allocpekare; else Servermem->say[x]=allocpekare; Permit(); return(0); }
void brev_lasa(int tnr) { int brevanv; char *arg2; arg2=hittaefter(argument); if(arg2[0]) { brevanv=parsenamn(arg2); if(brevanv==-1) { puttekn("\n\n\rFinns ingen sådan användare!\n\r",-1); return; } } else brevanv=inloggad; if(tnr<getfirstletter(brevanv) || tnr>=getnextletter(brevanv)) { puttekn("\r\n\nBrevet finns inte!\r\n",-1); return; } visabrev(tnr,brevanv); }
void listabrev(void) { BPTR fh; int anv,x,first; char filnamn[50],namn[50]; struct ReadLetter listhead; if(argument[0]) { anv=parsenamn(argument); if(anv==-1) { puttekn("\n\n\rFinns ingen sådan användare!\n\r",-1); return; } } else anv=inloggad; first=getfirstletter(anv); x=getnextletter(anv)-1; sprintf(outbuffer,"\n\n\rLägsta brev: %d Högsta brev: %d\n\n\r",first,x); puttekn(outbuffer,-1); puttekn("Namn Text Datum Ärende\n\r",-1); puttekn("-------------------------------------------------------------------------\r\n",-1); for(;x>=first;x--) { sprintf(filnamn,"NiKom:Users/%d/%d/%d.letter",anv/100,anv,x); if(!(fh=Open(filnamn,MODE_OLDFILE))) { sprintf(outbuffer,"\n\rKunde inte öppna %s\n\r",filnamn); puttekn(outbuffer,-1); return; } if(readletterheader(fh,&listhead)) { sprintf(outbuffer,"\n\rKunde inte läsa %s\n\r",filnamn); puttekn(outbuffer,-1); Close(fh); return; } Close(fh); listhead.subject[26]=0; listhead.date[6]=0; if(!strcmp(listhead.systemid,"NiKom")) { if(anv!=inloggad && inloggad!=atoi(listhead.from)) continue; strcpy(namn,getusername(atoi(listhead.from))); sprintf(outbuffer,"%-34s%5d %s %s\r\n",namn,x,listhead.date,listhead.subject); } else if(!strcmp(listhead.systemid,"Fido")) { if(anv!=inloggad) continue; sprintf(outbuffer,"%-34s%5d %s %s\r\n",listhead.from,x,listhead.date,listhead.subject); } else sprintf(outbuffer,"%s%5d\r\n","<Okänd brevtyp>",x); if(puttekn(outbuffer,-1)) return; } }
int RegisterNewUser(void) { long tid; int newUserId, isCorrect, tmp; struct ShortUser *shortUser; struct User *user = &Servermem->inne[nodnr]; memset(user, 0, sizeof(struct User)); if(Servermem->cfg.defaultcharset == 0) { if(AskUserForCharacterSet(TRUE, FALSE)) { return 1; } } else { Servermem->inne[nodnr].chrset = Servermem->cfg.defaultcharset; } SendString("\r\n\n"); user->rader = Servermem->cfg.defaultrader; sendfile("NiKom:Texter/NyAnv.txt"); for(;;) { do { SendString("\r\n\nNamn: "); if(GetString(40, NULL)) { return 1; } } while(inmat[0] == '\0'); if(parsenamn(inmat) == -1) { break; } SendString("\r\n\nDet finns redan en användare med det namnet.\r\n\n",-1); } strncpy(user->namn, inmat, 41); SendString("\r\nGatuadress: "); if(GetString(40, NULL)) { return 1; } strncpy(user->gata, inmat, 41); SendString("\r\nPostadress: "); if(GetString(40, NULL)) { return 1; } strncpy(user->postadress, inmat, 41); SendString("\r\nLand: "); if(GetString(40, NULL)) { return 1; } strncpy(user->land, inmat, 41); SendString("\r\nTelefon: "); if(GetString(20, NULL)) { return 1; } strncpy(user->telefon, inmat, 21); SendString("\r\nAnnan info: "); if(GetString(60, NULL)) { return 1; } strncpy(user->annan_info, inmat, 61); do { if(MaybeEditPassword("Lösenord", "Bekräfta lösenord", user->losen, 15)) { return 1; } } while(user->losen[0] == '\0'); strcpy(user->prompt, "-->"); if(MaybeEditString("Prompt", user->prompt, 5)) { return 1; } user->tot_tid = 0L; time(&tid); user->forst_in = tid; user->senast_in = 0L; user->read = 0L; user->skrivit = 0L; user->flaggor = Servermem->cfg.defaultflags; user->upload = 0; user->download = 0; user->loggin = 0; user->grupper = 0L; user->defarea = 0L; user->shell = 0; user->status = Servermem->cfg.defaultstatus; user->language = 0; user->brevpek = 0; initConfPermissions(); InitUnreadTexts(&Servermem->unreadTexts[nodnr]); SendString("\r\n\nNamn : %s\r\n", user->namn); SendString("Gatuadress : %s\r\n",user->gata); SendString("Postadress : %s\r\n",user->postadress); SendString("Land : %s\r\n",user->land); SendString("Telefon : %s\r\n",user->telefon); SendString("Annan info : %s\r\n",user->annan_info); SendString("Prompt : %s\r\n",user->prompt); if(GetYesOrNo("\r\n\n", "Stämmer detta?", NULL, NULL, "Ja", "Nej", "\r\n\n", TRUE, &isCorrect)) { return 1; } while(!isCorrect) { for(;;) { SendString("\r\nNamn : (%s) ", user->namn); if(GetString(40,NULL)) { return 1; } if(inmat[0] == '\0') { break; } if((tmp = parsenamn(inmat)) != -1) { SendString("\r\n\nDet finns redan en användare med det namnet.\r\n"); } else { strncpy(user->namn, inmat, 41); break; } } if(MaybeEditString("Gatuadress", user->gata, 40)) { return 1; } if(MaybeEditString("Postadress", user->postadress, 40)) { return 1; } if(MaybeEditString("Land", user->land, 40)) { return 1; } if(MaybeEditString("Telefon", user->telefon, 20)) { return 1; } if(MaybeEditString("Annan info", user->annan_info, 60)) { return 1; } if(MaybeEditPassword("Lösenord", "Bekräfta lösenord", user->losen, 15)) { return 1; } if(MaybeEditString("Prompt", user->prompt, 5)) { return 1; } if(GetYesOrNo("\r\n\n", "Stämmer allt nu?", NULL, NULL, "Ja", "Nej", "\r\n\n", TRUE, &isCorrect)) { return 1; } } newUserId =((struct ShortUser *)Servermem->user_list.mlh_TailPred)->nummer + 1; if(!(shortUser = (struct ShortUser *)AllocMem(sizeof(struct ShortUser), MEMF_CLEAR | MEMF_PUBLIC))) { LogEvent(SYSTEM_LOG, ERROR, "Could not allocate %d bytes.\n", sizeof(struct ShortUser)); DisplayInternalError(); return 2; } strcpy(shortUser->namn, user->namn); shortUser->nummer = newUserId; shortUser->status = user->status; AddTail((struct List *)&Servermem->user_list, (struct Node *)shortUser); if(!createUserDirectory(newUserId)) { return 2; } inloggad = newUserId; SendString("\r\n\nDu får användarnumret %d\r\n",inloggad); if(Servermem->cfg.ar.nyanv) sendrexx(Servermem->cfg.ar.nyanv); return 0; }
void main(int argc,char *argv[]) { int going=TRUE,forsok=2,car=1,x,connectbps, i, tmp; struct NodeType *nt; char *tmppscreen,commandstring[100], configname[50] = "NiKom:DatoCfg/SerNode.cfg"; FILE *fil; if(argc>1) for(x=1; x<argc; x++) { if(argv[x][0]=='-') { if(argv[x][1]=='G') getty=TRUE; else if(argv[x][1]=='B') gettybps=atoi(&argv[x][2]); else if(argv[x][1]=='C') connectbps = atoi(&argv[x][2]); } else strcpy(configname,argv[x]); } if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0))) cleanup(ERROR,"Kunde inte öppna intuition.library\n"); if(!(UtilityBase=OpenLibrary("utility.library",37L))) cleanup(ERROR,"Kunde inte öppna utility.library\n"); if(!(NiKomBase=OpenLibrary("nikom.library",0L))) cleanup(ERROR,"Kunde inte öppna nikom.library\n"); if(!initnode(NODSER)) cleanup(ERROR,"Kunde inte registrera noden i Servern\n"); if(!(nikomnodeport = CreateMsgPort())) cleanup(ERROR,"Kunde inte skapa NiKomNode-porten"); sprintf(nikomnodeportnamn,"NiKomNode%d",nodnr); nikomnodeport->mp_Node.ln_Name = nikomnodeportnamn; nikomnodeport->mp_Node.ln_Pri = 1; AddPort(nikomnodeport); sprintf(rexxportnamn,"NiKomPreRexx%d",nodnr); if(!(rexxport=(struct MsgPort *)CreateMsgPort())) cleanup(ERROR,"Kunde inte öppna RexxPort\n"); rexxport->mp_Node.ln_Name=rexxportnamn; rexxport->mp_Node.ln_Pri=50; AddPort(rexxport); if(!(RexxSysBase=(struct RsxLib *)OpenLibrary("rexxsyslib.library",0L))) cleanup(ERROR,"Kunde inte öppna rexxsyslib.library\n"); getnodeconfig(configname); if(pubscreen[0]=='-') tmppscreen=NULL; else tmppscreen=pubscreen; if(!(NiKwind=openmywindow(tmppscreen))) cleanup(ERROR,"Kunde inte öppna fönstret\n"); if(getty) dtespeed = gettybps; else dtespeed = highbaud; if(!OpenIO(NiKwind)) cleanup(ERROR,"Couldn't setup IO"); strcpy(Servermem->nodid[nodnr],nodid); conreqtkn(); serreqtkn(); Delay(50); for(;;) { inloggad=-1; Servermem->idletime[nodnr] = time(NULL); Servermem->inloggad[nodnr]=-1; if(getty) Servermem->connectbps[nodnr] = connectbps; else waitconnect(); Servermem->idletime[nodnr] = time(NULL); Servermem->inloggad[nodnr]=-2; /* Sätt till <Uppringd> för att även hantera -getty-fallet */ reloginspec: updateinactive(); Servermem->inne[nodnr].flaggor = Servermem->cfg.defaultflags; if(!getty) Delay(100); Servermem->inne[nodnr].rader=0; Servermem->inne[nodnr].chrset = CHRS_LATIN1; sendfile("NiKom:Texter/Inlogg.txt"); if(Servermem->cfg.ar.preinlogg) sendrexx(Servermem->cfg.ar.preinlogg); car=TRUE; Servermem->inne[nodnr].chrset = 0; memset(commandhistory,0,1000); going=1; while(going && going<=Servermem->cfg.logintries) { putstring("\r\nNamn: ",-1,0); if(getstring(EKO,40,NULL)) { car=FALSE; break; } if(!stricmp(inmat,Servermem->cfg.ny) && !(Servermem->cfg.cfgflags & NICFG_CLOSEDBBS)) { tmp = RegisterNewUser(); if(tmp == 2) { goto panik; } car = tmp ? 0 : 1; going=FALSE; } else if((inloggad=parsenamn(inmat))>=0) { if(readuser(inloggad,&Servermem->inne[nodnr])) { puttekn("Error reading user data.\r\n", -1); goto panik; } // TODO: Extract password loop. Should be identical to in NiKomCon.c forsok=2; while(forsok) { puttekn("\r\nLösen: ",-1); if(Servermem->inne[nodnr].flaggor & STAREKOFLAG) { if(getstring(STAREKO,15,NULL)) { car=FALSE; break; } } else { if(getstring(EJEKO,15,NULL)) { car=FALSE; break; } } if(CheckPassword(inmat, Servermem->inne[nodnr].losen)) { forsok=FALSE; going=FALSE; } else forsok--; } if(going && (Servermem->cfg.logmask & LOG_FAILINLOGG)) { LogEvent(USAGE_LOG, WARN, "Nod %d, %s angivet som namn, fel lösen.", nodnr, getusername(inloggad)); } if(going) going++; } else if(inloggad==-1) puttekn("\r\nHittar ej namnet\r\n",-1); } if(!car) { if(getty) cleanup(OK,""); disconnect(); continue; } if(going) { putstring("\n\n\rTyvärr. Du har försökt maximalt antal gånger att logga in. Kopplar ned.\n\r",-1,0); goto panik; /* Urrk vad fult. :-) */ } Servermem->inloggad[nodnr]=inloggad; Servermem->idletime[nodnr] = time(NULL); if((nt = selectNodeType()) == NULL) { goto panik; } abortinactive(); abortserial(); sprintf(commandstring,"%s -N%d -B%d %s",nt->path,nodnr,dtespeed,configname); CloseConsole(); CloseWindow(NiKwind); NiKwind = NULL; RemPort(nikomnodeport); i = 0; if(Servermem->connectbps[nodnr] > 0) { while(Servermem->info.bps[i] != Servermem->connectbps[nodnr] && Servermem->info.bps[i] > 0 && i<49) i++; if(i<49) { if(Servermem->info.bps[i] == Servermem->connectbps[nodnr]) Servermem->info.antbps[i]++; else { Servermem->info.bps[i] = Servermem->connectbps[nodnr]; Servermem->info.antbps[i]++; } } if(!(fil = fopen("NiKom:datocfg/sysinfo.dat","w"))) { /* putstring("Kunde inte spara nya sysinfo.dat..\n",-1,0); */ } if(fwrite((void *)&Servermem->info,sizeof(Servermem->info),1,fil) != 1) { /* putstring("Kunde inte skriva till nya sysinfo.dat....\n",-1,0); */ } fclose(fil); } nodestate = SystemTags(commandstring, SYS_UserShell, TRUE, TAG_DONE); AddPort(nikomnodeport); if(!getty || (nodestate & NIKSTATE_RELOGIN)) { if(!(NiKwind = openmywindow(tmppscreen))) cleanup(ERROR,"Kunde inte öppna fönstret\n"); OpenConsole(NiKwind); } serreqtkn(); if(nodestate & NIKSTATE_RELOGIN) goto reloginspec; panik: Delay(hangupdelay); if(getty) cleanup(OK,""); disconnect(); } }
int __saveds __asm LIBCreateUser(register __d0 LONG nodnummer, register __a0 struct TagItem *taglist, register __a6 struct NiKomBase *NiKomBase) { struct User *newuser; struct ShortUser *allokpek; struct Mote *motpek=(struct Mote *)NiKomBase->Servermem->mot_list.mlh_Head; long tid, anvnummer = -1; char dirnamn[100],filnamn[40], bitmap[MAXTEXTS/8]; BPTR lock,fh; ULONG tmp; if(!(newuser=AllocMem(sizeof(struct User),MEMF_CLEAR | MEMF_PUBLIC))) return(-1); strcpy(newuser->namn,(char *)GetTagData(US_Name,NULL,taglist)); if(newuser->namn == NULL) { FreeMem(newuser,sizeof(struct User)); return(-2); } else if(NiKomBase->Servermem != NULL) { if(parsenamn(newuser->namn, NiKomBase) != -1) { FreeMem(newuser,sizeof(struct User)); return(-3); } } else { sprintf(filnamn,"NiKom:Users/0/0/Data"); if(fh=Open(filnamn, MODE_OLDFILE)) { Close(fh); FreeMem(newuser,sizeof(struct User)); return(-6); } anvnummer = 0; } strcpy(newuser->gata,(char *)GetTagData(US_Street,NULL,taglist)); if(newuser->gata == NULL) { FreeMem(newuser,sizeof(struct User)); return(-2); } strcpy(newuser->postadress,(char *)GetTagData(US_Address,NULL,taglist)); if(newuser->postadress == NULL) { FreeMem(newuser,sizeof(struct User)); return(-2); } strcpy(newuser->land,(char *)GetTagData(US_Country,NULL,taglist)); if(newuser->land == NULL) { FreeMem(newuser,sizeof(struct User)); return(-2); } strcpy(newuser->prompt,(char *)GetTagData(US_Prompt,NULL,taglist)); if(newuser->land == NULL) { FreeMem(newuser,sizeof(struct User)); return(-2); } strcpy(newuser->telefon,(char *)GetTagData(US_Phonenumber,NULL,taglist)); if(newuser->telefon == NULL) { FreeMem(newuser,sizeof(struct User)); return(-2); } strcpy(newuser->annan_info,(char *)GetTagData(US_OtherInfo,NULL,taglist)); if(newuser->annan_info == NULL) { FreeMem(newuser,sizeof(struct User)); return(-2); } strcpy(newuser->losen,(char *)GetTagData(US_Password,NULL,taglist)); if(newuser->losen == NULL) { FreeMem(newuser,sizeof(struct User)); return(-2); } tmp = GetTagData(US_Status,-1,taglist); if(tmp == -1) { FreeMem(newuser,sizeof(struct User)); return(-2); } else { newuser->status = tmp; } tmp = GetTagData(US_Rader, -2,taglist); if(tmp == -2) { FreeMem(newuser,sizeof(struct User)); return(-2); } else { newuser->rader = tmp; } tmp = GetTagData(US_Charset,-1,taglist); if(tmp == -1) { FreeMem(newuser,sizeof(struct User)); return(-2); } else { newuser->chrset = tmp; } tmp = GetTagData(US_Flags,-1,taglist); if(tmp == -1) { FreeMem(newuser,sizeof(struct User)); return(-2); } else { newuser->flaggor = tmp; } if(newuser->flaggor == -1) newuser->flaggor = NiKomBase->Servermem->cfg.defaultflags; if(newuser->rader == -1) newuser->rader = NiKomBase->Servermem->cfg.defaultrader; if(NiKomBase->Servermem->cfg.cfgflags & NICFG_CRYPTEDPASSWORDS) strcpy(newuser->losen, LIBCryptPassword(newuser->losen, NiKomBase)); newuser->tot_tid = 0L; newuser->senast_in = 0L; newuser->read = 0L; newuser->skrivit = 0L; newuser->upload = 0; newuser->download = 0; newuser->loggin = 0; newuser->grupper = 0L; newuser->defarea = 0L; newuser->shell = 0; newuser->brevpek = 0; memset((void *)newuser->motmed, 0, MAXMOTE/8); memset((void *)newuser->motratt, 0, MAXMOTE/8); time(&tid); newuser->forst_in = tid; memset((void *)bitmap,~0,MAXTEXTS/8); if(anvnummer == -1) { anvnummer = ((struct ShortUser *)NiKomBase->Servermem->user_list.mlh_TailPred)->nummer+1; newuser->textpek = NiKomBase->Servermem->info.lowtext; newuser->status = NiKomBase->Servermem->cfg.defaultstatus; newuser->protokoll = NiKomBase->Servermem->cfg.defaultprotokoll; for(;motpek->mot_node.mln_Succ;motpek=(struct Mote *)motpek->mot_node.mln_Succ) { if(motpek->status & (SKRIVSTYRT | SLUTET)) BAMCLEAR(newuser->motratt,motpek->nummer); else BAMSET(newuser->motratt,motpek->nummer); } if(!(allokpek=(struct ShortUser *)AllocMem(sizeof(struct ShortUser),MEMF_CLEAR | MEMF_PUBLIC))) { FreeMem(newuser,sizeof(struct User)); return(-1); } strcpy(allokpek->namn,newuser->namn); allokpek->nummer=anvnummer; allokpek->status=newuser->status; AddTail((struct List *)&NiKomBase->Servermem->user_list,(struct Node *)allokpek); if(nodnummer != -1) memcpy((void *)&NiKomBase->Servermem->inne[nodnummer],(void *)newuser,sizeof(newuser)); } else { newuser->textpek = newuser->protokoll = 0; } LIBLockNiKomBase(NiKomBase); sprintf(dirnamn,"NiKom:Users/%d",anvnummer/100); if(!(lock=Lock(dirnamn,ACCESS_READ))) if(!(lock=CreateDir(dirnamn))) { FreeMem(newuser,sizeof(struct User)); return(-4); } UnLock(lock); sprintf(dirnamn,"NiKom:Users/%d/%d",anvnummer/100,anvnummer); if(!(lock=Lock(dirnamn,ACCESS_READ))) if(!(lock=CreateDir(dirnamn))) { FreeMem(newuser,sizeof(struct User)); return(-4); } UnLock(lock); sprintf(filnamn,"NiKom:Users/%d/%d/Data",anvnummer/100,anvnummer); if(!(fh=Open(filnamn,MODE_NEWFILE))) { FreeMem(newuser,sizeof(struct User)); LIBUnLockNiKomBase(NiKomBase); return(-4); } if(Write(fh,(void *)newuser,sizeof(struct User))==-1) { Close(fh); FreeMem(newuser,sizeof(struct User)); LIBUnLockNiKomBase(NiKomBase); return(-4); } Close(fh); sprintf(filnamn,"NiKom:Users/%d/%d/Bitmap0",anvnummer/100,anvnummer); if(!(fh=Open(filnamn,MODE_NEWFILE))) { FreeMem(newuser,sizeof(struct User)); LIBUnLockNiKomBase(NiKomBase); return(-4); } if(Write(fh,(void *)bitmap,MAXTEXTS/8)==-1) { Close(fh); FreeMem(newuser,sizeof(struct User)); LIBUnLockNiKomBase(NiKomBase); return(-4); } Close(fh); sprintf(filnamn,"Nikom:Users/%d/%d/.firstletter",anvnummer/100,anvnummer); if(!(fh=Open(filnamn,MODE_NEWFILE))) { FreeMem(newuser,sizeof(struct User)); LIBUnLockNiKomBase(NiKomBase); return(-4); } Write(fh,"0",1); Close(fh); sprintf(filnamn,"Nikom:Users/%d/%d/.nextletter",anvnummer/100,anvnummer); if(!(fh=Open(filnamn,MODE_NEWFILE))) { FreeMem(newuser,sizeof(struct User)); LIBUnLockNiKomBase(NiKomBase); return(-4); } Write(fh,"0",1); Close(fh); LIBUnLockNiKomBase(NiKomBase); return(anvnummer); }
int __saveds __asm LIBEditUser(register __d0 LONG usernumber, register __a0 struct TagItem *taglist, register __a6 struct NiKomBase *NiKomBase) { int i, userloggedin = -1, cacheduser = -1; ULONG tmp; struct User user; for(i=0;i<MAXNOD;i++) if(usernumber==NiKomBase->Servermem->inloggad[i]) break; if(i<MAXNOD) { memcpy(&user,&NiKomBase->Servermem->inne[i],sizeof(struct User)); userloggedin = i; } else { /* for(i=0;i<MAXUSERSCACHED;i++) if(NiKomBase->Servermem->UserCache[i].usernumber != -1) break; if(i<MAXUSERSCACHED) { memcpy(&user,&NiKomBase->Servermem->UserCache[i].Usercached,sizeof(struct User)); userloggedin = i; } else */ if(readuser(usernumber,&user)) return(-2); } if(GetTagData(US_Name,NULL,taglist)) if(parsenamn((char *)GetTagData(US_Name,NULL,taglist),NiKomBase) == -1) strcpy(user.namn,(char *)GetTagData(US_Name,NULL,taglist)); if(GetTagData(US_Street,NULL,taglist)) strcpy(user.gata,(char *)GetTagData(US_Street,NULL,taglist)); if(GetTagData(US_Address,NULL,taglist)) strcpy(user.postadress,(char *)GetTagData(US_Address,NULL,taglist)); if(GetTagData(US_Country,NULL,taglist)) strcpy(user.land,(char *)GetTagData(US_Country,NULL,taglist)); if(GetTagData(US_Phonenumber,NULL,taglist)) strcpy(user.telefon,(char *)GetTagData(US_Phonenumber,NULL,taglist)); if(GetTagData(US_OtherInfo,NULL,taglist)) strcpy(user.annan_info,(char *)GetTagData(US_OtherInfo,NULL,taglist)); if(GetTagData(US_Password,NULL,taglist)) strcpy(user.losen,(char *)GetTagData(US_Password,NULL,taglist)); if(GetTagData(US_Prompt,NULL,taglist)) strcpy(user.prompt,(char *)GetTagData(US_Prompt,NULL,taglist)); tmp = GetTagData(US_Status,-1L,taglist); if(tmp != -1L) user.status = tmp; tmp = GetTagData(US_Rader,-1L,taglist); if(tmp != -1L) user.rader = tmp; tmp = GetTagData(US_Protocol,-1L,taglist); if(tmp != -1L) user.protokoll = tmp; tmp = GetTagData(US_Tottid,-1L,taglist); if(tmp != -1L) user.tot_tid = tmp; tmp = GetTagData(US_FirstLogin,-1L,taglist); if(tmp != -1L) user.forst_in = tmp; tmp = GetTagData(US_LastLogin,-1L,taglist); if(tmp != -1L) user.senast_in = tmp; tmp = GetTagData(US_Read,-1L,taglist); if(tmp != -1L) user.read = tmp; GetTagData(US_Written,-1L,taglist); if(tmp != -1L) user.skrivit = tmp; tmp = GetTagData(US_Flags,-1L,taglist); if(tmp != -1L) user.flaggor = tmp; tmp = GetTagData(US_Defarea,-1L,taglist); if(tmp != -1L) user.defarea = tmp; tmp = GetTagData(US_Charset,-1L,taglist); if(tmp != -1L) user.chrset = tmp; tmp = GetTagData(US_Uploads,-1L,taglist); if(tmp != -1L) user.upload = tmp; tmp = GetTagData(US_Downloads,-1L,taglist); if(tmp != -1L) user.download = tmp; tmp = GetTagData(US_Loggin,-1L,taglist); if(tmp != -1L) user.loggin = tmp; tmp = GetTagData(US_Shell,-1L,taglist); if(tmp != -1L) user.shell = tmp; /* struct User { long tot_tid,forst_in,senast_in,read,skrivit,flaggor,textpek,brevpek, grupper,defarea,reserv2,chrset,reserv4,reserv5,upload,download, loggin,shell; char namn[41],gata[41],postadress[41],land[41],telefon[21], annan_info[61],losen[16],status,rader,protokoll, prompt[6],motratt[MAXMOTE/8],motmed[MAXMOTE/8],vote[MAXVOTE]; }; */ if(i<MAXNOD) memcpy(&NiKomBase->Servermem->inne[i],&user,sizeof(struct User)); else { if(writeuser(usernumber,&user)) return(-3); } return(usernumber); }
int andmot(void) { int motnr,going=TRUE,tillf,chng=FALSE,y,mad,clearmed,setratt,changed,x; struct ShortUser *userletpek; struct FidoDomain *domain; struct User skuser; struct Mote tempmote,*motpek; char tkn; if((motnr=parsemot(argument))==-1) { puttekn("\r\n\nFinns inget möte som heter så!\r\n\n",-1); return(0); } else if(motnr==-3) { puttekn("\r\n\nSkriv: Ändra Möte <mötesnamn>\r\n\n",-1); return(0); } motpek=getmotpek(motnr); if(!MayAdminConf(motnr, inloggad, &Servermem->inne[nodnr])) { puttekn("\r\n\nDu har ingen rätt att ändra på det mötet!\r\n\n",-1); return(0); } memcpy(&tempmote,motpek,sizeof(struct Mote)); while(going) { sprintf(outbuffer,"\r\nNamn : (%s) ",tempmote.namn); puttekn(outbuffer,-1); if(getstring(EKO,40,NULL)) return(1); if(inmat[0]) { if((tillf=parsemot(inmat))!=-1 && tillf!=motnr) puttekn("\r\n\nMötet finns redan!\r\n",-1); else { strncpy(tempmote.namn,inmat,40); tempmote.namn[40] = 0; going=FALSE; } } else going=FALSE; } sprintf(outbuffer,"\r\nMAD (%s) ",getusername(tempmote.mad)); puttekn(outbuffer,-1); if(getstring(EKO,40,NULL)) return(1); if(inmat[0]) { if((mad=parsenamn(inmat))==-1) puttekn("\r\nFinns ingen sådan användare!",-1); else tempmote.mad=mad; } sprintf(outbuffer,"\r\nSorteringsvärde : (%d) ",tempmote.sortpri); puttekn(outbuffer,-1); if(getstring(EKO,10,NULL)) return(1); if(inmat[0]) { tillf=atoi(inmat); if(tillf<0 || tillf>LONG_MAX) { sprintf(outbuffer,"\n\rVärdet måste ligga mellan 0 och %d",LONG_MAX); puttekn(outbuffer,-1); } else tempmote.sortpri=tillf; } puttekn("\r\nSka mötet vara slutet? ",-1); if(!jaellernej('j','n',tempmote.status & SLUTET ? 1 : 2)) { puttekn("Öppet",-1); if(tempmote.status & SLUTET) { chng=TRUE; tempmote.status &= ~SLUTET; } } else { puttekn("Slutet",-1); if(!(tempmote.status & SLUTET)) { chng=TRUE; tempmote.status |= SLUTET; } puttekn("\r\nVilka grupper ska ha tillgång till mötet? (? för lista)\r\n",-1); if(editgrupp((char *)&tempmote.grupper)) return(1); } puttekn("\r\nSka mötet vara skrivskyddat? ",-1); if(!jaellernej('j','n',tempmote.status & SKRIVSKYDD ? 1 : 2)) { puttekn("Oskyddat",-1); tempmote.status &= ~SKRIVSKYDD; } else { tempmote.status |= SKRIVSKYDD; puttekn("Skyddat",-1); } puttekn("\r\nSka mötet vara kommentarsskyddat? ",-1); if(!jaellernej('j','n',tempmote.status & KOMSKYDD ? 1 : 2)) { puttekn("Oskyddat",-1); tempmote.status &= ~KOMSKYDD; } else { tempmote.status |= KOMSKYDD; puttekn("Skyddat",-1); } puttekn("\r\nSka mötet vara hemligt? ",-1); if(!jaellernej('j','n',tempmote.status & HEMLIGT ? 1 : 2)) { puttekn("Ej hemligt",-1); tempmote.status &= ~HEMLIGT; } else { tempmote.status |= HEMLIGT; puttekn("Hemligt",-1); } if(!(tempmote.status & SLUTET)) { puttekn("\n\rSka alla användare bli medlemmar automagiskt? ",-1); if(!jaellernej('j','n',tempmote.status & AUTOMEDLEM ? 1 : 2)) { puttekn("Nej",-1); if(tempmote.status & AUTOMEDLEM) { chng=TRUE; tempmote.status &= ~AUTOMEDLEM; } } else { puttekn("Ja",-1); tempmote.status |= AUTOMEDLEM; } puttekn("\r\nSka rättigheterna styra skrivmöjlighet? ",-1); if(!jaellernej('j','n',tempmote.status & SKRIVSTYRT ? 1 : 2)) { puttekn("Nej",-1); if(tempmote.status & SKRIVSTYRT) chng=TRUE; tempmote.status &= ~SKRIVSTYRT; } else { puttekn("Ja",-1); if(!(tempmote.status & SKRIVSTYRT)) chng=TRUE; tempmote.status |= SKRIVSTYRT; puttekn("\r\nVilka grupper ska ha tillgång till mötet? (? för lista)\r\n",-1); if(editgrupp((char *)&tempmote.grupper)) return(1); } } else tempmote.status &= ~(AUTOMEDLEM | SKRIVSTYRT); puttekn("\r\nSka mötet bara vara åtkomligt från ARexx? ",-1); if(!jaellernej('j','n',tempmote.status & SUPERHEMLIGT ? 1 : 2)) { puttekn("Nej",-1); tempmote.status &= ~SUPERHEMLIGT; } else { tempmote.status |= SUPERHEMLIGT; puttekn("Ja",-1); } if(tempmote.type == MOTE_FIDO) { sprintf(outbuffer,"\n\rKatalog: (%s) ",tempmote.dir); puttekn(outbuffer,-1); getstring(EKO,79,NULL); if(inmat[0]) strcpy(tempmote.dir,inmat); sprintf(outbuffer,"\n\rTag-namn: (%s) ",tempmote.tagnamn); puttekn(outbuffer,-1); getstring(EKO,49,NULL); if(inmat[0]) strcpy(tempmote.tagnamn,inmat); sprintf(outbuffer,"\n\rOrigin: (%s) ",tempmote.origin); puttekn(outbuffer,-1); getstring(EKO,69,NULL); if(inmat[0]) strcpy(tempmote.origin,inmat); sprintf(outbuffer,"\n\n\r%c1: ISO Latin 1 (ISO 8859-1)\n\r",tempmote.charset==CHRS_LATIN1 ? '*' : ' '); puttekn(outbuffer,-1); sprintf(outbuffer,"%c2: SIS-7 (SF7, 'Måsvingar')\n\r",tempmote.charset==CHRS_SIS7 ? '*' : ' '); puttekn(outbuffer,-1); sprintf(outbuffer,"%c3: IBM CodePage\n\r",tempmote.charset==CHRS_CP437 ? '*' : ' '); puttekn(outbuffer,-1); sprintf(outbuffer,"%c4: Mac\n\n\r",tempmote.charset==CHRS_MAC ? '*' : ' '); puttekn(outbuffer,-1); puttekn("Val: ",-1); for(;;) { tkn=gettekn(); if(tkn=='1' || tkn=='2' || tkn=='3' || tkn=='4' || tkn=='\r') break; } switch(tkn) { case '1' : tempmote.charset = CHRS_LATIN1; break; case '2' : tempmote.charset = CHRS_SIS7; break; case '3' : tempmote.charset = CHRS_CP437; break; case '4' : tempmote.charset = CHRS_MAC; break; default: break; } puttekn("\n\n\r",-1); for(x=0;x<10;x++) { if(!Servermem->fidodata.fd[x].domain[0]) break; sprintf(outbuffer,"%c%3d: %s (%d:%d/%d.%d)\n\r",tempmote.domain == Servermem->fidodata.fd[x].nummer ? '*' : ' ', Servermem->fidodata.fd[x].nummer, Servermem->fidodata.fd[x].domain, Servermem->fidodata.fd[x].zone, Servermem->fidodata.fd[x].net, Servermem->fidodata.fd[x].node, Servermem->fidodata.fd[x].point); puttekn(outbuffer,-1); } if(!x) { puttekn("\n\rDu måste definiera en domän i NiKomFido.cfg först!\n\r",-1); return(0); } for(;;) { if(getstring(EKO,10,NULL)) return(1); if(!inmat[0]) break; if(domain=getfidodomain(atoi(inmat),0)) { tempmote.domain=domain->nummer; break; } else puttekn("\n\rFinns ingen sådan domän.\n\r",-1); } } puttekn("\r\n\nÄr allt korrekt? ",-1); if(jaellernej('j','n',1)) puttekn("Ja\n\n\r",-1); else { puttekn("Nej\r\n\n",-1); return(0); } if(chng) { puttekn("Users.dat kommer nu att gås igenom för att nollställa medlemskap\n\r",-1); puttekn("och rättigheter som om mötet var nyskapat.\n\n\r",-1); puttekn("Är ändringarna fortfarande korrekta? ",-1); if(!jaellernej('j','n',1)) { puttekn("Nej\n\r",-1); return(0); } puttekn("Ja\n\r",-1); } memcpy(motpek,&tempmote,sizeof(struct Mote)); writemeet(motpek); if(!chng) return(0); if((tempmote.status & AUTOMEDLEM) && !(tempmote.status & SKRIVSTYRT)) return(0); if(tempmote.status & SUPERHEMLIGT) return(0); if(tempmote.status & AUTOMEDLEM) clearmed=FALSE; else clearmed=TRUE; if(tempmote.status & (SLUTET | SKRIVSTYRT)) setratt=FALSE; else setratt=TRUE; for(y=0;y<MAXNOD;y++) { BAMCLEAR(Servermem->inne[y].motmed,tempmote.nummer); if(setratt) BAMSET(Servermem->inne[y].motratt,tempmote.nummer); else BAMCLEAR(Servermem->inne[y].motratt,tempmote.nummer); } puttekn("\r\nÄndrar i Users.dat..\r\n",-1); for(userletpek=(struct ShortUser *)Servermem->user_list.mlh_Head;userletpek->user_node.mln_Succ;userletpek=(struct ShortUser *)userletpek->user_node.mln_Succ) { if(!(userletpek->nummer%10)) { sprintf(outbuffer,"\r%d",userletpek->nummer); puttekn(outbuffer,-1); } if(readuser(userletpek->nummer,&skuser)) return(0); changed=FALSE; if(setratt!=BAMTEST(skuser.motratt,tempmote.nummer)) { if(setratt) BAMSET(skuser.motratt,tempmote.nummer); else BAMCLEAR(skuser.motratt,tempmote.nummer); changed=TRUE; } if(clearmed && BAMTEST(skuser.motmed,tempmote.nummer)) { BAMCLEAR(skuser.motmed,tempmote.nummer); changed=TRUE; } if(changed && writeuser(userletpek->nummer,&skuser)) return(0); } for(y=0;y<MAXNOD;y++) { BAMCLEAR(Servermem->inne[y].motmed,tempmote.nummer); if(setratt) BAMSET(Servermem->inne[y].motratt,tempmote.nummer); else BAMCLEAR(Servermem->inne[y].motratt,tempmote.nummer); } BAMSET(Servermem->inne[nodnr].motratt,tempmote.nummer); BAMSET(Servermem->inne[nodnr].motmed,tempmote.nummer); return(0); }
void main(int argc, char **argv) { int going = TRUE, forsok = 2,car = 1, tmp, ch; long tid; char tellstr[100],*tmppscreen, titel[80]; NewList((struct List *)&aliaslist); NewList((struct List *)&edit_list); if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0))) cleanup(EXIT_ERROR,"Kunde inte öppna intuition.library\n"); if(!(UtilityBase=OpenLibrary("utility.library",37L))) cleanup(EXIT_ERROR,"Kunde inte öppna utility.library\n"); if(!(LocaleBase=OpenLibrary("locale.library",38L))) cleanup(EXIT_ERROR,"Kunde inte öppna locale.library\n"); if(!(NiKomBase=OpenLibrary("nikom.library",0L))) cleanup(EXIT_ERROR,"Kunde inte öppna nikom.linbrary"); getnodeconfig("NiKom:Datocfg/ConNode.cfg"); if(!(initnode(NODCON))) cleanup(EXIT_ERROR,"Kunde inte registrera noden i Servern\n"); if(!(nikomnodeport = CreateMsgPort())) cleanup(EXIT_ERROR,"Kunde inte skapa NiKomNode-porten"); sprintf(nikomnodeportnamn,"NiKomNode%d",nodnr); nikomnodeport->mp_Node.ln_Name = nikomnodeportnamn; nikomnodeport->mp_Node.ln_Pri = 1; AddPort(nikomnodeport); sprintf(rexxportnamn,"NiKomRexx%d",nodnr); if(!(rexxport=(struct MsgPort *)CreateMsgPort())) cleanup(EXIT_ERROR,"Kunde inte öppna RexxPort\n"); rexxport->mp_Node.ln_Name=rexxportnamn; rexxport->mp_Node.ln_Pri=50; AddPort(rexxport); if(!(RexxSysBase=(struct RsxLib *)OpenLibrary("rexxsyslib.library",0L))) cleanup(EXIT_ERROR,"Kunde inte öppna rexxsyslib.library\n"); if(pubscreen[0]=='-') tmppscreen=NULL; else tmppscreen=pubscreen; if(!(NiKwind=(struct Window *)OpenWindowTags(NULL,WA_Left,xpos, WA_Top,ypos, WA_Width,xsize, WA_Height,ysize, WA_IDCMP,IDCMP_CLOSEWINDOW, WA_MinWidth,50, WA_MinHeight,10, WA_MaxWidth,~0, WA_MaxHeight,~0, WA_SizeGadget,TRUE, WA_SizeBBottom, TRUE, WA_DragBar,TRUE, WA_DepthGadget,TRUE, WA_CloseGadget,TRUE, WA_SimpleRefresh,TRUE, WA_ScreenTitle,"NiKomCon", WA_AutoAdjust,TRUE, WA_PubScreenName,tmppscreen, TAG_DONE))) cleanup(EXIT_ERROR,"Kunde inte öppna fönstret\n"); if(!OpenIO(NiKwind)) cleanup(EXIT_ERROR,"Kunde inte öppna IO\n"); strcpy(Servermem->nodid[nodnr],nodid); sprintf(titel,"Nod #%d CON: <Ingen inloggad>",nodnr); SetWindowTitles(NiKwind,titel,(UBYTE *)-1L); Servermem->connectbps[nodnr] = -1; conreqtkn(); do { Servermem->idletime[nodnr] = time(NULL); memset(commandhistory,0,1024); Servermem->inne[nodnr].rader=0; sendfile("NiKom:Texter/Inlogg.txt"); if(Servermem->cfg.ar.preinlogg) sendautorexx(Servermem->cfg.ar.preinlogg); going=TRUE; while(going) { Servermem->idletime[nodnr] = time(NULL); puttekn("\r\nNamn: ",-1); getstring(EKO,40,NULL); if(!stricmp(inmat,Servermem->cfg.ny)) { tmp = RegisterNewUser(); if(tmp == 2) { goto panik; } car = tmp ? 0 : 1; going=FALSE; } else if((inloggad=parsenamn(inmat))>=0) { if(readuser(inloggad,&Servermem->inne[nodnr])) { puttekn("Error reading user data.\r\n", -1); goto panik; } // TODO: Extract password loop. Should be identical to in PreNode/Ser.c forsok=2; while(forsok) { puttekn("\r\nLösen: ",-1); if(Servermem->inne[nodnr].flaggor & STAREKOFLAG) getstring(STAREKO,15,NULL); else getstring(EJEKO,15,NULL); if(CheckPassword(inmat, Servermem->inne[nodnr].losen)) { forsok=FALSE; going=FALSE; } else { forsok--; } } } else if(inloggad==-1) puttekn("\r\nHittar ej namnet\r\n",-1); } sprintf(titel,"Nod #%d CON: %s #%d",nodnr,Servermem->inne[nodnr].namn,inloggad); SetWindowTitles(NiKwind,titel,(UBYTE *)-1L); if(!ReadUnreadTexts(&Servermem->unreadTexts[nodnr], inloggad)) { puttekn("Error reading unread text info.\r\n", -1); LogEvent(SYSTEM_LOG, ERROR, "Can't read unread text info for user %d", inloggad); goto panik; } Servermem->inloggad[nodnr]=inloggad; Servermem->idletime[nodnr] = time(NULL); if(getft("NiKom:Texter/Bulletin.txt")>Servermem->inne[nodnr].senast_in) sendfile("NiKom:Texter/Bulletin.txt"); connection(); if(Servermem->cfg.logmask & LOG_UTLOGG) { LogEvent(USAGE_LOG, INFO, "%s loggar ut från nod %d", getusername(inloggad), nodnr); } if(Servermem->say[nodnr]) displaysay(); if(Servermem->cfg.ar.utlogg) sendautorexx(Servermem->cfg.ar.utlogg); sendfile("NiKom:Texter/Utlogg.txt"); sprintf(titel,"Nod #%d CON: <Ingen inloggad>",nodnr); SetWindowTitles(NiKwind,titel,(UBYTE *)-1L); Servermem->inloggad[nodnr]=-1; Servermem->action[nodnr]=0; time(&tid); Servermem->inne[nodnr].senast_in=tid; Servermem->inne[nodnr].tot_tid+=(tid-logintime); Servermem->inne[nodnr].loggin++; Servermem->info.inloggningar++; Servermem->inne[nodnr].defarea=area2; writeuser(inloggad,&Servermem->inne[nodnr]); WriteUnreadTexts(&Servermem->unreadTexts[nodnr], inloggad); writesenaste(); freealiasmem(); sprintf(tellstr,"loggade just ut från nod %d",nodnr); tellallnodes(tellstr); panik: nodestate = 0; puttekn("\r\n\nEn inloggning till? (J/n)",-1); } while((ch = GetChar()) != 'n' && ch != 'N'); cleanup(EXIT_OK,""); }
int skapmot(void) { struct ShortUser *shortUser; int mad, setPermission, changed, ch, i, fidoDomainId, highestId; struct FidoDomain *fidoDomain; BPTR lock; struct User user; struct Mote tmpConf,*searchConf,*newConf; memset(&tmpConf, 0, sizeof(struct Mote)); if(argument[0] == '\0') { SendString("\r\n\nNamn på mötet: "); if(GetString(40,NULL)) { return 1; } strcpy(tmpConf.namn, inmat); } else { strcpy(tmpConf.namn, argument); } if(parsemot(tmpConf.namn) != -1) { SendString("\r\n\nFinns redan ett sådant möte!\r\n"); return 0; } tmpConf.skapat_tid = time(NULL);; tmpConf.skapat_av = inloggad; for(;;) { SendString("\r\nMötesAdministratör (MAD) : "); if(GetString(5,NULL)) { return 1; } if(inmat[0]) { if((mad = parsenamn(inmat)) == -1) { SendString("\r\nFinns ingen sådan användare!"); } else { tmpConf.mad = mad; break; } } } SendString("\n\rSorteringsvärde: "); tmpConf.sortpri = GetNumber(0, LONG_MAX, NULL); if(EditBitFlagShort("\r\nSka mötet vara slutet?", 'j', 'n', "Slutet", "Öppet", &tmpConf.status, SLUTET)) { return 1; } if(tmpConf.status & SLUTET) { SendString("\r\nVilka grupper ska ha tillgång till mötet? (? för lista)\r\n"); if(editgrupp((char *)&tmpConf.grupper)) { return 1; } } if(EditBitFlagShort("\r\nSka mötet vara skrivskyddat?", 'j', 'n', "Skyddat", "Oskyddat", &tmpConf.status, SKRIVSKYDD)) { return 1; } if(EditBitFlagShort("\r\nSka mötet vara kommentarsskyddat?", 'j', 'n', "Skyddat", "Oskyddat", &tmpConf.status, KOMSKYDD)) { return 1; } if(EditBitFlagShort("\r\nSka mötet vara hemligt?", 'j', 'n', "Hemligt", "Ej hemligt", &tmpConf.status, HEMLIGT)) { return 1; } if(!(tmpConf.status & SLUTET)) { if(EditBitFlagShort("\r\nSka alla användare bli medlemmar automagiskt?", 'j', 'n', "Ja", "Nej", &tmpConf.status, AUTOMEDLEM)) { return 1; } if(EditBitFlagShort("\r\nSka rättigheterna styra skrivmöjlighet?", 'j', 'n', "Ja", "Nej", &tmpConf.status, SKRIVSTYRT)) { return 1; } if(tmpConf.status & SKRIVSTYRT) { SendString("\r\nVilka grupper ska ha tillgång till mötet? (? för lista)\r\n"); if(editgrupp((char *)&tmpConf.grupper)) { return 1; } } } if(EditBitFlagShort("\r\nSka mötet enbart kommas åt från ARexx?", 'j', 'n', "Ja", "Nej", &tmpConf.status, SUPERHEMLIGT)) { return 1; } SendString("\n\n\rVilken typ av möte ska det vara?\n\r"); SendString("1: Lokalt möte\n\r"); SendString("2: Fido-möte\n\n\r"); SendString("Val: "); for(;;) { ch = GetChar(); if(ch == GETCHAR_LOGOUT) { return 1; } if(ch == '1' || ch == '2') { break; } } if(ch == '1') { SendString("Lokalt möte\n\n\r"); tmpConf.type = MOTE_ORGINAL; } else { SendString("Fido-möte\n\n\r"); tmpConf.type = MOTE_FIDO; if(EditString("Katalog for .msg-filerna", tmpConf.dir, 79, TRUE)) { return 1; } if(!(lock = Lock(tmpConf.dir, SHARED_LOCK))) { if(!(lock = CreateDir(tmpConf.dir))) SendString("\n\rKunde inte skapa katalogen\n\r"); } if(lock) { UnLock(lock); } if(EditString("FidoNet tag-namn", tmpConf.tagnamn, 49, TRUE)) { return 1; } strcpy(tmpConf.origin, Servermem->fidodata.defaultorigin); if(MaybeEditString("Origin-rad", tmpConf.origin, 69)) { return 1; } SendString("\n\n\rVilken teckenuppsättning ska användas för utgående texter?\n\r"); SendString("1: ISO Latin 1 (ISO 8859-1)\n\r"); SendString("2: SIS-7 (SF7, 'Måsvingar')\n\r"); SendString("3: IBM CodePage\n\r"); SendString("4: Mac\n\n\r"); SendString("Val: "); for(;;) { ch = GetChar(); if(ch == GETCHAR_LOGOUT) { return 1; } if(ch == '1' || ch == '2' || ch == '3' || ch == '4') { break; } } switch(ch) { case '1': SendString("ISO Latin 1\n\n\r"); tmpConf.charset = CHRS_LATIN1; break; case '2': SendString("SIS-7\n\n\r"); tmpConf.charset = CHRS_SIS7; break; case '3': SendString("IBM CodePage\n\n\r"); tmpConf.charset = CHRS_CP437; break; case '4': SendString("Mac\n\n\r"); tmpConf.charset = CHRS_MAC; break; } SendString("Vilken domän är mötet i?\n\r"); highestId = 0; for(i = 0; i < 10; i++) { if(!Servermem->fidodata.fd[i].domain[0]) { break; } highestId = max(highestId, Servermem->fidodata.fd[i].nummer); SendString("%3d: %s (%d:%d/%d.%d)\n\r", Servermem->fidodata.fd[i].nummer, Servermem->fidodata.fd[i].domain, Servermem->fidodata.fd[i].zone, Servermem->fidodata.fd[i].net, Servermem->fidodata.fd[i].node, Servermem->fidodata.fd[i].point); } if(i == 0) { SendString("\n\rDu måste definiera en domän i NiKomFido.cfg först!\n\r"); return 0; } for(;;) { SendString("\r\nDomän: "); if(GetString(5, NULL)) { return 1; } fidoDomainId = atoi(inmat); if(fidoDomain = getfidodomain(fidoDomainId, 0)) { break; } else { SendString("\n\rFinns ingen sådan domän.\n\r"); } } tmpConf.domain = fidoDomain->nummer; SendString("%s\n\n\r", fidoDomain->domain); } for(i = 0; i < MAXMOTE; i++) { if(getmotpek(i) == NULL) { break; } } if(i >= MAXMOTE) { SendString("\n\n\rDet finns inte plats för fler möten.\n\r"); return 0; } tmpConf.nummer = i; if(!(newConf = (struct Mote *)AllocMem(sizeof(struct Mote), MEMF_CLEAR | MEMF_PUBLIC))) { LogEvent(SYSTEM_LOG, ERROR, "Could not allocate %d bytes.", sizeof(struct Mote)); DisplayInternalError(); return 0; } memcpy(newConf, &tmpConf, sizeof(struct Mote)); ITER_EL(searchConf, Servermem->mot_list, mot_node, struct Mote *) { if(searchConf->sortpri > newConf->sortpri) { break; } } searchConf = (struct Mote *)searchConf->mot_node.mln_Pred; Insert((struct List *)&Servermem->mot_list, (struct Node *)newConf, (struct Node *)searchConf); writemeet(newConf); if((newConf->status & AUTOMEDLEM) && !(newConf->status & SKRIVSTYRT)) { return 0; } if(newConf->status & SUPERHEMLIGT) { return 0; } setPermission = (newConf->status & (SLUTET | SKRIVSTYRT)) ? FALSE : TRUE; for(i = 0; i < MAXNOD; i++) { BAMCLEAR(Servermem->inne[i].motmed, newConf->nummer); if(setPermission) { BAMSET(Servermem->inne[i].motratt, newConf->nummer); } else { BAMCLEAR(Servermem->inne[i].motratt, newConf->nummer); } } SendString("\r\nÄndrar i användardata..\r\n"); ITER_EL(shortUser, Servermem->user_list, user_node, struct ShortUser *) { if(!(shortUser->nummer % 10)) { SendString("\r%d", shortUser->nummer); } if(readuser(shortUser->nummer, &user)) { LogEvent(SYSTEM_LOG, ERROR, "Could not read user %d to set " "membership/permissions for new conference.", shortUser->nummer); DisplayInternalError(); return 0; } changed = FALSE; if(setPermission != BAMTEST(user.motratt, newConf->nummer)) { if(setPermission) { BAMSET(user.motratt, newConf->nummer); } else { BAMCLEAR(user.motratt, newConf->nummer); } changed = TRUE; } if(!(newConf->status & AUTOMEDLEM) && BAMTEST(user.motmed, newConf->nummer)) { BAMCLEAR(user.motmed, newConf->nummer); changed = TRUE; } if(changed && writeuser(shortUser->nummer, &user)) { LogEvent(SYSTEM_LOG, ERROR, "Could not write user %d to set " "membership/permissions for new conference.", shortUser->nummer); DisplayInternalError(); return 0; } } for(i = 0; i < MAXNOD; i++) { BAMCLEAR(Servermem->inne[i].motmed, newConf->nummer); if(setPermission) { BAMSET(Servermem->inne[i].motratt, newConf->nummer); } else { BAMCLEAR(Servermem->inne[i].motratt, newConf->nummer); } } BAMSET(Servermem->inne[nodnr].motratt, newConf->nummer); BAMSET(Servermem->inne[nodnr].motmed, newConf->nummer); if(newConf->type == MOTE_FIDO) { ReScanFidoConf(newConf, 0); } return 0; }
void main(int argc, char **argv) { int going=TRUE,forsok=2,car=1; long tid; char tellstr[100],*tmppscreen, titel[80]; UBYTE tillftkn; NewList((struct List *)&aliaslist); NewList((struct List *)&edit_list); if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0))) cleanup(ERROR,"Kunde inte öppna intuition.library\n"); if(!(UtilityBase=OpenLibrary("utility.library",37L))) cleanup(ERROR,"Kunde inte öppna utility.library\n"); if(!(NiKomBase=OpenLibrary("nikom.library",0L))) cleanup(ERROR,"Kunde inte öppna nikom.linbrary"); getnodeconfig("NiKom:Datocfg/ConNode.cfg"); if(!(initnode(NODCON))) cleanup(ERROR,"Kunde inte registrera noden i Servern\n"); if(!(nikomnodeport = CreateMsgPort())) cleanup(ERROR,"Kunde inte skapa NiKomNode-porten"); sprintf(nikomnodeportnamn,"NiKomNode%d",nodnr); nikomnodeport->mp_Node.ln_Name = nikomnodeportnamn; nikomnodeport->mp_Node.ln_Pri = 1; AddPort(nikomnodeport); sprintf(rexxportnamn,"NiKomRexx%d",nodnr); if(!(rexxport=(struct MsgPort *)CreateMsgPort())) cleanup(ERROR,"Kunde inte öppna RexxPort\n"); rexxport->mp_Node.ln_Name=rexxportnamn; rexxport->mp_Node.ln_Pri=50; AddPort(rexxport); if(!(RexxSysBase=(struct RsxLib *)OpenLibrary("rexxsyslib.library",0L))) cleanup(ERROR,"Kunde inte öppna rexxsyslib.library\n"); if(pubscreen[0]=='-') tmppscreen=NULL; else tmppscreen=pubscreen; if(!(NiKwind=(struct Window *)OpenWindowTags(NULL,WA_Left,xpos, WA_Top,ypos, WA_Width,xsize, WA_Height,ysize, WA_IDCMP,IDCMP_CLOSEWINDOW, WA_MinWidth,50, WA_MinHeight,10, WA_MaxWidth,~0, WA_MaxHeight,~0, WA_SizeGadget,TRUE, WA_SizeBBottom, TRUE, WA_DragBar,TRUE, WA_DepthGadget,TRUE, WA_CloseGadget,TRUE, WA_SimpleRefresh,TRUE, WA_ScreenTitle,"NiKom © Tomas Kärki 1996-1998", WA_AutoAdjust,TRUE, WA_PubScreenName,tmppscreen, TAG_DONE))) cleanup(ERROR,"Kunde inte öppna fönstret\n"); if(!OpenIO(NiKwind)) cleanup(ERROR,"Kunde inte öppna IO\n"); if(!getkeyfile()) cleanup(ERROR,"Korrupt nyckelfil\n"); strcpy(Servermem->nodid[nodnr],nodid); sprintf(titel,"Nod #%d CON: <Ingen inloggad>",nodnr); SetWindowTitles(NiKwind,titel,(UBYTE *)-1L); Servermem->connectbps[nodnr] = -1; conreqtkn(); do { memset(commandhistory,0,1024); Servermem->inne[nodnr].rader=0; sendfile("NiKom:Texter/Inlogg.txt"); if(Servermem->cfg.ar.preinlogg) sendrexx(Servermem->cfg.ar.preinlogg); going=TRUE; while(going) { puttekn("\r\nNamn: ",-1); getstring(EKO,40,NULL); if(!stricmp(inmat,Servermem->cfg.ny)) { /* if(!reggadnamn[0] && ((struct ShortUser *)Servermem->user_list.mlh_TailPred)->nummer >= 4) puttekn("\n\n\rDenna demoversion av NiKom kan hantera maximalt 5 användare.\n\r",-1); else { Versionen är nu obegränsad 970930! */ if((car=nyanv())==2) goto panik; going=FALSE; /* } */ } else if((inloggad=parsenamn(inmat))>=0) { readuser(inloggad,&Servermem->inne[nodnr]); forsok=2; while(forsok) { puttekn("\r\nLösen: ",-1); if(Servermem->inne[nodnr].flaggor & STAREKOFLAG) getstring(STAREKO,15,NULL); else getstring(EJEKO,15,NULL); if(CheckPassword(inloggad, inmat)) { forsok=FALSE; going=FALSE; } else forsok--; } } else if(inloggad==-1) puttekn("\r\nHittar ej namnet\r\n",-1); } sprintf(titel,"Nod #%d CON: %s #%d",nodnr,Servermem->inne[nodnr].namn,inloggad); SetWindowTitles(NiKwind,titel,(UBYTE *)-1L); readuserbitmap(inloggad,Servermem->bitmaps[nodnr],0,temppek); Servermem->inloggad[nodnr]=inloggad; Servermem->idletime[nodnr] = time(NULL); if(getft("NiKom:Texter/Bulletin.txt")>Servermem->inne[nodnr].senast_in) sendfile("NiKom:Texter/Bulletin.txt"); connection(); if(Servermem->cfg.logmask & LOG_UTLOGG) { sprintf(outbuffer,"%s loggar ut från nod %d",getusername(inloggad),nodnr); logevent(outbuffer); } if(Servermem->say[nodnr]) displaysay(); if(Servermem->cfg.ar.utlogg) sendrexx(Servermem->cfg.ar.utlogg); sendfile("NiKom:Texter/Utlogg.txt"); sprintf(titel,"Nod #%d CON: <Ingen inloggad>",nodnr); SetWindowTitles(NiKwind,titel,(UBYTE *)-1L); SaveProgramCategory(inloggad); Servermem->inloggad[nodnr]=-1; Servermem->action[nodnr]=0; Servermem->inne[nodnr].textpek=textpek; time(&tid); Servermem->inne[nodnr].senast_in=tid; Servermem->inne[nodnr].tot_tid+=(tid-logintime); Servermem->inne[nodnr].loggin++; Servermem->info.inloggningar++; Servermem->inne[nodnr].defarea=area2; writeuser(inloggad,&Servermem->inne[nodnr]); writeuserbitmap(inloggad,Servermem->bitmaps[nodnr],0,temppek); writesenaste(); freealiasmem(); sprintf(tellstr,"loggade just ut från nod %d",nodnr); tellallnodes(tellstr); panik: puttekn("\r\n\nEn inloggning till? (J/n)",-1); } while((tillftkn=gettekn())!='n' && tillftkn!='N'); cleanup(OK,""); }