summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg_manage/pkg_manage.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/pkg_manage/pkg_manage.c')
-rw-r--r--usr.sbin/pkg_manage/pkg_manage.c538
1 files changed, 0 insertions, 538 deletions
diff --git a/usr.sbin/pkg_manage/pkg_manage.c b/usr.sbin/pkg_manage/pkg_manage.c
deleted file mode 100644
index c97fd10..0000000
--- a/usr.sbin/pkg_manage/pkg_manage.c
+++ /dev/null
@@ -1,538 +0,0 @@
-/***************************************************************
- *
- * Program: pkg_manage.c
- * Author: Marc van Kempen
- * Desc: Add, delete packages with the pkg_* binaries
- * Get info about installed packages
- * Review about to be installed packages
- *
- * 1. View installed packages
- * 2. Delete installed packages
- * 3. Preview package install
- * 4. Install packages
- *
- * Copyright (c) 1995, Marc van Kempen
- *
- * All rights reserved.
- *
- * This software may be used, modified, copied, distributed, and
- * sold, in both source and binary form provided that the above
- * copyright and these terms are retained, verbatim, as the first
- * lines of this file. Under no circumstances is the author
- * responsible for the proper functioning of this software, nor does
- * the author assume any responsibility for damages incurred with
- * its use.
- *
- ***************************************************************/
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <stdio.h>
-
-#include "pkg_manage.h"
-#include "ui_objects.h"
-#include "dialog.priv.h"
-#include "dir.h"
-
-PKG_info p_inf = { 0, 0, NULL, NULL, NULL, NULL, NULL };
-
-/*******************************************************************
- *
- * Misc Functions
- *
- *******************************************************************/
-
-void
-FreeInfo(void)
-/*
- * Desc: free the space allocated to p_inf
- */
-{
- int i;
-
- free(p_inf.buf);
- free(p_inf.name);
- free(p_inf.comment);
- free(p_inf.description);
- p_inf.Nitems = 0;
- for (i=0; i<2*p_inf.Nitems; i++) {
- free(p_inf.mnu[i]);
- }
- free(p_inf.mnu);
-
- return;
-} /* FreeInfo() */
-
-int
-file_exists(char *fname)
-/*
- * Desc: check if the file <fname> exists (and is readable)
- */
-{
- FILE *f;
-
- if (strlen(fname) == 0) return(FALSE); /* apparently opening an empty */
- /* file for reading succeeds always */
- f = fopen(fname, "r");
- if (f) {
- fclose(f);
- return(TRUE);
- } else {
- return(FALSE);
- }
-} /* file_exists() */
-
-
-int
-exec_catch_errors(char *prog, char *arg, char *fout)
-/*
- * Desc: run the program <prog> with arguments <arg> and catch its output
- * in <fout> and display it in case of an error. specify NULL,
- * if you don't want output.
- */
-{
- char *execstr, *tmp, msg[MAXPATHLEN];
- int ret, yesno, unlink_fout;
-
- execstr = (char *) malloc( strlen(prog) + strlen(arg) + 30 );
- if (!execstr) {
- fprintf(stderr, "exec_catch_errors: Error while mallocing memory\n");
- exit(-1);
- }
-
- /* when fout == NULL, allocate a temporary file name and unlink it */
- /* when done */
- if (!fout) {
- fout = tempnam(NULL, "pkg.");
- if (!fout) {
- fprintf(stderr, "exec_catch_errors: Error allocating temp.name\n");
- exit(-1);
- }
- unlink_fout = TRUE;
- } else {
- unlink_fout = FALSE;
- }
-
- sprintf(execstr, "%s %s > %s 2>&1", prog, arg, fout);
- ret = system(execstr);
- if (ret) {
-
- yesno = dialog_yesno("Error", "An error occured, view output?", 8, 40);
- if (yesno == 0) {
- /* disable helpline */
- tmp = get_helpline();
- use_helpline("use arrowkeys, PgUp, PgDn to move, press enter when done");
- sprintf(msg, "Error output from %s", prog);
- dialog_textbox(msg, fout, LINES-2, COLS-4);
- restore_helpline(tmp);
- }
- }
-
- if (unlink_fout) {
- unlink(fout);
- free(fout);
- }
- free(execstr);
-
- return(ret);
-} /* exec_catch_errors() */
-
-void
-get_pkginfo(void)
-/*
- * Desc: get info about installed packages
- */
-{
- FILE *f;
- char *p;
- struct stat sb;
- int i, j, n, lsize;
- int newline, ret;
- int state;
- char *tmp_file;
-#define R_NAME 1
-#define R_COMMENT 2
-#define R_DESC 3
-
- if (p_inf.Nitems > 0) {
- FreeInfo();
- }
- /* p_inf.Nitems == 0 */
-
- dialog_msgbox("PKG INFO", "Reading info, please wait ...", 4, 35, FALSE);
-
- tmp_file = tempnam(NULL, "pkg.");
- ret = exec_catch_errors(PKG_INFO, "-a", tmp_file);
- if (ret) {
- dialog_notify("Could not get package info\nexiting!");
- unlink(tmp_file);
- free(tmp_file);
- return;
- }
- dialog_clear_norefresh();
-
- f = fopen(tmp_file, "r");
- if (!f) {
- dialog_notify("Could not open temporary file");
- unlink(tmp_file);
- free(tmp_file);
- return;
- }
-
- if (stat(tmp_file, &sb)) { /* stat file to get filesize */
- dialog_notify("Could not stat temporary file");
- fclose(f);
- unlink(tmp_file);
- free(tmp_file);
- return;
- }
-
- if (sb.st_size == 0) {
-#if 0
- dialog_notify("No packages installed or no info available");
-#endif
- fclose(f);
- unlink(tmp_file);
- free(tmp_file);
- return;
- }
-
- /* Allocate a buffer with sufficient space to hold the entire file */
- p_inf.buf = (char *) malloc( sb.st_size + 1);
- p_inf.N = sb.st_size;
- if (fread(p_inf.buf, 1, p_inf.N, f) != p_inf.N) {
- dialog_notify("Could not read entire temporary file");
- free(p_inf.buf);
- fclose(f);
- unlink(tmp_file);
- free(tmp_file);
- return;
- }
- p_inf.buf[p_inf.N] = 0;
- fclose(f);
- unlink(tmp_file);
- free(tmp_file);
-
- /* make one sweep through the buffer to determine the # of entries */
- /* Look for "Information for" in the first column */
- i = p_inf.N - strlen("Information for") - 1;
- p = p_inf.buf;
- if (strncmp(p_inf.buf, "Information for", 15) == 0) {
- n = 1;
- } else {
- n = 0;
- }
- while (i-- > 0) {
- if (*p == '\n') {
- if (strncmp(p+1, "Information for", 15) == 0) {
- n++;
- }
- }
- p++;
- }
-
- /* malloc space for PKG_info */
- p_inf.name = (char **) malloc( n * sizeof(char *) );
- p_inf.comment = (char **) malloc( n * sizeof(char *) );
- p_inf.description = (char **) malloc( n * sizeof(char *) );
- p_inf.Nitems = n;
-
- /* parse pkg_info output */
- /* use a finite state automate to parse the file */
-
- i = 0;
- p = p_inf.buf;
- newline = TRUE;
- state = R_NAME;
- while (*p) {
- if (newline) {
- newline = FALSE;
- switch(state) {
- case R_NAME:
- if (strncmp(p, "Information for", 15) == 0) {
- if (p>p_inf.buf) *(p-1) = '\0';
- p_inf.name[i] = (char *) p+16;
- while (*p && *p != ':') p++;
- if (*p) *p = '\0';
- state = R_COMMENT;
- }
- break;
- case R_COMMENT:
- if (strncmp(p, "Comment:", 8) == 0) {
- while (*p && *p != '\n') p++;
- if (*p) p_inf.comment[i] = (char *) p+1;
- p++;
- while (*p && *p != '\n') p++;
- if (*p) {
- *p = '\0';
- newline = TRUE;
- }
- state = R_DESC;
- }
- break;
- case R_DESC:
- if (strncmp(p, "Description:", 12) == 0) {
- while (*p && *p != '\n') p++;
- if (*p) {
- p_inf.description[i] = (char *) p+1;
- newline = TRUE;
- }
- state = R_NAME;
- i++;
- }
- break;
- }
- }
- if (*p == '\n') newline = TRUE;
- p++;
- }
-
- /* build menu entries */
- p_inf.mnu = (unsigned char **) malloc( 2 * p_inf.Nitems * sizeof(char *) );
-
- lsize = COLS-30;
- j=0;
- for (i=0; i<p_inf.Nitems; i++) {
- /* tag */
- p_inf.mnu[j] = (char *) malloc( lsize );
- strncpy(p_inf.mnu[j], p_inf.name[i], lsize-1);
- p_inf.mnu[j++][lsize-1] = 0;
-
- /* description */
- p_inf.mnu[j] = (char *) malloc( lsize );
- strncpy(p_inf.mnu[j], p_inf.comment[i], lsize-1);
- p_inf.mnu[j++][lsize-1] = 0;
- }
-
- return;
-} /* get_pkginfo() */
-
-int
-get_pkg_index(char *selection)
-/*
- * desc: get the index i, for which p_inf.name[i] == selection
- */
-{
- int i, found = FALSE, index = -1;
-
- for (i=0; i<p_inf.Nitems && !found; i++) {
- if (strcmp(selection, p_inf.name[i]) == 0) {
- found = TRUE;
- index = i;
- }
- }
-
- return(index);
-} /* get_pkg_index() */
-
-void
-install_package(char *fname)
-/*
- * Desc: install the package <fname>
- */
-{
- char *tmp_file;
-
- tmp_file = tempnam(NULL, "pkg.");
- if (!tmp_file) {
- fprintf(stderr, "install_package(): Error malloc'ing tmp_file\n");
- exit(-1);
- }
- exec_catch_errors(PKG_ADD, fname, tmp_file);
-
- unlink(tmp_file);
- free(tmp_file);
-
- return;
-} /* install_package() */
-
-
-
-int
-get_desc(char *fname, char **name, char **comment,
- char **desc, long *size, char *tmp_dir)
-/*
- * Desc: get the description and comment from the files
- * DESC, CONTENT and COMMENT from fname
- * Pre: the current working directory is a temporary,
- * empty directory.
- * Post: name = the name of the package
- * comment = the comment for the package
- * desc = the description for the package
- */
-{
- char msg[80], args[512], *buf, *p, tmp[MAXPATHLEN];
- FILE *f, *pf;
- struct stat sb;
- int i, N, ret, found;
-
- *comment = NULL;
- *desc = NULL;
- *name = NULL;
-
- sprintf(args, "--fast-read -zxvf %s -C %s %s %s %s", fname,
- tmp_dir, CONTENTS, DESC, COMMENT);
- ret = exec_catch_errors(TAR, args, NULL);
- if (ret) {
- sprintf(msg, "Could not get info for <%s>", fname);
- dialog_notify(msg);
- return(FALSE);
- }
- /* Read CONTENTS */
- sprintf(tmp, "%s/%s", tmp_dir, CONTENTS);
- f = fopen(tmp, "r");
- if (f == NULL) {
- /* No contents file in package, propably not a package */
- return(FALSE);
- }
- if (stat(tmp, &sb)) { /* stat file to get filesize */
- dialog_notify("Could not stat CONTENTS file");
- fclose(f);
- return(FALSE);
- }
- if (sb.st_size == 0) {
- dialog_notify("CONTENTS file has zero length");
- fclose(f);
- return(FALSE);
- }
-
- /* Allocate a buffer with sufficient space to hold the entire file */
- buf = (char *) malloc( sb.st_size + 1);
- N = sb.st_size;
- if (fread(buf, 1, N, f) != N) {
- sprintf(msg, "Could not read CONTENT file for <%s>", fname);
- dialog_notify(msg);
- free(buf);
- fclose(f);
- return(FALSE);
- }
- fclose(f);
- buf[N] = 0;
-
- /* look for the name of the package */
- p = buf;
- found = FALSE;
- while (*p && !found) {
- if (strncmp(p, "@name ", 6) == 0) {
- i=0;
- p += 6;
- while (*p && p[i] != '\n' && p[i] != '\r') i++;
- *name = (char *) malloc( i+1 );
- strncpy(*name, p, i);
- (*name)[i] = 0;
- found = TRUE;
- } else {
- p++;
- }
- }
- unlink(tmp);
-
- /* Read COMMENT file */
- sprintf(tmp, "%s/%s", tmp_dir, COMMENT);
- f = fopen(tmp, "r");
- if (f == NULL) {
- /* No comment file in package, propably not a package */
- return(FALSE);
- }
- if (stat(tmp, &sb)) { /* stat file to get filesize */
- dialog_notify("Could not stat COMMENT file");
- fclose(f);
- return(FALSE);
- }
- if (sb.st_size == 0) {
- dialog_notify("COMMENT file has zero length");
- fclose(f);
- return(FALSE);
- }
-
- /* Allocate a buffer with sufficient space to hold the entire file */
- *comment = (char *) malloc( sb.st_size + 1);
- N = sb.st_size;
- if (fread(*comment, 1, N, f) != N) {
- sprintf(msg, "Could not read COMMENT file for <%s>", fname);
- dialog_notify(msg);
- free(*comment);
- fclose(f);
- return(FALSE);
- }
- fclose(f);
- (*comment)[N] = 0;
- unlink(tmp);
-
- /* Read DESC */
- sprintf(tmp, "%s/%s", tmp_dir, DESC);
- f = fopen(tmp, "r");
- if (f == NULL) {
- /* No description file in package, propably not a package */
- return(FALSE);
- }
- if (stat(tmp, &sb)) { /* stat file to get filesize */
- dialog_notify("Could not stat DESC file");
- fclose(f);
- return(FALSE);
- }
- if (sb.st_size == 0) {
- dialog_notify("DESC file has zero length");
- fclose(f);
- return(FALSE);
- }
-
- /* Allocate a buffer with sufficient space to hold the entire file */
- *desc = (char *) malloc( sb.st_size + 1);
- N = sb.st_size;
- if (fread(*desc, 1, N, f) != N) {
- sprintf(msg, "Could not read CONTENT file for <%s>", fname);
- dialog_notify(msg);
- free(*desc);
- fclose(f);
- return(FALSE);
- }
- fclose(f);
- (*desc)[N] = 0;
- unlink(tmp);
-
- /* get the size from the uncompressed package */
- sprintf(tmp, "%s -l %s", GUNZIP, fname);
- pf = popen(tmp, "r");
- if (!pf) {
- dialog_notify("Could not popen gunzip to get package size");
- *size = 0;
- } else {
- while (!feof(pf)) {
- fgets(tmp, 80, pf);
- }
- sscanf(tmp, "%*s %ld", size);
- pclose(pf);
- }
-
- if (found) {
- return(TRUE);
- } else {
- return(FALSE);
- }
-} /* get_desc() */
-
-
-int
-already_installed(char *name)
-/*
- * Desc: check if <name> is already installed as a package
- */
-{
- int i, found;
-
- found = FALSE;
- for (i=0; i<p_inf.Nitems && !found; i++) {
- if (strcmp(name, p_inf.name[i]) == 0) {
- found = TRUE;
- }
- }
-
- return(found);
-} /* already_installed() */
-
-
OpenPOWER on IntegriCloud