static void assert_version_support(const char *const *argv, struct versionrevision *version, const char *feature_name) { struct pkginfo *pkg; if (*argv) badusage(_("--%s takes no arguments"), cipaction->olong); modstatdb_init(admindir,msdbrw_readonly|msdbrw_noavail); pkg = pkg_db_find("dpkg"); switch (pkg->status) { case stat_installed: case stat_triggerspending: break; case stat_unpacked: case stat_halfconfigured: case stat_halfinstalled: case stat_triggersawaited: if (versionsatisfied3(&pkg->configversion, version, dvr_laterequal)) break; printf(_("Version of dpkg with working %s support not yet configured.\n" " Please use 'dpkg --configure dpkg', and then try again.\n"), feature_name); exit(1); default: printf(_("dpkg not recorded as installed, cannot check for %s support!\n"), feature_name); exit(1); } }
static void ignoredepends(const struct cmdinfo *cip, const char *value) { char *copy, *p; const char *pnerr; copy= m_malloc(strlen(value)+2); strcpy(copy,value); copy[strlen(value) + 1] = '\0'; for (p=copy; *p; p++) { if (*p != ',') continue; *p++ = '\0'; if (!*p || *p==',' || p==copy+1) badusage(_("null package name in --ignore-depends comma-separated list `%.250s'"), value); } p= copy; while (*p) { pnerr = pkg_name_is_illegal(p, NULL); if (pnerr) ohshite(_("--ignore-depends requires a legal package name. " "`%.250s' is not; %s"), p, pnerr); pkg_list_prepend(&ignoredependss, pkg_db_find(p)); p+= strlen(p)+1; } free(copy); }
static void tdm_incorp_package(const char *awname) { struct pkginfo *aw = strcmp(awname, "-") ? pkg_db_find(awname) : NULL; dtki->activate_awaiter(aw); }
static void trk_explicit_activate_awaiter(struct pkginfo *aw) { char buf[1024]; const char *emsg; struct pkginfo *pend; if (!trk_explicit_f) return; if (fseek(trk_explicit_f, 0, SEEK_SET)) ohshite(_("failed to rewind trigger interest file `%.250s'"), trk_explicit_fn.buf); while (trk_explicit_fgets(buf, sizeof(buf)) >= 0) { char *slash; bool noawait = false; slash = strchr(buf, '/'); if (slash && strcmp("/noawait", slash) == 0) { noawait = true; *slash = '\0'; } emsg = pkg_name_is_illegal(buf, NULL); if (emsg) ohshit(_("trigger interest file `%.250s' syntax error; " "illegal package name `%.250s': %.250s"), trk_explicit_fn.buf, buf, emsg); pend = pkg_db_find(buf); trig_record_activation(pend, noawait ? NULL : aw, trk_explicit_trig); } }
void trig_file_interests_ensure(void) { FILE *f; char linebuf[1024], *space; struct pkginfo *pkg; const char *emsg; if (filetriggers_edited >= 0) return; f = fopen(triggersfilefile, "r"); if (!f) { if (errno == ENOENT) goto ok; ohshite(_("unable to read file triggers file `%.250s'"), triggersfilefile); } push_cleanup(cu_closestream, ~0, NULL, 0, 1, f); while (fgets_checked(linebuf, sizeof(linebuf), f, triggersfilefile) >= 0) { char *slash; enum trig_options trig_opts = trig_await; space = strchr(linebuf, ' '); if (!space || linebuf[0] != '/') ohshit(_("syntax error in file triggers file `%.250s'"), triggersfilefile); *space++ = '\0'; slash = strchr(space, '/'); if (slash && strcmp("/noawait", slash) == 0) { trig_opts = trig_noawait; *slash = '\0'; } emsg = pkg_name_is_illegal(space, NULL); if (emsg) ohshit(_("file triggers record mentions illegal " "package name `%.250s' (for interest in file " "`%.250s'): %.250s"), space, linebuf, emsg); pkg = pkg_db_find(space); trk_file_interest_change(linebuf, pkg, +2, trig_opts); } pop_cleanup(ehflag_normaltidy); ok: filetriggers_edited = 0; }
void ensure_diversions(void) { static struct varbuf vb; struct stat stab1, stab2; char linebuf[MAXDIVERTFILENAME]; FILE *file; struct diversion *ov, *oicontest, *oialtname; varbufreset(&vb); varbufaddstr(&vb, admindir); varbufaddstr(&vb, "/" DIVERSIONSFILE); varbufaddc(&vb, 0); onerr_abort++; file = fopen(vb.buf,"r"); if (!file) { if (errno != ENOENT) ohshite(_("failed to open diversions file")); if (!diversionsfile) { onerr_abort--; return; } } else if (diversionsfile) { if (fstat(fileno(diversionsfile), &stab1)) ohshite(_("failed to fstat previous diversions file")); if (fstat(fileno(file), &stab2)) ohshite(_("failed to fstat diversions file")); if (stab1.st_dev == stab2.st_dev && stab1.st_ino == stab2.st_ino) { fclose(file); onerr_abort--; return; } } if (diversionsfile) fclose(diversionsfile); diversionsfile = file; setcloexec(fileno(diversionsfile), vb.buf); for (ov = diversions; ov; ov = ov->next) { ov->useinstead->divert->camefrom->divert = NULL; ov->useinstead->divert = NULL; } diversions = NULL; if (!file) { onerr_abort--; return; } while (fgets_checked(linebuf, sizeof(linebuf), file, vb.buf) >= 0) { oicontest = nfmalloc(sizeof(struct diversion)); oialtname = nfmalloc(sizeof(struct diversion)); oialtname->camefrom = findnamenode(linebuf, 0); oialtname->useinstead = NULL; fgets_must(linebuf, sizeof(linebuf), file, vb.buf); oicontest->useinstead = findnamenode(linebuf, 0); oicontest->camefrom = NULL; fgets_must(linebuf, sizeof(linebuf), file, vb.buf); oicontest->pkg = oialtname->pkg = strcmp(linebuf, ":") ? pkg_db_find(linebuf) : NULL; if (oialtname->camefrom->divert || oicontest->useinstead->divert) ohshit(_("conflicting diversions involving `%.250s' or `%.250s'"), oialtname->camefrom->name, oicontest->useinstead->name); oialtname->camefrom->divert = oicontest; oicontest->useinstead->divert = oialtname; oicontest->next = diversions; diversions = oicontest; } onerr_abort--; }
int setselections(const char *const *argv) { const struct namevalue *nv; struct pkginfo *pkg; const char *e; int c, lno; struct varbuf namevb = VARBUF_INIT; struct varbuf selvb = VARBUF_INIT; if (*argv) badusage(_("--%s takes no arguments"), cipaction->olong); modstatdb_open(msdbrw_write | msdbrw_available_readonly); lno= 1; for (;;) { do { c= getchar(); if (c == '\n') lno++; } while (c != EOF && isspace(c)); if (c == EOF) break; if (c == '#') { do { c= getchar(); if (c == '\n') lno++; } while (c != EOF && c != '\n'); continue; } varbuf_reset(&namevb); while (!isspace(c)) { varbuf_add_char(&namevb, c); c= getchar(); if (c == EOF) ohshit(_("unexpected eof in package name at line %d"),lno); if (c == '\n') ohshit(_("unexpected end of line in package name at line %d"),lno); } varbuf_end_str(&namevb); while (c != EOF && isspace(c)) { c= getchar(); if (c == EOF) ohshit(_("unexpected eof after package name at line %d"),lno); if (c == '\n') ohshit(_("unexpected end of line after package name at line %d"),lno); } varbuf_reset(&selvb); while (c != EOF && !isspace(c)) { varbuf_add_char(&selvb, c); c= getchar(); } varbuf_end_str(&selvb); while (c != EOF && c != '\n') { c= getchar(); if (!isspace(c)) ohshit(_("unexpected data after package and selection at line %d"),lno); } e = pkg_name_is_illegal(namevb.buf); if (e) ohshit(_("illegal package name at line %d: %.250s"),lno,e); nv = namevalue_find_by_name(wantinfos, selvb.buf); if (nv == NULL) ohshit(_("unknown wanted status at line %d: %.250s"), lno, selvb.buf); pkg = pkg_db_find(namevb.buf); pkg_set_want(pkg, nv->value); if (c == EOF) break; lno++; } if (ferror(stdin)) ohshite(_("read error on standard input")); modstatdb_shutdown(); varbuf_destroy(&namevb); varbuf_destroy(&selvb); return 0; }