[Pyobjc-dev] Re: [Pyobjc-checkins] CVS: pyobjc/Examples/TableModel2 main.m,1.4,1.5
Brought to you by:
ronaldoussoren
From: Just v. R. <ju...@le...> - 2002-11-22 20:45:58
|
Look, the patch below shows _exactly_ why I don't like the execve wrapper to written in anything but Python. I can't even tell (but then again, I'm lazy) whether this prepends or sets or appends PYTHONPATH. (Ronald, please don't take this as an insult, the code is just fine, I'm just trying to make a further argument for the Python version...) I will apply a similar patch to the execve wrapper, but I need to do different things in different situations: When building an applet: - append PYTHONPATH (not prepend as that kindof defeats its purpose) When building a fully standalone app: - set PYTHONHOME to something inside the bundle, just to make sure no modules can be loaded from anywhere but the bundle - set or replace PYTHONPATH. A bogus PYTHONPATH could otherwise break the app. With the Python version this is trivial to do. For main.c this would add yet another 20 or so lines of terse C code. Just Ronald Oussoren wrote (on the checkins list): > Update of /cvsroot/pyobjc/pyobjc/Examples/TableModel2 > In directory sc8-pr-cvs1:/tmp/cvs-serv9080 > > Modified Files: > main.m > Log Message: > Set PYTHONPATH in main.m > > Index: main.m > =================================================================== > RCS file: /cvsroot/pyobjc/pyobjc/Examples/TableModel2/main.m,v > retrieving revision 1.4 > retrieving revision 1.5 > diff -C2 -d -r1.4 -r1.5 > *** main.m 18 Oct 2002 19:08:57 -0000 1.4 > --- main.m 22 Nov 2002 20:26:12 -0000 1.5 > *************** > *** 22,25 **** > --- 22,56 ---- > NSMutableArray *bundlePaths = [[NSMutableArray array] retain]; > int i; > + int envc; > + char** childEnvp; > + char* PYTHONPATH = NULL; > + > + for (envc = 0; envp[envc] != NULL; envc++) { > + if (strncmp(envp[envc], "PYTHONPATH=", sizeof("PYTHONPATH=")-1) == 0) { > + PYTHONPATH=envp[envc] + sizeof("PYTHONPATH=") - 1; > + /* No break, we also want to know how large envp is */ > + } > + } > + > + childEnvp = alloca(sizeof(char*) * (envc + 2)); > + for (envc = 0; envp[envc] != NULL; envc ++) { > + if (strncmp(envp[envc], "PYTHONPATH=", sizeof("PYTHONPATH=")-1) == 0) { > + const char* s = [[[NSBundle mainBundle] resourcePath] UTF8String]; > + childEnvp[envc] = alloca(strlen(envp[envc]) + strlen(s) + 2); > + sprintf(childEnvp[envc], "%s:%s", envp[envc], s); > + > + } else { > + childEnvp[envc] = envp[i]; > + } > + } > + if (PYTHONPATH) { > + envp[envc] = NULL; > + } else { > + const char* s = [[[NSBundle mainBundle] resourcePath] UTF8String]; > + childEnvp[envc] = alloca(sizeof("PYTHONPATH=") + strlen(s)); > + sprintf(childEnvp[envc], "PYTHONPATH=%s", s); > + childEnvp[envc+1] = NULL; > + } > + > > while ( aBundle = [bundleEnumerator nextObject] ) { > *************** > *** 56,60 **** > childArgv[i+3] = NULL; > > ! return execve(pythonBinPathPtr, (char **)childArgv, envp); > } > > --- 87,93 ---- > childArgv[i+3] = NULL; > > ! i = execve(pythonBinPathPtr, (char **)childArgv, (char**) childEnvp); > ! if (i == -1) perror("execv"); > ! return 1; > } |