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; }
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; }