Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Record shared library usage in pkgdb and add tools for querying same
Matthew Seaman committed 14 years ago
commit d860a8b1b3d6206215be2e529428ce74fc017e60
parent 89c39fd
2 files changed +195 -0
added pkg/pkg-shlib.8
@@ -0,0 +1,71 @@
+
.\"
+
.\" FreeBSD pkg - a next generation package for the installation and maintenance
+
.\" of non-core utilities.
+
.\"
+
.\" Redistribution and use in source and binary forms, with or without
+
.\" modification, are permitted provided that the following conditions
+
.\" are met:
+
.\" 1. Redistributions of source code must retain the above copyright
+
.\"    notice, this list of conditions and the following disclaimer.
+
.\" 2. Redistributions in binary form must reproduce the above copyright
+
.\"    notice, this list of conditions and the following disclaimer in the
+
.\"    documentation and/or other materials provided with the distribution.
+
.\"
+
.\"
+
.\"     @(#)pkg.8
+
.\" $FreeBSD$
+
.\"
+
.Dd March 19, 2012
+
.Dt PKG-SHLIB 8
+
.Os
+
.Sh NAME
+
.Nm "pkg shlib"
+
.Nd displays which packages link to a specific shared library
+
.Pp
+
.Ar <library>
+
is the filename of the library, without any leading path, but
+
including the ABI version number.
+
Only exact matches are handled.
+
.Sh SYNOPSIS
+
.Nm
+
.Ar <library>
+
.Sh DESCRIPTION
+
.Nm
+
is used for displaying the packages that link to
+
.Ar <library>
+
.Sh OPTIONS
+
The following commands are supported by
+
.Nm :
+
.Bl -tag -width F1
+
.El
+
.Sh ENVIRONMENT
+
The following environment variables affect the execution of
+
.Nm .
+
See
+
.Xr pkg.conf 5
+
for further description.
+
.Bl -tag -width ".Ev NO_DESCRIPTIONS"
+
.It PKG_DBDIR
+
.El
+
.Sh FILES
+
See
+
.Xr pkg.conf 5 .
+
.Sh SEE ALSO
+
.Xr pkg 8 ,
+
.Xr pkg-add 8 ,
+
.Xr pkg-autoremove 8 ,
+
.Xr pkg-search 8 ,
+
.Xr pkg-backup 8 ,
+
.Xr pkg-install 8 ,
+
.Xr pkg-delete 8 ,
+
.Xr pkg-info 8 ,
+
.Xr pkg-register 8 ,
+
.Xr pkg-repo 8 ,
+
.Xr pkg-set 8 ,
+
.Xr pkg-update 8 ,
+
.Xr pkg-updating 8 ,
+
.Xr pkg-upgrade 8 ,
+
.Xr pkg-version 8 ,
+
.Xr pkg-which 8 ,
+
.Xr pkg-create 8 ,
+
.Xr pkg.conf 5
added pkg/shlib.c
@@ -0,0 +1,124 @@
+
/*
+
 * Copyright (c) 2011-2012 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
+
 * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
+
 * Copyright (c) 2012 Matthew Seaman <matthew@FreeBSD.org>
+
 * All rights reserved.
+
 * 
+
 * Redistribution and use in source and binary forms, with or without
+
 * modification, are permitted provided that the following conditions
+
 * are met:
+
 * 1. Redistributions of source code must retain the above copyright
+
 *    notice, this list of conditions and the following disclaimer
+
 *    in this position and unchanged.
+
 * 2. Redistributions in binary form must reproduce the above copyright
+
 *    notice, this list of conditions and the following disclaimer in the
+
 *    documentation and/or other materials provided with the distribution.
+
 * 
+
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 */
+

+
#include <sys/param.h>
+

+
#include <err.h>
+
#include <stdio.h>
+
#include <pkg.h>
+
#include <libgen.h>
+
#include <stdlib.h>
+
#include <string.h>
+
#include <unistd.h>
+
#include <sysexits.h>
+
#include <ctype.h>
+

+
#include "pkgcli.h"
+

+
void
+
usage_shlib(void)
+
{
+
	fprintf(stderr, "usage: pkg shlib <library>\n\n");
+
	fprintf(stderr, "<library> should be a filename without leading path.\n");
+
	fprintf(stderr, "For more information see 'pkg help shlib'.\n");
+
}
+

+
char*
+
sanatize(char *target, const char *source, size_t size)
+
{
+
	size_t i;
+
	int s;
+
	char *rc = target;
+

+
	for (i = 0; i < size - 1; i++) {
+
		s = source[i];
+
		if (s == '\0')
+
			break;
+
		if (isascii(s) && (isspace(s) || s == '/')) {
+
			rc = NULL;
+
			break;
+
		} else {
+
			target[i] = s;
+
		}
+
	}
+
	target[i] = '\0';
+

+
	return (rc);
+
}
+

+
int
+
exec_shlib(int argc, char **argv)
+
{
+
	struct pkgdb *db = NULL;
+
	struct pkgdb_it *it = NULL;
+
	struct pkg *pkg = NULL;
+
	char libname[MAXPATHLEN + 1];
+
	int ret = EPKG_OK, retcode = EPKG_OK, count = 0;
+
	const char *name, *version;
+

+
	if (argc != 2) {
+
		usage_shlib();
+
		return (EX_USAGE);
+
	}
+

+
	if (sanatize(libname, argv[1], sizeof(libname)) == NULL) {
+
		usage_shlib();
+
		return (EX_USAGE);
+
	}
+

+
	if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) {
+
		pkgdb_close(db);
+
		return (EX_IOERR);
+
	}
+

+
	if ((it = pkgdb_query_shlib(db, libname)) == NULL) {
+
		return (EX_IOERR);
+
	}
+

+
	while (( ret = pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC)) == EPKG_OK) {
+
		if (count == 0)
+
			printf("%s is linked to by the folowing packages:\n", libname);
+
		count++;
+
		pkg_get(pkg, PKG_NAME, &name, PKG_VERSION, &version);
+
		printf("%s-%s\n", name, version);
+
	}
+

+
        if (ret != EPKG_END) {
+
		retcode = EPKG_WARN;
+
	} else if (count == 0) {
+
		printf("%s was not found in the database\n", libname);
+
		retcode = EPKG_WARN;
+
	}
+
		
+
	pkg_free(pkg);
+
	pkgdb_it_free(it);
+

+
	pkgdb_close(db);
+
	return (retcode);
+
}