/*
###   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;
   }
Exemple #2
0
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;
}
Exemple #3
0
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 );
}
Exemple #4
0
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 */
Exemple #5
0
	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 */
Exemple #6
0
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 );
}    
Exemple #7
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();
    }
}
Exemple #8
0
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;
}