예제 #1
0
파일: stepd_api.c 프로젝트: IFCA/slurm
static int
_step_connect(const char *directory, const char *nodename,
	      uint32_t jobid, uint32_t stepid)
{
	int fd;
	int len;
	struct sockaddr_un addr;
	char *name = NULL;

	if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
		debug("_step_connect: socket: %m");
		return -1;
	}

	memset(&addr, 0, sizeof(addr));
	addr.sun_family = AF_UNIX;
	xstrfmtcat(name, "%s/%s_%u.%u", directory, nodename, jobid, stepid);
	strcpy(addr.sun_path, name);
	len = strlen(addr.sun_path)+1 + sizeof(addr.sun_family);

	if (connect(fd, (struct sockaddr *) &addr, len) < 0) {
		if (errno == ECONNREFUSED) {
			_handle_stray_socket(name);
		} else {
			debug("_step_connect: connect: %m");
		}
		xfree(name);
		close(fd);
		return -1;
	}

	xfree(name);
	return fd;
}
예제 #2
0
static int
_step_connect(const char *directory, const char *nodename,
	      uint32_t jobid, uint32_t stepid)
{
	int fd;
	int len;
	struct sockaddr_un addr;
	char *name = NULL;

	if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
		error("%s: socket() failed dir %s node %s job %u step %u %m",
		      __func__, directory, nodename, jobid, stepid);
		return -1;
	}

	memset(&addr, 0, sizeof(addr));
	addr.sun_family = AF_UNIX;

	xstrfmtcat(name, "%s/%s_%u.%u", directory, nodename, jobid, stepid);

	strlcpy(addr.sun_path, name, sizeof(addr.sun_path));
	len = strlen(addr.sun_path) + 1 + sizeof(addr.sun_family);

	if (connect(fd, (struct sockaddr *) &addr, len) < 0) {
		/* Can indicate race condition at step termination */
		debug("%s: connect() failed dir %s node %s step %u.%u %m",
		      __func__, directory, nodename, jobid, stepid);
		if (errno == ECONNREFUSED) {
			_handle_stray_socket(name);
			if (stepid == SLURM_BATCH_SCRIPT)
				_handle_stray_script(directory, jobid);
		}
		xfree(name);
		close(fd);
		return -1;
	}

	xfree(name);
	return fd;
}