110898Sroland.mainz@nrubsig.org /*********************************************************************** 210898Sroland.mainz@nrubsig.org * * 310898Sroland.mainz@nrubsig.org * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property * 510898Sroland.mainz@nrubsig.org * and is licensed under the * 610898Sroland.mainz@nrubsig.org * Common Public License, Version 1.0 * 710898Sroland.mainz@nrubsig.org * by AT&T Intellectual Property * 810898Sroland.mainz@nrubsig.org * * 910898Sroland.mainz@nrubsig.org * A copy of the License is available at * 1010898Sroland.mainz@nrubsig.org * http://www.opensource.org/licenses/cpl1.0.txt * 1110898Sroland.mainz@nrubsig.org * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 1210898Sroland.mainz@nrubsig.org * * 1310898Sroland.mainz@nrubsig.org * Information and Software Systems Research * 1410898Sroland.mainz@nrubsig.org * AT&T Research * 1510898Sroland.mainz@nrubsig.org * Florham Park NJ * 1610898Sroland.mainz@nrubsig.org * * 1710898Sroland.mainz@nrubsig.org * Glenn Fowler <gsf@research.att.com> * 1810898Sroland.mainz@nrubsig.org * David Korn <dgk@research.att.com> * 1910898Sroland.mainz@nrubsig.org * Phong Vo <kpv@research.att.com> * 2010898Sroland.mainz@nrubsig.org * * 2110898Sroland.mainz@nrubsig.org ***********************************************************************/ 2210898Sroland.mainz@nrubsig.org #pragma prototyped 2310898Sroland.mainz@nrubsig.org /* 2410898Sroland.mainz@nrubsig.org * Glenn Fowler 2510898Sroland.mainz@nrubsig.org * AT&T Research 2610898Sroland.mainz@nrubsig.org * 2710898Sroland.mainz@nrubsig.org * return the full path of the current program in path 2810898Sroland.mainz@nrubsig.org * command!=0 is used as a default 2910898Sroland.mainz@nrubsig.org */ 3010898Sroland.mainz@nrubsig.org 3110898Sroland.mainz@nrubsig.org #include <ast.h> 3210898Sroland.mainz@nrubsig.org 3310898Sroland.mainz@nrubsig.org #if _WINIX 3410898Sroland.mainz@nrubsig.org #include <ast_windows.h> 3510898Sroland.mainz@nrubsig.org #include <ctype.h> 3610898Sroland.mainz@nrubsig.org #endif 3710898Sroland.mainz@nrubsig.org 3810898Sroland.mainz@nrubsig.org #include "FEATURE/prog" 3910898Sroland.mainz@nrubsig.org 4010898Sroland.mainz@nrubsig.org static size_t 4110898Sroland.mainz@nrubsig.org prog(const char* command, char* path, size_t size) 4210898Sroland.mainz@nrubsig.org { 4310898Sroland.mainz@nrubsig.org ssize_t n; 4410898Sroland.mainz@nrubsig.org #if _WINIX || _lib_getexecname 4510898Sroland.mainz@nrubsig.org char* s; 4610898Sroland.mainz@nrubsig.org #endif 4710898Sroland.mainz@nrubsig.org #if _WINIX 4810898Sroland.mainz@nrubsig.org char* t; 4910898Sroland.mainz@nrubsig.org char* e; 5010898Sroland.mainz@nrubsig.org int c; 5110898Sroland.mainz@nrubsig.org int q; 5210898Sroland.mainz@nrubsig.org #endif 5310898Sroland.mainz@nrubsig.org 5410898Sroland.mainz@nrubsig.org #ifdef _PROC_PROG 5510898Sroland.mainz@nrubsig.org if ((n = readlink(_PROC_PROG, path, size)) > 0) 5610898Sroland.mainz@nrubsig.org { 5710898Sroland.mainz@nrubsig.org if (n < size) 5810898Sroland.mainz@nrubsig.org path[n] = 0; 5910898Sroland.mainz@nrubsig.org return n; 6010898Sroland.mainz@nrubsig.org } 6110898Sroland.mainz@nrubsig.org #endif 6210898Sroland.mainz@nrubsig.org #if _lib_getexecname 6310898Sroland.mainz@nrubsig.org if (s = (char*)getexecname()) 6410898Sroland.mainz@nrubsig.org { 6510898Sroland.mainz@nrubsig.org n = strlen(s); 6610898Sroland.mainz@nrubsig.org if (n < size) 6710898Sroland.mainz@nrubsig.org strcpy(path, s); 6810898Sroland.mainz@nrubsig.org return n; 6910898Sroland.mainz@nrubsig.org } 7010898Sroland.mainz@nrubsig.org #endif 7110898Sroland.mainz@nrubsig.org #if _WINIX 7210898Sroland.mainz@nrubsig.org if (s = GetCommandLine()) 7310898Sroland.mainz@nrubsig.org { 7410898Sroland.mainz@nrubsig.org n = 0; 7510898Sroland.mainz@nrubsig.org q = 0; 7610898Sroland.mainz@nrubsig.org t = path; 7710898Sroland.mainz@nrubsig.org e = path + size - 1; 7810898Sroland.mainz@nrubsig.org while (c = *s++) 7910898Sroland.mainz@nrubsig.org { 8010898Sroland.mainz@nrubsig.org if (c == q) 8110898Sroland.mainz@nrubsig.org q = 0; 8210898Sroland.mainz@nrubsig.org else if (!q && c == '"') 8310898Sroland.mainz@nrubsig.org q = c; 8410898Sroland.mainz@nrubsig.org else if (!q && isspace(c)) 8510898Sroland.mainz@nrubsig.org break; 8610898Sroland.mainz@nrubsig.org else if (t < e) 8710898Sroland.mainz@nrubsig.org *t++ = c == '\\' ? '/' : c; 8810898Sroland.mainz@nrubsig.org else 8910898Sroland.mainz@nrubsig.org n++; 9010898Sroland.mainz@nrubsig.org } 9110898Sroland.mainz@nrubsig.org if (t < e) 9210898Sroland.mainz@nrubsig.org *t = 0; 9310898Sroland.mainz@nrubsig.org return (t - path) + n; 9410898Sroland.mainz@nrubsig.org } 9510898Sroland.mainz@nrubsig.org #endif 9610898Sroland.mainz@nrubsig.org if (command) 9710898Sroland.mainz@nrubsig.org { 9810898Sroland.mainz@nrubsig.org if ((n = strlen(command) + 1) <= size) 9910898Sroland.mainz@nrubsig.org memcpy(path, command, n); 10010898Sroland.mainz@nrubsig.org return n; 10110898Sroland.mainz@nrubsig.org } 10210898Sroland.mainz@nrubsig.org return 0; 10310898Sroland.mainz@nrubsig.org } 10410898Sroland.mainz@nrubsig.org 10510898Sroland.mainz@nrubsig.org size_t 10610898Sroland.mainz@nrubsig.org pathprog(const char* command, char* path, size_t size) 10710898Sroland.mainz@nrubsig.org { 10810898Sroland.mainz@nrubsig.org ssize_t n; 10910898Sroland.mainz@nrubsig.org char buf[PATH_MAX]; 11010898Sroland.mainz@nrubsig.org 11110898Sroland.mainz@nrubsig.org if ((n = prog(command, path, size)) > 0 && n <= size && *path != '/') 11210898Sroland.mainz@nrubsig.org { 11310898Sroland.mainz@nrubsig.org if (!pathpath(buf, path, NiL, PATH_REGULAR|PATH_EXECUTE)) 11410898Sroland.mainz@nrubsig.org n = 0; 11510898Sroland.mainz@nrubsig.org else if ((n = strlen(buf) + 1) <= size) 11610898Sroland.mainz@nrubsig.org memcpy(path, buf, n); 11710898Sroland.mainz@nrubsig.org } 11810898Sroland.mainz@nrubsig.org return n; 11910898Sroland.mainz@nrubsig.org } 120