void ipc_exit(void) { tgt_event_del(ipc_fd); close(ipc_fd); close(ipc_lock_fd); }
static void mtask_handler(int fd, int events, void *data) { int err, len; char *p; struct mgmt_task *mtask = data; struct tgtadm_req *req = &mtask->req; struct tgtadm_rsp *rsp = &mtask->rsp; switch (mtask->mtask_state) { case MTASK_STATE_HDR_RECV: len = sizeof(*req) - mtask->done; err = read(fd, (char *)req + mtask->done, len); if (err > 0) { mtask->done += err; if (mtask->done == sizeof(*req)) { if (req->len == sizeof(*req)) { tgt_mgmt(mtask); mtask->mtask_state = MTASK_STATE_RSP_SEND; if (tgt_event_modify(fd, EPOLLOUT)) eprintf("failed to modify\n"); mtask->done = 0; } else { /* the pdu exists */ mtask->done = 0; mtask->mtask_state = MTASK_STATE_PDU_RECV; if (mtask->bsize < req->len) { eprintf("FIXME: %d\n", req->len); goto out; } } } } else if (errno != EAGAIN) goto out; break; case MTASK_STATE_PDU_RECV: len = req->len - (sizeof(*req) + mtask->done); err = read(fd, mtask->buf + mtask->done, len); if (err > 0) { mtask->done += err; if (mtask->done == req->len - (sizeof(*req))) { tgt_mgmt(mtask); mtask->mtask_state = MTASK_STATE_RSP_SEND; if (tgt_event_modify(fd, EPOLLOUT)) eprintf("failed to modify\n"); mtask->done = 0; } } else if (errno != EAGAIN) goto out; break; case MTASK_STATE_RSP_SEND: if (mtask->done < sizeof(*rsp)) { p = (char *)rsp + mtask->done; len = sizeof(*rsp) - mtask->done; } else { p = mtask->buf + (mtask->done - sizeof(*rsp)); len = rsp->len - mtask->done; } err = write(fd, p, len); if (err > 0) { mtask->done += err; if (mtask->done == rsp->len) { if (req->mode == MODE_SYSTEM && req->op == OP_DELETE && !rsp->err) system_active = 0; goto out; } } else if (errno != EAGAIN) goto out; break; default: eprintf("unknown state %d\n", mtask->mtask_state); } return; out: tgt_event_del(fd); free(mtask->buf); free(mtask); close(fd); }
static void mtask_recv_send_handler(int fd, int events, void *data) { int err, len; char *p; struct mgmt_task *mtask = data; struct tgtadm_req *req = &mtask->req; struct tgtadm_rsp *rsp = &mtask->rsp; switch (mtask->mtask_state) { case MTASK_STATE_HDR_RECV: len = sizeof(*req) - mtask->done; err = read(fd, (char *)req + mtask->done, len); if (err > 0) { mtask->done += err; if (mtask->done == sizeof(*req)) { mtask->req_bsize = req->len - sizeof(*req); if (!mtask->req_bsize) { err = mtask_received(mtask, fd); if (err) goto out; } else { /* the pdu exists */ if (mtask->req_bsize > MAX_MGT_BUFSIZE) { eprintf("mtask buffer len: %d too large\n", mtask->req_bsize); mtask->req_bsize = 0; goto out; } mtask->req_buf = zalloc(mtask->req_bsize); if (!mtask->req_buf) { eprintf("can't allocate mtask buffer len: %d\n", mtask->req_bsize); mtask->req_bsize = 0; goto out; } mtask->mtask_state = MTASK_STATE_PDU_RECV; mtask->done = 0; } } } else if (errno != EAGAIN) goto out; break; case MTASK_STATE_PDU_RECV: len = mtask->req_bsize - mtask->done; err = read(fd, mtask->req_buf + mtask->done, len); if (err > 0) { mtask->done += err; if (mtask->done == mtask->req_bsize) { err = mtask_received(mtask, fd); if (err) goto out; } } else if (errno != EAGAIN) goto out; break; case MTASK_STATE_HDR_SEND: p = (char *)rsp + mtask->done; len = sizeof(*rsp) - mtask->done; err = write(fd, p, len); if (err > 0) { mtask->done += err; if (mtask->done == sizeof(*rsp)) { if (rsp->len == sizeof(*rsp)) goto out; mtask->done = 0; mtask->mtask_state = MTASK_STATE_PDU_SEND; } } else if (errno != EAGAIN) goto out; break; case MTASK_STATE_PDU_SEND: err = concat_write(&mtask->rsp_concat, fd, mtask->done); if (err >= 0) { mtask->done += err; if (mtask->done == (rsp->len - sizeof(*rsp))) goto out; } else if (errno != EAGAIN) goto out; break; default: eprintf("unknown state %d\n", mtask->mtask_state); } return; out: if (req->mode == MODE_SYSTEM && req->op == OP_DELETE && !rsp->err) system_active = 0; tgt_event_del(fd); close(fd); mtask_free(mtask); }
static void spt_sg_close(struct tgt_device *dev) { tgt_event_del(dev->fd); close(dev->fd); }