1/*	$NetBSD: main.c,v 1.1.1.10 2011/02/18 22:32:27 aymeric Exp $	*/
2
3#if HAVE_CONFIG_H
4#include "config.h"
5#endif
6#include <nbcompat.h>
7#if HAVE_SYS_CDEFS_H
8#include <sys/cdefs.h>
9#endif
10__RCSID("$NetBSD: main.c,v 1.1.1.10 2011/02/18 22:32:27 aymeric Exp $");
11
12/*
13 *
14 * FreeBSD install - a package for the installation and maintainance
15 * of non-core utilities.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 *
26 * Jordan K. Hubbard
27 * 18 July 1993
28 *
29 * This is the add module.
30 *
31 */
32
33#if HAVE_ERR_H
34#include <err.h>
35#endif
36#if HAVE_SYS_PARAM_H
37#include <sys/param.h>
38#endif
39#include "lib.h"
40#include "add.h"
41
42static char Options[] = "AC:DIK:LP:RVW:fhm:np:t:Uuvw:";
43
44char   *Destdir = NULL;
45char   *OverrideMachine = NULL;
46char   *Prefix = NULL;
47char   *View = NULL;
48char   *Viewbase = NULL;
49Boolean NoView = FALSE;
50Boolean NoInstall = FALSE;
51Boolean NoRecord = FALSE;
52Boolean Automatic = FALSE;
53Boolean ForceDepends = FALSE;
54/*
55 * Normally, updating fails if the dependencies of a depending package
56 * are not satisfied by the package to be updated.  ForceDepending
57 * turns that failure into a warning.
58 */
59Boolean ForceDepending = FALSE;
60
61int	LicenseCheck = 0;
62int     Replace = 0;
63int	ReplaceSame = 0;
64
65static void
66usage(void)
67{
68	(void) fprintf(stderr, "%s\n%s\n%s\n%s\n",
69	    "usage: pkg_add [-AfhILnRuVv] [-C config] [-P destdir] [-K pkg_dbdir]",
70	    "               [-m machine] [-p prefix] [-s verification-type",
71	    "               [-W viewbase] [-w view]\n",
72	    "               [[ftp|http]://[user[:password]@]host[:port]][/path/]pkg-name ...");
73	exit(1);
74}
75
76int
77main(int argc, char **argv)
78{
79	int     ch, error=0;
80	lpkg_head_t pkgs;
81
82	setprogname(argv[0]);
83	while ((ch = getopt(argc, argv, Options)) != -1) {
84		switch (ch) {
85		case 'A':
86			Automatic = TRUE;
87			break;
88
89		case 'C':
90			config_file = optarg;
91			break;
92
93		case 'D':
94			ForceDepending = TRUE;
95			break;
96
97		case 'P':
98			Destdir = optarg;
99			break;
100
101		case 'f':
102			Force = TRUE;
103			ForceDepends = TRUE;
104			ForceDepending = TRUE;
105			break;
106
107		case 'I':
108			NoInstall = TRUE;
109			break;
110
111		case 'K':
112			pkgdb_set_dir(optarg, 3);
113			break;
114
115		case 'L':
116			NoView = TRUE;
117			break;
118
119		case 'R':
120			NoRecord = TRUE;
121			break;
122
123		case 'm':
124			OverrideMachine = optarg;
125			break;
126
127		case 'n':
128			Fake = TRUE;
129			Verbose = TRUE;
130			break;
131
132		case 'p':
133			Prefix = optarg;
134			break;
135
136		case 'U':
137			ReplaceSame = 1;
138			Replace = 1;
139			break;
140
141		case 'u':
142			Replace = 1;
143			break;
144
145		case 'V':
146			show_version();
147			/* NOTREACHED */
148
149		case 'v':
150			Verbose = TRUE;
151			break;
152
153		case 'W':
154			Viewbase = optarg;
155			break;
156
157		case 'w':
158			View = optarg;
159			break;
160
161		case 'h':
162		case '?':
163		default:
164			usage();
165			break;
166		}
167	}
168	argc -= optind;
169	argv += optind;
170
171	pkg_install_config();
172
173	if (Destdir != NULL) {
174		char *pkgdbdir;
175
176		pkgdbdir = xasprintf("%s/%s", Destdir, config_pkg_dbdir);
177		pkgdb_set_dir(pkgdbdir, 4);
178		free(pkgdbdir);
179	}
180
181	process_pkg_path();
182	TAILQ_INIT(&pkgs);
183
184	if (argc == 0) {
185		/* If no packages, yelp */
186		warnx("missing package name(s)");
187		usage();
188	}
189
190	if (strcasecmp(do_license_check, "no") == 0)
191		LicenseCheck = 0;
192	else if (strcasecmp(do_license_check, "yes") == 0)
193		LicenseCheck = 1;
194	else if (strcasecmp(do_license_check, "always") == 0)
195		LicenseCheck = 2;
196	else
197		errx(1, "Unknown value of the configuration variable"
198		    "CHECK_LICENSE");
199
200	if (LicenseCheck)
201		load_license_lists();
202
203	/* Get all the remaining package names, if any */
204	for (; argc > 0; --argc, ++argv) {
205		lpkg_t *lpp;
206
207		if (IS_STDIN(*argv))
208			lpp = alloc_lpkg("-");
209		else
210			lpp = alloc_lpkg(*argv);
211
212		TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link);
213	}
214
215	error += pkg_perform(&pkgs);
216	if (error != 0) {
217		warnx("%d package addition%s failed", error, error == 1 ? "" : "s");
218		exit(1);
219	}
220	exit(0);
221}
222