int remtree( char *dirname) { static char id[] = "remtree"; DIR *dir; struct dirent *pdir; char namebuf[MAXPATHLEN]; char *filnam; int i; int rtnv = 0; #if defined(HAVE_STRUCT_STAT64) && defined(HAVE_STAT64) && defined(LARGEFILE_WORKS) struct stat64 sb; #else struct stat sb; #endif #if defined(HAVE_STRUCT_STAT64) && defined(HAVE_STAT64) && defined(LARGEFILE_WORKS) if (lstat64(dirname, &sb) == -1) #else if (lstat(dirname, &sb) == -1) #endif { if (errno != ENOENT) log_err(errno, id, "stat"); return(-1); } if (S_ISDIR(sb.st_mode)) { if ((dir = opendir(dirname)) == NULL) { if (errno != ENOENT) log_err(errno, id, "opendir"); return(-1); } strcpy(namebuf, dirname); strcat(namebuf, "/"); i = strlen(namebuf); filnam = &namebuf[i]; while ((pdir = readdir(dir)) != NULL) { if ((pdir->d_name[0] == '.') && ((pdir->d_name[1] == '\0') || (pdir->d_name[1] == '.'))) continue; strcpy(filnam, pdir->d_name); #if defined(HAVE_STRUCT_STAT64) && defined(HAVE_STAT64) && defined(LARGEFILE_WORKS) if (lstat64(namebuf, &sb) == -1) #else if (lstat(namebuf, &sb) == -1) #endif { log_err(errno, id, "stat"); rtnv = -1; continue; } if (S_ISDIR(sb.st_mode)) { rtnv = remtree(namebuf); } else if (unlink(namebuf) < 0) { if (errno != ENOENT) { sprintf(log_buffer, "unlink failed on %s", namebuf); log_err(errno, id, log_buffer); rtnv = -1; } } else if (LOGLEVEL >= 7) { sprintf(log_buffer, "unlink(1) succeeded on %s", namebuf); log_ext(-1, id, log_buffer, LOG_DEBUG); } } /* END while ((pdir = readdir(dir)) != NULL) */ closedir(dir); if (rmdir(dirname) < 0) { if ((errno != ENOENT) && (errno != EINVAL)) { sprintf(log_buffer, "rmdir failed on %s", dirname); log_err(errno, id, log_buffer); rtnv = -1; } } else if (LOGLEVEL >= 7) { sprintf(log_buffer, "rmdir succeeded on %s", dirname); log_ext(-1, id, log_buffer, LOG_DEBUG); } } else if (unlink(dirname) < 0) { snprintf(log_buffer,sizeof(log_buffer),"unlink failed on %s",dirname); log_err(errno,id,log_buffer); rtnv = -1; } else if (LOGLEVEL >= 7) { sprintf(log_buffer, "unlink(2) succeeded on %s", dirname); log_ext(-1, id, log_buffer, LOG_DEBUG); } return(rtnv); } /* END remtree() */
void *delete_job_files( void *vp) { static char *id = "remove_dir"; job_file_delete_info *jfdi = (job_file_delete_info *)vp; char namebuf[MAXPATHLEN+1]; int rc = 0; if (jfdi->has_temp_dir == TRUE) { if (tmpdir_basename[0] == '/') { snprintf(namebuf, sizeof(namebuf), "%s/%s", tmpdir_basename, jfdi->jobid); sprintf(log_buffer, "removing transient job directory %s", namebuf); log_record(PBSEVENT_DEBUG,PBS_EVENTCLASS_JOB,jfdi->jobid,log_buffer); if ((setegid(jfdi->gid) == -1) || (seteuid(jfdi->uid) == -1)) { /* FAILURE */ rc = -1; } else { rc = remtree(namebuf); seteuid(pbsuser); setegid(pbsgroup); } } if ((rc != 0) && (LOGLEVEL >= 5)) { snprintf(log_buffer,sizeof(log_buffer), "recursive remove of job transient tmpdir %s failed", namebuf); log_err(errno,id,log_buffer); } } /* END code to remove temp dir */ #ifdef PENABLE_LINUX26_CPUSETS /* Delete the cpuset for the job. */ delete_cpuset(jfdi->jobid); #endif /* PENABLE_LINUX26_CPUSETS */ /* delete the node file and gpu file */ if (jfdi->has_node_file == TRUE) { sprintf(namebuf,"%s/%s", path_aux, jfdi->jobid); unlink(namebuf); sprintf(namebuf, "%s/%sgpu", path_aux, jfdi->jobid); unlink(namebuf); } /* END code to delete node and gpu files */ /* delete script file */ if (multi_mom) { snprintf(namebuf, sizeof(namebuf), "%s%s%d%s", path_jobs, jfdi->prefix, pbs_rm_port, JOB_SCRIPT_SUFFIX); } else { snprintf(namebuf, sizeof(namebuf), "%s%s%s", path_jobs, jfdi->prefix, JOB_SCRIPT_SUFFIX); } if (unlink(namebuf) < 0) { if (errno != ENOENT) log_err(errno,id,msg_err_purgejob); } else { snprintf(log_buffer,sizeof(log_buffer),"removed job script"); log_record(PBSEVENT_DEBUG,PBS_EVENTCLASS_JOB,jfdi->jobid,log_buffer); } /* delete job task directory */ if (multi_mom) { snprintf(namebuf,sizeof(namebuf),"%s%s%d%s", path_jobs, jfdi->prefix, pbs_rm_port, JOB_TASKDIR_SUFFIX); } else { snprintf(namebuf,sizeof(namebuf),"%s%s%s", path_jobs, jfdi->prefix, JOB_TASKDIR_SUFFIX); } remtree(namebuf); mom_checkpoint_delete_files(jfdi); /* delete job file */ if (multi_mom) { snprintf(namebuf,sizeof(namebuf),"%s%s%d%s", path_jobs, jfdi->prefix, pbs_rm_port, JOB_FILE_SUFFIX); } else { snprintf(namebuf,sizeof(namebuf),"%s%s%s", path_jobs, jfdi->prefix, JOB_FILE_SUFFIX); } if (unlink(namebuf) < 0) { if (errno != ENOENT) log_err(errno,id,msg_err_purgejob); } else if (LOGLEVEL >= 6) { snprintf(log_buffer,sizeof(log_buffer),"remove job file"); log_record(PBSEVENT_DEBUG,PBS_EVENTCLASS_JOB,jfdi->jobid,log_buffer); } free(jfdi); return(NULL); } /* END delete_files() */
int remtree( char *dirname) { DIR *dir; struct dirent *pdir; char namebuf[MAXPATHLEN]; int len; int rtnv = 0; #if defined(HAVE_STRUCT_STAT64) && defined(HAVE_STAT64) && defined(LARGEFILE_WORKS) struct stat64 sb; #else struct stat sb; #endif #if defined(HAVE_STRUCT_STAT64) && defined(HAVE_STAT64) && defined(LARGEFILE_WORKS) if (lstat64(dirname, &sb) == -1) #else if (lstat(dirname, &sb) == -1) #endif { if (errno != ENOENT) log_err(errno, __func__, (char *)"stat"); return(-1); } if (S_ISDIR(sb.st_mode)) { if ((dir = opendir(dirname)) == NULL) { if (errno != ENOENT) log_err(errno, __func__, (char *)"opendir"); return(-1); } snprintf(namebuf, sizeof(namebuf), "%s/", dirname); len = strlen(namebuf); while ((pdir = readdir(dir)) != NULL) { if (pdir->d_name[0] == '.' && (pdir->d_name[1] == '\0' || (pdir->d_name[1] == '.' && pdir->d_name[2] == '\0'))) continue; snprintf(namebuf + len, sizeof(namebuf) - len, "%s", pdir->d_name); #if defined(HAVE_STRUCT_STAT64) && defined(HAVE_STAT64) && defined(LARGEFILE_WORKS) if (lstat64(namebuf, &sb) == -1) #else if (lstat(namebuf, &sb) == -1) #endif { log_err(errno, __func__, (char *)"stat"); rtnv = -1; continue; } if (S_ISDIR(sb.st_mode)) { rtnv = remtree(namebuf); } else if (unlink(namebuf) < 0) { if (errno != ENOENT) { sprintf(log_buffer, "unlink failed on %s", namebuf); log_err(errno, __func__, log_buffer); rtnv = -1; } } else if (LOGLEVEL >= 7) { sprintf(log_buffer, "unlink(1) succeeded on %s", namebuf); log_ext(-1, __func__, log_buffer, LOG_DEBUG); } } /* END while ((pdir = readdir(dir)) != NULL) */ closedir(dir); if (rmdir(dirname) < 0) { if ((errno != ENOENT) && (errno != EINVAL)) { sprintf(log_buffer, "rmdir failed on %s", dirname); log_err(errno, __func__, log_buffer); rtnv = -1; } } else if (LOGLEVEL >= 7) { sprintf(log_buffer, "rmdir succeeded on %s", dirname); log_ext(-1, __func__, log_buffer, LOG_DEBUG); } } else if (unlink(dirname) < 0) { snprintf(log_buffer,sizeof(log_buffer),"unlink failed on %s",dirname); log_err(errno,__func__,log_buffer); rtnv = -1; } else if (LOGLEVEL >= 7) { sprintf(log_buffer, "unlink(2) succeeded on %s", dirname); log_ext(-1, __func__, log_buffer, LOG_DEBUG); } return(rtnv); } /* END remtree() */