00001
00006 #include "system.h"
00007
00008 #include <rpmio.h>
00009 #include <rpmiotypes.h>
00010 #include <rpmlog.h>
00011
00012 #include <rpmtag.h>
00013 #include <rpmcli.h>
00014
00015 #include "debug.h"
00016
00017
00018 extern time_t get_date(const char * p, void * now);
00019
00020
00021
00022
00023 struct rpmQVKArguments_s rpmIArgs = {
00024 #if defined(RPM_VENDOR_MANDRIVA)
00025 .probFilter = RPMPROB_FILTER_NONE,
00026 #else
00027 .probFilter = (RPMPROB_FILTER_REPLACEOLDFILES | RPMPROB_FILTER_REPLACENEWFILES),
00028 #endif
00029 };
00030
00031
00032 #define POPT_RELOCATE -1021
00033 #define POPT_EXCLUDEPATH -1022
00034 #define POPT_ROLLBACK -1023
00035 #define POPT_ROLLBACK_EXCLUDE -1024
00036
00037 #define POPT_AUTOROLLBACK_GOAL -1036
00038
00039 #define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))
00040
00046
00047 static void argerror(const char * desc)
00048
00049
00050 {
00051
00052 fprintf(stderr, _("%s: %s\n"), __progname, desc);
00053
00054 exit(EXIT_FAILURE);
00055 }
00056
00059 static void installArgCallback( poptContext con,
00060 enum poptCallbackReason reason,
00061 const struct poptOption * opt, const char * arg,
00062 const void * data)
00063
00064
00065 {
00066 QVA_t ia = &rpmIArgs;
00067 int xx;
00068
00069
00070 if (opt->arg == NULL)
00071 switch (opt->val) {
00072
00073 case 'i':
00074 ia->installInterfaceFlags |= INSTALL_INSTALL;
00075 break;
00076
00077 case POPT_EXCLUDEPATH:
00078 if (arg == NULL || *arg != '/')
00079 argerror(_("exclude paths must begin with a /"));
00080 xx = rpmfiAddRelocation(&ia->relocations, &ia->nrelocations, arg, NULL);
00081 break;
00082 case POPT_RELOCATE:
00083 { char * oldPath = NULL;
00084 char * newPath = NULL;
00085
00086 if (arg == NULL)
00087 argerror(_("Option --relocate needs /old/path=/new/path argument"));
00088 if (*arg != '/')
00089 argerror(_("relocations must begin with a /"));
00090 oldPath = xstrdup(arg);
00091 if (!(newPath = strchr(oldPath, '=')))
00092 argerror(_("relocations must contain a ="));
00093 *newPath++ = '\0';
00094 if (*newPath != '/')
00095 argerror(_("relocations must have a / following the ="));
00096 xx = rpmfiAddRelocation(&ia->relocations, &ia->nrelocations,
00097 oldPath, newPath);
00098 oldPath = _free(oldPath);
00099 } break;
00100
00101 case POPT_ROLLBACK_EXCLUDE:
00102 { rpmuint32_t tid;
00103 char *t, *te;
00104
00105
00106 if (arg == NULL)
00107 argerror(_("Option --rbexclude needs transaction id argument(s)"));
00108
00109 te = alloca_strdup(arg);
00110 while (*te != '\0' && strchr(" \t\n,", *te) != NULL)
00111 *te++ = '\0';
00112 while ((t = te++) != NULL && *t != '\0') {
00113
00114 while (*te != '\0' && strchr(" \t\n,", *te) == NULL)
00115 te++;
00116 while (*te != '\0' && strchr(" \t\n,", *te) != NULL)
00117 *te++ = '\0';
00118
00119
00120
00121 tid = (rpmuint32_t) strtol(t, NULL, 0);
00122
00123
00124 ia->rbtidExcludes = xrealloc(ia->rbtidExcludes,
00125 sizeof(*ia->rbtidExcludes) * (ia->numrbtidExcludes + 1));
00126
00127
00128
00129 ia->rbtidExcludes[ia->numrbtidExcludes] = tid;
00130
00131 ia->numrbtidExcludes++;
00132 }
00133 } break;
00134
00135 case POPT_ROLLBACK:
00136 { time_t tid;
00137 if (arg == NULL)
00138 argerror(_("Option --rollback needs a time/date stamp argument"));
00139
00140
00141 tid = get_date(arg, NULL);
00142 rpmlog(RPMLOG_INFO, _("Rollback goal: %-24.24s (0x%08x)\n"), ctime(&tid), (int)tid);
00143
00144
00145 if (tid == (time_t)-1 || tid == (time_t)0)
00146 argerror(_("malformed rollback time/date stamp argument"));
00147 ia->rbtid = (rpmuint32_t)tid;
00148 } break;
00149
00150 case POPT_AUTOROLLBACK_GOAL:
00151 { time_t tid;
00152 if (arg == NULL)
00153 argerror(_("arbgoal takes a time/date stamp argument"));
00154
00155
00156 tid = get_date(arg, NULL);
00157
00158
00159 if (tid == (time_t)-1 || tid == (time_t)0)
00160 argerror(_("malformed arbgoal time/date stamp argument"));
00161 ia->arbtid = (rpmuint32_t)tid;
00162 } break;
00163
00164 case RPMCLI_POPT_NODIGEST:
00165 ia->qva_flags |= VERIFY_DIGEST;
00166 break;
00167
00168 case RPMCLI_POPT_NOSIGNATURE:
00169 ia->qva_flags |= VERIFY_SIGNATURE;
00170 break;
00171
00172 case RPMCLI_POPT_NOHDRCHK:
00173 ia->qva_flags |= VERIFY_HDRCHK;
00174 break;
00175
00176 case RPMCLI_POPT_NODEPS:
00177 ia->noDeps = 1;
00178 break;
00179
00180 case RPMCLI_POPT_NOCONTEXTS:
00181 ia->transFlags |= RPMTRANS_FLAG_NOCONTEXTS;
00182 break;
00183
00184 case RPMCLI_POPT_NOSCRIPTS:
00185 ia->transFlags |= (_noTransScripts|_noTransTriggers);
00186 break;
00187
00188 case RPMCLI_POPT_NOFDIGESTS:
00189 ia->transFlags |= RPMTRANS_FLAG_NOFDIGESTS;
00190 break;
00191
00192 }
00193 }
00194
00197
00198
00199 struct poptOption rpmInstallPoptTable[] = {
00200
00201 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00202 installArgCallback, 0, NULL, NULL },
00203
00204
00205 { "allfiles", '\0', POPT_BIT_SET,
00206 &rpmIArgs.transFlags, RPMTRANS_FLAG_ALLFILES,
00207 N_("install all files, even configurations which might otherwise be skipped"),
00208 NULL},
00209 { "apply", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
00210 (_noTransScripts|_noTransTriggers|
00211 RPMTRANS_FLAG_APPLYONLY|RPMTRANS_FLAG_PKGCOMMIT),
00212 N_("do not execute package scriptlet(s)"), NULL },
00213 { "dirstash", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00214 &rpmIArgs.transFlags, RPMTRANS_FLAG_DIRSTASH,
00215 N_("save erased package files by renaming into sub-directory"), NULL},
00216 { "excludeconfigs", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00217 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOCONFIGS,
00218 N_("do not install configuration files"), NULL},
00219 { "excludedocs", '\0', POPT_BIT_SET,
00220 &rpmIArgs.transFlags, RPMTRANS_FLAG_NODOCS,
00221 N_("do not install documentation"), NULL},
00222 { "justdb", '\0', POPT_BIT_SET, &rpmIArgs.transFlags, RPMTRANS_FLAG_JUSTDB,
00223 N_("update the database, but do not modify the filesystem"), NULL},
00224 { "noconfigs", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00225 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOCONFIGS,
00226 N_("do not install configuration files"), NULL},
00227 { "nodocs", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00228 &rpmIArgs.transFlags, RPMTRANS_FLAG_NODOCS,
00229 N_("do not install documentation"), NULL},
00230 #ifdef NOTYET
00231 { "nocontexts", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00232 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOCONTEXTS,
00233 N_("don't install file security contexts"), NULL},
00234 { "nofdigests", '\0', POPT_BIT_SET,
00235 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOFDIGESTS,
00236 N_("don't verify file digests"), NULL },
00237 #else
00238 { "nocontexts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCONTEXTS,
00239 N_("don't verify file security contexts"), NULL },
00240 { "nofdigests", '\0', 0, NULL, RPMCLI_POPT_NOFDIGESTS,
00241 N_("don't verify file digests"), NULL },
00242 #endif
00243 { "norpmdb", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00244 &rpmIArgs.transFlags, RPMTRANS_FLAG_NORPMDB,
00245 N_("don't register headers in rpmdb"), NULL},
00246
00247 #ifdef NOTYET
00248 { "noscripts", '\0', POPT_BIT_SET,
00249 &rpmIArgs.transFlags, (_noTransScripts|_noTransTriggers),
00250 N_("do not execute package scriptlet(s)"), NULL },
00251 #else
00252 { "noscripts", '\0', 0, NULL, RPMCLI_POPT_NOSCRIPTS,
00253 N_("do not execute package scriptlet(s)"), NULL },
00254 #endif
00255 { "nopretrans", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00256 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOPRETRANS,
00257 N_("do not execute %%pretrans scriptlet (if any)"), NULL },
00258 { "nopre", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00259 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOPRE,
00260 N_("do not execute %%pre scriptlet (if any)"), NULL },
00261 { "nopost", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00262 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOPOST,
00263 N_("do not execute %%post scriptlet (if any)"), NULL },
00264 { "nopreun", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00265 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOPREUN,
00266 N_("do not execute %%preun scriptlet (if any)"), NULL },
00267 { "nopostun", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00268 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOPOSTUN,
00269 N_("do not execute %%postun scriptlet (if any)"), NULL },
00270 { "noposttrans", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00271 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOPOSTTRANS,
00272 N_("do not execute %%postrans scriptlet (if any)"), NULL },
00273
00274 { "notriggers", '\0', POPT_BIT_SET, &rpmIArgs.transFlags, _noTransTriggers,
00275 N_("do not execute any scriptlet(s) triggered by this package"), NULL},
00276 { "notriggerprein", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00277 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERPREIN,
00278 N_("do not execute any %%triggerprein scriptlet(s)"), NULL},
00279 { "notriggerin", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00280 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERIN,
00281 N_("do not execute any %%triggerin scriptlet(s)"), NULL},
00282 { "notriggerun", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00283 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERUN,
00284 N_("do not execute any %%triggerun scriptlet(s)"), NULL},
00285 { "notriggerpostun", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN,
00286 &rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERPOSTUN,
00287 N_("do not execute any %%triggerpostun scriptlet(s)"), NULL},
00288
00289 { "repackage", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE,
00290 &rpmIArgs.transFlags, RPMTRANS_FLAG_REPACKAGE,
00291 N_("save erased package files by repackaging"), NULL},
00292 { "test", '\0', POPT_BIT_SET, &rpmIArgs.transFlags, RPMTRANS_FLAG_TEST,
00293 N_("don't install, but tell if it would work or not"), NULL},
00294
00295 { "allmatches", '\0', POPT_BIT_SET,
00296 &rpmIArgs.installInterfaceFlags, INSTALL_ALLMATCHES,
00297 N_("remove all packages which match <package> (normally an error is generated if <package> specified multiple packages)"),
00298 NULL},
00299
00300 { "badreloc", '\0', POPT_BIT_SET,
00301 &rpmIArgs.probFilter, RPMPROB_FILTER_FORCERELOCATE,
00302 N_("relocate files in non-relocatable package"), NULL},
00303
00304 { "erase", 'e', POPT_BIT_SET,
00305 &rpmIArgs.installInterfaceFlags, INSTALL_ERASE,
00306 N_("erase (uninstall) package"), N_("<package>+") },
00307 { "excludepath", '\0', POPT_ARG_STRING, NULL, POPT_EXCLUDEPATH,
00308 N_("skip files with leading component <path> "),
00309 N_("<path>") },
00310
00311 { "fileconflicts", '\0', POPT_BIT_CLR, &rpmIArgs.probFilter,
00312 (RPMPROB_FILTER_REPLACEOLDFILES | RPMPROB_FILTER_REPLACENEWFILES),
00313 N_("detect file conflicts between packages"), NULL},
00314
00315 { "freshen", 'F', POPT_BIT_SET, &rpmIArgs.installInterfaceFlags,
00316 (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL),
00317 N_("upgrade package(s) if already installed"),
00318 N_("<packagefile>+") },
00319 { "hash", 'h', POPT_BIT_SET, &rpmIArgs.installInterfaceFlags, INSTALL_HASH,
00320 N_("print hash marks as package installs (good with -v)"), NULL},
00321 #ifndef DIEDIEDIE
00322 { "ignorearch", '\0', POPT_BIT_SET,
00323 &rpmIArgs.probFilter, RPMPROB_FILTER_IGNOREARCH,
00324 N_("don't verify package architecture"), NULL},
00325 { "ignoreos", '\0', POPT_BIT_SET,
00326 &rpmIArgs.probFilter, RPMPROB_FILTER_IGNOREOS,
00327 N_("don't verify package operating system"), NULL},
00328 #endif
00329 { "ignoresize", '\0', POPT_BIT_SET, &rpmIArgs.probFilter,
00330 (RPMPROB_FILTER_DISKSPACE|RPMPROB_FILTER_DISKNODES),
00331 N_("don't check disk space before installing"), NULL},
00332 { "includedocs", '\0', POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.incldocs, 0,
00333 N_("install documentation"), NULL},
00334
00335 { "install", 'i', 0, NULL, 'i',
00336 N_("install package(s)"), N_("<packagefile>+") },
00337
00338 { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
00339 N_("do not verify package dependencies"), NULL },
00340
00341 { "noorder", '\0', POPT_BIT_SET,
00342 &rpmIArgs.installInterfaceFlags, INSTALL_NOORDER,
00343 N_("do not reorder package installation to satisfy dependencies"),
00344 NULL},
00345
00346 { "nodigest", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NODIGEST,
00347 N_("don't verify package digest(s)"), NULL },
00348 { "nohdrchk", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOHDRCHK,
00349 N_("don't verify database header(s) when retrieved"), NULL },
00350 { "nosignature", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOSIGNATURE,
00351 N_("don't verify package signature(s)"), NULL },
00352
00353 { "oldpackage", '\0', POPT_BIT_SET,
00354 &rpmIArgs.probFilter, RPMPROB_FILTER_OLDPACKAGE,
00355 N_("upgrade to an old version of the package (--force on upgrades does this automatically)"),
00356 NULL},
00357 { "percent", '\0', POPT_BIT_SET,
00358 &rpmIArgs.installInterfaceFlags, INSTALL_PERCENT,
00359 N_("print percentages as package installs"), NULL},
00360 { "prefix", '\0', POPT_ARG_STRING, &rpmIArgs.qva_prefix, 0,
00361 N_("relocate the package to <dir>, if relocatable"),
00362 N_("<dir>") },
00363 { "relocate", '\0', POPT_ARG_STRING, NULL, POPT_RELOCATE,
00364 N_("relocate files from path <old> to <new>"),
00365 N_("<old>=<new>") },
00366 { "replacefiles", '\0', POPT_BIT_SET, &rpmIArgs.probFilter,
00367 (RPMPROB_FILTER_REPLACEOLDFILES | RPMPROB_FILTER_REPLACENEWFILES),
00368 N_("ignore file conflicts between packages"), NULL},
00369 { "replacepkgs", '\0', POPT_BIT_SET,
00370 &rpmIArgs.probFilter, RPMPROB_FILTER_REPLACEPKG,
00371 N_("reinstall if the package is already present"), NULL},
00372 { "rollback", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, NULL, POPT_ROLLBACK,
00373 N_("deinstall new, reinstall old, package(s), back to <date>"),
00374 N_("<date>") },
00375 { "arbgoal", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, NULL, POPT_AUTOROLLBACK_GOAL,
00376 N_("If transaction fails rollback to <date>"),
00377 N_("<date>") },
00378 { "rbexclude", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, NULL, POPT_ROLLBACK_EXCLUDE,
00379 N_("Exclude Transaction I.D. from rollback"),
00380 N_("<tid>") },
00381 { "upgrade", 'U', POPT_BIT_SET,
00382 &rpmIArgs.installInterfaceFlags, (INSTALL_UPGRADE|INSTALL_INSTALL),
00383 N_("upgrade package(s)"),
00384 N_("<packagefile>+") },
00385
00386 POPT_TABLEEND
00387 };
00388