From owner-freebsd-bugs@FreeBSD.ORG Sat Oct 27 17:30:04 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 7E9E116A417 for ; Sat, 27 Oct 2007 17:30:04 +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 6DEAC13C4B3 for ; Sat, 27 Oct 2007 17:30:04 +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 l9RHU45J016495 for ; Sat, 27 Oct 2007 17:30:04 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.1/8.14.1/Submit) id l9RHU4fb016491; Sat, 27 Oct 2007 17:30:04 GMT (envelope-from gnats) Date: Sat, 27 Oct 2007 17:30:04 GMT Message-Id: <200710271730.l9RHU4fb016491@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: =?ISO-8859-1?Q?Beat_G=E4tzi?= Cc: Subject: Re: bin/117564: pkg_updating: UPDATING parser and displayer X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: =?ISO-8859-1?Q?Beat_G=E4tzi?= List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 27 Oct 2007 17:30:04 -0000 The following reply was made to PR bin/117564; it has been noted by GNATS. From: =?ISO-8859-1?Q?Beat_G=E4tzi?= To: bug-followup@FreeBSD.org Cc: Subject: Re: bin/117564: pkg_updating: UPDATING parser and displayer Date: Sat, 27 Oct 2007 19:07:20 +0200 This is a multi-part message in MIME format. --------------020505060006080209090802 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Make the patch more compatible to style(9): - Fix line legth - Fix multi line comments Thanks to Craig Rodrigues for point out this style violations. --------------020505060006080209090802 Content-Type: text/plain; name="pkg_updating.patch" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="pkg_updating.patch" 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 18:49:45.000000000 +0200 @@ -0,0 +1,248 @@ +/*- + * ---------------------------------------------------------------------------- + * "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) { + /* Open /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 ) { + /* Tmp variable to store port name. */ + char *pname; + 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 18:49:40.000000000 +0200 @@ -0,0 +1,28 @@ +/*- + * ---------------------------------------------------------------------------- + * "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 */ + +/* 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. --------------020505060006080209090802--