static void test_cleanup(void) { const char *error; if (unlink_directory(tmpdir, UNLINK_DIRECTORY_FLAG_RMDIR, &error) < 0) i_error("unlink_directory() failed: %s", error); }
static void mailbox_list_try_delete(struct mailbox_list *list, const char *name, enum mailbox_list_path_type type) { const char *mailbox_path, *path; mailbox_path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_MAILBOX); path = mailbox_list_get_path(list, name, type); if (path == NULL || *path == '\0' || strcmp(path, mailbox_path) == 0) return; if (*list->set.maildir_name == '\0' && (list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) == 0) { /* this directory may contain also child mailboxes' data. we don't want to delete that. */ bool rmdir_path = *list->set.maildir_name != '\0'; if (mailbox_list_delete_mailbox_nonrecursive(list, name, path, rmdir_path) < 0) return; } else { if (unlink_directory(path, TRUE) < 0 && errno != ENOENT && errno != ENOTEMPTY) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", path); } } /* avoid leaving empty directories lying around */ mailbox_list_delete_until_root(list, path, type); }
void testsuite_smtp_deinit(void) { if ( unlink_directory(testsuite_smtp_tmp, TRUE) < 0 ) i_warning("failed to remove temporary directory '%s': %m.", testsuite_smtp_tmp); pool_unref(&testsuite_smtp_pool); }
static void testsuite_tmp_dir_deinit(void) { if ( unlink_directory(testsuite_tmp_dir, TRUE) < 0 ) i_warning("failed to remove temporary directory '%s': %m.", testsuite_tmp_dir); i_free(testsuite_tmp_dir); }
void testsuite_binary_deinit(void) { if ( unlink_directory(testsuite_binary_tmp, TRUE) < 0 ) { i_warning("failed to remove temporary directory '%s': %m.", testsuite_binary_tmp); } i_free(testsuite_binary_tmp); }
int mailbox_list_delete_trash(const char *path) { if (unlink_directory(path, TRUE) < 0) { if (errno == ELOOP) { /* it's a symlink? try just deleting it */ if (unlink(path) == 0) return 0; errno = ELOOP; return -1; } } return 0; }
static int /* O - 0 = success, 1 = fail */ make_subpackage(const char *prodname, /* I - Product short name */ const char *directory, /* I - Directory for distribution files */ const char *platname, /* I - Platform name */ dist_t *dist, /* I - Distribution information */ struct utsname *platform, /* I - Platform information */ const char *subpackage) /* I - Subpackage */ { int i, j; /* Looping vars */ const char *header; /* Dependency header string */ FILE *fp; /* Control file */ char prodfull[255], /* Full name of product */ name[1024], /* Full product name */ filename[1024]; /* Destination filename */ command_t *c; /* Current command */ depend_t *d; /* Current dependency */ file_t *file; /* Current distribution file */ struct passwd *pwd; /* Pointer to user record */ struct group *grp; /* Pointer to group record */ const char *runlevels, /* Run levels */ *rlptr; /* Pointer into runlevels */ static const char *depends[] = /* Dependency names */ { "Depends:", "Conflicts:", "Replaces:", "Provides:" }; /* * Figure out the full name of the distribution... */ if (subpackage) snprintf(prodfull, sizeof(prodfull), "%s-%s", prodname, subpackage); else strlcpy(prodfull, prodname, sizeof(prodfull)); /* * Then the subdirectory name... */ if (dist->release[0]) snprintf(name, sizeof(name), "%s-%s-%s", prodfull, dist->version, dist->release); else snprintf(name, sizeof(name), "%s-%s", prodfull, dist->version); if (platname[0]) { strlcat(name, "-", sizeof(name)); strlcat(name, platname, sizeof(name)); } if (Verbosity) printf("Creating Debian %s distribution...\n", name); /* * Write the control file for DPKG... */ if (Verbosity) puts("Creating control file..."); snprintf(filename, sizeof(filename), "%s/%s", directory, name); mkdir(filename, 0777); strlcat(filename, "/DEBIAN", sizeof(filename)); mkdir(filename, 0777); chmod(filename, 0755); strlcat(filename, "/control", sizeof(filename)); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create control file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fprintf(fp, "Package: %s\n", prodfull); if (dist->release[0]) fprintf(fp, "Version: %s-%s\n", dist->version, dist->release); else fprintf(fp, "Version: %s\n", dist->version); fprintf(fp, "Maintainer: %s\n", dist->vendor); /* * The Architecture attribute needs to match the uname info * (which we change in get_platform to a common name) */ if (!strcmp(platform->machine, "intel")) fputs("Architecture: i386\n", fp); else if (!strcmp(platform->machine, "ppc")) fputs("Architecture: powerpc\n", fp); else fprintf(fp, "Architecture: %s\n", platform->machine); fprintf(fp, "Description: %s\n", dist->product); fprintf(fp, " Copyright: %s\n", dist->copyright); for (i = 0; i < dist->num_descriptions; i ++) if (dist->descriptions[i].subpackage == subpackage) fprintf(fp, " %s\n", dist->descriptions[i].description); for (j = DEPEND_REQUIRES; j <= DEPEND_PROVIDES; j ++) { for (i = dist->num_depends, d = dist->depends; i > 0; i --, d ++) if (d->type == j && d->subpackage == subpackage) break; if (i) { for (header = depends[j]; i > 0; i --, d ++, header = ",") if (d->type == j && d->subpackage == subpackage) { if (!strcmp(d->product, "_self")) fprintf(fp, "%s %s", header, prodname); else fprintf(fp, "%s %s", header, d->product); if (d->vernumber[0] == 0) { if (d->vernumber[1] < INT_MAX) fprintf(fp, " (<= %s)", d->version[1]); } else { if (d->vernumber[1] < INT_MAX) fprintf(fp, " (>= %s, <= %s)", d->version[0], d->version[1]); else fprintf(fp, " (>= %s)", d->version[0]); } } putc('\n', fp); } } fclose(fp); /* * Write the preinst file for DPKG... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage) break; if (i) { if (Verbosity) puts("Creating preinst script..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/preinst", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fchmod(fileno(fp), 0755); fputs("#!/bin/sh\n", fp); fputs("# " EPM_VERSION "\n", fp); for (; i > 0; i --, c ++) if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); fclose(fp); } /* * Write the postinst file for DPKG... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage) break; if (!i) for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) break; if (i) { if (Verbosity) puts("Creating postinst script..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/postinst", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fchmod(fileno(fp), 0755); fputs("#!/bin/sh\n", fp); fputs("# " EPM_VERSION "\n", fp); for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) { runlevels = get_runlevels(file, "02345"); fprintf(fp, "update-rc.d %s start %02d", file->dst, get_start(file, 99)); for (rlptr = runlevels; isdigit(*rlptr & 255); rlptr ++) if (*rlptr != '0') fprintf(fp, " %c", *rlptr); if (strchr(runlevels, '0') != NULL) fprintf(fp, " . stop %02d 0", get_stop(file, 0)); fputs(" . >/dev/null\n", fp); fprintf(fp, "/etc/init.d/%s start\n", file->dst); } fclose(fp); } /* * Write the prerm file for DPKG... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage) break; if (!i) for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) break; if (i) { if (Verbosity) puts("Creating prerm script..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/prerm", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fchmod(fileno(fp), 0755); fputs("#!/bin/sh\n", fp); fputs("# " EPM_VERSION "\n", fp); for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) fprintf(fp, "/etc/init.d/%s stop\n", file->dst); fclose(fp); } /* * Write the postrm file for DPKG... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage) break; if (!i) for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) break; if (i) { if (Verbosity) puts("Creating postrm script..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/postrm", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fchmod(fileno(fp), 0755); fputs("#!/bin/sh\n", fp); fputs("# " EPM_VERSION "\n", fp); for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) { fputs("if [ purge = \"$1\" ]; then\n", fp); fprintf(fp, " update-rc.d %s remove >/dev/null\n", file->dst); fputs("fi\n", fp); } fclose(fp); } /* * Write the conffiles file for DPKG... */ if (Verbosity) puts("Creating conffiles..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/conffiles", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'c' && file->subpackage == subpackage) fprintf(fp, "%s\n", file->dst); else if (tolower(file->type) == 'i' && file->subpackage == subpackage) fprintf(fp, "/etc/init.d/%s\n", file->dst); fclose(fp); /* * Copy the files over... */ if (Verbosity) puts("Copying temporary distribution files..."); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) { if (file->subpackage != subpackage) continue; /* * Find the username and groupname IDs... */ pwd = getpwnam(file->user); grp = getgrnam(file->group); endpwent(); endgrent(); /* * Copy the file or make the directory or make the symlink as needed... */ switch (tolower(file->type)) { case 'c' : case 'f' : snprintf(filename, sizeof(filename), "%s/%s%s", directory, name, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); if (copy_file(filename, file->src, file->mode, pwd ? pwd->pw_uid : 0, grp ? grp->gr_gid : 0)) return (1); break; case 'i' : snprintf(filename, sizeof(filename), "%s/%s/etc/init.d/%s", directory, name, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); if (copy_file(filename, file->src, file->mode, pwd ? pwd->pw_uid : 0, grp ? grp->gr_gid : 0)) return (1); break; case 'd' : snprintf(filename, sizeof(filename), "%s/%s%s", directory, name, file->dst); if (Verbosity > 1) printf("Directory %s...\n", filename); make_directory(filename, file->mode, pwd ? pwd->pw_uid : 0, grp ? grp->gr_gid : 0); break; case 'l' : snprintf(filename, sizeof(filename), "%s/%s%s", directory, name, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); make_link(filename, file->src); break; } } /* * Build the distribution from the spec file... */ if (Verbosity) printf("Building Debian %s binary distribution...\n", name); if (run_command(directory, "dpkg --build %s", name)) return (1); /* * Remove temporary files... */ if (!KeepFiles) { if (Verbosity) printf("Removing temporary %s distribution files...\n", name); snprintf(filename, sizeof(filename), "%s/%s", directory, name); unlink_directory(filename); } return (0); }
int /* O - 0 on success, -1 on failure */ unlink_directory(const char *directory) /* I - Directory */ { DIR *dir; /* Directory */ DIRENT *dent; /* Directory entry */ char filename[1024]; /* Filename */ struct stat fileinfo; /* Information on the source file */ /* * Try opening the source directory... */ if ((dir = opendir(directory)) == NULL) { fprintf(stderr, "epm: Unable to open directory \"%s\": %s\n", directory, strerror(errno)); return (-1); } /* * Read from the directory... */ while ((dent = readdir(dir)) != NULL) { /* * Skip "." and ".."... */ if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) continue; /* * Get file info... */ snprintf(filename, sizeof(filename), "%s/%s", directory, dent->d_name); if (stat(filename, &fileinfo)) { fprintf(stderr, "epm: Unable to stat \"%s\": %s\n", filename, strerror(errno)); continue; } /* * Process accordingly... */ if (Verbosity) puts(filename); if (S_ISDIR(fileinfo.st_mode)) { /* * Directory... */ if (unlink_directory(filename)) goto fail; if (rmdir(filename)) { fprintf(stderr, "epm: Unable to remove \"%s\": %s\n", filename, strerror(errno)); goto fail; } } else { /* * Regular file or symlink... */ if (unlink(filename)) { fprintf(stderr, "epm: Unable to remove \"%s\": %s\n", filename, strerror(errno)); goto fail; } } } closedir(dir); return (0); fail: closedir(dir); return (-1); }
int /* O - 0 = success, 1 = fail */ make_rpm(int format, /* I - Subformat */ const char *prodname, /* I - Product short name */ const char *directory, /* I - Directory for distribution files */ const char *platname, /* I - Platform name */ dist_t *dist, /* I - Distribution information */ struct utsname *platform, /* I - Platform information */ const char *setup, /* I - Setup GUI image */ const char *types) /* I - Setup GUI install types */ { int i; /* Looping var */ FILE *fp; /* Spec file */ tarf_t *tarfile; /* Distribution tar file */ char specname[1024]; /* Spec filename */ char name[1024], /* Product filename */ filename[1024]; /* Destination filename */ file_t *file; /* Current distribution file */ char absdir[1024]; /* Absolute directory */ char rpmdir[1024]; /* RPMDIR env var */ char release[256]; /* Release: number */ const char *build_option; /* Additional rpmbuild option */ if (Verbosity) puts("Creating RPM distribution..."); if (directory[0] != '/') { char current[1024]; /* Current directory */ getcwd(current, sizeof(current)); snprintf(absdir, sizeof(absdir), "%s/%s", current, directory); } else strlcpy(absdir, directory, sizeof(absdir)); /* * Write the spec file for RPM... */ if (Verbosity) puts("Creating spec file..."); snprintf(specname, sizeof(specname), "%s/%s.spec", directory, prodname); if ((fp = fopen(specname, "w")) == NULL) { fprintf(stderr, "epm: Unable to create spec file \"%s\" - %s\n", specname, strerror(errno)); return (1); } if (dist->release[0]) strlcpy(release, dist->release, sizeof(release)); else strlcpy(release, "0", sizeof(release)); fprintf(fp, "Name: %s\n", prodname); fprintf(fp, "Version: %s\n", dist->version); if (dist->epoch) fprintf(fp, "Epoch: %d\n", dist->epoch); fprintf(fp, "Release: %s\n", release); fprintf(fp, "License: %s\n", dist->copyright); fprintf(fp, "Packager: %s\n", dist->packager); fprintf(fp, "Vendor: %s\n", dist->vendor); if (format == PACKAGE_LSB || format == PACKAGE_LSB_SIGNED) fputs("Requires: lsb >= 3.0\n", fp); /* * Tell RPM to put the distributions in the output directory... */ #ifdef EPM_RPMTOPDIR fprintf(fp, "%%define _topdir %s\n", absdir); strcpy(rpmdir, absdir); #else if (getenv("RPMDIR")) strlcpy(rpmdir, getenv("RPMDIR"), sizeof(rpmdir)); else if (!access("/usr/src/redhat", 0)) strcpy(rpmdir, "/usr/src/redhat"); else if (!access("/usr/src/Mandrake", 0)) strcpy(rpmdir, "/usr/src/Mandrake"); else strcpy(rpmdir, "/usr/src/RPM"); #endif /* EPM_RPMTOPDIR */ snprintf(filename, sizeof(filename), "%s/RPMS", directory); make_directory(filename, 0777, getuid(), getgid()); snprintf(filename, sizeof(filename), "%s/rpms", directory); symlink("RPMS", filename); if (!strcmp(platform->machine, "intel")) snprintf(filename, sizeof(filename), "%s/RPMS/i386", directory); else if (!strcmp(platform->machine, "ppc")) snprintf(filename, sizeof(filename), "%s/RPMS/powerpc", directory); else snprintf(filename, sizeof(filename), "%s/RPMS/%s", directory, platform->machine); make_directory(filename, 0777, getuid(), getgid()); /* * Now list all of the subpackages... */ write_spec(format, prodname, dist, fp, NULL); for (i = 0; i < dist->num_subpackages; i ++) write_spec(format, prodname, dist, fp, dist->subpackages[i]); /* * Close the spec file... */ fclose(fp); /* * Copy the files over... */ if (Verbosity) puts("Copying temporary distribution files..."); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) { /* * Copy the file or make the directory or make the symlink as needed... */ switch (tolower(file->type)) { case 'c' : case 'f' : snprintf(filename, sizeof(filename), "%s/buildroot%s", directory, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); if (copy_file(filename, file->src, 0, -1, -1)) return (1); break; case 'i' : if (format == PACKAGE_LSB || format == PACKAGE_LSB_SIGNED) snprintf(filename, sizeof(filename), "%s/buildroot/etc/init.d/%s", directory, file->dst); else snprintf(filename, sizeof(filename), "%s/buildroot%s/init.d/%s", directory, SoftwareDir, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); if (copy_file(filename, file->src, 0, -1, -1)) return (1); break; case 'd' : snprintf(filename, sizeof(filename), "%s/buildroot%s", directory, file->dst); if (Verbosity > 1) printf("Directory %s...\n", filename); make_directory(filename, 0755, -1, -1); break; case 'l' : snprintf(filename, sizeof(filename), "%s/buildroot%s", directory, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); make_link(filename, file->src); break; } } /* * Build the distribution from the spec file... */ if (Verbosity) puts("Building RPM binary distribution..."); if (format == PACKAGE_LSB_SIGNED || format == PACKAGE_RPM_SIGNED) build_option = "-signed "; else build_option = ""; if (!strcmp(platform->machine, "intel")) { if (run_command(NULL, EPM_RPMBUILD " -bb --buildroot \"%s/buildroot\" " EPM_RPMARCH "i386 %s%s", absdir, build_option, specname)) return (1); } else if (!strcmp(platform->machine, "ppc")) { if (run_command(NULL, EPM_RPMBUILD " -bb --buildroot \"%s/buildroot\" " EPM_RPMARCH "powerpc %s%s", absdir, build_option, specname)) return (1); } else if (run_command(NULL, EPM_RPMBUILD " -bb --buildroot \"%s/buildroot\" " EPM_RPMARCH "%s %s%s", absdir, platform->machine, build_option, specname)) return (1); /* * Move the RPMs to the local directory and rename the RPMs using the * product name specified by the user... */ move_rpms(prodname, directory, platname, dist, platform, rpmdir, NULL, release); for (i = 0; i < dist->num_subpackages; i ++) move_rpms(prodname, directory, platname, dist, platform, rpmdir, dist->subpackages[i], release); /* * Build a compressed tar file to hold all of the subpackages... */ if (dist->num_subpackages || setup) { /* * Figure out the full name of the distribution... */ if (dist->release[0]) snprintf(name, sizeof(name), "%s-%s-%s", prodname, dist->version, dist->release); else snprintf(name, sizeof(name), "%s-%s", prodname, dist->version); if (platname[0]) { strlcat(name, "-", sizeof(name)); strlcat(name, platname, sizeof(name)); } /* * Create a compressed tar file... */ snprintf(filename, sizeof(filename), "%s/%s.rpm.tgz", directory, name); if ((tarfile = tar_open(filename, 1)) == NULL) return (1); /* * Archive the setup and uninst GUIs and their data files... */ if (setup) { /* * Include the ESP Software Installation Wizard (setup)... */ const char *setup_img; /* Setup image name */ struct stat srcstat; /* File information */ if (stat(SetupProgram, &srcstat)) { fprintf(stderr, "epm: Unable to stat GUI setup program %s - %s\n", SetupProgram, strerror(errno)); tar_close(tarfile); return (-1); } if (tar_header(tarfile, TAR_NORMAL, 0555, srcstat.st_size, srcstat.st_mtime, "root", "root", "setup", NULL) < 0) { fprintf(stderr, "epm: Error writing file header - %s\n", strerror(errno)); tar_close(tarfile); return (-1); } if (tar_file(tarfile, SetupProgram) < 0) { fprintf(stderr, "epm: Error writing file data for setup -\n %s\n", strerror(errno)); tar_close(tarfile); return (-1); } if (Verbosity) printf(" %7.0fk setup\n", (srcstat.st_size + 1023) / 1024.0); /* * And the image file... */ stat(setup, &srcstat); if (strlen(setup) > 4 && !strcmp(setup + strlen(setup) - 4, ".gif")) setup_img = "setup.gif"; else setup_img = "setup.xpm"; if (tar_header(tarfile, TAR_NORMAL, 0444, srcstat.st_size, srcstat.st_mtime, "root", "root", setup_img, NULL) < 0) { fprintf(stderr, "epm: Error writing file header - %s\n", strerror(errno)); tar_close(tarfile); return (-1); } if (tar_file(tarfile, setup) < 0) { fprintf(stderr, "epm: Error writing file data for %s -\n %s\n", setup_img, strerror(errno)); tar_close(tarfile); return (-1); } if (Verbosity) printf(" %7.0fk %s\n", (srcstat.st_size + 1023) / 1024.0, setup_img); /* * And the types file... */ if (types) { stat(types, &srcstat); if (tar_header(tarfile, TAR_NORMAL, 0444, srcstat.st_size, srcstat.st_mtime, "root", "root", types, NULL) < 0) { fprintf(stderr, "epm: Error writing file header - %s\n", strerror(errno)); tar_close(tarfile); return (-1); } if (tar_file(tarfile, types) < 0) { fprintf(stderr, "epm: Error writing file data for setup.types -\n %s\n", strerror(errno)); tar_close(tarfile); return (-1); } if (Verbosity) printf(" %7.0fk setup.types\n", (srcstat.st_size + 1023) / 1024.0); } /* * Include the ESP Software Removal Wizard (uninst)... */ if (stat(UninstProgram, &srcstat)) { fprintf(stderr, "epm: Unable to stat GUI uninstall program %s - %s\n", UninstProgram, strerror(errno)); tar_close(tarfile); return (-1); } if (tar_header(tarfile, TAR_NORMAL, 0555, srcstat.st_size, srcstat.st_mtime, "root", "root", "uninst", NULL) < 0) { fprintf(stderr, "epm: Error writing file header - %s\n", strerror(errno)); tar_close(tarfile); return (-1); } if (tar_file(tarfile, UninstProgram) < 0) { fprintf(stderr, "epm: Error writing file data for uninst -\n %s\n", strerror(errno)); tar_close(tarfile); return (-1); } if (Verbosity) printf(" %7.0fk uninst\n", (srcstat.st_size + 1023) / 1024.0); } /* * Archive the main package and subpackages... */ if (tar_package(tarfile, "rpm", prodname, directory, platname, dist, NULL)) { tar_close(tarfile); return (1); } for (i = 0; i < dist->num_subpackages; i ++) { if (tar_package(tarfile, "rpm", prodname, directory, platname, dist, dist->subpackages[i])) { tar_close(tarfile); return (1); } } tar_close(tarfile); } /* * Remove temporary files... */ if (!KeepFiles) { if (Verbosity) puts("Removing temporary distribution files..."); snprintf(filename, sizeof(filename), "%s/RPMS", directory); unlink_directory(filename); snprintf(filename, sizeof(filename), "%s/rpms", directory); unlink(filename); snprintf(filename, sizeof(filename), "%s/buildroot", directory); unlink_directory(filename); unlink(specname); if (dist->num_subpackages) { /* * Remove .rpm files since they are now in a .tgz file... */ unlink_package("rpm", prodname, directory, platname, dist, NULL); for (i = 0; i < dist->num_subpackages; i ++) unlink_package("rpm", prodname, directory, platname, dist, dist->subpackages[i]); } } return (0); }
int mailbox_list_delete_maildir_via_trash(struct mailbox_list *list, const char *name, const char *trash_dir) { const char *src, *trash_dest; unsigned int count; src = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_MAILBOX); if (mailbox_list_check_root_delete(list, name, src) < 0) return -1; /* rename the mailbox dir to trash dir, which atomically marks it as being deleted. */ count = 0; trash_dest = trash_dir; for (; rename(src, trash_dest) < 0; count++) { if (ENOTFOUND(errno)) { if (trash_dest != trash_dir && count < 5) { /* either the source was just deleted or the trash dir was deleted. */ trash_dest = trash_dir; continue; } mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); return -1; } if (errno == EXDEV) { /* can't do this the fast way */ return 0; } if (!EDESTDIREXISTS(errno)) { if (mailbox_list_set_error_from_errno(list)) return -1; mailbox_list_set_critical(list, "rename(%s, %s) failed: %m", src, trash_dest); return -1; } /* trash dir already exists. the reasons for this are: a) another process is in the middle of deleting it b) previous process crashed and didn't delete it c) NFS: mailbox was recently deleted, but some connection still has that mailbox open. the directory contains .nfs* files that can't be deleted until the mailbox is closed. Because of c) we'll first try to rename the mailbox under the trash directory and only later try to delete the entire trash directory. */ if (trash_dir == trash_dest) { trash_dest = t_strconcat(trash_dir, "/", unique_fname(), NULL); } else if (unlink_directory(trash_dest, TRUE) < 0 && (errno != ENOTEMPTY || count >= 5)) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", trash_dest); return -1; } } if (unlink_directory(trash_dir, TRUE) < 0 && errno != ENOTEMPTY && errno != EBUSY) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", trash_dir); /* it's already renamed to trash dir, which means it's deleted as far as the client is concerned. Report success. */ } return 1; }
int mailbox_list_delete_mailbox_nonrecursive(struct mailbox_list *list, const char *name, const char *path, bool rmdir_path) { DIR *dir; struct dirent *d; string_t *full_path; unsigned int dir_len; bool mailbox_dir, unlinked_something = FALSE; if (mailbox_list_check_root_delete(list, name, path) < 0) return -1; dir = opendir(path); if (dir == NULL) { if (errno == ENOENT) { mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); } else { if (!mailbox_list_set_error_from_errno(list)) { mailbox_list_set_critical(list, "opendir(%s) failed: %m", path); } } return -1; } full_path = t_str_new(256); str_append(full_path, path); str_append_c(full_path, '/'); dir_len = str_len(full_path); for (errno = 0; (d = readdir(dir)) != NULL; errno = 0) { if (d->d_name[0] == '.') { /* skip . and .. */ if (d->d_name[1] == '\0') continue; if (d->d_name[1] == '.' && d->d_name[2] == '\0') continue; } mailbox_dir = list->v.is_internal_name != NULL && list->v.is_internal_name(list, d->d_name); str_truncate(full_path, dir_len); str_append(full_path, d->d_name); if (mailbox_dir) { if (unlink_directory(str_c(full_path), TRUE) < 0) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", str_c(full_path)); } else { unlinked_something = TRUE; } continue; } /* trying to unlink() a directory gives either EPERM or EISDIR (non-POSIX). it doesn't really work anywhere in practise, so don't bother stat()ing the file first */ if (unlink(str_c(full_path)) == 0) unlinked_something = TRUE; else if (errno != ENOENT && errno != EISDIR && errno != EPERM) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", str_c(full_path)); } } if (errno != 0) mailbox_list_set_critical(list, "readdir(%s) failed: %m", path); if (closedir(dir) < 0) { mailbox_list_set_critical(list, "closedir(%s) failed: %m", path); } if (rmdir_path) { if (rmdir(path) == 0) unlinked_something = TRUE; else if (errno != ENOENT && errno != ENOTEMPTY && errno != EEXIST) { mailbox_list_set_critical(list, "rmdir(%s) failed: %m", path); return -1; } } if (!unlinked_something) { mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Mailbox has children, can't delete it"); return -1; } return 0; }