xref: /onnv-gate/usr/src/lib/libast/common/path/pathprog.c (revision 12068:08a39a083754)
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