| Re: [AD] get_executable_name in unix |
[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]
Peter Wang wrote on Sat Apr 08, 2000 um 12:31:10PM: > I'm not a code-Nazi, and the file in question isn't even mine, but > could you please keep your patches consistent with the rest of the > file? Some things I noted: So, I corrected the things that Peter pointed out, copied the code to the linux driver also and added my comment to the docs. New patch is attached. > BTW, I'm pretty sure Michael would know that it's not "X-Windows", > but just doesn't care. What's in a name? Valid names are listed in X(1), registed is "X Window System". Greetings, Eduard. -- ===================================================================== Eduard Bloch <eb@xxxxxxxxxx>; HP: http://eduard.bloch.com/edecosi 0xEDF008C5(gpg): E6EB 98E2 B885 8FF0 6C04 5C1D E106 481E EDF0 08C5
diff -u --recursive --new-file allegro-3.9.32.orig/docs/allegro._tx allegro-3.9.32/docs/allegro._tx
--- allegro-3.9.32.orig/docs/allegro._tx Mon Mar 13 01:24:00 2000
+++ allegro-3.9.32/docs/allegro._tx Sat Apr 8 21:17:17 2000
@@ -4704,6 +4704,11 @@
Fills buf with the full path to the current executable, returning at most
size bytes.
+ On Linux and Unix platforms, the executed binary will be searched
+ in the $PATH environment if argv[0] doesn't contain the full pathname
+ (eg. if the executed binary is somewhere in the path and was called
+ directly from the command line).
+
@@char *@fix_filename_case(char *path);
@xref fix_filename_slashes, fix_filename_path
Converts a filename to a standardised case. On DOS platforms, they will
diff -u --recursive --new-file allegro-3.9.32.orig/src/linux/lsystem.c allegro-3.9.32/src/linux/lsystem.c
--- allegro-3.9.32.orig/src/linux/lsystem.c Mon Mar 13 01:23:49 2000
+++ allegro-3.9.32/src/linux/lsystem.c Sat Apr 8 21:06:52 2000
@@ -27,6 +27,8 @@
#include "allegro/aintvga.h"
#include "linalleg.h"
+#include <sys/stat.h>
+
#ifdef HAVE_SYS_IO_H
/* This exists in Red Hat systems, at least, and defines the iopl function
* which, contrary to the documentation, is left out of unistd.h.
@@ -219,7 +221,40 @@
*/
static void sys_linux_get_executable_name (char *output, int size)
{
- do_uconvert (__crt0_argv[0], U_ASCII, output, U_CURRENT, size);
+ int c,entries=0, i=0;
+ char *path,path_parts[30][250];
+ struct stat finfo;
+
+ path=(char *)getenv("PATH");
+ if (path) {
+ for (c=0; c<strlen(path); c++) {
+ if (path[c]==':') {
+ path_parts[entries][i]='\0'; /* terminate it*/
+ entries++;
+ i=0;
+ }
+ else {
+ path_parts[entries][i]=path[c];
+ i++;
+ }
+ path_parts[entries][i]='\0'; /* terminate the last string */
+ }
+ }
+ if (entries!=0 && (!strchr(__crt0_argv[0], '/'))) {
+ /* if path is decoded and program called without /'s */
+ for (c=0; c<=entries; c++) {
+ strcat(path_parts[c], "/"); /* append "/" + argv[0] */
+ strcat(path_parts[c], __crt0_argv[0]);
+ if ((stat(path_parts[c], &finfo)==0) && (!S_ISDIR (finfo.st_mode))) {
+ // check if it is a valid file and not a directory
+ do_uconvert (path_parts[c], U_ASCII, output, U_CURRENT, size);
+ return;
+ }
+ }
+ }
+ else {
+ do_uconvert (__crt0_argv[0], U_ASCII, output, U_CURRENT, size);
+ }
}
diff -u --recursive --new-file allegro-3.9.32.orig/src/x/xsystem.c allegro-3.9.32/src/x/xsystem.c
--- allegro-3.9.32.orig/src/x/xsystem.c Mon Mar 13 01:23:53 2000
+++ allegro-3.9.32/src/x/xsystem.c Sat Apr 8 21:06:39 2000
@@ -11,8 +11,11 @@
* Main system driver for the X-Windows library.
*
* By Michael Bukin.
+ *
+ * Searching in $PATH by Eduard Bloch
*
* See readme.txt for copyright information.
+ *
*/
@@ -25,6 +28,8 @@
#include <sys/time.h>
#include <unistd.h>
+#include <sys/stat.h>
+#include <string.h>
void (*_xwin_keyboard_interrupt)(int pressed, int code) = 0;
@@ -45,13 +50,13 @@
static _DRIVER_INFO *_xwin_sysdrv_timer_drivers(void);
-/* the main system driver for running under X-Windows */
+/* the main system driver for running under X11 */
SYSTEM_DRIVER system_xwin =
{
SYSTEM_XWINDOWS,
empty_string,
empty_string,
- "X-Windows",
+ "X Window System",
_xwin_sysdrv_init,
_xwin_sysdrv_exit,
_xwin_sysdrv_get_executable_name,
@@ -219,10 +224,48 @@
/* _xwin_sysdrv_get_executable_name:
* Return full path to the current executable.
+ *
+ * <Comment for the manpage:> On Unix systems, if the program was
+ * called without the complete path-name (eg. because it is placed
+ * somewhere in $PATH) the PATH environment will be searched for the
+ * correct binary file.
*/
static void _xwin_sysdrv_get_executable_name(char *output, int size)
{
- do_uconvert(__crt0_argv[0], U_ASCII, output, U_CURRENT, size);
+ int c,entries=0, i=0;
+ char *path,path_parts[30][250];
+ struct stat finfo;
+
+ path=(char *)getenv("PATH");
+ if (path) {
+ for (c=0; c<strlen(path); c++) {
+ if (path[c]==':') {
+ path_parts[entries][i]='\0'; /* terminate it*/
+ entries++;
+ i=0;
+ }
+ else {
+ path_parts[entries][i]=path[c];
+ i++;
+ }
+ path_parts[entries][i]='\0'; /* terminate the last string */
+ }
+ }
+ if (entries!=0 && (!strchr(__crt0_argv[0], '/'))) {
+ /* if path is decoded and program called without /'s */
+ for (c=0; c<=entries; c++) {
+ strcat(path_parts[c], "/"); /* append "/" + argv[0] */
+ strcat(path_parts[c], __crt0_argv[0]);
+ if ((stat(path_parts[c], &finfo)==0) && (!S_ISDIR (finfo.st_mode))) {
+ // check if it is a valid file and not a directory
+ do_uconvert (path_parts[c], U_ASCII, output, U_CURRENT, size);
+ return;
+ }
+ }
+ }
+ else {
+ do_uconvert (__crt0_argv[0], U_ASCII, output, U_CURRENT, size);
+ }
}
Attachment:
pgp6xYnBocr7u.pgp
Description: PGP signature
| Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |