Fix taskqueues to truely work on SMP systems.
[dragonfly.git] / usr.sbin / pkg_install / info / show.c
blob4c1667b8d5194ae339f6a7f6103e95925cfc0424
1 /*
2 * FreeBSD install - a package for the installation and maintainance
3 * of non-core utilities.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * Jordan K. Hubbard
15 * 23 Aug 1993
17 * Various display routines for the info module.
19 * $FreeBSD: src/usr.sbin/pkg_install/info/show.c,v 1.37 2003/05/26 17:06:05 lioux Exp $
20 * $DragonFly: src/usr.sbin/pkg_install/info/Attic/show.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
23 #include "lib.h"
24 #include "info.h"
25 #include <err.h>
26 #include <stdlib.h>
27 #include <sys/types.h>
28 #include <sys/stat.h>
29 #include <md5.h>
31 void
32 show_file(const char *title, const char *fname)
34 FILE *fp;
35 char line[1024];
36 int n;
38 if (!Quiet)
39 printf("%s%s", InfoPrefix, title);
40 fp = fopen(fname, "r");
41 if (fp == (FILE *) NULL)
42 printf("ERROR: show_file: Can't open '%s' for reading!\n", fname);
43 else {
44 int append_nl = 0;
45 while ((n = fread(line, 1, 1024, fp)) != 0)
46 fwrite(line, 1, n, stdout);
47 fclose(fp);
48 append_nl = (line[n - 1] != '\n'); /* Do we have a trailing \n ? */
49 if (append_nl)
50 printf("\n");
52 printf("\n"); /* just in case */
55 void
56 show_index(const char *title, const char *fname)
58 FILE *fp;
59 char line[MAXINDEXSIZE+2];
61 strlcpy(line, "???\n", sizeof(line));
63 if (!Quiet)
64 printf("%s%s", InfoPrefix, title);
65 fp = fopen(fname, "r");
66 if (fp == (FILE *) NULL) {
67 warnx("show_file: can't open '%s' for reading", fname);
68 } else {
69 if(fgets(line, MAXINDEXSIZE + 1, fp)) {
70 size_t line_length = strlen(line);
72 if (line[line_length - 1] != '\n') { /* Do we have a trailing \n ? */
73 line[line_length] = '\n'; /* Add a trailing \n */
74 line[line_length + 1] = '\0'; /* Terminate string */
77 fclose(fp);
79 fputs(line, stdout);
82 /* Show a packing list item type. If showall is TRUE, show all */
83 void
84 show_plist(const char *title, Package *plist, plist_t type, Boolean showall)
86 PackingList p;
87 Boolean ign = FALSE;
89 if (!Quiet)
90 printf("%s%s", InfoPrefix, title);
91 p = plist->head;
92 while (p) {
93 if (p->type != type && showall != TRUE) {
94 p = p->next;
95 continue;
97 switch(p->type) {
98 case PLIST_FILE:
99 if (ign) {
100 printf(Quiet ? "%s\n" : "File: %s (ignored)\n", p->name);
101 ign = FALSE;
103 else
104 printf(Quiet ? "%s\n" : "File: %s\n", p->name);
105 break;
107 case PLIST_CWD:
108 printf(Quiet ? "@cwd %s\n" : "\tCWD to %s\n", p->name);
109 break;
111 case PLIST_SRC:
112 printf(Quiet ? "@srcdir %s\n" : "\tSRCDIR to %s\n", p->name);
113 break;
115 case PLIST_CMD:
116 printf(Quiet ? "@exec %s\n" : "\tEXEC '%s'\n", p->name);
117 break;
119 case PLIST_UNEXEC:
120 printf(Quiet ? "@unexec %s\n" : "\tUNEXEC '%s'\n", p->name);
121 break;
123 case PLIST_CHMOD:
124 printf(Quiet ? "@chmod %s\n" : "\tCHMOD to %s\n",
125 p->name ? p->name : "(clear default)");
126 break;
128 case PLIST_CHOWN:
129 printf(Quiet ? "@chown %s\n" : "\tCHOWN to %s\n",
130 p->name ? p->name : "(clear default)");
131 break;
133 case PLIST_CHGRP:
134 printf(Quiet ? "@chgrp %s\n" : "\tCHGRP to %s\n",
135 p->name ? p->name : "(clear default)");
136 break;
138 case PLIST_COMMENT:
139 printf(Quiet ? "@comment %s\n" : "\tComment: %s\n", p->name);
140 break;
142 case PLIST_IGNORE:
143 ign = TRUE;
144 break;
146 case PLIST_IGNORE_INST:
147 printf(Quiet ? "@ignore_inst ??? doesn't belong here.\n" :
148 "\tIgnore next file installation directive (doesn't belong)\n");
149 ign = TRUE;
150 break;
152 case PLIST_NAME:
153 printf(Quiet ? "@name %s\n" : "\tPackage name: %s\n", p->name);
154 break;
156 case PLIST_DISPLAY:
157 printf(Quiet ? "@display %s\n" : "\tInstall message file: %s\n", p->name);
158 break;
160 case PLIST_PKGDEP:
161 printf(Quiet ? "@pkgdep %s\n" : "Dependency: %s\n", p->name);
162 break;
164 case PLIST_DEPORIGIN:
165 printf(Quiet ? "@comment DEPORIGIN:%s\n" :
166 "\tdependency origin: %s\n", p->name);
167 break;
169 case PLIST_CONFLICTS:
170 printf(Quiet ? "@conflicts %s\n" : "Conflicts: %s\n", p->name);
171 break;
173 case PLIST_MTREE:
174 printf(Quiet ? "@mtree %s\n" : "\tPackage mtree file: %s\n", p->name);
175 break;
177 case PLIST_DIR_RM:
178 printf(Quiet ? "@dirrm %s\n" : "\tDeinstall directory remove: %s\n", p->name);
179 break;
181 case PLIST_OPTION:
182 printf(Quiet ? "@option %s\n" :
183 "\tOption \"%s\" controlling package installation behaviour\n",
184 p->name);
185 break;
187 case PLIST_ORIGIN:
188 printf(Quiet ? "@comment ORIGIN:%s\n" :
189 "\tPackage origin: %s\n", p->name);
190 break;
192 default:
193 cleanup(0);
194 errx(2, "%s: unknown command type %d (%s)",
195 __func__, p->type, p->name);
196 break;
198 p = p->next;
202 /* Show all files in the packing list (except ignored ones) */
203 void
204 show_files(const char *title, Package *plist)
206 PackingList p;
207 Boolean ign = FALSE;
208 const char *dir = ".";
210 if (!Quiet)
211 printf("%s%s", InfoPrefix, title);
212 p = plist->head;
213 while (p) {
214 switch(p->type) {
215 case PLIST_FILE:
216 if (!ign)
217 printf("%s/%s\n", dir, p->name);
218 ign = FALSE;
219 break;
221 case PLIST_CWD:
222 dir = p->name;
223 break;
225 case PLIST_IGNORE:
226 ign = TRUE;
227 break;
229 /* Silence GCC in the -Wall mode */
230 default:
231 break;
233 p = p->next;
237 /* Calculate and show size of all installed package files (except ignored ones) */
238 void
239 show_size(const char *title, Package *plist)
241 PackingList p;
242 Boolean ign = FALSE;
243 const char *dir = ".";
244 struct stat sb;
245 char tmp[FILENAME_MAX];
246 unsigned long size = 0;
247 long blksize;
248 int headerlen;
249 char *descr;
251 descr = getbsize(&headerlen, &blksize);
252 if (!Quiet)
253 printf("%s%s", InfoPrefix, title);
254 for (p = plist->head; p != NULL; p = p->next) {
255 switch (p->type) {
256 case PLIST_FILE:
257 if (!ign) {
258 snprintf(tmp, FILENAME_MAX, "%s/%s", dir, p->name);
259 if (!lstat(tmp, &sb)) {
260 size += sb.st_size;
261 if (Verbose)
262 printf("%lu\t%s\n", (unsigned long) howmany(sb.st_size, blksize), tmp);
265 ign = FALSE;
266 break;
268 case PLIST_CWD:
269 dir = p->name;
270 break;
272 case PLIST_IGNORE:
273 ign = TRUE;
274 break;
276 /* Silence GCC in the -Wall mode */
277 default:
278 break;
281 if (!Quiet)
282 printf("%lu\t(%s)\n", howmany(size, blksize), descr);
283 else
284 if (UseBlkSz)
285 printf("%lu\n", howmany(size, blksize));
286 else
287 printf("%lu\n", size);
290 /* Show files that don't match the recorded checksum */
291 void
292 show_cksum(const char *title, Package *plist)
294 PackingList p;
295 const char *dir = ".";
296 char tmp[FILENAME_MAX];
298 if (!Quiet)
299 printf("%s%s", InfoPrefix, title);
301 for (p = plist->head; p != NULL; p = p->next)
302 if (p->type == PLIST_CWD)
303 dir = p->name;
304 else if (p->type == PLIST_FILE) {
305 snprintf(tmp, FILENAME_MAX, "%s/%s", dir, p->name);
306 if (!fexists(tmp))
307 warnx("%s doesn't exist\n", tmp);
308 else if (p->next && p->next->type == PLIST_COMMENT &&
309 (strncmp(p->next->name, "MD5:", 4) == 0)) {
310 char *cp = NULL, buf[33];
313 * For packing lists whose version is 1.1 or greater, the md5
314 * hash for a symlink is calculated on the string returned
315 * by readlink().
317 if (issymlink(tmp) && verscmp(plist, 1, 0) > 0) {
318 int len;
319 char linkbuf[FILENAME_MAX];
321 if ((len = readlink(tmp, linkbuf, FILENAME_MAX)) > 0)
322 cp = MD5Data((unsigned char *)linkbuf, len, buf);
323 } else if (isfile(tmp) || verscmp(plist, 1, 1) < 0)
324 cp = MD5File(tmp, buf);
326 if (cp != NULL) {
327 /* Mismatch? */
328 if (strcmp(cp, p->next->name + 4))
329 printf("%s fails the original MD5 checksum\n", tmp);
330 else if (Verbose)
331 printf("%s matched the original MD5 checksum\n", tmp);
337 /* Show an "origin" path (usually category/portname) */
338 void
339 show_origin(const char *title, Package *plist)
342 if (!Quiet)
343 printf("%s%s", InfoPrefix, title);
344 printf("%s\n", plist->origin != NULL ? plist->origin : "");
347 /* Show revision number of the packing list */
348 void
349 show_fmtrev(const char *title, Package *plist)
352 if (!Quiet)
353 printf("%s%s", InfoPrefix, title);
354 printf("%d.%d\n", plist->fmtver_maj, plist->fmtver_mnr);