コード例 #1
0
ファイル: fname.c プロジェクト: miguelgila/slurm
/* 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;
}
コード例 #2
0
ファイル: fname.c プロジェクト: A1ve5/slurm
/* 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;
}
コード例 #3
0
ファイル: fname.c プロジェクト: BYUHPC/slurm
/* 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;
}