Example #1
0
File: mgmt.c Project: fujita/tgt
void ipc_exit(void)
{
	tgt_event_del(ipc_fd);
	close(ipc_fd);
	close(ipc_lock_fd);
}
Example #2
0
File: mgmt.c Project: redlicha/tgt
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);
}
Example #3
0
File: mgmt.c Project: fujita/tgt
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);
}
Example #4
0
static void spt_sg_close(struct tgt_device *dev)
{
	tgt_event_del(dev->fd);
	close(dev->fd);
}