[pacman-dev] [PATCH] Allow -Qo to perform a functional 'which'

Nathan Wayde kumyco at konnichi.com
Mon Dec 21 07:08:49 EST 2009


On 21/12/09 09:55, Allan McRae wrote:
> When pacman queries the ownership of an object that is not a path,
> it will check in the users PATH for a match. Implements FS#8798.
>
> Patch-by: Shankar<jatheendra at gmail.com>
> [Allan: rework for master, tidy-up]
> Signed-off-by: Allan McRae<allan at archlinux.org>
> ---
>
> This was original posted a year ago...
> http://mailman.archlinux.org/pipermail/pacman-dev/2008-November/007659.html
>
> The comments then were that we should maybe refactor out stuff dealing with
> file paths, specifically removing trailing backslashes. That appears to only
> occur in two other places and is very simple so I do not thing it needs
> refactored and can be done in a spearate patch if necessary.
>
> The only other part I do not like is the "failed to read file" error block is
> repeated, but I can not see a nice way to fix that.
>
>   src/pacman/query.c |   58 +++++++++++++++++++++++++++++++++++++++++++++++----
>   1 files changed, 53 insertions(+), 5 deletions(-)
>
> diff --git a/src/pacman/query.c b/src/pacman/query.c
> index 6b6a25d..6f579fd 100644
> --- a/src/pacman/query.c
> +++ b/src/pacman/query.c
> @@ -56,6 +56,41 @@ static char *resolve_path(const char* file)
>   	return(str);
>   }
>
> +/* check if filename exists in PATH */
> +static int search_path(char *filename, struct stat * bufptr)
> +{
> +	char *envpath, *path, *fullname;
> +	int len;
> +
> +	if ((envpath = getenv("PATH")) == NULL) {
> +		return(-1);
> +	}
> +	if ((envpath = strdup(envpath)) == NULL) {
> +		return(-1);
> +	}
> +
> +	fullname = calloc(PATH_MAX+1, sizeof(char));
> +
> +	while ((path = strsep(&envpath, ":")) != NULL) {
> +		len = strlen(path);
> +
> +		/* strip the trailing slash if one exists */
> +		if(path[len - 1] == '/') {
> +				path[len - 1] = '\0';
> +		}
> +
> +		snprintf(fullname, PATH_MAX+1, "%s/%s", path, filename);
> +
> +		if(stat(fullname, bufptr) == 0) {
> +			strncpy(filename, fullname, PATH_MAX+1);
> +			free(fullname);
> +			return(0);
> +		}
> +	}
> +	free(fullname);
> +	return(-1);
> +}
> +

just a heads-up, search_path() contains a memory leak; envpath is never 
free()'d. Note, the original envpath is lost in the call to strsep().



More information about the pacman-dev mailing list