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); }
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); }
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); }
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; } }
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); }
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; }
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
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); }