// 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); } }
/* 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); }
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; }
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; }
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); } }