mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-12-30 15:38:06 +01:00
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:
parent
dab396ba99
commit
f6da9b9d77
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=13995
@ -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.
|
||||
|
@ -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>
|
@ -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)
|
@ -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)
|
@ -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.
|
@ -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.
|
@ -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() */
|
@ -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
|
||||
|
||||
|
@ -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)
|
@ -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() */
|
||||
|
||||
|
@ -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);
|
@ -1,5 +0,0 @@
|
||||
|
||||
|
||||
Shown are the commands that will be executed when the package
|
||||
is installed.
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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() */
|
@ -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.
|
@ -1 +0,0 @@
|
||||
char version[] = "pkg_manage version 1.0";
|
Loading…
Reference in New Issue
Block a user