示例#1
0
// Check for DOPUS5: assignments
void startup_check_assign()
{
    BPTR lock;

#if !defined(__amigaos3__) && !defined(__amigaos4__)
    // See if we have a DOPUS5: lock
    if ((lock=Lock("DOPUS5:",ACCESS_READ)))
        UnLock(lock);

    // We don't; assign it to PROGDIR:
    else
#endif
        if ((lock=DupLock(GetProgramDir())))
        {
            if (!(AssignLock("DOPUS5",lock)))
                UnLock(lock);
        }

    // See if we have a D5THEMES: lock
    if ((lock=Lock("D5THEMES:",ACCESS_READ)))
        UnLock(lock);

    // We don't; assign it to DOpus5:Themes
    else if ((lock=Lock("DOpus5:Themes",ACCESS_READ)))
    {
        if (!(AssignLock("D5THEMES",lock)))
            UnLock(lock);
    }
}
示例#2
0
/* This code was grapped from IconImage/wbarg.c/IconFromWBArg()
 * Commodore-Amiga Example code
 */
static struct DiskObject *smart_get_icon(struct SmartArgs *args, struct WBStartup *wb_startup)
{
   struct DiskObject *dob = NULL;
   struct WBArg *wbarg = wb_startup->sm_ArgList;
   ULONG num = wb_startup->sm_NumArgs;

   UBYTE work_name[MAXIMUM_FILENAME_LENGTH];
   BPTR old_lock, new_lock;

   /* Copy the WBArg contents */
   strncpy(work_name, wbarg->wa_Name, MAXIMUM_FILENAME_LENGTH);

   new_lock = DupLock(wbarg->wa_Lock);
   if (new_lock != NULL)
   {
      D(bug("work_name : \"%s\"\n", work_name));

      /* go to the directory where the icon resides */
      old_lock = CurrentDir(new_lock);

      dob = GetDiskObjectNew(work_name);

      /* test, if the first icon is a project icon and if so, get its icon */
      if (wb_startup->sm_NumArgs > 1)
      {
         BPTR new_lock2;

         if ((new_lock2 = DupLock(wbarg[1].wa_Lock)))
         {
            struct DiskObject *prj;

            CurrentDir(new_lock2);

            UnLock(new_lock);
            new_lock = new_lock2;

            strncpy(work_name, wbarg[1].wa_Name, MAXIMUM_FILENAME_LENGTH);
            D(bug("work_name2 : \"%s\"\n", work_name));

            if ((prj = GetDiskObjectNew(work_name)))
            {
               if (prj->do_Type == WBPROJECT)
               {
                  BPTR test;

                  /* if this is only an icon skip it */
                  if (!(test = Lock(work_name, SHARED_LOCK)))
                  {
                     wbarg++;
                     num--;
                  }
                  else
                     UnLock(test);

                  if (dob)
                     FreeDiskObject(dob);

                  dob = prj;
               }
            }
         }
      }

      if (dob)
      {
         D(bug("dobj window : %s\n", dob->do_ToolWindow));
      }

      /* go back to where we used to be */
      CurrentDir(old_lock);

      /* release the duplicated lock */
      UnLock(new_lock);

      args->sa_WBArg = wbarg + 1;
      args->sa_NumArgs = num;
   }

   D(bug("return (dob)\n"));

   return (dob);
}
示例#3
0
static int findFirstMatch( char * pFileName, char * wpName )
{
static BOOL isfirst=TRUE;
BPTR dirlock;
struct Node * newnode;
/* char * onefname; */
char * point;
unsigned len;

/* printf("Called findFirstMatch: %s %s\n", pFileName, wpName); */

if(isfirst)
	{
	isfirst=FALSE;

	NewListPPC(&filelist);

	fib = AllocDosObject(DOS_FIB, NULL);

	strcpy(filepart, FilePart(pFileName));

	if((point=PathPart(pFileName)) == pFileName) /* Current directory */
		{
		dirlock=DupLock(((struct Process *)FindTask(NULL))->pr_CurrentDir);
		*pathpart=0;
		}
	else
		{
		len =(unsigned) (point-pFileName);
		strncpy(pathpart, pFileName, len);
		pathpart[len]=0;

		dirlock=Lock(pathpart, ACCESS_READ);
		}

	if(dirlock)
		{
		if(Examine(dirlock, fib))
			{
			while(ExNext(dirlock, fib))
				{
				if(fib->fib_DirEntryType == ST_FILE || fib->fib_DirEntryType == ST_LINKFILE)
					{
					/* printf("%s\n", fib->fib_FileName); */

					newnode=malloc(sizeof(struct Node));

					newnode->ln_Type = NT_USER;
					newnode->ln_Name=malloc(strlen(fib->fib_FileName)+1);
					strcpy(newnode->ln_Name, fib->fib_FileName);

					AddTailPPC(&filelist, newnode);

					}
				}
			}

		UnLock(dirlock);

		FreeDosObject(DOS_FIB, fib);
		}
	else	return FALSE;
	}

if(ParsePatternNoCase(filepart, parsebuf, PARSEBUFLEN))
	{
	for(currentnode = filelist.lh_Head; currentnode->ln_Succ; currentnode = currentnode->ln_Succ)
		{
		/* printf("Match %s %s\n", parsebuf, currentnode->ln_Name); */
		if(MatchPatternNoCase(parsebuf, currentnode->ln_Name))
			{
			/* printf("Trovato %s\n", currentnode->ln_Name); */
			strcpy(wpName, pathpart);
			AddPart(wpName, currentnode->ln_Name, MAX_NAMELEN);
			currentnode = currentnode->ln_Succ;
			return TRUE;
			}
		}
/*	return FALSE; */
	}
return FALSE;
}
示例#4
0
LONG launcher()
{
    D(bug("launcher: Entered child launcher\n"));

    struct Task *this = FindTask(NULL);
    struct vfork_data *udata = this->tc_UserData;
    BYTE child_signal;
    struct Library *aroscbase = NULL;

    GetIntETask(this)->iet_startup = GetETask(this)->et_Result2 = AllocVec(sizeof(struct aros_startup), MEMF_ANY | MEMF_CLEAR);

    /* Allocate signal for parent->child communication */
    child_signal = udata->child_signal = AllocSignal(-1);
    D(bug("launcher: Allocated child signal: %d\n", udata->child_signal));
    if(udata->child_signal == -1)
    {
	/* Lie */
	udata->child_errno = ENOMEM;
	Signal(udata->parent, 1 << udata->parent_signal);
	return -1;
    }

    if(__register_init_fdarray(udata->ppriv->acpd_fd_array, udata->ppriv->acpd_numslots))
        aroscbase = OpenLibrary((STRPTR) "arosc.library", 0);
    if(!aroscbase)
    {
	FreeSignal(child_signal);
	udata->child_errno = ENOMEM;
	Signal(udata->parent, 1 << udata->parent_signal);
	return -1;	
    }
    
    udata->cpriv = __get_arosc_privdata();
    udata->cpriv->acpd_parent_does_upath = udata->ppriv->acpd_doupath;
    udata->cpriv->acpd_flags |= DO_NOT_CLONE_ENV_VARS;

    if(setjmp(__aros_startup_jmp_buf) == 0)
    {
        /* Setup complete, signal parent */
        D(bug("launcher: Signaling parent that we finished setup\n"));
        Signal(udata->parent, 1 << udata->parent_signal);

        D(bug("launcher: Child waiting for exec or exit\n"));
        Wait(1 << udata->child_signal);

        if(udata->child_executed)
        {
            APTR exec_id;
            BPTR dir;
            
            D(bug("launcher: child executed\n"));
            
            /* Set current dir to parent's current dir */
            dir = DupLock(((struct Process *)udata->parent)->pr_CurrentDir);
            UnLock(CurrentDir(dir));
            /* Don't mind updating aroscbase->acb_startup_cd_changed as we will
               exit from process after __exec_do has finished */

            /* Filenames passed from parent obey parent's __doupath */
            __doupath = udata->cpriv->acpd_parent_does_upath;
            D(bug("launcher: __doupath == %d for __exec_prepare()\n", __doupath));
            
            exec_id = udata->exec_id = __exec_prepare(
                udata->exec_filename,
                udata->exec_searchpath,
                udata->exec_argv,
                udata->exec_envp
            );
            
            udata->child_errno = errno;

            /* Clear __doupath again, command will set it if wanted */
            __doupath = 0;
            
            D(bug("launcher: informing parent that we have run __exec_prepare\n"));
            /* Inform parent that we have run __exec_prepare */
            Signal(udata->parent, 1 << udata->parent_signal);
            
            /* Wait 'till __exec_do() is called on parent process */
            D(bug("launcher: Waiting parent to get the result\n"));
            Wait(1 << udata->child_signal);

            D(bug("launcher: informing parent that we won't use udata anymore\n"));
            /* Inform parent that we won't use udata anymore */
            Signal(udata->parent, 1 << udata->parent_signal);

            if (exec_id)
            {
                D(bug("launcher: executing command\n"));
                __exec_do(exec_id);
                
                assert(0); /* Should not be reached */
            }
            else
            {
                D(bug("launcher: exit because execve returned with an error\n"));
                _exit(0);
            }
        }
        else
        {
            D(bug("launcher: informing parent that we won't use udata anymore\n"));
            /* Inform parent that we won't use udata anymore */
            Signal(udata->parent, 1 << udata->parent_signal);
        }
    }
    else
    {
        D(bug("launcher: freeing child_signal\n"));
        FreeSignal(child_signal);
        CloseLibrary(aroscbase);
    }
    
    return 0;
}
示例#5
0
void __nocommandline(void)
{
    struct WBStartup *wbs=_WBenchMsg;

    if (wbs!=NULL)
    {
      if(__stdiowin[0])
      { BPTR win;

        if((window=win=PPCOpen(__stdiowin,MODE_OLDFILE))==0l)
          exit(RETURN_FAIL);
        input = SelectInput(win);
        output = SelectOutput(win);
      }

      if(wbs->sm_ArgList!=NULL) /* cd to icon */
        cd=CurrentDir(DupLock(wbs->sm_ArgList->wa_Lock));

      __argc=0;
      __argv=(char **)wbs;
    }
    else
    {
      char **av,*a,*cl=__commandline;
      size_t i=__commandlen;
      int ac;

      if(!(cline=(char *)PPCAllocVec(i+1,MEMF_ANY))) /* get buffer */
        exit(RETURN_FAIL);
  
      for(a=cline,ac=1;;) /* and parse commandline */
      {
        while(i&&(*cl==' '||*cl=='\t'||*cl=='\n'))
        { cl++;
          i--; }
        if(!i)
          break;
        if(*cl=='\"')
        {
          cl++;
          i--;
          while(i)
          {
            if(*cl=='\"')
            {
              cl++;
              i--;
              break;
            }
            if(*cl=='*')
            {
              cl++;
              i--;
              if(!i)
                break;
            }
            *a++=*cl++;
            i--;
          }
        }
        else
          while(i&&(*cl!=' '&&*cl!='\t'&&*cl!='\n'))
          { *a++=*cl++;
            i--; }
        *a++='\0';
        ac++;
      }
        /* NULL Terminated */
      if(!(__argv=av=(char **)PPCAllocVec(((__argc=ac-1)+1)*sizeof(char *),MEMF_ANY|MEMF_CLEAR)))
        exit(RETURN_FAIL);

      for(a=cline,i=1;i<ac;i++)
      { 
        av[i-1]=a;
        while(*a++)
          ; 
      }
    }
}
void __initcommandline(void)
{
  struct WBStartup *wbs=_WBenchMsg;

  if(wbs!=NULL)
  { if(__stdiowin[0])
    { BPTR win;

      if((window=win=Open(__stdiowin,MODE_OLDFILE))==0l)
        exit(RETURN_FAIL);
      SelectInput(win);
      SelectOutput(win);
    }
    if(wbs->sm_ArgList!=NULL) /* cd to icon */
      cd=CurrentDir(DupLock(wbs->sm_ArgList->wa_Lock));

    __argc=0;
    __argv=(char **)wbs;
  }else
  { 
    char **av,*a,*cl=__commandline;
    size_t i=__commandlen;
    int ac;

    if(!(cline=(char *)AllocVec(i+1,MEMF_ANY))) /* get buffer */
      exit(RETURN_FAIL);
  
    for(a=cline,ac=1;;) /* and parse commandline */
    {
      while(i&&(*cl==' '||*cl=='\t'||*cl=='\n'))
      { cl++;
        i--; }
      if(!i)
        break;
      if(*cl=='\"')
      {
        cl++;
        i--;
        while(i)
        {
          if(*cl=='\"')
          {
            cl++;
            i--;
            break;
          }
          if(*cl=='*')
          {
            cl++;
            i--;
            if(!i)
              break;
          }
          *a++=*cl++;
          i--;
        }
      }
      else
        while(i&&(*cl!=' '&&*cl!='\t'&&*cl!='\n'))
        { *a++=*cl++;
          i--; }
      *a++='\0';
      ac++;
    }
      /* NULL Terminated */
    if(!(__argv=av=(char **)AllocVec(((__argc=ac)+1)*sizeof(char *),MEMF_ANY|MEMF_CLEAR)))
      exit(RETURN_FAIL);

    for(a=cline,i=1;i<ac;i++)
    { 
      av[i]=a;
      while(*a++)
        ; 
    }
  
    for(i=256;;i+=256) /* try in steps of 256 bytes */
    { if(!(*av=(char *)AllocVec(i,MEMF_ANY)))
        break;
      GetProgramName(*av,i); /* Who am I ? */
      if(IoErr()!=ERROR_LINE_TOO_LONG)
        break;
      FreeVec(*av);
    }
  
    if(*av==NULL)
      exit(RETURN_FAIL);
  }
}