Index: ossp-pkg/path/Makefile.in RCS File: /v/ossp/cvs/ossp-pkg/path/Makefile.in,v rcsdiff -q -kk '-r1.3' '-r1.4' -u '/v/ossp/cvs/ossp-pkg/path/Makefile.in,v' 2>/dev/null --- Makefile.in 2002/08/03 21:00:14 1.3 +++ Makefile.in 2002/08/23 15:33:18 1.4 @@ -51,7 +51,7 @@ LIB_NAME = libpath.la LIB_OBJS = path_abs2rel.lo path_rel2abs.lo path_resolve.lo \ - path_dirname.lo path_basename.lo path_temp.lo path_util.lo + path_dirname.lo path_basename.lo path_temp.lo path_self.lo path_util.lo TST_NAME = path_test TST_OBJS = path_test.o Index: ossp-pkg/path/path.h RCS File: /v/ossp/cvs/ossp-pkg/path/path.h,v rcsdiff -q -kk '-r1.3' '-r1.4' -u '/v/ossp/cvs/ossp-pkg/path/path.h,v' 2>/dev/null --- path.h 2002/08/03 21:00:14 1.3 +++ path.h 2002/08/23 15:33:18 1.4 @@ -37,7 +37,9 @@ PATH_ERR_USE, PATH_ERR_INT, PATH_ERR_SYS, - PATH_ERR_EXS + PATH_ERR_MEM, + PATH_ERR_EXS, + PATH_ERR_NFD } path_rc_t; typedef enum { @@ -51,6 +53,7 @@ char *path_dirname (char *, size_t, const char *); char *path_basename (char *, size_t, const char *); path_rc_t path_temp(path_temp_t id, const char *tmpl, char **res_ptr, size_t *res_size, int *res_fd); +path_rc_t path_self (char *res_buf, size_t res_size, const char *argv0); #endif /* __PATH_H__ */ Index: ossp-pkg/path/path_self.c RCS File: /v/ossp/cvs/ossp-pkg/path/path_self.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/path/path_self.c,v' | diff -u /dev/null - -L'ossp-pkg/path/path_self.c' 2>/dev/null --- ossp-pkg/path/path_self.c +++ - 2024-05-15 17:09:18.018040996 +0200 @@ -0,0 +1,113 @@ +/* +** OSSP path - Filesystem Path Manipulation +** Copyright (c) 2002 Ralf S. Engelschall +** Copyright (c) 2002 The OSSP Project +** Copyright (c) 2002 Cable & Wireless Deutschland +** +** This file is part of OSSP path, a filesystem path manipulation library +** which can be found at http://www.ossp.org/pkg/lib/path/. +** +** Permission to use, copy, modify, and distribute this software for +** any purpose with or without fee is hereby granted, provided that +** the above copyright notice and this permission notice appear in all +** copies. +** +** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +** +** path_self.c: resolve path to current program +*/ + +#include +#include +#include +#include +#include + +#include "path.h" + +#define PATH_DEFAULT "/bin:/sbin:/usr/bin:/usr/sbin:." + +path_rc_t path_self(char *res_buf, size_t res_size, const char *argv0) +{ + char *path; + size_t l; + struct stat sb; + char *cpB, *cpE; + size_t argv0_len; + + if (res_buf == NULL || res_size == 0 || argv0 == NULL) + return PATH_ERR_ARG; + + /* determine length of argv[0] */ + argv0_len = strlen(argv0); + + /* short-circuit if argv[0] already contains an absolute path */ + if (argv0[0] == '/') { + if (argv0_len > res_size-1) + return PATH_ERR_MEM; + memcpy(res_buf, argv0, argv0_len); + res_buf[argv0_len] = '\0'; + if (path_resolve(res_buf, res_size, res_buf) == NULL) + return PATH_ERR_SYS; + return PATH_OK; + } + + /* short-circuit if argv[0] already contains a relative path */ + if (argv0[0] == '.') { + if (getcwd(res_buf, res_size) == NULL) + return PATH_ERR_SYS; + l = strlen(res_buf); + if (res_buf[l-1] == '/') + l--; + if (l+1+argv0_len+1 > res_size) + return PATH_ERR_MEM; + res_buf[l++] = '/'; + memcpy(res_buf+l, argv0, argv0_len); + res_buf[l+argv0_len] = '\0'; + if (path_resolve(res_buf, res_size, res_buf) == NULL) + return PATH_ERR_SYS; + return PATH_OK; + } + + /* else search argv[0] in $PATH */ + if ((path = getenv("PATH")) == NULL) + path = PATH_DEFAULT; + cpE = path; + cpB = cpE; + while (*cpE != '\0') { + if ((cpE = strchr(cpB, ':')) == NULL) + cpE = strchr(cpB, '\0'); + if ((l = cpE-cpB) > 0) { + if (cpB[l-1] == '/') + l--; + if (l+1+argv0_len+1 <= res_size) { + memcpy(res_buf, cpB, l); + res_buf[l++] = '/'; + memcpy(res_buf+l, argv0, argv0_len); + res_buf[l+argv0_len] = '\0'; + if (stat(res_buf, &sb) == 0) { + if (path_resolve(res_buf, res_size, res_buf) == NULL) + return PATH_ERR_SYS; + return PATH_OK; + } + } + } + if (*cpE == '\0') + break; + cpB = cpE+1; + } + + return PATH_ERR_NFD; +} + Index: ossp-pkg/path/path_test.c RCS File: /v/ossp/cvs/ossp-pkg/path/path_test.c,v rcsdiff -q -kk '-r1.2' '-r1.3' -u '/v/ossp/cvs/ossp-pkg/path/path_test.c,v' 2>/dev/null --- path_test.c 2002/08/03 10:23:41 1.2 +++ path_test.c 2002/08/23 15:33:18 1.3 @@ -37,33 +37,108 @@ #include "path.h" +static void usage(const char *argv0, const char *error) +{ + if (error != NULL) + fprintf(stderr, "error: %s\n", error); + fprintf(stderr, "usage: %s abs2rel []\n", argv0); + fprintf(stderr, "usage: %s rel2abs []\n", argv0); + fprintf(stderr, "usage: %s resolve \n", argv0); + fprintf(stderr, "usage: %s dirname \n", argv0); + fprintf(stderr, "usage: %s basename \n", argv0); + fprintf(stderr, "usage: %s temp dir|file [