strlcpy(fname, cp, sizeof(fname)); if (*cp != '/') { if (!getcwd(fname, sizeof(fname))) { cleanup(0); err(1, "fatal error during execution: getcwd");
strlcpy(fname, cp, sizeof(fname)); if (isURL(fname) && (cp = fileGetURL(NULL, fname)) != NULL) { strlcpy(fname, cp, sizeof(fname)); isTMP = TRUE; isurl = 1; } else if (*cp != '/') { if (!getcwd(fname, sizeof(fname))) { cleanup(0); err(1, "fatal error during execution: " "getcwd"); } len = strlen(fname); snprintf(&fname[len], sizeof(fname) - len, "/%s", cp);
pkg_do(char *pkg){	Boolean         installed = FALSE, isTMP = FALSE;	char            log_dir[FILENAME_MAX];	char            fname[FILENAME_MAX];	package_t       plist;	FILE           *fp;	struct stat     sb;	char           *cp = NULL;	int             code = 0;	char           *pkg2 = 0; /* hold full name of package, storage to free */	int             len;	set_pkg(pkg);	if (isURL(pkg)) {		if ((cp = fileGetURL(NULL, pkg)) != NULL) {			strlcpy(fname, cp, sizeof(fname));			isTMP = TRUE;		}	} else if (fexists(pkg) && isfile(pkg)) {		if (*pkg != '/') {			if (!getcwd(fname, sizeof(fname))) {			    cleanup(0);			    err(1, "fatal error during execution: getcwd");			}			len = strlen(fname);			snprintf(&fname[len], sizeof(fname) - len, "/%s", pkg);		} else			strlcpy(fname, pkg, sizeof(fname));		cp = fname;	} else {		if ((cp = fileFindByPath(NULL, pkg)) != NULL) {		    strlcpy(fname, cp, sizeof(fname));		    if (*cp != '/') {			if (!getcwd(fname, sizeof(fname))) {			    cleanup(0);			    err(1, "fatal error during execution: getcwd");			}			len = strlen(fname);			snprintf(&fname[len], sizeof(fname) - len, "/%s", cp);		    }		}	}	if (cp) {		if (isURL(pkg)) {			/* file is already unpacked by fileGetURL() */			strlcpy(PlayPen, cp, PlayPenSize);		} else {			/*			 * Apply a crude heuristic to see how much space the package will			 * take up once it's unpacked.  I've noticed that most packages			 * compress an average of 75%, but we're only unpacking the + files so			 * be very optimistic.			 */			if (stat(fname, &sb) == FAIL) {				pwarnx("can't stat package file '%s'", fname);				code = 1;				goto bail;			}			Home = make_playpen(PlayPen, PlayPenSize, sb.st_size / 2);			if (unpack(fname, "+*")) {				pwarnx("error during unpacking, no info for '%s' available", pkg);				code = 1;				goto bail;			}		}	}	/*	 * It's not an uninstalled package, try and find it among the	 * installed	 */	else {		char           *tmp;		if (!(tmp = getenv(PKG_DBDIR)))			tmp = DEF_LOG_DIR;		(void) snprintf(log_dir, sizeof(log_dir), "%s/%s", tmp,			pkg);		if (!fexists(log_dir) && 			! (pkg2 = find_prefix(log_dir, sizeof(log_dir), tmp, pkg))) {			pwarnx("can't find package `%s' installed or in a file!", pkg);			return 1;		}		if (pkg2) 			pkg = pkg2;		if (chdir(log_dir) == FAIL) {			pwarnx("can't change directory to '%s'!", log_dir);			free(pkg2);			return 1;		}		installed = TRUE;	}	/*         * Index is special info type that has to override all others to make         * any sense.         */	if (Flags & SHOW_INDEX) {		show_index(pkg, COMMENT_FNAME);	} else {		/* Suck in the contents list */		plist.head = plist.tail = NULL;		fp = fopen(CONTENTS_FNAME, "r");		if (!fp) {			pwarnx("unable to open %s file", CONTENTS_FNAME);			code = 1;			goto bail;		}		/* If we have a prefix, add it now */		read_plist(&plist, fp);		fclose(fp);		/* Start showing the package contents */		if (!Quiet)			printf("%sInformation for %s:\n\n", InfoPrefix, pkg);		if (Flags & SHOW_COMMENT)			show_file("Comment:\n", COMMENT_FNAME);		if ((Flags & SHOW_REQBY) && !isemptyfile(REQUIRED_BY_FNAME))			show_file("Required by:\n", REQUIRED_BY_FNAME);		if (Flags & SHOW_DESC)			show_file("Description:\n", DESC_FNAME);		if ((Flags & SHOW_DISPLAY) && fexists(DISPLAY_FNAME))			show_file("Install notice:\n", DISPLAY_FNAME);		if (Flags & SHOW_PLIST)			show_plist("Packing list:\n", &plist, PLIST_SHOW_ALL);		if ((Flags & SHOW_INSTALL) && fexists(INSTALL_FNAME))			show_file("Install script:\n", INSTALL_FNAME);		if ((Flags & SHOW_DEINSTALL) && fexists(DEINSTALL_FNAME))			show_file("De-Install script:\n", DEINSTALL_FNAME);		if ((Flags & SHOW_MTREE) && fexists(MTREE_FNAME))			show_file("mtree file:\n", MTREE_FNAME);		if (Flags & SHOW_PREFIX)			show_plist("Prefix(s):\n", &plist, PLIST_CWD);		if (Flags & SHOW_FILES)			show_files("Files:\n", &plist);		if (!Quiet)			puts(InfoPrefix);		free_plist(&plist);	}bail:	free(pkg2);	leave_playpen(Home);	if (isTMP)		unlink(fname);	return code;}