Date: Mon, 8 May 2000 14:02:33 +0300 (EEST) From: "Maxim Sobolev" <sobomax@altavista.net> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/18445: [PATCH] Additional feature for pkg_info to quiery size of installed package Message-ID: <200005081102.OAA96090@vega.vega.com>
next in thread | raw e-mail | index | archive | help
>Number: 18445
>Category: bin
>Synopsis: [PATCH] Additional feature for pkg_info to quiery size of installed package
>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: Mon May 08 04:30:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Maxim Sobolev
>Release: FreeBSD 3.4-STABLE i386
>Organization:
Vega International Capital
>Environment:
>Description:
Additional feature for pkg_info to quiery size of installed package.
I have really missed this feature since my first encounter with FreeBSD ;).
>How-To-Repeat:
>Fix:
===================================================================
RCS file: pkg_install/info/RCS/info.h,v
retrieving revision 1.1
diff -du -r1.1 pkg_install/info/info.h
--- pkg_install/info/info.h 2000/05/07 08:37:46 1.1
+++ pkg_install/info/info.h 2000/05/08 08:59:21
@@ -43,6 +43,7 @@
#define SHOW_DISPLAY 0x0200
#define SHOW_REQBY 0x0400
#define SHOW_MTREE 0x0800
+#define SHOW_SIZE 0x1000
extern int Flags;
extern Boolean AllInstalled;
@@ -55,5 +56,6 @@
extern void show_plist(char *, Package *, plist_t);
extern void show_files(char *, Package *);
extern void show_index(char *, char *);
+extern void show_size(char *, Package *);
#endif /* _INST_INFO_H_INCLUDE */
===================================================================
RCS file: pkg_install/info/RCS/main.c,v
retrieving revision 1.1
diff -du -r1.1 pkg_install/info/main.c
--- pkg_install/info/main.c 2000/05/07 08:37:46 1.1
+++ pkg_install/info/main.c 2000/05/07 09:07:35
@@ -28,7 +28,7 @@
"$FreeBSD: src/usr.sbin/pkg_install/info/main.c,v 1.22 2000/01/18 01:45:54 dan Exp $";
#endif
-static char Options[] = "acdDe:fhiIkl:LmpqrRt:v";
+static char Options[] = "acdDe:fhiIkl:LsmpqrRt:v";
int Flags = 0;
Boolean AllInstalled = FALSE;
@@ -111,6 +111,10 @@
case 'm':
Flags |= SHOW_MTREE;
break;
+
+ case 's':
+ Flags |= SHOW_SIZE;
+ break;
case 'l':
InfoPrefix = optarg;
===================================================================
RCS file: pkg_install/info/RCS/perform.c,v
retrieving revision 1.1
diff -du -r1.1 pkg_install/info/perform.c
--- pkg_install/info/perform.c 2000/05/07 08:37:46 1.1
+++ pkg_install/info/perform.c 2000/05/07 10:36:51
@@ -201,6 +201,8 @@
show_plist("Prefix(s):\n", &plist, PLIST_CWD);
if (Flags & SHOW_FILES)
show_files("Files:\n", &plist);
+ if ((Flags & SHOW_SIZE) && installed)
+ show_size("Package Size:\n", &plist);
if (!Quiet)
puts(InfoPrefix);
}
===================================================================
RCS file: pkg_install/info/RCS/pkg_info.1,v
retrieving revision 1.1
diff -du -r1.1 pkg_install/info/pkg_info.1
--- pkg_install/info/pkg_info.1 2000/05/07 08:37:46 1.1
+++ pkg_install/info/pkg_info.1 2000/05/07 10:58:58
@@ -86,6 +86,8 @@
Show the files within each package. This is different from just
viewing the packing list, since full pathnames for everything
are generated.
+.It Fl s
+Show the total size occuped by files installed within each package.
.It Fl e Ar pkg-name
If the package identified by
.Ar pkg-name
===================================================================
RCS file: pkg_install/info/RCS/show.c,v
retrieving revision 1.1
diff -du -r1.1 pkg_install/info/show.c
--- pkg_install/info/show.c 2000/05/07 08:37:46 1.1
+++ pkg_install/info/show.c 2000/05/07 13:58:38
@@ -27,6 +27,9 @@
#include "info.h"
#include <err.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
void
show_file(char *title, char *fname)
@@ -195,7 +198,63 @@
case PLIST_IGNORE:
ign = TRUE;
break;
+
+ /* Silence GCC in the -Wall mode */
+ default:
+ break;
}
p = p->next;
}
+}
+
+/* Calculate and show size of all installed package files (except ignored ones) */
+void
+show_size(char *title, Package *plist)
+{
+ PackingList p;
+ Boolean ign = FALSE;
+ char *dir = ".";
+ struct stat sb;
+ char tmp[FILENAME_MAX];
+ unsigned long size = 0;
+ long blksize;
+ int headerlen;
+ char *descr;
+
+ descr = getbsize(&headerlen, &blksize);
+ if (!Quiet)
+ printf("%s%s", InfoPrefix, title);
+ p = plist->head;
+ while (p) {
+ switch(p->type) {
+ case PLIST_FILE:
+ if (!ign) {
+ snprintf(tmp, FILENAME_MAX, "%s/%s", dir, p->name);
+ if (!lstat(tmp, &sb)) {
+ size += sb.st_size;
+ if(Verbose)
+ printf("%lu\t%s\n", (unsigned long)sb.st_size/blksize, tmp);
+ }
+ }
+ ign = FALSE;
+ break;
+
+ case PLIST_CWD:
+ dir = p->name;
+ break;
+
+ case PLIST_IGNORE:
+ ign = TRUE;
+ break;
+
+ /* Silence GCC in the -Wall mode */
+ default:
+ break;
+ }
+ p = p->next;
+ }
+ if (!Quiet)
+ printf("%lu (%s)\n", size/blksize, descr);
+ else
+ printf("%lu\n", size);
}
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200005081102.OAA96090>
