void conn_new(struct session *s, struct connection_config *cc) { struct connection *c; int nodelay = 1; if (!(c = calloc(1, sizeof(*c)))) fatal("session_add_conn"); c->fd = -1; c->state = CONN_FREE; c->session = s; c->cid = arc4random(); c->config = *cc; c->mine = initiator_conn_defaults; c->mine.HeaderDigest = s->config.HeaderDigest; c->mine.DataDigest = s->config.DataDigest; c->his = iscsi_conn_defaults; c->active = iscsi_conn_defaults; TAILQ_INIT(&c->pdu_w); TAILQ_INIT(&c->tasks); TAILQ_INSERT_TAIL(&s->connections, c, entry); if (pdu_readbuf_set(&c->prbuf, PDU_READ_SIZE)) { log_warn("conn_new"); conn_free(c); return; } /* create socket */ c->fd = socket(c->config.TargetAddr.ss_family, SOCK_STREAM, 0); if (c->fd == -1) { log_warn("conn_new: socket"); conn_free(c); return; } if (socket_setblockmode(c->fd, 1)) { log_warn("conn_new: socket_setblockmode"); conn_free(c); return; } /* try to turn off TCP Nagle */ if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay)) == -1) log_warn("conn_new: setting TCP_NODELAY"); event_set(&c->ev, c->fd, EV_READ|EV_PERSIST, conn_dispatch, c); event_set(&c->wev, c->fd, EV_WRITE, conn_write_dispatch, c); conn_fsm(c, CONN_EV_CONNECT); }
int control_init(char *path) { struct sockaddr_un sun; int fd; mode_t old_umask; if ((control_state = calloc(1, sizeof(*control_state))) == NULL) { log_warn("control_init: calloc"); return (-1); } if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { log_warn("control_init: socket"); return (-1); } bzero(&sun, sizeof(sun)); sun.sun_family = AF_UNIX; strlcpy(sun.sun_path, path, sizeof(sun.sun_path)); if (unlink(path) == -1) if (errno != ENOENT) { log_warn("control_init: unlink %s", path); close(fd); return (-1); } old_umask = umask(S_IXUSR|S_IXGRP|S_IWOTH|S_IROTH|S_IXOTH); if (bind(fd, (struct sockaddr *)&sun, sizeof(sun)) == -1) { log_warn("control_init: bind: %s", path); close(fd); umask(old_umask); return (-1); } umask(old_umask); if (chmod(path, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1) { log_warn("control_init: chmod"); close(fd); (void)unlink(path); return (-1); } socket_setblockmode(fd, 1); control_state->fd = fd; TAILQ_INIT(&control_state->channel); TAILQ_INIT(&controls); return (0); }