static int convert_from_old(const char *pkg_add_dbdir, bool dry_run) { DIR *d; struct dirent *dp; struct pkg *p = NULL; char path[MAXPATHLEN]; struct pkgdb *db = NULL; if ((d = opendir(pkg_add_dbdir)) == NULL) err(EX_NOINPUT, "%s", pkg_add_dbdir); if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) { return (EX_IOERR); } while ((dp = readdir(d)) != NULL) { if (dp->d_type == DT_DIR) { if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) continue; if (p == NULL) { if (pkg_new(&p, PKG_OLD_FILE) != EPKG_OK) err(EX_OSERR, "malloc"); } else pkg_reset(p, PKG_OLD_FILE); printf("Converting %s...\n", dp->d_name); snprintf(path, MAXPATHLEN, "%s/%s", pkg_add_dbdir, dp->d_name); if (pkg_old_load_from_path(p, path) != EPKG_OK) { fprintf(stderr, "Skipping invalid package: %s\n", path); continue; } pkg_from_old(p); if (!dry_run) pkgdb_register_ports(db, p); } } pkg_free(p); pkgdb_close(db); return (EX_OK); }
static int convert_from_old(const char *pkg_add_dbdir, bool dry_run) { DIR *d; struct dirent *dp; struct pkg *p = NULL; char path[MAXPATHLEN]; struct pkgdb *db = NULL; struct stat sb; int lock_type = PKGDB_LOCK_EXCLUSIVE; int ret; if (dry_run) ret = pkgdb_access(PKGDB_MODE_READ, PKGDB_DB_LOCAL); else ret = pkgdb_access(PKGDB_MODE_READ|PKGDB_MODE_WRITE| PKGDB_MODE_CREATE, PKGDB_DB_LOCAL); if (ret == EPKG_ENOACCESS) { warnx("Insufficient privileges to convert packages"); return (EX_NOPERM); } else if (ret != EPKG_OK && ret != EPKG_ENODB) { warnx("Error accessing the package database"); return (EX_SOFTWARE); } if ((d = opendir(pkg_add_dbdir)) == NULL) err(EX_NOINPUT, "%s", pkg_add_dbdir); if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) { return (EX_IOERR); } if (dry_run) lock_type = PKGDB_LOCK_READONLY; if (pkgdb_obtain_lock(db, lock_type) != EPKG_OK) { pkgdb_close(db); warnx("Cannot get an advisory lock on a database, it is locked" " by another process"); return (EX_TEMPFAIL); } while ((dp = readdir(d)) != NULL) { if (fstatat(dirfd(d), dp->d_name, &sb, 0) == 0 && S_ISDIR(sb.st_mode)) { if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) continue; if (p != NULL) pkg_free(p); if (pkg_new(&p, PKG_OLD_FILE) != EPKG_OK) err(EX_OSERR, "malloc"); printf("Converting %s...\n", dp->d_name); snprintf(path, sizeof(path), "%s/%s", pkg_add_dbdir, dp->d_name); if (pkg_old_load_from_path(p, path) != EPKG_OK) { fprintf(stderr, "Skipping invalid package: %s\n", path); continue; } pkg_from_old(p); if (!dry_run) pkgdb_register_ports(db, p); } } pkg_free(p); pkgdb_release_lock(db, lock_type); pkgdb_close(db); return (EX_OK); }