#include <exec/types.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <proto/dos.h>
#include <proto/exec.h>
void addPath(BPTR newPath) {
struct Process *proc = (struct Process *)FindTask(NULL);
struct CommandLineInterface *cli = (struct CommandLineInterface *)BADDR(proc->pr_CLI);
BPTR *oldPathList, *newPathList;
LONG oldPathCount = 0;
LONG i;
// Get the current path list
oldPathList = (BPTR *)BADDR(cli->cli_CommandDir);
// Count the current paths
while (oldPathList[oldPathCount] != (BPTR)NULL) {
oldPathCount++;
}
// Allocate new path list (old paths + new path + null terminator)
newPathList = AllocVec(sizeof(BPTR) * (oldPathCount + 2), MEMF_CLEAR);
if (!newPathList) {
return; // Memory allocation failed
}
// Copy old paths to new path list
for (i = 0; i < oldPathCount; i++) {
newPathList[i] = oldPathList[i];
}
// Add new path
newPathList[oldPathCount] = newPath;
// Update the CLI structure with the new path list
cli->cli_CommandDir = MKBADDR(newPathList);
// Free the old path list
FreeVec(oldPathList);
}
int main() {
BPTR newPath;
// Convert the directory string to a lock (e.g., "SYS:C/")
newPath = Lock("SYS:C/", ACCESS_READ);
if (newPath) {
addPath(newPath);
// Clean up
UnLock(newPath);
}
return 0;
}@Rafael/ARMO, post #1
(...)
IF wbmessage<>NIL
->Start z WB, próba przekształcenia w CLI
wb_into_CLI()
ENDIF
(...)PROC wb_into_CLI()
DEF
wbCLI=NIL:PTR TO commandlineinterface,
wbPort=NIL:PTR TO mp,
wbProc=NIL:PTR TO process,
wbMsg=NIL:PTR TO wbstartup
process := FindTask(NIL);
cli := BADDR (process.cli)
-> jesli masz cli, to nie mieszaj
IF cli THEN RETURN;
/* kopiowanie cli Workbencha do procesu */
wbMsg:=wbmessage
Forbid()
IF (wbPort := wbMsg.message.replyport)
IF ((wbPort.flags AND PF_ACTION) = PA_SIGNAL)
IF (wbProc := wbPort.sigtask)
IF (wbProc.task.ln.type = NT_PROCESS)
IF (wbCLI := BADDR(wbProc.cli))
process.cli:=wbProc.cli
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
Permit()
ENDPROC@vojo, post #2
(struct Process *)FindTask("Workbench")@Rafael/ARMO, post #4
@Rafael/ARMO, post #1
@cholok, post #6
@cholok, post #6
@Rafael/ARMO, post #4
wydaje mi się że zamiast przechodzić po kolejnych zagłębieniach w strukturach aby dostać proces Workbench, można to samo uzyskać czytelniej za pomocą:
(struct Process *)FindTask("Workbench")
Druga sprawa dotyczy listy z wbProc.cli (wpProc->pr_CLI) i zwykłego skopiowanie wskaźnika do własnego procesu (co jest w Twoim kodzie: process.cli:=wbProc.cli). Czy czasem jak nasz proces zostanie zamknięty, to nie nastąpi zwolnienie pamięci tej listy
@vojo, post #10
No jeśli program zwalniałby zasoby których nie alokował, to wg mnie byłby to błąd.
E takich rzeczy nie robi, automatycznie zwalnia tylko zasoby jawnie zaalokowane (np. przez funkcje New() czy String()).
PS. Ciekawe jak to by zadziałało przy "zamiennikach" Workbencha typu Scalos czy Magellan...
edit: chodzi mi o to czy Scalos zwróci coś dla FindTask("Workbench")
@Rafael/ARMO, post #8
Można owszem przekazać NP_Path w przypadku SystemTags() ale dla Execute() już tak nie jest.
Dlatego zależy mi aby Path był ustawiony w obrębie naszego procesu.
@Hexmage960, post #12
Hej, jeśli chodzi o Execute(), to podobnie jak polecenie EXECUTE wykonuje ono skrypt AmigaDOSa. Więc prawdopodobnie możesz użyć polecenia PATH do uzupełnienia ścieżki. [...]
@Rafael/ARMO, post #13
@vojo, post #14
void PrintPathLockList()
{
Forbid();
const struct Task *pWorkbenchTask = (struct Task *)FindTask("Workbench");
Permit();
if (!pWorkbenchTask || pWorkbenchTask->tc_Node.ln_Type != NT_PROCESS)
return;
const struct Process *pWorkbenchProcess = (struct Process *)pWorkbenchTask;
const struct CommandLineInterface *pCli = (struct CommandLineInterface *)BADDR(pWorkbenchProcess->pr_CLI);
if (!pCli)
return;
char buffer[256];
const struct FileLock *pFileLock = (struct FileLock *)BADDR(pCli->cli_CommandDir);
while (pFileLock)
{
printf("lock: 0x%08x", pFileLock->fl_Key);
if (NameFromLock(pFileLock->fl_Key, buffer, sizeof(buffer)))
printf(" name: %s\n", buffer);
else
printf("\n");
pFileLock = (struct FileLock *)BADDR(pFileLock->fl_Link);
}
}@Rafael/ARMO, post #16
BPTR script = Open("SkryptDOS", MODE_OLDFILE);
Execute("", script, Output());