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
prog(const char * command,char * path,size_t size)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
pathprog(const char * command,char * path,size_t size)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