1 /*        $NetBSD: main.c,v 1.5 2024/06/11 09:26:57 wiz 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.5 2024/06/11 09:26:57 wiz 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 #include "lib.h"
37 #include "add.h"
38 
39 static char Options[] = "AC:DIK:P:RVfhm:np:t:Uuv";
40 
41 char   *Destdir = NULL;
42 char   *OverrideMachine = NULL;
43 char   *OverrideOpsys = NULL;
44 char   *OverrideOSVersion = NULL;
45 char   *Prefix = NULL;
46 Boolean NoInstall = FALSE;
47 Boolean NoRecord = FALSE;
48 Boolean Automatic = FALSE;
49 Boolean ForceDepends = FALSE;
50 /*
51  * Normally, updating fails if the dependencies of a depending package
52  * are not satisfied by the package to be updated.  ForceDepending
53  * turns that failure into a warning.
54  */
55 Boolean ForceDepending = FALSE;
56 
57 int       LicenseCheck = 0;
58 int     Replace = 0;
59 int       ReplaceSame = 0;
60 
61 static void
usage(void)62 usage(void)
63 {
64           (void) fprintf(stderr, "%s\n%s\n%s\n",
65               "usage: pkg_add [-AfhInRuVv] [-C config] [-P destdir] [-K pkg_dbdir]",
66               "               [-m machine] [-p prefix]",
67               "               [[ftp|http]://[user[:password]@]host[:port]][/path/]pkg-name ...");
68           exit(1);
69 }
70 
71 int
main(int argc,char ** argv)72 main(int argc, char **argv)
73 {
74           int     ch, error=0;
75           lpkg_head_t pkgs;
76 
77           setprogname(argv[0]);
78           while ((ch = getopt(argc, argv, Options)) != -1) {
79                     switch (ch) {
80                     case 'A':
81                               Automatic = TRUE;
82                               break;
83 
84                     case 'C':
85                               config_file = optarg;
86                               break;
87 
88                     case 'D':
89                               ForceDepending = TRUE;
90                               break;
91 
92                     case 'P':
93                               Destdir = optarg;
94                               break;
95 
96                     case 'f':
97                               Force = TRUE;
98                               ForceDepends = TRUE;
99                               ForceDepending = TRUE;
100                               break;
101 
102                     case 'I':
103                               NoInstall = TRUE;
104                               break;
105 
106                     case 'K':
107                               pkgdb_set_dir(optarg, 3);
108                               break;
109 
110                     case 'R':
111                               NoRecord = TRUE;
112                               break;
113 
114                     case 'm':
115                               parse_cross(optarg, &OverrideMachine, &OverrideOpsys,
116                                   &OverrideOSVersion);
117                               break;
118 
119                     case 'n':
120                               Fake = TRUE;
121                               Verbose = TRUE;
122                               break;
123 
124                     case 'p':
125                               Prefix = optarg;
126                               break;
127 
128                     case 'U':
129                               ReplaceSame = 1;
130                               Replace = 1;
131                               break;
132 
133                     case 'u':
134                               Replace = 1;
135                               break;
136 
137                     case 'V':
138                               show_version();
139                               /* NOTREACHED */
140 
141                     case 'v':
142                               Verbose = TRUE;
143                               break;
144 
145                     case 'h':
146                     case '?':
147                     default:
148                               usage();
149                               break;
150                     }
151           }
152           argc -= optind;
153           argv += optind;
154 
155           pkg_install_config();
156 
157           if (Destdir != NULL) {
158                     char *pkgdbdir;
159 
160                     pkgdbdir = xasprintf("%s/%s", Destdir, config_pkg_dbdir);
161                     pkgdb_set_dir(pkgdbdir, 4);
162                     free(pkgdbdir);
163           }
164 
165 #ifndef BOOTSTRAP
166           process_pkg_path();
167 #endif
168 
169           TAILQ_INIT(&pkgs);
170 
171           if (argc == 0) {
172                     /* If no packages, yelp */
173                     warnx("missing package name(s)");
174                     usage();
175           }
176 
177 #ifndef BOOTSTRAP
178           if (strcasecmp(do_license_check, "no") == 0)
179                     LicenseCheck = 0;
180           else if (strcasecmp(do_license_check, "yes") == 0)
181                     LicenseCheck = 1;
182           else if (strcasecmp(do_license_check, "always") == 0)
183                     LicenseCheck = 2;
184           else
185                     errx(1, "Unknown value of the configuration variable"
186                         "CHECK_LICENSE");
187 
188           if (LicenseCheck)
189                     load_license_lists();
190 #endif
191 
192           /* Get all the remaining package names, if any */
193           for (; argc > 0; --argc, ++argv) {
194                     lpkg_t *lpp;
195 
196                     if (IS_STDIN(*argv))
197                               lpp = alloc_lpkg("-");
198                     else
199                               lpp = alloc_lpkg(*argv);
200 
201                     TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link);
202           }
203 
204           error += pkg_perform(&pkgs);
205           if (error != 0) {
206                     warnx("%d package addition%s failed", error, error == 1 ? "" : "s");
207                     exit(1);
208           }
209           exit(0);
210 }
211