/* ### CSupport/popen ### ### NAME ### popen/pclose -- Unix-like pipes ### ### STATUS ### Experimental ### does not work with csh ! ### */ FILE *popen(char *command, char *mode) { static char pname[25]; struct Task *me = FindTask(0); static count = 0; count++; /* guarantees a unique pipe name ! */ sprintf(pname, "pipe:tr_%lx_%d", me, count); if (strcmp(mode, "r") == 0) /* open pipe for reading */ { FILE *reader; BPTR writer, null; writer = Open(pname, MODE_NEWFILE); reader = fopen(pname, "r"); null = Open("NIL:", MODE_NEWFILE); if (SystemTags(command, SYS_Input, null, SYS_Output, writer, SYS_Asynch, TRUE, NP_StackSize, me->tc_SPUpper - me->tc_SPLower, TAG_END) == -1) { Close(null); Close(writer); fclose(reader); return NULL; } else return reader; } else if (strcmp(mode, "w") == 0) /* open pipe for writing */ { FILE *writer; BPTR reader, null; writer = fopen(pname, "w"); reader = Open(pname, MODE_OLDFILE); null = Open("NIL:", MODE_NEWFILE); if (SystemTags(command, SYS_Input, reader, SYS_Output, null, SYS_Asynch, TRUE, NP_StackSize, me->tc_SPUpper - me->tc_SPLower, TAG_END) == -1) { Close(null); Close(reader); fclose(writer); return NULL; } else return writer; } else return NULL; }
int MyExecute (char **argv) { char * buffer, * ptr; char ** aptr; int len = 0; int status; for (aptr=argv; *aptr; aptr++) { len += strlen (*aptr) + 4; } buffer = AllocMem (len, MEMF_ANY); if (!buffer) fatal (NILF, "MyExecute: Cannot allocate space for calling a command"); ptr = buffer; for (aptr=argv; *aptr; aptr++) { if (((*aptr)[0] == ';' && !(*aptr)[1])) { *ptr ++ = '"'; strcpy (ptr, *aptr); ptr += strlen (ptr); *ptr ++ = '"'; } else if ((*aptr)[0] == '@' && (*aptr)[1] == '@' && !(*aptr)[2]) { *ptr ++ = '\n'; continue; } else { strcpy (ptr, *aptr); ptr += strlen (ptr); } *ptr ++ = ' '; *ptr = 0; } ptr[-1] = '\n'; status = SystemTags (buffer, SYS_UserShell, TRUE, TAG_END); FreeMem (buffer, len); if (SetSignal (0L,0L) & SIGBREAKF_CTRL_C) status = 20; /* Warnings don't count */ if (status == 5) status = 0; return status; }
VOID LoadModule( STRPTR Dir, STRPTR Module ) { BPTR in = Open( "NIL:", MODE_OLDFILE ); BPTR out = Open( "NIL:", MODE_OLDFILE ); BYTE Path[256]; if( !Stricmp( Module, "Random" )) Module = RandomModule(); if( !Module ) return; strcpy( Path, Dir ); AddPart( Path, Module, 256 ); if( in && out ) if( SystemTags( Path, SYS_Asynch, TRUE, SYS_Input, in, SYS_Output, out, TAG_END ) != -1 ) return; if( in ) Close( in ); if( out ) Close( out ); }
static int system_no_sh(const char *string) { struct arosc_privdata *pdata = __get_arosc_privdata(); const char *apath; char *args, *cmd, *fullcmd; fdesc *in, *out, *err; int ret; D(bug("system_no_sh(%s)\n", string)); args = strdup(string); cmd = strsep(&args, " \t\n"); if (!args) args = ""; D(bug("system(cmd=%s, args=%s)\n", cmd, args)); apath = __path_u2a(cmd); fullcmd = malloc(strlen(apath) + strlen(args) + 2); strcpy(fullcmd, apath); strcat(fullcmd, " "); strcat(fullcmd, args); free(cmd); in = pdata->acpd_fd_array[STDIN_FILENO]; out = pdata->acpd_fd_array[STDOUT_FILENO]; err = pdata->acpd_fd_array[STDERR_FILENO]; ret = (int)SystemTags ( fullcmd, SYS_Input, (IPTR)(in ? in->fcb->fh : NULL), SYS_Output, (IPTR)(out ? out->fcb->fh : NULL), SYS_Error, (IPTR)(err ? err->fcb->fh : NULL), NULL ); free(fullcmd); if (ret == -1) errno = IoErr2errno(IoErr()); return ret; } /* system */
int system ( /* SYNOPSIS */ const char *string) /* FUNCTION Execute a command string. If string is NULL then 1 will be returned. INPUTS string - command to execute or NULL RESULT Return value of command executed. If value < 0 errno indicates error. 1 is return if string is NULL. NOTES The system() version of stdcio.library just passes the command to SystemTags() dos.library call. EXAMPLE BUGS SEE ALSO INTERNALS ******************************************************************************/ { int ret; if (string == NULL) return 1; /* We have AmigaShell */ ret = (int)SystemTags(string, NULL); if (ret == -1) errno = __stdc_ioerr2errno(IoErr()); return ret; } /* system */
VOID ExecSubProc( STRPTR Command, STRPTR Extension ) { BPTR in = Open( "NIL:", MODE_OLDFILE ); BPTR out = Open( "NIL:", MODE_OLDFILE ); BYTE Path[216], Target[108]; strcpy( Path, Prefs->bp_Dir ); AddPart( Path, Command, 216 ); strcat( Path, " " ); strcpy( Target, Prefs->bp_Dir ); AddPart( Target, Prefs->bp_Blanker, 108 ); strcat( Path, Target ); strcat( Path, Extension ); if( in && out &&( SystemTags( Path, SYS_Asynch, TRUE, SYS_Input, in, SYS_Output, out, TAG_END ) != -1 )) return; if( in ) Close( in ); if( out ) Close( out ); }
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(); } }
void *dllInternalLoadLibrary(char *filename,char *portname,int raiseusecount) { struct dll_sInstance *inst; struct MsgPort *dllport; struct MsgPort *myport; dll_tMessage msg,*reply; static int cleanupflag=0; BPTR handle; int i; bug("[DynLink] %s('%s','%s')\n", __PRETTY_FUNCTION__, filename, portname); if(!cleanupflag) { bzero(&dllOpenedDLLs, sizeof(dllOpenedDLLs)); if(atexit((void *)dllCleanup)) return 0L; else cleanupflag=1L; } if(!filename) return 0L; //Paranoia if(!(handle=Open(filename, MODE_OLDFILE))) return 0L; Close(handle); if(!portname) portname=filename; // Search for already opened DLLs for(i=0;i<DLLOPENDLLS_MAX;i++) { if(dllOpenedDLLs[i].inst) { if(strcmp(dllOpenedDLLs[i].name,portname)==0) { if(raiseusecount) dllOpenedDLLs[i].usecount++; return dllOpenedDLLs[i].inst; } } } bug("[DynLink] %s: not opened yet\n", __PRETTY_FUNCTION__); // Not opened yet, search for a free slot for(i=0;i<DLLOPENDLLS_MAX;i++) if(!dllOpenedDLLs[i].inst) break; if(i==DLLOPENDLLS_MAX) return 0L; // No free slot available bug("[DynLink] %s: using slot %u\n", __PRETTY_FUNCTION__, i); if(!(inst=malloc(sizeof(struct dll_sInstance)))) return 0L; bug("[DynLink] %s: instance @ 0x%p\n", __PRETTY_FUNCTION__, inst); if(!(myport=CreateMsgPort())) { free(inst); return 0L; } bug("[DynLink] %s: port @ 0x%p\n", __PRETTY_FUNCTION__, myport); if(!(dllport=FindPort(portname))) { BPTR output = Open("CON:0/0/800/600/DLL_OUTPUT/AUTO/CLOSE/WAIT", MODE_NEWFILE); char commandline[1024]; int i; sprintf(commandline,"\"%s\" \"%s\"", filename, portname); bug("[DynLink] %s: calling '%s', output @ 0x%p\n", __PRETTY_FUNCTION__, commandline, output); SystemTags(commandline, SYS_Asynch, TRUE, SYS_Output, output, SYS_Input, NULL, //FIXME: some dll's might need stdin NP_StackSize, 10000, //Messagehandler doesn't need a big stack (FIXME: but DLL_(De)Init might) TAG_DONE); bug("[DynLink] %s: waiting for load ...\n", __PRETTY_FUNCTION__); for (i=0; i<20; i++) { dllport = FindPort(portname); if (dllport) break; //printf("Delaying...\n"); Delay(25L); } } if(!dllport) { DeleteMsgPort(myport); free(inst); return 0L; } bug("[DynLink] %s: found port for '%s' @ 0x%p\n", __PRETTY_FUNCTION__, portname, dllport); inst->dllPort=dllport; inst->StackType=DLLSTACK_DEFAULT; bzero(&msg, sizeof(msg)); msg.dllMessageType=DLLMTYPE_Open; msg.dllMessageData.dllOpen.StackType = inst->StackType; msg.Message.mn_ReplyPort = myport; PutMsg(dllport, (struct Message *)&msg); WaitPort(myport); reply=(dll_tMessage *)GetMsg(myport); if (reply) { if(reply->dllMessageData.dllOpen.ErrorCode!=DLLERR_NoError) { DeleteMsgPort(myport); free(inst); return 0L; } //Obligatory symbol exports inst->FindResource = dllGetProcAddress(inst,"dllFindResource"); inst->LoadResource = dllGetProcAddress(inst,"dllLoadResource"); inst->FreeResource = dllGetProcAddress(inst,"dllFreeResource"); if((inst->FindResource==0L)|| (inst->LoadResource==0L)|| (inst->FreeResource==0L)) { DeleteMsgPort(myport); dllOpenedDLLs[i].inst=inst; dllInternalFreeLibrary(i); return 0L; } } else { //FIXME: Must/Can I send a Close message here ?? DeleteMsgPort(myport); free(inst); return 0L; } DeleteMsgPort(myport); dllOpenedDLLs[i].inst=inst; dllOpenedDLLs[i].usecount=1; strcpy(dllOpenedDLLs[i].name,portname); return inst; }