示例#1
0
void 
mtask_error(struct mtask_context * context, const char *msg, ...) {
	static uint32_t logger = 0;
	if (logger == 0) {
		logger = mtask_handle_findname("logger");
	}
	if (logger == 0) {
		return;
	}

	char tmp[LOG_MESSAGE_SIZE];
	char *data = NULL;

	va_list ap;

	va_start(ap,msg);
	int len = vsnprintf(tmp, LOG_MESSAGE_SIZE, msg, ap);
	va_end(ap);
	if (len < LOG_MESSAGE_SIZE) {
		data = mtask_strdup(tmp);
	} else {
		int max_size = LOG_MESSAGE_SIZE;
		for (;;) {
			max_size *= 2;
			data = mtask_malloc(max_size);
			va_start(ap,msg);
			len = vsnprintf(data, max_size, msg, ap);
			va_end(ap);
			if (len < max_size) {
				break;
			}
			mtask_free(data);
		}
	}


	struct mtask_message smsg;
	if (context == NULL) {
		smsg.source = 0;
	} else {
		smsg.source = mtask_context_handle(context);
	}
	smsg.session = 0;
	smsg.data = data;
	smsg.sz = len | ((size_t)PTYPE_TEXT << MESSAGE_TYPE_SHIFT);
	mtask_context_push(logger, &smsg);
}
示例#2
0
文件: mgmt.c 项目: fujita/tgt
static void mgmt_event_handler(int accept_fd, int events, void *data)
{
	int fd, err;
	struct mgmt_task *mtask;

	fd = ipc_accept(accept_fd);
	if (fd < 0) {
		eprintf("failed to accept a socket\n");
		return;
	}

	err = ipc_perm(fd);
	if (err < 0) {
		eprintf("permission error\n");
		goto out;
	}

	err = set_non_blocking(fd);
	if (err) {
		eprintf("failed to set a socket non-blocking\n");
		goto out;
	}

	mtask = mtask_alloc();
	if (!mtask)
		goto out;

	err = tgt_event_add(fd, EPOLLIN, mtask_recv_send_handler, mtask);
	if (err) {
		eprintf("failed to add a socket to epoll %d\n", fd);
		mtask_free(mtask);
		goto out;
	}

	return;
out:
	if (fd > 0)
		close(fd);

	return;
}
示例#3
0
文件: mgmt.c 项目: 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);
}