From owner-freebsd-bugs@FreeBSD.ORG Sat Oct 27 15:10:01 2007 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F0ED516A41A for ; Sat, 27 Oct 2007 15:10:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id D208913C4A5 for ; Sat, 27 Oct 2007 15:10:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.1/8.14.1) with ESMTP id l9RFA14e009494 for ; Sat, 27 Oct 2007 15:10:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.1/8.14.1/Submit) id l9RFA1cP009493; Sat, 27 Oct 2007 15:10:01 GMT (envelope-from gnats) Resent-Date: Sat, 27 Oct 2007 15:10:01 GMT Resent-Message-Id: <200710271510.l9RFA1cP009493@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Beat Gätzi Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 087C316A419 for ; Sat, 27 Oct 2007 15:06:51 +0000 (UTC) (envelope-from beat@chruetertee.ch) Received: from mail14.bluewin.ch (mail14.bluewin.ch [195.186.19.62]) by mx1.freebsd.org (Postfix) with ESMTP id A5A9413C4A6 for ; Sat, 27 Oct 2007 15:06:50 +0000 (UTC) (envelope-from beat@chruetertee.ch) Received: from [83.79.31.175] (83.79.31.175) by mail14.bluewin.ch (Bluewin 7.3.121) id 471B432300178F9C for FreeBSD-gnats-submit@freebsd.org; Sat, 27 Oct 2007 14:44:51 +0000 Received: by _HOSTNAME_ (sSMTP sendmail emulation); Sat, 27 Oct 2007 16:45:32 +0200 Message-Id: <471B432300178F9C@mail14.bluewin.ch> (added by postmaster@bluewin.ch) Date: Sat, 27 Oct 2007 16:45:32 +0200 From: "Beat Gaetzi" To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: bin/117564: pkg_updating: UPDATING parser and displayer X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Beat Gätzi List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 27 Oct 2007 15:10:02 -0000 >Number: 117564 >Category: bin >Synopsis: pkg_updating: UPDATING parser and displayer >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sat Oct 27 15:10:01 UTC 2007 >Closed-Date: >Last-Modified: >Originator: Beat Gätzi >Release: FreeBSD 8.0-CURRENT i386 >Organization: >Environment: System: FreeBSD daedalus.network.local 8.0-CURRENT FreeBSD 8.0-CURRENT #0: Tue Oct 23 22:18:38 CEST 2007 root@daedalus.network.local:/usr/obj/usr/src/sys/GENERIC i386 >Description: This patch add another pkg_* program: pkg_updating pkg_updating scan the installed ports and show all UPDATING entries that affect one of the installed ports, and are relevant on the given machine. The idea of pkg_updating is from the project idea page: http://www.freebsd.org/projects/ideas/#p-ports-updating >How-To-Repeat: >Fix: --- pkg_updating.patch begins here --- diff -Naur src.orig/usr.sbin/pkg_install/Makefile src/usr.sbin/pkg_install/Makefile --- src.orig/usr.sbin/pkg_install/Makefile 2007-06-24 21:12:55.000000000 +0200 +++ src/usr.sbin/pkg_install/Makefile 2007-10-27 15:35:17.000000000 +0200 @@ -2,7 +2,7 @@ .include -SUBDIR= lib add create delete info ${_sign} version +SUBDIR= lib add create delete info ${_sign} updating version .if ${MK_OPENSSL} != "no" _sign= sign diff -Naur src.orig/usr.sbin/pkg_install/updating/Makefile src/usr.sbin/pkg_install/updating/Makefile --- src.orig/usr.sbin/pkg_install/updating/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ src/usr.sbin/pkg_install/updating/Makefile 2007-10-27 15:26:35.000000000 +0200 @@ -0,0 +1,11 @@ +# $FreeBSD$ + +PROG= pkg_updating +SRCS= main.c + +CFLAGS+= -I${.CURDIR}/../lib + +WARNS?= 6 +WFORMAT?= 1 + +.include diff -Naur src.orig/usr.sbin/pkg_install/updating/main.c src/usr.sbin/pkg_install/updating/main.c --- src.orig/usr.sbin/pkg_install/updating/main.c 1970-01-01 01:00:00.000000000 +0100 +++ src/usr.sbin/pkg_install/updating/main.c 2007-10-27 16:29:00.000000000 +0200 @@ -0,0 +1,240 @@ +/*- + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Beat Gätzi + * ---------------------------------------------------------------------------- + */ + +#include +__FBSDID("$FreeBSD$"); + +#include /* For MAXPATHLEN */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pathnames.h" + +typedef struct installedport { + struct installedport *next; /* List of installed ports */ + char name[LINE_MAX]; /* Name of the installed port */ +} INSTALLEDPORT; + +int usage(void); + +/* + * Parse /usr/port/UPDATING for corresponding entries. If no argument is + * passed to pkg_updating all entries for all installed ports are displayed. + * If a list of portnames is passed to pkg_updating only entries for the + * given portnames are displayed. Use the -d option to define that only newer + * entries as this date are shown. + */ +int +main(int argc, char *argv[]) +{ + /* Keyword for searching portname in UPDATING */ + const char *affects = "AFFECTS"; + /* Indicate a date -> end of a entry. Will fail on 2100-01-01.. */ + const char *end = "20"; + /* Keyword for searching origin portname of installed port */ + const char *origin = "@comment ORIGIN:"; + const char *pkgdbpath = LOG_DIR; /* Location of pkgdb */ + const char *updatingfile = UPDATING; /* Location of UPDATING */ + + char *date = NULL; /* Passed -d argument */ + char *dateline = NULL; /* Saved date of an entry */ + /* Tmp lines for parsing file */ + char *tmpline1 = NULL; + char *tmpline2 = NULL; + + char originline[LINE_MAX]; /* Line of +CONTENTS */ + /* Temporary variable to create path to +CONTENTS for installed ports */ + char tmp_file[MAXPATHLEN]; + char updatingline[LINE_MAX]; /* Line of UPDATING */ + + int ch; /* Char used by getopt */ + int found = 0; /* Found an entry */ + int linelength; /* Length of parsed line */ + int maxcharperline = LINE_MAX; /* Max chars per line */ + int dflag = 0; /* -d option set */ + /* If pflag = 0 UPDATING will be checked for all installed ports */ + int pflag = 0; + + size_t n; /* Offset to create path */ + + struct dirent *pkgdbdir; /* pkgdb directory */ + + /* Needed nodes for linked list with installed ports */ + INSTALLEDPORT *head = (INSTALLEDPORT *) NULL; + INSTALLEDPORT *curr = (INSTALLEDPORT *) NULL; + + DIR *dir; + FILE *fd; + + while ((ch = getopt(argc, argv, "f:p:d:")) != -1) { + switch (ch) { + case 'd': + dflag = 1; + date = optarg; + break; + case 'f': + updatingfile = optarg; + break; + case '?': + default: + usage(); + } + } + argc -= optind; + argv += optind; + + /* Check if passed date has a correct format */ + if (dflag == 1) { + linelength = strlen(date); + if (linelength != 8) + exit(EX_DATAERR); + if (strspn(date, "0123456789") != 8) { + fprintf(stderr, "unknown date format: %s\n", date); + exit(EX_DATAERR); + } + } + + /* Save the list of passed portnames */ + if (argc != 0) { + pflag = 1; + while (*argv) { + if((curr = (INSTALLEDPORT *) + malloc(sizeof(INSTALLEDPORT))) == NULL) + (void)exit(EXIT_FAILURE); + strlcpy (curr->name, *argv, strlen(*argv) + 1); + curr->next = head; + head = curr; + *argv++; + } + } + + /* UPDATING will be parsed for all installed ports if no portname is passed */ + if (pflag == 0) { + /* Opens /var/db/pkg and search for all installed ports */ + if((dir = opendir(pkgdbpath)) != NULL) { + while ((pkgdbdir = readdir(dir)) != NULL) { + if (strcmp(pkgdbdir->d_name, ".") != 0 && + strcmp(pkgdbdir->d_name, "..") !=0) { + + /* Create path to +CONTENTS file for each installed port */ + n = strlcpy(tmp_file, pkgdbpath, strlen(pkgdbpath)+1); + n = strlcpy(tmp_file + n, "/", sizeof(tmp_file) - n); + n = strlcat(tmp_file + n, pkgdbdir->d_name, sizeof(tmp_file) - n); + (void)strlcat(tmp_file + n, "/+CONTENTS", sizeof(tmp_file) - n); + + /* Open +CONTENT file */ + fd = fopen(tmp_file, "r"); + if(fd == NULL) { + fprintf(stderr, "warning: can't open %s: %s\n", + tmp_file, strerror(errno)); + continue; + } + + /* Parses +CONTENT for ORIGIN line and + put element into linked list */ + while(fgets(originline, maxcharperline, fd) != NULL) { + tmpline1 = strstr(originline, origin); + if( tmpline1 != NULL ) { + char *pname; /* Tmp variable to store port name */ + pname = strrchr(originline, (int)':'); + pname++; + if((curr = (INSTALLEDPORT *) + malloc(sizeof(INSTALLEDPORT))) == NULL) + (void)exit(EXIT_FAILURE); + strlcpy (curr->name, pname, strlen(pname)+1); + curr->next = head; + head = curr; + } + } + + if(ferror(fd)) { + fprintf(stderr, "error reading input\n"); + exit(EX_IOERR); + } + + (void)fclose(fd); + } + } + closedir(dir); + } + } + + /* Open UPDATING file */ + fd = fopen(updatingfile, "r"); + if(fd == NULL) { + fprintf(stderr, "can't open %s: %s\n", + updatingfile, strerror(errno)); + exit(EX_UNAVAILABLE); + } + + /* Parse opened UPDATING file */ + while(fgets(updatingline, maxcharperline, fd) != NULL) { + /* No entry is found so far */ + if (found == 0) { + /* Search for AFFECTS line to parse the portname */ + tmpline1 = strstr(updatingline, affects); + + if( tmpline1 != NULL ) { + curr = head; + while(curr != NULL) { + tmpline2 = strstr(updatingline, curr->name); + if( tmpline2 != NULL ) + break; + curr = curr->next; + } + if( tmpline2 != NULL ) { + /* If -d is set, check if entry is newer than the date */ + if ( (dflag == 1) && (strncmp(dateline, date, 8) < 0)) + continue; + printf("%s", dateline); + printf("%s", updatingline); + found = 1; + } + } + } + /* Search for the end of an entry, if not found print the line */ + else { + tmpline1 = strstr(updatingline, end); + if( tmpline1 == NULL ) + printf("%s", updatingline); + else { + linelength = strlen(updatingline); + if (linelength == 10) + found = 0; + else + printf("%s", updatingline); + } + } + /* Save the actual line, it could be a date */ + dateline = strdup(updatingline); + } + + if(ferror(fd)) { + fprintf(stderr, "error reading input\n"); + exit(EX_IOERR); + } + (void)fclose(fd); + + exit(EX_OK); +} + +int +usage(void) +{ + fprintf(stderr, + "usage: pkg_updating [-d YYYYMMDD] [-f file] [portname ...]\n"); + exit(EX_USAGE); +} diff -Naur src.orig/usr.sbin/pkg_install/updating/pathnames.h src/usr.sbin/pkg_install/updating/pathnames.h --- src.orig/usr.sbin/pkg_install/updating/pathnames.h 1970-01-01 01:00:00.000000000 +0100 +++ src/usr.sbin/pkg_install/updating/pathnames.h 2007-10-27 16:30:11.000000000 +0200 @@ -0,0 +1,27 @@ +/*- + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Beat Gätzi + * ---------------------------------------------------------------------------- + * + * $FreeBSD$ + * + */ + +/* Copy from ../version/version.h, shouldn't this go in lib/lib.h? */ +/* Where the ports lives by default */ +#define DEF_PORTS_DIR "/usr/ports/UPDATING" +/* just in case we change the environment variable name */ +#define PORTSDIR "PORTSDIR" +/* macro to get name of directory where we put logging information */ +#define UPDATING (getenv(PORTSDIR) ? strcat(getenv(PORTSDIR), "/UPDATING") : DEF_PORTS_DIR) + +/* Where we put logging information by default, else ${PKG_DBDIR} if set */ +#define DEF_LOG_DIR "/var/db/pkg" +/* just in case we change the environment variable name */ +#define PKG_DBDIR "PKG_DBDIR" +/* macro to get name of directory where we put logging information */ +#define LOG_DIR (getenv(PKG_DBDIR) ? getenv(PKG_DBDIR) : DEF_LOG_DIR) + diff -Naur src.orig/usr.sbin/pkg_install/updating/pkg_updating.1 src/usr.sbin/pkg_install/updating/pkg_updating.1 --- src.orig/usr.sbin/pkg_install/updating/pkg_updating.1 1970-01-01 01:00:00.000000000 +0100 +++ src/usr.sbin/pkg_install/updating/pkg_updating.1 2007-10-27 15:26:49.000000000 +0200 @@ -0,0 +1,88 @@ +.\" +.\" FreeBSD updating - Scan the installed ports and show all UPDATING entries +.\" that affect one of the installed ports. Alternative a list of portnames +.\" could be passed to pkg_updating +.\" +.\" "THE BEER-WARE LICENSE" (Revision 42): +.\" wrote this file. As long as you retain this notice you +.\" can do whatever you want with this stuff. If we meet some day, and you think +.\" this stuff is worth it, you can buy me a beer in return. Beat Gätzi +.\" +.\" $FreeBSD$ +.\" +.Dd October 20, 2007 +.Dt PKG_UPDATING 1 +.Os +.Sh NAME +.Nm pkg_updating +.Nd a utility for displaying UPDATING entries of software packages +.Sh SYNOPSIS +.Nm +.Op Fl d Ar date +.Op Fl f Ar file +.Op Ar pkg-name ... +.Nm +.Sh DESCRIPTION +The +.Nm +command scan the installed ports and show all UPDATING entries that affect one +of the installed ports. Alternative a list of pkg-names could be passed. +.Sh OPTIONS +The following command line options are supported: +.Bl -tag -width indent +.It Ar pkg-name ... +UPDATING entries for the named packages are displayed. +.It Fl d Ar date +Only entries newer than this date are shown. Use a YYYYMMDD date format. +.It Fl f Ar UPDATING file +Defines a alternative location of the UPDATING file. +.El +.Sh EXAMPLES +.Bl -tag -width indent +.Dl pkg_updating +.Pp +Shows all entries of all installed ports. +.Pp +.Dl pkg_updating -d 20070101 +.Pp +Shows all entries of all installed ports since 2007-01-01. +.Pp +.Dl pkg_updating apache mysql +.Pp +Shows all entries for all apache and mysql ports. +.Pp +.Dl pkg_updating -d 20060101 apache +.Pp +Shows all apache entries since 2006-01-01. +.Pp +.Dl pkg_updating -f /tmp/UPDATING +.Pp +Defines that the UPDATING file is in /tmp and shows all entries of all +installed ports +.Pp +.El +.Sh ENVIRONMENT +.Bl -tag -width PKG_DBDIR +.It Ev PKG_DBDIR +Specifies an alternative location for the installed package database. +.It Ev PORTSDIR +Location of the ports tree. +.El +.Sh FILES +.Bl -tag -width /var/db/pkg -compact +.It Pa /var/db/pkg +Default location of the installed package database. +.It Pa /usr/ports +The default ports directory and default location of the UPDATING file +.El +.Sh SEE ALSO +.Xr pkg_add 1 , +.Xr pkg_create 1 , +.Xr pkg_delete 1 , +.Xr pkg_version 1 +.Sh AUTHORS +.An Beat Gätzi Aq beat@chruetertee.ch +.Sh CONTRIBUTORS +.An Martin Tournoij Aq carpetsmoker@xs4all.nl +.Sh BUGS +Sure to be some. --- pkg_updating.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted: