示例#1
0
文件: gid_oper.c 项目: 1514louluo/acl
static int gid_store_sync(GID_STORE *store)
{
	char  buf[1024];

	/* 需要先将文件内容清空 */
#if 0
	if (acl_file_ftruncate(store->fh.fp, 0) < 0) {
		acl_msg_error("%s(%d), %s: ftruncate %s error(%s)",
			__FILE__, __LINE__, __FUNCTION__,
			ACL_VSTREAM_PATH(store->fh.fp), acl_last_serror());
		return (-1);
	}
#endif
	if (acl_vstream_fseek(store->fh.fp, SEEK_SET, 0) < 0) {
		acl_msg_error("%s(%d), %s: fseek %s error(%s)",
			__FILE__, __LINE__, __FUNCTION__,
			ACL_VSTREAM_PATH(store->fh.fp), acl_last_serror());
	}

	snprintf(buf, sizeof(buf), "%s:%s %d %lld %lld %lld\r\n",
		store->tag, store->sid, store->step, store->cur_gid,
		store->min_gid, store->max_gid);

	/* 初始化文件内容: tag:sid step cur_gid min_gid max_gid\r\n */
	if (acl_vstream_writen(store->fh.fp,
		buf, strlen(buf)) == ACL_VSTREAM_EOF)
	{
		acl_msg_error("%s(%d), %s: write to %s error(%s)",
			__FILE__, __LINE__, __FUNCTION__,
			ACL_VSTREAM_PATH(store->fh.fp), acl_last_serror());
		return (-1);
	}

	return (0);
}
示例#2
0
static void plugin_init(ACL_DLL_ENV *dll_env)
{
	if (dll_env)
		memcpy(&__dll_env, dll_env, sizeof(ACL_DLL_ENV));
	else
		memset(&__dll_env, 0, sizeof(ACL_DLL_ENV));
        if (__dll_env.logfp) {
                acl_msg_open2(__dll_env.logfp, "http-gb");
                acl_msg_info("%s(%d): logger opened, %s", __FUNCTION__,
                        __LINE__, ACL_VSTREAM_PATH(__dll_env.logfp));
        }

	/* 如果 mem_slice 非空则设置内存分配采用切片分配方式 */
	if (__dll_env.mem_slice)
		acl_mem_slice_set(__dll_env.mem_slice);
}
示例#3
0
int http_util_get_res_body(HTTP_UTIL *http_util, char *buf, size_t size)
{
	const char *myname = "http_util_get_res_body";
	int   ret;

	if (buf == NULL || size == 0) {
		acl_msg_error("%s(%d): buf(%s), size(%d) invalid",
			myname, __LINE__, buf ? "not null" : "null", (int) size);
		return (-1);
	}

	if ((http_util->flag & (HTTP_UTIL_FLAG_HAS_RES_BODY
		| HTTP_UTIL_FLAG_NO_RES_BODY)) == 0)
	{
		if (!http_util_has_res_body(http_util))
			return (http_util->res_body_dlen);
	}

	ret = (int) http_res_body_get_sync(http_util->http_res,
			http_util->stream, buf, (int) size);
	if (ret <= 0)
		return (ret);
	http_util->res_body_dlen += ret;
	if (http_util->dump_stream == NULL)
		return (ret);

	if (acl_vstream_writen(http_util->dump_stream, buf, ret) == ACL_VSTREAM_EOF)
	{
		/* 如果有一次不能转储数据至文件或流则关闭该功能不再进行转储 */

		acl_msg_error("%s(%d): dump to stream(%s) error(%s)",
			myname, __LINE__, ACL_VSTREAM_PATH(http_util->dump_stream),
			acl_last_serror());
		if ((http_util->flag & HTTP_UTIL_FLAG_SET_DUMP_FILE)) {
			if (http_util->dump_stream)
				acl_vstream_close(http_util->dump_stream);
			http_util->flag &= ~HTTP_UTIL_FLAG_SET_DUMP_FILE;
		} else
			http_util->flag &= ~HTTP_UTIL_FLAG_SET_DUMP_STREAM;

		http_util->dump_stream = NULL;
	}

	return (ret);
}
示例#4
0
文件: acl_mylog.c 项目: 10jschen/acl
void acl_log_fp_set(ACL_VSTREAM *fp, const char *logpre)
{
	const char *myname = "acl_log_fp_set";
	ACL_LOG *log;
	ACL_ITER iter;

	acl_assert(fp);

	if (__loggers == NULL)
		__loggers = private_fifo_new();

	acl_foreach(iter, __loggers) {
		log = (ACL_LOG*) iter.data;
		if (strcmp(log->path, ACL_VSTREAM_PATH(fp)) == 0) {
			acl_msg_warn("%s(%d): log %s has been opened.",
				myname, __LINE__, log->path);
			return;
		}
	}
示例#5
0
文件: main.c 项目: 10jschen/acl
static int close_callback(ACL_ASTREAM *stream, void *context)
{
	const char *myname = "close_callback";
	ACL_AIO *aio = (ACL_AIO*) context;
	const char *addr = ACL_VSTREAM_PATH(stream->stream);

	printf("%s: re-connect %s, aio(%s)\n", myname, addr, aio ? "not null" : "null");
	stream = acl_aio_connect(aio, addr, 0);
	if (stream == NULL) {
		printf("%s: connect addr(%s) error(%s)\n",
			myname, addr, acl_last_serror());
		return (-1);
	}
	printf("%s: re-connect %s ok\n", myname, addr);
	acl_aio_ctl(stream, ACL_AIO_CTL_CONNECT_FN, connect_callback,
		ACL_AIO_CTL_CTX, aio,
		ACL_AIO_CTL_END);
	return (-1);
}
示例#6
0
void acl_msg_open2(ACL_VSTREAM *fp, const char *info_pre)
{
	if (fp == NULL || info_pre == NULL || *info_pre == 0)
		return;

	if (__open_fn != NULL) {
		int ret = __open_fn(ACL_VSTREAM_PATH(fp), __msg_ctx);
		/* if return < 0, use the default log */
		if (ret < 0) {
			__open_fn = NULL;
			__close_fn = NULL;
			__write_fn = NULL;
			__msg_ctx = NULL;
			acl_log_fp_set(fp, info_pre);
		}
	} else {
		acl_log_fp_set(fp, info_pre);
	}
	__log_open_flag = 1;
}
示例#7
0
文件: acl_mylog.c 项目: 10jschen/acl
	acl_foreach(iter, __loggers) {
		log = (ACL_LOG*) iter.data;
		if (strcmp(log->path, ACL_VSTREAM_PATH(fp)) == 0) {
			acl_msg_warn("%s(%d): log %s has been opened.",
				myname, __LINE__, log->path);
			return;
		}
	}

#ifdef	ACL_UNIX
	acl_close_on_exec(ACL_VSTREAM_SOCK(fp), ACL_CLOSE_ON_EXEC);
#endif
	log = (ACL_LOG*) calloc(1, sizeof(ACL_LOG));
	log->fp = fp;
	log->path = strdup(ACL_VSTREAM_PATH(fp));
	log->type = ACL_LOG_T_UNKNOWN;
	log->lock = (acl_pthread_mutex_t*) calloc(1, sizeof(acl_pthread_mutex_t));
	thread_mutex_init(log->lock, NULL);
	if (logpre && *logpre)
		snprintf(log->logpre, sizeof(log->logpre), "%s", logpre);
	else
		log->logpre[0] = 0;
	log->flag |= ACL_LOG_F_FIXED;
	private_fifo_push(__loggers, log);
}

static int open_file_log(const char *filename, const char *logpre)
{
	const char *myname = "open_file_log";
#ifdef	WIN32
示例#8
0
文件: gid_oper.c 项目: 1514louluo/acl
static int gid_store_on_open(ACL_FHANDLE *fh, void *ctx)
{
	GID_STORE *store = (GID_STORE*) fh;
	GID_STORE_CTX *sc = (GID_STORE_CTX*) ctx;
	ACL_ARGV *argv;
	char  buf[512], *ptr;
	int   ret;

	/* 检查是否有问题 */
	if (fh->size != sizeof(GID_STORE))
		acl_msg_fatal("%s(%d), %s: size(%d) != GID_STORE's size(%d)",
			__FILE__, __LINE__, __FUNCTION__,
			(int) fh->size, (int) sizeof(GID_STORE));

	/* 如果是新文件则初始化 */
	if (fh->fsize == 0) {
		ACL_SAFE_STRNCPY(store->tag, sc->tag, sizeof(store->tag));
		ACL_SAFE_STRNCPY(store->sid, sc->sid, sizeof(store->sid));
		store->step = sc->step;
		store->cur_gid = sc->cur_gid;
		store->min_gid = sc->min_gid;
		store->max_gid = sc->max_gid;

		return (gid_store_sync(store));
	}

	/* 数据格式:tag:sid step cur_gid min_gid max_gid\r\n */

	/* 从文件中获得数据 */
	ret = acl_vstream_gets_nonl(fh->fp, buf, sizeof(buf));
	if (ret == ACL_VSTREAM_EOF) {
		acl_msg_error("%s(%d), %s: gets from %s error(%s)",
			__FILE__, __LINE__, __FUNCTION__,
			ACL_VSTREAM_PATH(fh->fp), acl_last_serror());
		return (-1);
	}

	/* 拆分字符串 */
	argv = acl_argv_split(buf, ",\t ");
	if (argv->argc < 5) {
		acl_msg_error("%s(%d), %s: invalid line(%s) from %s",
			__FILE__, __LINE__, __FUNCTION__,
			buf, ACL_VSTREAM_PATH(fh->fp));
		acl_argv_free(argv);
		return (-1);
	}

	ACL_SAFE_STRNCPY(store->tag, argv->argv[0], sizeof(store->tag));
	ptr = strchr(store->tag, ':');
	if (ptr) {
		*ptr++ = 0;
		ACL_SAFE_STRNCPY(store->sid, ptr, sizeof(store->sid));
	}
	store->step = atoi(argv->argv[1]);

	/* 如果存储的步进值与参数中的步进值不一致,则优先采用参数步进值 */
	if (store->step != sc->step) {
		acl_msg_warn("%s(%d), %s: change step from %d to %d for %s",
			__FILE__, __LINE__, __FUNCTION__,
			store->step, sc->step, ACL_VSTREAM_PATH(fh->fp));
		store->step = sc->step;
	}
	store->cur_gid = atoll(argv->argv[2]);
	store->min_gid = atoll(argv->argv[3]);
	store->max_gid = atoll(argv->argv[4]);

	acl_argv_free(argv);
	return (0);
}