From 7f18624d2d8d82f284b9910c120abd484c144155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alfkil=20Thorbj=C3=B8rn=20Wennermark?= Date: Sat, 14 Sep 2024 19:47:54 +0200 Subject: [PATCH 1/2] Fix popen/pclose and add test for popen. --- library/misc/children.c | 54 ++++++++++++++++++++++++++-- library/misc/children.h | 4 ++- library/shared_library/clib4.h | 1 + library/stdio/popen.c | 58 ++++++++++++++++++++++++++----- test_programs/popen/child | Bin 0 -> 6274 bytes test_programs/popen/child.c | 3 ++ test_programs/popen/popen_test | Bin 0 -> 53462 bytes test_programs/popen/popen_test.c | 25 +++++++++++++ 8 files changed, 132 insertions(+), 13 deletions(-) create mode 100644 test_programs/popen/child create mode 100644 test_programs/popen/child.c create mode 100644 test_programs/popen/popen_test create mode 100644 test_programs/popen/popen_test.c diff --git a/library/misc/children.c b/library/misc/children.c index a86f2d46..02193f1c 100644 --- a/library/misc/children.c +++ b/library/misc/children.c @@ -31,6 +31,15 @@ pidChildrenScan(const void *children, void *pid) { return NULL; } +static void * +pipeChildrenScan(const void *children, void *pipe) { + const struct Clib4Children *myChildren = children; + FILE *stream = *((FILE **)pipe); + if (myChildren->pipe == stream) + return (struct Clib4Children *) children; + return NULL; +} + BOOL insertSpawnedChildren(uint32 pid, uint32 ppid, uint32 gid) { DECLARE_UTILITYBASE(); @@ -79,6 +88,46 @@ findSpawnedChildrenByPid(uint32 pid) { struct Clib4Children * findSpawnedChildrenByGid(uint32 pid, uint32 gid) { + struct Clib4Resource *res = (APTR) OpenResource(RESOURCE_NAME); + if (res) { + uint32 me = GetPID(0, GPID_PROCESS); + size_t iter = 0; + void *item; + + while (hashmap_iter(res->children, &iter, &item)) { + const struct Clib4Node *node = item; + // struct Clib4Children *children; + if (node->pid == me) { + //children = + return hashmap_scan_item(node->spawnedProcesses, gidChildrenScan, &gid); + } + } + } + return NULL; +} + +pid_t +findSpawnedChildrenPidByPipe(FILE *pipe) { + struct Clib4Resource *res = (APTR) OpenResource(RESOURCE_NAME); + if (res) { + uint32 me = GetPID(0, GPID_PROCESS); + size_t iter = 0; + void *item; + + while (hashmap_iter(res->children, &iter, &item)) { + const struct Clib4Node *node = item; + struct Clib4Children *children; + if (node->pid == me) { + children = hashmap_scan_item(node->spawnedProcesses, pipeChildrenScan, &pipe); + if(children) return children->pid; + } + } + } + return -1; +} + +void +addSpawnedChildrenPipeHandle(uint32 pid, FILE *pipe) { struct Clib4Resource *res = (APTR) OpenResource(RESOURCE_NAME); if (res) { uint32 me = GetPID(0, GPID_PROCESS); @@ -90,12 +139,11 @@ findSpawnedChildrenByGid(uint32 pid, uint32 gid) { struct Clib4Children *children; if (node->pid == me) { children = hashmap_scan_item(node->spawnedProcesses, pidChildrenScan, &pid); - if (children->groupId == gid) - return children; + if (children) children->pipe = pipe; + break; } } } - return NULL; } void diff --git a/library/misc/children.h b/library/misc/children.h index 235d6448..865d4691 100644 --- a/library/misc/children.h +++ b/library/misc/children.h @@ -10,7 +10,9 @@ BOOL insertSpawnedChildren(uint32 pid, uint32 ppid, uint32 gid); struct Clib4Children *findSpawnedChildrenByPid(uint32 pid); struct Clib4Children *findSpawnedChildrenByGid(uint32 pid, uint32 gid); +void addSpawnedChildrenPipeHandle(uint32 pid, FILE *pipe); +pid_t findSpawnedChildrenPidByPipe(FILE *pipe); void spawnedProcessExit(int32 rc, int32 data UNUSED); -void spawnedProcessEnter(int32 entry_data UNUSED); +void spawnedProcessEnter(int32 entry_data); #endif \ No newline at end of file diff --git a/library/shared_library/clib4.h b/library/shared_library/clib4.h index f3cda4bb..a1d09bb6 100644 --- a/library/shared_library/clib4.h +++ b/library/shared_library/clib4.h @@ -68,6 +68,7 @@ struct Clib4Children { uint32 pid; /* the process PID */ gid_t groupId; /* Group ID of process */ uint32 returnCode; /* the return code of process */ + FILE *pipe; }; int libReserved(void); diff --git a/library/stdio/popen.c b/library/stdio/popen.c index 5afbd4b9..bd086735 100644 --- a/library/stdio/popen.c +++ b/library/stdio/popen.c @@ -11,6 +11,7 @@ #endif /* _STDLIB_MEMORY_H */ #include "children.h" +#include int pclose(FILE *stream) { @@ -31,12 +32,17 @@ pclose(FILE *stream) { goto out; } + int status = 0; + pid_t pid = findSpawnedChildrenPidByPipe(stream); + waitpid(pid, &status, 0); + fclose(stream); /* ZZZ we actually could catch the program's termination code * by passing an exit function address to SystemTags() below. */ - result = OK; + if(status != -1) + result = WEXITSTATUS(status); out: @@ -50,12 +56,13 @@ popen(const char *command, const char *type) { char *command_copy = NULL; BPTR input = BZERO; BPTR output = BZERO; - char pipe_file_name[40]; + // char pipe_file_name[40]; FILE *result = NULL; LONG status; - unsigned long task_address; - time_t now = 0; + // unsigned long task_address; + // time_t now = 0; int i; + struct _clib4 *__clib4 = __CLIB4; ENTER(); @@ -173,6 +180,11 @@ popen(const char *command, const char *type) { command = command_copy; } + // Let's use out super cool pipe implementation instead : + int p[2]; + pipe(p); + +#if 0 /* Build a (hopefully) unique name for the pipe stream to open. We construct it from the current process address, converted into an octal number, followed by the current time (in seconds), @@ -199,18 +211,32 @@ popen(const char *command, const char *type) { pipe_file_name[i] = '\0'; SHOWSTRING(pipe_file_name); +#endif /* Now open the input and output streams for the program to launch. */ if (type[0] == 'r') { /* Read mode: we want to read the output of the program; the program should read from "NIL:". */ input = Open("NIL:", MODE_NEWFILE); - if (input != BZERO) - output = Open(pipe_file_name, MODE_NEWFILE); + if (input != BZERO) { + // output = Open(pipe_file_name, MODE_NEWFILE); + int err = __get_default_file(p[1], &output); + if (err) { + __set_errno(EBADF); + goto out; + } + output = DupFileHandle(output); + } } else { /* Write mode: we want to send data to the program; the program should write to "NIL:". */ - input = Open(pipe_file_name, MODE_NEWFILE); + // input = Open(pipe_file_name, MODE_NEWFILE); + int err = __get_default_file(p[0], &input); + if (err) { + __set_errno(EBADF); + goto out; + } + input = DupFileHandle(input); if (input != BZERO) output = Open("NIL:", MODE_NEWFILE); } @@ -222,6 +248,7 @@ popen(const char *command, const char *type) { __set_errno_r(__clib4, __translate_io_error_to_errno(IoErr())); goto out; } + D(("Launching [%s]", command)); /* Now try to launch the program. */ status = SystemTags((STRPTR) command, @@ -231,12 +258,16 @@ popen(const char *command, const char *type) { SYS_UserShell, TRUE, NP_Name, command, NP_EntryCode, spawnedProcessEnter, + NP_EntryData, getgid(), NP_ExitCode, spawnedProcessExit, NP_Child, TRUE, TAG_END); + uint32 ret; + /* If launching the program returned -1 then it could not be started. We'll need to close the I/O streams we opened above. */ + if (status == -1) { SHOWMSG("SystemTagList() failed"); @@ -248,14 +279,23 @@ popen(const char *command, const char *type) { * If mode is set as P_NOWAIT we can retrieve process id calling IoErr() * just after SystemTags. In this case spawnv will return pid */ - uint32 ret = IoErr(); // This is our ProcessID; + ret = IoErr(); // This is our ProcessID; } /* OK, the program is running. Once it terminates, it will automatically shut down the streams we opened for it. */ input = output = BZERO; /* Now try to open the pipe we will use to exchange data with the program. */ - result = fopen(pipe_file_name, type); + // result = fopen(pipe_file_name, type); + + if (type[0] == 'r') { + result = fdopen(p[0], "r"); + close(p[1]); + } else { + result = fdopen(p[1], "w"); + close(p[0]); + } + if(result) addSpawnedChildrenPipeHandle(ret, result); //pid, pipe out: diff --git a/test_programs/popen/child b/test_programs/popen/child new file mode 100644 index 0000000000000000000000000000000000000000..66a6b73bb6f2852432c68b5263d86b3cd824e812 GIT binary patch literal 6274 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 +#include +int main() { + enableUnixPaths(); + FILE *proc; + int i; + for(i = 0; i < 100; i++) +// if (proc = popen("list", "r")) { + if (proc = popen("/SDK/gcc/bin/gcc -mcrt=clib4 -Wl,--verbose xc++ -o NIL:", "r")) { + usleep(100); + while (!feof(proc)) { + char buff[10 * 1024]; + size_t read_in = fread(buff, 1, sizeof(buff), proc); + if (!read_in) + break; + buff[read_in+1] = '\0'; + printf("%s\n", buff); + } + int ec = pclose(proc); + + printf("return code : %d\n", ec); + } + + return 0; +} \ No newline at end of file From 6c4611249c78f903cfa9cb6d82664c18002c3d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alfkil=20Thorbj=C3=B8rn=20Wennermark?= Date: Sat, 14 Sep 2024 20:20:15 +0200 Subject: [PATCH 2/2] Delete executables from popen test folder. --- test_programs/popen/child | Bin 6274 -> 0 bytes test_programs/popen/popen_test | Bin 53462 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test_programs/popen/child delete mode 100644 test_programs/popen/popen_test diff --git a/test_programs/popen/child b/test_programs/popen/child deleted file mode 100644 index 66a6b73bb6f2852432c68b5263d86b3cd824e812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6274 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