1N/A/***********************************************************************
1N/A* *
1N/A* This software is part of the ast package *
1N/A* Copyright (c) 1985-2011 AT&T Intellectual Property *
1N/A* and is licensed under the *
1N/A* Common Public License, Version 1.0 *
1N/A* by AT&T Intellectual Property *
1N/A* *
1N/A* A copy of the License is available at *
1N/A* http://www.opensource.org/licenses/cpl1.0.txt *
1N/A* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1N/A* *
1N/A* Information and Software Systems Research *
1N/A* AT&T Research *
1N/A* Florham Park NJ *
1N/A* *
1N/A* Glenn Fowler <gsf@research.att.com> *
1N/A* David Korn <dgk@research.att.com> *
1N/A* Phong Vo <kpv@research.att.com> *
1N/A* *
1N/A***********************************************************************/
1N/A#pragma prototyped
1N/A/*
1N/A * Glenn Fowler
1N/A * AT&T Research
1N/A *
1N/A * return the full path of the current program in path
1N/A * command!=0 is used as a default
1N/A */
1N/A
1N/A#include <ast.h>
1N/A
1N/A#if _WINIX
1N/A#include <ast_windows.h>
1N/A#include <ctype.h>
1N/A#endif
1N/A
1N/A#include "FEATURE/prog"
1N/A
1N/Astatic size_t
1N/Aprog(const char* command, char* path, size_t size)
1N/A{
1N/A ssize_t n;
1N/A#if _WINIX || _lib_getexecname
1N/A char* s;
1N/A#endif
1N/A#if _WINIX
1N/A char* t;
1N/A char* e;
1N/A int c;
1N/A int q;
1N/A#endif
1N/A
1N/A#ifdef _PROC_PROG
1N/A if ((n = readlink(_PROC_PROG, path, size)) > 0 && *path == '/')
1N/A {
1N/A if (n < size)
1N/A path[n] = 0;
1N/A return n;
1N/A }
1N/A#endif
1N/A#if _lib_getexecname
1N/A if ((s = (char*)getexecname()) && *s == '/')
1N/A {
1N/A n = strlen(s);
1N/A if (n < size)
1N/A strcpy(path, s);
1N/A return n;
1N/A }
1N/A#endif
1N/A#if _WINIX
1N/A if (s = GetCommandLine())
1N/A {
1N/A n = 0;
1N/A q = 0;
1N/A t = path;
1N/A e = path + size - 1;
1N/A while (c = *s++)
1N/A {
1N/A if (c == q)
1N/A q = 0;
1N/A else if (!q && c == '"')
1N/A q = c;
1N/A else if (!q && isspace(c))
1N/A break;
1N/A else if (t < e)
1N/A *t++ = c == '\\' ? '/' : c;
1N/A else
1N/A n++;
1N/A }
1N/A if (t < e)
1N/A *t = 0;
1N/A return (t - path) + n;
1N/A }
1N/A#endif
1N/A if (command)
1N/A {
1N/A if ((n = strlen(command) + 1) <= size)
1N/A memcpy(path, command, n);
1N/A return n;
1N/A }
1N/A return 0;
1N/A}
1N/A
1N/Asize_t
1N/Apathprog(const char* command, char* path, size_t size)
1N/A{
1N/A char* rel;
1N/A ssize_t n;
1N/A
1N/A if ((n = prog(command, path, size)) > 0 && n < size && *path != '/' && (rel = strdup(path)))
1N/A {
1N/A n = pathpath(rel, NiL, PATH_REGULAR|PATH_EXECUTE, path, size) ? strlen(path) : 0;
1N/A free(rel);
1N/A }
1N/A return n;
1N/A}