/** * Load the list of files in this package into memory, or update the * list if it is there but stale. */ void ensure_packagefiles_available(struct pkginfo *pkg) { static int fd; const char *filelistfile; struct fileinlist **lendp; struct stat stat_buf; char *loaded_list, *loaded_list_end, *thisline, *nextline, *ptr; if (pkg->clientdata && pkg->clientdata->fileslistvalid) return; ensure_package_clientdata(pkg); /* Throw away any stale data, if there was any. */ pkg_files_blank(pkg); /* Packages which aren't installed don't have a files list. */ if (pkg->status == stat_notinstalled) { pkg->clientdata->fileslistvalid = true; return; } /* In a package set that is not multiarch same, there's only * one .list file. Don't read it multiple times. */ if (pkg->installed.multiarch != multiarch_same) { struct pkginfo *otherpkg; for (otherpkg = &pkg->set->pkg; otherpkg; otherpkg = otherpkg->arch_next) { /* If we find a non-multiarch-same package in the set with a more * advanced status, we assume the list file is not for this package. */ if (otherpkg->status > pkg->status && otherpkg->installed.multiarch != multiarch_same) { pkg->clientdata->fileslistvalid = true; return; } } } filelistfile = pkgadminfile(pkg, &pkg->installed, LISTFILE); onerr_abort++; fd= open(filelistfile,O_RDONLY); if (fd==-1) { if (errno != ENOENT) ohshite(_("unable to open files list file for package `%.250s'"), pkg_describe(pkg, pdo_foreign)); onerr_abort--; if (pkg->status != stat_configfiles) { if (saidread == 1) putc('\n',stderr); warning(_("files list file for package `%.250s' missing, assuming " "package has no files currently installed."), pkg_describe(pkg, pdo_foreign)); } pkg->clientdata->files = NULL; pkg->clientdata->fileslistvalid = true; return; } push_cleanup(cu_closefd, ehflag_bombout, NULL, 0, 1, &fd); if(fstat(fd, &stat_buf)) ohshite(_("unable to stat files list file for package '%.250s'"), pkg_describe(pkg, pdo_foreign)); if (stat_buf.st_size) { loaded_list = nfmalloc(stat_buf.st_size); loaded_list_end = loaded_list + stat_buf.st_size; if (fd_read(fd, loaded_list, stat_buf.st_size) < 0) ohshite(_("reading files list for package '%.250s'"), pkg_describe(pkg, pdo_foreign)); lendp= &pkg->clientdata->files; thisline = loaded_list; while (thisline < loaded_list_end) { if (!(ptr = memchr(thisline, '\n', loaded_list_end - thisline))) ohshit(_("files list file for package '%.250s' is missing final newline"), pkg_describe(pkg, pdo_foreign)); /* Where to start next time around. */ nextline = ptr + 1; /* Strip trailing ‘/’. */ if (ptr > thisline && ptr[-1] == '/') ptr--; /* Add the file to the list. */ if (ptr == thisline) ohshit(_("files list file for package `%.250s' contains empty filename"), pkg_describe(pkg, pdo_foreign)); *ptr = '\0'; lendp = pkg_files_add_file(pkg, thisline, fnn_nocopy, lendp); thisline = nextline; } } pop_cleanup(ehflag_normaltidy); /* fd = open() */ if (close(fd)) ohshite(_("error closing files list file for package `%.250s'"), pkg_describe(pkg, pdo_foreign)); onerr_abort--; pkg->clientdata->fileslistvalid = true; }
/** * Load the list of files in this package into memory, or update the * list if it is there but stale. */ void ensure_packagefiles_available(struct pkginfo *pkg) { static int fd; const char *filelistfile; struct fileinlist **lendp; struct stat stat_buf; char *loaded_list, *loaded_list_end, *thisline, *nextline, *ptr; if (pkg->clientdata && pkg->clientdata->fileslistvalid) return; ensure_package_clientdata(pkg); /* Throw away any stale data, if there was any. */ pkg_files_blank(pkg); /* Packages which aren't installed don't have a files list. */ if (pkg->status == stat_notinstalled) { pkg->clientdata->fileslistvalid = true; return; } filelistfile = pkg_infodb_get_file(pkg, &pkg->installed, LISTFILE); onerr_abort++; fd= open(filelistfile,O_RDONLY); if (fd==-1) { if (errno != ENOENT) ohshite(_("unable to open files list file for package `%.250s'"), pkg_name(pkg, pnaw_nonambig)); onerr_abort--; if (pkg->status != stat_configfiles && dpkg_version_is_informative(&pkg->configversion)) { warning(_("files list file for package '%.250s' missing; assuming " "package has no files currently installed"), pkg_name(pkg, pnaw_nonambig)); } pkg->clientdata->files = NULL; pkg->clientdata->fileslistvalid = true; return; } push_cleanup(cu_closefd, ehflag_bombout, NULL, 0, 1, &fd); if (fstat(fd, &stat_buf)) ohshite(_("unable to stat files list file for package '%.250s'"), pkg_name(pkg, pnaw_nonambig)); if (!S_ISREG(stat_buf.st_mode)) ohshit(_("files list for package '%.250s' is not a regular file"), pkg_name(pkg, pnaw_nonambig)); if (stat_buf.st_size) { loaded_list = nfmalloc(stat_buf.st_size); loaded_list_end = loaded_list + stat_buf.st_size; if (fd_read(fd, loaded_list, stat_buf.st_size) < 0) ohshite(_("reading files list for package '%.250s'"), pkg_name(pkg, pnaw_nonambig)); lendp= &pkg->clientdata->files; thisline = loaded_list; while (thisline < loaded_list_end) { struct filenamenode *namenode; ptr = memchr(thisline, '\n', loaded_list_end - thisline); if (ptr == NULL) ohshit(_("files list file for package '%.250s' is missing final newline"), pkg_name(pkg, pnaw_nonambig)); /* Where to start next time around. */ nextline = ptr + 1; /* Strip trailing ‘/’. */ if (ptr > thisline && ptr[-1] == '/') ptr--; /* Add the file to the list. */ if (ptr == thisline) ohshit(_("files list file for package `%.250s' contains empty filename"), pkg_name(pkg, pnaw_nonambig)); *ptr = '\0'; namenode = findnamenode(thisline, fnn_nocopy); lendp = pkg_files_add_file(pkg, namenode, lendp); thisline = nextline; } } pop_cleanup(ehflag_normaltidy); /* fd = open() */ if (close(fd)) ohshite(_("error closing files list file for package `%.250s'"), pkg_name(pkg, pnaw_nonambig)); onerr_abort--; pkg->clientdata->fileslistvalid = true; }