diff options
Diffstat (limited to 'pkgtools/pkg_install/files/add/main.c')
-rw-r--r-- | pkgtools/pkg_install/files/add/main.c | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/pkgtools/pkg_install/files/add/main.c b/pkgtools/pkg_install/files/add/main.c new file mode 100644 index 00000000000..8a4bb49fff9 --- /dev/null +++ b/pkgtools/pkg_install/files/add/main.c @@ -0,0 +1,197 @@ +/* $NetBSD: main.c,v 1.1.1.1 2002/12/20 18:13:55 schmonz Exp $ */ + +#if 0 +#include <sys/cdefs.h> +#ifndef lint +#if 0 +static char *rcsid = "from FreeBSD Id: main.c,v 1.16 1997/10/08 07:45:43 charnier Exp"; +#else +__RCSID("$NetBSD: main.c,v 1.1.1.1 2002/12/20 18:13:55 schmonz Exp $"); +#endif +#endif +#endif + +/* + * + * FreeBSD install - a package for the installation and maintainance + * of non-core utilities. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Jordan K. Hubbard + * 18 July 1993 + * + * This is the add module. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_ERR_H +#include <err.h> +#endif + +#ifdef HAVE_SYS_PARAM_H +#include <sys/param.h> +#endif + +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif + +#ifdef HAVE_SYS_RESOURCE_H +#include <sys/resource.h> +#endif + +#include "lib.h" +#include "add.h" +#include "verify.h" + +static char Options[] = "hVvIRfnp:SMs:t:u"; + +char *Prefix = NULL; +Boolean NoInstall = FALSE; +Boolean NoRecord = FALSE; + +char *Mode = NULL; +char *Owner = NULL; +char *Group = NULL; +char *PkgName = NULL; +char *Directory = NULL; +char FirstPen[FILENAME_MAX]; +add_mode_t AddMode = NORMAL; +int upgrade = 0; + +static void +usage(void) +{ + (void) fprintf(stderr, "%s\n%s\n", + "usage: pkg_add [-hVvInfRMSu] [-t template] [-p prefix]", + " [-s verification-type] pkg-name [pkg-name ...]"); + exit(1); +} + +int +main(int argc, char **argv) +{ + int ch, error=0; + lpkg_head_t pkgs; + struct rlimit rlim; + int rc; + + setprogname(argv[0]); + + while ((ch = getopt(argc, argv, Options)) != -1) { + switch (ch) { + case 'v': + Verbose = TRUE; + break; + + case 'p': + Prefix = optarg; + break; + + case 'I': + NoInstall = TRUE; + break; + + case 'R': + NoRecord = TRUE; + break; + + case 'f': + Force = TRUE; + break; + + case 'n': + Fake = TRUE; + Verbose = TRUE; + break; + + case 's': + set_verification(optarg); + break; + + case 't': + strcpy(FirstPen, optarg); + break; + + case 'S': + AddMode = SLAVE; + break; + + case 'M': + AddMode = MASTER; + break; + + case 'V': + show_version(); + /* NOTREACHED */ + + case 'u': + upgrade = 1; + break; + case 'h': + case '?': + default: + usage(); + break; + } + } + argc -= optind; + argv += optind; + + path_create(getenv("PKG_PATH")); + TAILQ_INIT(&pkgs); + + if (AddMode != SLAVE) { + /* Get all the remaining package names, if any */ + for (ch = 0; *argv; ch++, argv++) { + lpkg_t *lpp; + + if (IS_STDIN(*argv)) + lpp = alloc_lpkg("-"); + else + lpp = alloc_lpkg(*argv); + + TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link); + } + } else if (!ch) + /* If no packages, yelp */ + warnx("missing package name(s)"), usage(); + else if (ch > 1 && AddMode == MASTER) + warnx("only one package name may be specified with master mode"), + usage(); + + /* Increase # of max. open file descriptors as high as possible */ + rc = getrlimit(RLIMIT_NOFILE, &rlim); + if (rc == -1) { + warn("cannot retrieve max. number of open files resource limit"); + } else { + rlim.rlim_cur = rlim.rlim_max; + rc = setrlimit(RLIMIT_NOFILE, &rlim); + if (rc == -1) { + warn("cannot increase max. number of open files resource limit, try 'ulimit'"); + } else { + if (Verbose) + printf("increasing RLIMIT_NOFILE to max. %ld open files\n", (long)rlim.rlim_cur); + } + } + + error += pkg_perform(&pkgs); + if (error != 0) { + if (Verbose) + warnx("%d package addition(s) failed", error); + exit(1); + } + exit(0); +} |