/* Create an IO filename from job parameters and the filename format * sent from client. Used by slurmd for prolog errors. */ extern char *fname_create2(batch_job_launch_msg_t *req) { stepd_step_rec_t job; char *esc, *name = NULL, *orig = NULL; if (req->std_err) orig = xstrdup(req->std_err); else if (req->std_out) orig = xstrdup(req->std_out); else xstrfmtcat(orig, "slurm-%u.out", req->job_id); esc = is_path_escaped(orig); /* If format doesn't specify an absolute pathname, use cwd */ if (orig[0] != '/') { xstrcat(name, req->work_dir); if (esc) { xstrcat(name, esc); goto fini; } if (name[strlen(name)-1] != '/') xstrcatchar(name, '/'); } if (esc) { /* esc is malloc */ name = esc; goto fini; } memset(&job, 0, sizeof(stepd_step_rec_t)); job.array_job_id = req->array_job_id; job.array_task_id = req->array_task_id; job.jobid = req->job_id; // job->nodeid = TBD; job.stepid = req->step_id; job.uid = req->uid; job.user_name = req->user_name; name = _create_batch_fname(name, orig, &job, 0); fini: xfree(orig); return name; }
/* Create an IO filename from job parameters and the filename format * sent from client */ char * fname_create(stepd_step_rec_t *job, const char *format, int taskid) { char *name = NULL; char *orig = xstrdup(format); int id; char *esc; if (((id = fname_single_task_io (format)) >= 0) && (taskid != id)) return (xstrdup ("/dev/null")); esc = is_path_escaped(orig); /* If format doesn't specify an absolute pathname, use cwd */ if (orig[0] != '/') { xstrcat(name, job->cwd); if (esc) { xstrcat(name, esc); goto fini; } if (name[strlen(name)-1] != '/') xstrcatchar(name, '/'); } if (esc) { /* esc is malloc */ name = esc; goto fini; } if (job->batch) name = _create_batch_fname(name, orig, job, taskid); else name = _create_step_fname(name, orig, job, taskid); fini: xfree(orig); return name; }
/* Create an IO filename from job parameters and the filename format * sent from client */ char * fname_create(stepd_step_rec_t *job, const char *format, int taskid) { unsigned int wid = 0; char *name = NULL; char *orig = xstrdup(format); char *p, *q; int id; char *esc; if (((id = fname_single_task_io (format)) >= 0) && (taskid != id)) return (xstrdup ("/dev/null")); esc = is_path_escaped(orig); /* If format doesn't specify an absolute pathname, * use cwd */ if (orig[0] != '/') { xstrcat(name, job->cwd); if (esc) { xstrcat(name, esc); goto via; } if (name[strlen(name)-1] != '/') xstrcatchar(name, '/'); } if (esc) { /* esc is malloc */ name = esc; goto via; } q = p = orig; while (*p != '\0') { if (*p == '%') { if (isdigit(*(++p))) { unsigned long in_width = 0; xmemcat(name, q, p - 1); if ((in_width = strtoul(p, &p, 10)) > MAX_WIDTH) wid = MAX_WIDTH; else wid = (unsigned int)in_width; q = p - 1; if (*p == '\0') break; } switch (*p) { case 'a': /* '%a' => array task id */ xmemcat(name, q, p - 1); xstrfmtcat(name, "%0*u", wid, job->array_task_id); q = ++p; break; case 'A': /* '%A' => array master job id */ xmemcat(name, q, p - 1); if (job->array_task_id == NO_VAL) { xstrfmtcat(name, "%0*u", wid, job->jobid); } else { xstrfmtcat(name, "%0*u", wid, job->array_job_id); } q = ++p; break; case 's': /* '%s' => step id */ xmemcat(name, q, p - 1); xstrfmtcat(name, "%0*u", wid, job->stepid); q = ++p; break; case 't': /* '%t' => taskid */ xmemcat(name, q, p - 1); xstrfmtcat(name, "%0*u", wid, taskid); q = ++p; break; case 'n': /* '%n' => nodeid */ xmemcat(name, q, p - 1); xstrfmtcat(name, "%0*u", wid, job->nodeid); q = ++p; break; case 'N': /* '%N' => node name */ xmemcat(name, q, p - 1); xstrfmtcat(name, "%s", conf->hostname); q = ++p; break; case 'u': /* '%u' => user name */ if (!job->user_name) job->user_name = uid_to_string(job->uid); xmemcat(name, q, p - 1); xstrfmtcat(name, "%s", job->user_name); q = ++p; break; case 'J': /* '%J' => jobid.stepid */ case 'j': /* '%j' => jobid */ xmemcat(name, q, p - 1); xstrfmtcat(name, "%0*u", wid, job->jobid); if ((*p == 'J') && (job->stepid != NO_VAL)) xstrfmtcat(name, ".%u", job->stepid); q = ++p; break; default: break; } wid = 0; } else p++; } if (q != p) xmemcat(name, q, p); via: xfree(orig); return name; }