Nuke pkg_manage. No fault of the author, but it sort of died when we

went to the multi-directory package scheme since it wasn't designed with
that kind of layout in mind when first written, and the attempts to adapt
it haven't really resulted in an interface that's easy to use.  I will make
a stand-alone version of the pkg installer in sysinstall at some point
and drop it into the existing pkg_install directory.
This commit is contained in:
Jordan K. Hubbard 1996-02-09 12:09:19 +00:00
parent dab396ba99
commit f6da9b9d77
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=13995
16 changed files with 0 additions and 1659 deletions

View File

@ -1,7 +0,0 @@
- fixed a bug with respect to the parsing of the pkg_info output
- implemented get_desc() which extracts +DESC and +COMMENT from the
packages. This is still done the stupid way (slow).
- install_batch(): two lists, one containing the to be installed
packages from the chosen directory, the other containing the
allready installed packages.

View File

@ -1,27 +0,0 @@
# $Id: Makefile,v 1.6 1995/05/30 03:50:08 rgrimes Exp $
PROG= pkg_manage
SRCS= pkg_main.c pkg_manage.c pkg_ui.c version.c
LDADD+= -ldialog -lncurses -lmytinfo
DPADD+= ${LIBDIALOG} ${LIBNCURSES} ${LIBMYTINFO}
CFLAGS+= -Wall -Wstrict-prototypes -DHELP_PATH=\"${HELPDIR}/\" \
-I${.CURDIR}/../../gnu/lib/libdialog \
-I${.CURDIR}/../../lib/libncurses
HELPDIR = /usr/share/misc/pkg_manage
HELPS= pkg_install.hlp pkg_preview_fs.hlp \
pkg_del_inst.hlp pkg_main.hlp \
pkg_ds_install.hlp pkg_preview.hlp \
pkg_view_inst.hlp
afterinstall:
@if [ ! -d ${HELPDIR} ]; then rm -f ${HELPDIR}; mkdir -p ${HELPDIR}; fi
@cd ${.CURDIR}; \
for m in ${HELPS} ; do \
cmp -s $$m ${DESTDIR}${HELPDIR}/$$m || \
${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 \
$$m ${DESTDIR}${HELPDIR} ; \
done
.include <bsd.prog.mk>

View File

@ -1,88 +0,0 @@
TODO list for pkg_manage:
- check for expections, catch error output from pkg_* tools
check all i/o operations for error capture.
done 6Apr95
- implement better (faster) way of getting the +* out of the
tar files, or use an index file for this.
done 9Apr95, modified tar to stop after having extracted all
fnames listed on the commandline.
- add extra option to have a user select a directory and then display
all packages in that directory with a descriptive line, one should be
able to select a whole bunch of packages and then select GO.
Maybe review the whole concept. Perhaps something like this:
done 5Apr95
NOTE:
Have two windows, one containing the installed packages, the other
containing the *to be* installed packages. Packages listed in this
last window depend upon the directory chosen. One can delete
packages in the left window, or move packages from the right window
to the left, that is install them.
Coupling deletion from the left window to inclusion in the right
window will be difficult, since one cannot be sure that the list
one sees in the right window are all the packages available.
Furthermore deleting a package does not give one a package file
to store in a central place.
This coupling should not be suggested.
- when deleting the last package in the list, adjust the cursor-pointer
done 6Apr95
- check if a package is already installed when installing it.
done 7Apr95
- Read also +CONTENTS from pkg when scanning directory to extract
the package name from it.
done 7Apr95
- should I check for uid being root before installing anything?
- Make sure that the process can continue as a batch process.
Accumulate all error messages and show them after processing.
Before beginning with a batch install, check if any packages are
already installed, if so pop up message suggesting to delete
the package first before installing the new one.
done 7apr95
- make a dialog in which the comment information is printed, and
which has a button for displaying the description information.
done 6Apr95, no button, but key F2 for description
- when selecting the directory to install multiple packages
print a helpline about what to do.
done 6Apr95
- limit the width of the info-popup when selecting multiple
packages.
done 6Apr95
- make sure that the popup's dont get too big.
done 6Apr95
- add progress indication when scanning packages and installing them.
done 6Apr95, added a dialog_gauge to libdialog.
- check for delwin's whenever a newwin was called
done 6Apr95
- when an error occurs in get_desc, because it can't stat the temporary
file, then there is an seg-fault in draw_box in RefreshListObj() ?????
Low priority, because something fishy is going on then anyway
- use $TMPDIR to create tmp directory into
done 18Apr95
- make sure that when calling help, the helplines are disabled.
done 11Apr95, also implemented a different mechanism to save and
restore helplines
- do a size calculation for the selected packages
done 11Apr95
- (next version?) implement exec_catch_errors with popen(), I think
this will speed up things quite a bit. (not sure about it)

View File

@ -1,14 +0,0 @@
Choose a package from the list of installed packages to delete.
Move the cursor to the package to be deleted and press enter.
You may now select to either:
1. Simulate delete Only display the commands that will
be executed to delete the package,
without actually executing them.
2. Delete This will actually delete the
package.
3. Cancel Return to the package selection menu.
(use arrow-keys or digit to choose option and press enter)

View File

@ -1,9 +0,0 @@
Select the directory where your packages are stored.
Use TAB, SHIFT-TAB to move from one field to another.
When in the directory list, pressing enter over a
directory will move you into that directory.
Select the <OK> button and press enter to continue,
Select the <Cancel> button to return.

View File

@ -1,19 +0,0 @@
There are several fields in the current window, you can move from
one to the other by pressing 'TAB' and 'SHIFT-TAB'.
In the left selection list, mark the packages you wish to install.
Pressing space will mark the current package, '*' will mark all
packages, '-' will unmark all packages.
To view information about a package press either 'ENTER' for
a one line description, or 'F2' for a longer description.
The right selection list lists the already installed packages.
Here you can also view information about these by using the same
keys as described above.
After having marked the packages of your choice, move to the
<Install marked> button with 'TAB' or 'SHIFT-TAB' and press
'ENTER' to actually install them. Before installation a check
will be made if a selected package is already installed. If so,
you will be informed of this and the package will be skipped.

View File

@ -1,57 +0,0 @@
/***************************************************************
*
* Program: pkg_main.c
* Author: Marc van Kempen
* Desc: main routine for pkg_manage
*
* 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 "pkg_manage.h"
#include "ui_objects.h"
extern PKG_info p_inf;
/*
* Main
*/
void
main(int argc, char **argv)
{
init_dialog();
p_inf.Nitems = 0; /* Initialize p_inf */
get_pkginfo();
/* start in the pkg add menu when giving the -add option */
if (argc > 1) {
if (strcmp(argv[1], "-add") == 0) {
install_pkgs_indir();
}
} else {
run_menu();
}
if (p_inf.Nitems > 0) {
FreeInfo();
}
clear();
dialog_update();
end_dialog();
return;
} /* main() */

View File

@ -1,7 +0,0 @@
This is the main menu for pkg_manage:
Select one of the options using the arrow-keys or press the
corresponding digit, and press enter

View File

@ -1,190 +0,0 @@
.TH pkg_manage 1 "6 November 1994" "pkg_manage (1)" "FreeBSD"
.SH NAME
.B pkg_manage
\- Package manager
.SH SYNOPSIS
.TP
.B pkg_manage
.SH DESCRIPTION
Pkg_manage is an interactive tool with which you can install,
delete and view packages. It is a
front-end to the pkg_add(1), pkg_info(1) and pkg_delete(1) programs.
Pressing F1 (or '?') at anytime during the program will bring up
online-help. (Pressing '?' will not invoke help when in character
input fields)
.SH NAVIGATING THE MENU
When starting pkg_manage you will be put in a menu with the following
choices:
.TP
.B 1. View installed.
You will be offered an overview of the installed
packages. Moving the cursor to a packagename and pressing 'enter'
will show additional information for the package. Use the
.B PgUp
and
.B PgDn
keys to page through the information. Press
.B Enter
(this selects the
.B <EXIT>
button) to return to the 'View installed Packages' menu.
When done viewing packages move the cursor to the
.B <Cancel>
button with the right-arrow key (or left-arrow key)
and press enter. This will return you to the main-menu.
.TP
.B 2. Delete installed
You can choose a package from the installed ones to delete. Move the
cursor to the package you wish to delete and press enter. This will
bring up another menu from which you can choose to either:
.B 1. Simulate delete:
Have a look at the commands that are going to be executed (recommended).
.B 2. Delete:
Execute the commands to delete the package.
.B 3. Cancel:
Do
.B NOT
execute the commands to delete the package and return to the
previous menu.
Choose the
.B <Cancel>
button if you don't want to delete any packages
and return to the main-menu.
.TP
.B 3. Preview package
Take a look at the commands that will be executed upon installation
of a package.
Choose a package with the fileselector. See below for a description of
the usage of the fileselector.
.TP
.B 4. Install packages
Install packages of your choice. Use the directoryselector to select a
directory containing your packages. Move the cursor to
.B <OK>
to continue,
.B <Cancel>
to back out.
Once a directory has been chosen, it will be scanned for packages files,
typically files ending in '.tgz'. These will be listed in
a listbox (the one on the left) as well as the already installed
packages, that will be listed in a similar box (on the right side).
Use TAB or SHIFT-TAB to move from field to field.
Packages can be selected in the left listbox, using either the
space bar, to mark/unmark a single package at a time, or by using
\'*', '-' to mark/unmark all packages at once.
Once the packages have been selected move to the
.B <Install marked>
button and press enter. If you want to back out, press either ESC
or move to the
.B <Cancel>
button and press enter.
Under the left listbox, the number of kilobytes that the packages will
consume once installed, are indicated.
.TP
.B 5. Quit
Well just try this one if you get fed up fiddling with your packages.
.SH USING THE FILESELECTOR
Using the fileselector is really very simple.
.\"
.\" Does anyone know how I can enter this into the manpage?
.\"
.\"+----------------------------------------------------------+
.\"| Filemask: Directory: |
.\"| +-----------------+ +----------------------------------+ |
.\"| |*.tgz | |/seperate/home/marc/src/pkg_manage| |
.\"| +-----------------+ +----------------------------------+ |
.\"| | Directories: Files: |
.\"| +--------------------------+ +-------------------------+ |
.\"| |.. | |mlist-1.2_bin.tgz | |
.\"| |libdialog | | | |
.\"| | | | | |
.\"| | | | | |
.\"| | | | | |
.\"| | | | | |
.\"| | | | | |
.\"| +-------------------(100%)-+ +------------------(100%)-+ |
.\"| Selection: |
.\"| +------------------------------------------------------+ |
.\"| | | |
.\"| +------------------------------------------------------+ |
.\"| +------+ +----------+ |
.\"| | <Ok> | | <Cancel> | |
.\"| +------+ +----------+ |
.\"+----------------------------------------------------------+
.\"
Use the
.B TAB
key to move forwards from one input/display field to
the next. If enabled in the termcap,
.B Shift-TAB
will move backwards.
Pressing enter in a field will perform the changes you may have made and
move to the next field. Pressing
.B TAB
will discard the changes and move to the next field.
The
.B "Filemask:"
controls what kind of files will be displayed in the
.B "Files:"
list. The expression follows the same rules as your shell does, i.e.
\'*.tgz' will only show files having names ending with '.tgz'.
.B "Directory:"
displays the current directory. You can also type in another directory
in this field.
The
.B "Directories:"
list enables you to browse the filesystem. Select
.B '..'
and press enter to
go up the directory tree, select any other directory listed to descent
into that directory.
Finally there three more fields: The
.B Selection:
, the
.B <Ok>
button and the
.B <Cancel>
button. The file chosen in the
.B Files:
field, assuming you pressed enter, will be displayed in the
.B Selection:
field. You can also change this value directly by editing the field.
When you are satisfied with the current selection you can move the cursor
to the
.B <Ok>
button and press enter. If you want to back out, move the cursor to the
.B <Cancel>
button and press enter.
.SH USING THE DIRECTORYSELECTOR
This is basically the same as using the fileselector. There are just no
files to select. Once the directory has been chosen, choose
.B <OK>
.SH SEE ALSO
pkg_add(1), pkg_info(1), pkg_delete(1), pkg_create(1).
.SH BUGS
Sure.
.SH AUTHORS
Marc van Kempen (wmbfmk@urc.tue.nl)

View File

@ -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() */

View File

@ -1,80 +0,0 @@
/*
* include file for pkg_manage
*
*
* 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 <sys/types.h>
#include <sys/stat.h>
#include <sys/dirent.h>
#include <ncurses.h>
#include <dialog.h>
#ifndef TRUE
#define TRUE (1)
#endif
#ifndef FALSE
#define FALSE (0)
#endif
typedef struct {
int N; /* size of buf in bytes */
int Nitems; /* # of packages */
char *buf; /* buffer to hold package info */
char **name; /* array of char pointer to locations in buf */
char **comment; /* idem */
char **description; /* idem */
unsigned char **mnu; /* pointers to be used with dialog_menu() */
} PKG_info;
/* Names of the description and comment files in the package */
#define DESC "+DESC"
#define COMMENT "+COMMENT"
#define CONTENTS "+CONTENTS"
/* some programs */
#define PKG_DELETE "/usr/sbin/pkg_delete"
#define PKG_INFO "/usr/sbin/pkg_info"
#define PKG_ADD "/usr/sbin/pkg_add"
#define TAR "/usr/bin/tar"
#define GUNZIP "/usr/bin/gunzip"
/* HELP_PATH must have a trailing '/' */
#ifndef HELP_PATH
#define HELP_PATH "/home/marc/src/dialog/pkg_manage/"
#endif
#define VIEW_INST_HLP HELP_PATH##"pkg_view_inst.hlp"
#define DEL_INST_HLP HELP_PATH##"pkg_del_inst.hlp"
#define INSTALL_HLP HELP_PATH##"pkg_install.hlp"
#define MAIN_HLP HELP_PATH##"pkg_main.hlp"
#define DS_INSTALL_HLP HELP_PATH##"pkg_ds_install.hlp"
#define PREVIEW_HLP HELP_PATH##"pkg_preview.hlp"
#define PREVIEW_FS_HLP HELP_PATH##"pkg_preview_fs.hlp"
/*
* prototypes
*/
void run_menu(void);
void get_pkginfo(void);
void FreeInfo(void);
void install_package(char *fname);
int get_pkg_index(char *selection);
void install_batch(void);
int get_desc(char *fname, char **name, char **comment,
char **desc, long *size, char *tmp_file);
int exec_catch_errors(char *prog, char *arg, char *fout);
int already_installed(char *name);
void install_pkgs_indir(void);

View File

@ -1,5 +0,0 @@
Shown are the commands that will be executed when the package
is installed.

View File

@ -1,10 +0,0 @@
Select a package. The commands that will be executed on installation
of this package will be shown.
Use TAB and SHIFT-TAB to move from field to field.
Selection: contains the name of the selected filename. Edit the field
directly or choose a filename from the "Files:" box.

View File

@ -1,599 +0,0 @@
/***************************************************************
*
* Program: pkg_ui.c
* Author: Marc van Kempen
* Desc: user interface parts of pkg_manage
*
* 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 <unistd.h>
#include <sys/param.h>
#include "pkg_manage.h"
#include "dir.h"
#include "dialog.priv.h"
#include "ui_objects.h"
extern PKG_info p_inf;
/*
* Functions
*/
void
view_installed(void)
/*
* Desc: View the installed packages
*/
{
int i, quit_view, sc=0, ch=0;
char selection[1024];
if (p_inf.Nitems == 0) {
use_helpfile(NULL);
use_helpline(NULL);
dialog_notify("No packages installed or no info available");
return;
}
use_helpfile(VIEW_INST_HLP);
quit_view = FALSE;
while (!quit_view) {
use_helpline("F1=help, use arrow-keys or character to select option and press enter");
if (dialog_menu("View installed packages",
"Press enter to see the package descriptions",
LINES, COLS, LINES-5, p_inf.Nitems,
p_inf.mnu, selection, &ch, &sc )) {
quit_view = TRUE;
} else {
i = get_pkg_index(selection);
use_helpline("F1=help, use PgUp and PgDn and arrow-keys to move through the text");
dialog_mesgbox(p_inf.comment[i], p_inf.description[i], LINES, COLS);
}
}
use_helpfile(NULL);
use_helpline(NULL);
return;
} /* view_installed() */
void
delete_installed(void)
/*
* Desc: Delete an installed package
*/
{
unsigned char *mnu[] = {
"1. Simulate delete", "Display commands that are going to be executed",
"2. Delete", "Execute commands to delete the package",
"3. Cancel", "Do NOT delete the package"
};
char tmp[512], args[512], selection[512], *tmp_file;
int quit_view, quit_del;
int i, sel, ch=0, sc=0, ch0=0, sc0=0, ret;
if (p_inf.Nitems == 0) {
use_helpfile(NULL);
use_helpline(NULL);
dialog_notify("No packages installed or no info available");
return;
}
quit_view = FALSE;
while (!quit_view) {
use_helpline("F1=help, use arrow-keys or character to select option and press enter");
use_helpfile(DEL_INST_HLP);
if (dialog_menu("DELETE an installed package",
"Press enter to select a package",
LINES, COLS, LINES-5, p_inf.Nitems,
p_inf.mnu, selection, &ch, &sc)) {
quit_view = TRUE;
} else {
quit_del = FALSE;
i = get_pkg_index(selection);
while (!quit_del) {
sprintf(tmp, "Delete <%s>", p_inf.name[i]);
use_helpline("F1=help, use arrow-keys or digit to select option and press enter");
if (dialog_menu("Delete a package", tmp, 10, COLS-6,
3, 3, mnu, selection, &ch0, &sc0)) {
quit_del = TRUE;
} else {
sel = atoi(selection);
switch(sel) {
case 1:
tmp_file = tempnam(NULL, "pkg.");
sprintf(args, "-n %s", p_inf.name[i]);
ret = exec_catch_errors(PKG_DELETE, args, tmp_file);
if (!ret) {
dialog_textbox("Package deletion commands",
tmp_file, LINES, COLS);
}
unlink(tmp_file);
free(tmp_file);
break;
case 2:
exec_catch_errors(PKG_DELETE, p_inf.name[i], NULL);
get_pkginfo();
if (ch >= p_inf.Nitems) { /* adjust pointers */
ch = p_inf.Nitems-1;
if (sc>ch) sc=ch;
}
quit_del = TRUE;
if (p_inf.Nitems == 0) {
/* Quit 'delete-installed' when no packages available */
quit_view = TRUE;
}
break;
case 3:
quit_del = TRUE;
break;
}
}
}
}
}
use_helpfile(NULL);
use_helpline(NULL);
return;
} /* delete_installed() */
void
preview_pkg(void)
/*
* Desc: View the package description and comment before installation
*/
{
char *fname, *tmp_file;
char args[512], title[512];
int err;
use_helpfile(PREVIEW_FS_HLP);
use_helpline("Select package to preview");
fname = dialog_fselect(".", "*.tgz");
while (fname) {
use_helpfile(PREVIEW_HLP);
use_helpline("use PgUp and PgDn and arrow-keys to move through the text");
tmp_file = tempnam(NULL, "pkg.");
if (!tmp_file) {
fprintf(stderr, "preview_pkg: Could not allocate space for tmp_file\n");
exit(-1);
}
sprintf(args, "-n %s", fname);
err = exec_catch_errors(PKG_ADD, args, tmp_file);
if (!err) {
sprintf(title, "Preview package <%s>", fname);
dialog_textbox(title, tmp_file, LINES, COLS);
}
unlink(tmp_file);
free(fname);
free(tmp_file);
use_helpfile(PREVIEW_FS_HLP);
use_helpline("Select package to preview");
fname = dialog_fselect(".", "*.tgz");
}
if (fname) free(fname);
use_helpfile(NULL);
use_helpline(NULL);
return;
} /* preview_pkg() */
void
install_batch(void)
/*
* Desc: Get the directory from which to list and install packages
*/
{
int quit;
use_helpfile(DS_INSTALL_HLP);
quit = FALSE;
while (!quit) {
use_helpline("Select directory where the pkg's reside");
if (dialog_dselect(".", "*.tgz")) {
quit = TRUE;
} else {
install_pkgs_indir();
}
}
return;
} /* install_batch() */
void
install_pkgs_indir(void)
/*
* Desc: install several packages.
*/
{
WINDOW *pkg_win, *w, *tmpwin;
DirList *d = NULL;
char **fnames, o_pkg[MAXPATHLEN], o_pkgi[MAXPATHLEN],
**comment, **desc, **names, msg[512];
int n, nf, i, p, quit, j, *a, recalc;
struct ComposeObj *obj = NULL;
ListObj *pkg_obj, *pkgi_obj;
ButtonObj *installbut_obj, *cancelbut_obj;
int o_installbut, o_cancelbut, install;
long total_marked = 0, *sizes;
char *tmp_file, tmp_dir[MAXPATHLEN];
/* list all packages in the current directory with a short description of
the package. Pressing enter should give more info about a specific
package. */
/* save current window */
tmpwin = dupwin(newscr);
if (tmpwin == NULL) {
endwin();
fprintf(stderr, "\ninstall_pkgs_indir: dupwin(newscr) failed\n");
exit(1);
}
use_helpline(NULL);
pkg_win = newwin(LINES-4, COLS-12, 2, 5);
if (pkg_win == NULL) {
endwin();
fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n",
LINES-4, COLS-10, 2, 5);
exit(1);
}
draw_box(pkg_win, 0, 0, LINES-4, COLS-12, dialog_attr, border_attr);
wattrset(pkg_win, dialog_attr);
mvwaddstr(pkg_win, 0, (COLS-12)/2 - 12, " Install multiple packages ");
draw_shadow(stdscr, 2, 5, LINES-4, COLS-12);
use_helpline("Enter,F2=info, Space=mark, *=mark all, -=unmark all, TAB=move");
display_helpline(pkg_win, LINES-5, COLS-12);
wrefresh(pkg_win);
/* now build a list of the packages in the chosen directory */
/* and display them in a list */
get_dir(".", "*.tgz", &d, &n);
get_filenames(d, n, &fnames, &nf);
FreeDir(d, n); /* free the space allocated to d */
/* now get the description and comment and the name from the packages. */
/* If there is no +COMMENT or +DESC in the package, then it's propably */
/* not a package */
if (nf == 0) {
dialog_notify("No installable packages in this directory");
return;
}
names = (char **) malloc( sizeof(char *) * nf);
if (!names) {
fprintf(stderr, "install_batch(): Error mallocing space for names\n");
exit(-1);
}
comment = (char **) malloc( sizeof(char *) * nf );
if (!comment) {
fprintf(stderr, "install_batch(): Error malloc'ing space for comment\n");
exit(-1);
}
desc = (char **) malloc( sizeof(char *) * nf );
if (!desc) {
fprintf(stderr, "install_batch(): Error malloc'ing space for desc\n");
exit(-1);
}
sizes = (long *) malloc( sizeof(long) * nf );
if (!sizes) {
fprintf(stderr, "install_batch(): Error malloc'ing space for desc\n");
exit(-1);
}
/* get_desc extracts the info from the file names[i] and puts the */
/* comment in comment[i] and the description in desc[i], space is */
/* malloc'ed as needed, and should be freed when done with it. */
/* get_desc() returns FALSE when fnames[i] is not a package */
/* the name of the package is extracted from CONTENT and put in */
/* names */
/* create a tmp directory in which the files will be extracted */
tmp_file = tempnam("", "pkg.");
if (!tmp_file) {
fprintf(stderr, "install_batch(): Error malloc'ing space for tmpfile\n");
exit(1);
}
if (getenv("TMPDIR")) {
sprintf(tmp_dir, "%s/%s", getenv("TMP_DIR"), tmp_file);
} else {
sprintf(tmp_dir, "/usr/tmp/%s", tmp_file);
mkdir("/usr/tmp", S_IRWXU);
}
free(tmp_file);
if (mkdir(tmp_dir, S_IRWXU)) {
dialog_notify("Could not create temporary directory in /usr/tmp, exiting");
free(names);
free(comment);
free(desc);
for (i=0; i<nf; i++) free(fnames[i]);
free(fnames);
delwin(pkg_win);
return;
}
w = dupwin(curscr);
if (!w) {
fprintf(stderr, "install_batch(): Error malloc'ing new window\n");
exit(-1);
}
a = (int *) malloc( nf * sizeof(int) );
j = 0;
for (i=0; i<nf; i++) {
dialog_gauge("Scanning directory:", fnames[i], LINES/2-3, COLS/2-30,
7, 60, (int) ((float) (i+1)/nf*100));
if (get_desc(fnames[i], &(names[i]), &(comment[i]),
&(desc[i]), &(sizes[i]), tmp_dir) == FALSE) {
a[j] = i;
j++;
}
}
wrefresh(w);
delwin(w);
/* remove the tmp directory and change to the previous directory */
if (rmdir(tmp_dir)) {
dialog_notify("install_batch(): Error removing temporary directory");
for (i=0; i<nf; i++) {
free(fnames[i]);
free(names[i]);
free(comment[i]);
free(desc[i]);
}
free(fnames);
free(names);
free(comment);
free(desc);
free(sizes);
delwin(pkg_win);
}
/* Now we should have an array with indices of filenames that are not */
/* packages, say a[0..k), 0<=k<=n, and the filenames itself */
/* remove the non-packages from the array */
i=0;
p=0;
while (i+p < nf) {
if ((i+p == a[p]) && (p<j)) {
free(fnames[i+p]);
free(names[i+p]);
free(comment[i+p]);
free(desc[i+p]);
p++;
} else {
fnames[i] = fnames[i+p];
names[i] = names[i+p];
comment[i] = comment[i+p];
desc[i] = desc[i+p];
sizes[i] = sizes[i+p];
i++;
}
}
nf = nf - j;
free(a);
o_pkg[0] = '0';
pkg_obj = NewListObj(pkg_win, "To be installed", names, o_pkg,
1, 2, LINES-11, COLS-50, nf);
AddObj(&obj, LISTOBJ, (void *) pkg_obj);
o_pkgi[0] = '0';
pkgi_obj = NewListObj(pkg_win, "Already Installed", p_inf.name, o_pkgi,
1, COLS-45, LINES-11, COLS-50, p_inf.Nitems);
AddObj(&obj, LISTOBJ, (void *) pkgi_obj);
o_installbut = FALSE;
installbut_obj = NewButtonObj(pkg_win, "Install marked", &o_installbut,
LINES-8, (COLS-12)/2 - 22);
AddObj(&obj, BUTTONOBJ, (void *) installbut_obj);
o_cancelbut = FALSE;
cancelbut_obj = NewButtonObj(pkg_win, "Cancel", &o_cancelbut,
LINES-8, (COLS-12)/2 + 2);
AddObj(&obj, BUTTONOBJ, (void *) cancelbut_obj);
/* print total_marked in window */
wmove(pkg_win, LINES-9, 2);
wattrset(pkg_win, dialog_attr);
waddstr(pkg_win, "Total marked = 0 kB");
total_marked = 0;
recalc = FALSE;
quit = FALSE;
install = FALSE;
while (!quit) {
use_helpfile(INSTALL_HLP);
switch(PollObj(&obj)) {
case SEL_CR:
/* first move back one list object */
if (obj->prev) obj=obj->prev;
if ((ListObj *) obj->obj == pkg_obj) {
dialog_notify(comment[pkg_obj->sel]);
}
if ((ListObj *) obj->obj == pkgi_obj) {
dialog_notify(p_inf.comment[pkgi_obj->sel]);
}
break;
case SEL_BUTTON:
if (o_installbut) {
install = TRUE;
quit = TRUE;
}
if (o_cancelbut) {
quit = TRUE;
}
break;
case SEL_ESC:
quit = TRUE;
break;
case ' ':
if ((ListObj *) obj->obj == pkg_obj) {
MarkCurrentListObj(pkg_obj);
}
recalc = TRUE;
wrefresh(pkg_win);
break;
case '*':
if ((ListObj *) obj->obj == pkg_obj) {
MarkAllListObj(pkg_obj);
}
recalc = TRUE;
break;
case '-':
if ((ListObj *) obj->obj == pkg_obj) {
UnMarkAllListObj(pkg_obj);
}
recalc = TRUE;
break;
case KEY_F(1):
display_helpfile();
break;
case KEY_F(2):
if ((ListObj *) obj->obj == pkg_obj) {
dialog_notify(desc[pkg_obj->sel]);
}
if ((ListObj *) obj->obj == pkgi_obj) {
dialog_notify(p_inf.description[pkgi_obj->sel]);
}
break;
}
if (recalc) {
total_marked = 0;
for (i=0; i<nf; i++) {
if (pkg_obj->seld[i]) {
total_marked += sizes[i];
}
}
recalc = FALSE;
/* print total_marked in window */
wmove(pkg_win, LINES-9, 2);
wattrset(pkg_win, dialog_attr);
sprintf(msg, "Total marked = %6ld kB", (long) (total_marked / 1024));
waddstr(pkg_win, msg);
wrefresh(pkg_win);
}
}
if (install) {
int ninstalled = 0;
/* check if any of the packages marked for installation are */
/* already installed */
i=0;
n=0;
while (i < nf) {
if ((pkg_obj->seld[i]) && (already_installed(names[i]))) {
/* popup a warning and remove the package from the */
/* packages that are going to be installed */
sprintf(msg, " The following package is already installed:\n\n %s (%s)\n\n",
names[i], fnames[i]);
strcat(msg, " This package will be skipped\n");
strcat(msg, " If you want to install it anyway, remove it first");
dialog_notify(msg);
pkg_obj->seld[i] = FALSE;
}
if (pkg_obj->seld[i]) n++; /* count selected packages */
i++;
}
/* now install whatever is left */
for (i=0; i<nf; i++) {
if (pkg_obj->seld[i]) {
dialog_gauge("Installing packages:", names[i], LINES/2-3,
COLS/2-30, 7, 60, (int) ((float) ++ninstalled/n*100));
install_package(fnames[i]);
}
}
if (n>0) get_pkginfo();
}
/* clean up */
for (i=0; i<nf; i++) {
free(fnames[i]);
free(names[i]);
free(comment[i]);
free(desc[i]);
}
free(fnames);
free(names);
free(comment);
free(desc);
free(sizes);
DelObj(obj);
use_helpfile(NULL);
use_helpline(NULL);
delwin(pkg_win);
touchwin(tmpwin);
wrefresh(tmpwin);
delwin(tmpwin);
return;
} /* install_batch() */
void
run_menu(void)
/*
* Desc: display/choose from menu
*/
{
int quit_pkg, sel, ch=0, sc=0;
char selection[30];
unsigned char *pkg_menu[] = {
"1. View installed", "Overview of the installed packages",
"2. Delete installed", "Delete an installed package",
"3. Preview package", "Preview commands executed on installation",
"4. Install packages", "Install one or more packages",
"5. Quit", "Leave the program",
};
quit_pkg = FALSE;
while (!quit_pkg) {
use_helpline("F1=help, use arrow-keys or digit to select option and press enter");
use_helpfile(MAIN_HLP);
if (dialog_menu("Package Manager", "Choose one of the options",
LINES, COLS, 5, 5, pkg_menu, selection, &ch, &sc)) {
quit_pkg = TRUE;
} else {
sel = atoi(selection);
switch(sel) {
case 1: /* View installed packages */
view_installed();
break;
case 2: /* Delete installed package */
delete_installed();
break;
case 3: /* Preview install */
preview_pkg();
break;
case 4: /* Install multiple packages */
install_batch();
break;
case 5: /* Quit */
quit_pkg = TRUE;
break;
}
}
}
return;
} /* run_menu() */

View File

@ -1,8 +0,0 @@
Choose a package from the list to see the description for the package.
Move the cursor with the arrow-keys and PgUp and PgDn, press enter
when the cursor highlights the right package.
When viewing the description use PgUp and PgDn and arrow-keys to move
through the text.

View File

@ -1 +0,0 @@
char version[] = "pkg_manage version 1.0";