noit_log_stream_t noit_log_stream_new_on_fd(const char *name, int fd, noit_hash_table *config) { char *lsname; noit_log_stream_t ls; asynch_log_ctx *actx; ls = calloc(1, sizeof(*ls)); actx = calloc(1, sizeof(*actx)); actx->name = "posix"; actx->write = posix_logio_asynch_write; actx->userdata = (void *)(vpsized_int)fd; ls->name = strdup(name); ls->ops = &posix_logio_ops; ls->op_ctx = actx; ls->flags |= NOIT_LOG_STREAM_ENABLED; ls->config = config; ls->lock = calloc(1, sizeof(*ls->lock)); noit_log_init_rwlock(ls); /* This double strdup of ls->name is needed, look for the next one * for an explanation. */ lsname = strdup(ls->name); if(noit_hash_store(&noit_loggers, lsname, strlen(ls->name), ls) == 0) { free(lsname); free(ls->name); free(ls); free(actx); return NULL; } return ls; }
noit_log_stream_t noit_log_stream_new(const char *name, const char *type, const char *path, void *ctx, noit_hash_table *config) { noit_log_stream_t ls, saved; struct _noit_log_stream tmpbuf; void *vops = NULL; ls = calloc(1, sizeof(*ls)); ls->name = strdup(name); ls->path = path ? strdup(path) : NULL; ls->type = type ? strdup(type) : NULL; ls->enabled = 1; ls->config = config; if(!type) ls->ops = NULL; else if(noit_hash_retrieve(&noit_logops, type, strlen(type), &vops)) ls->ops = vops; else goto freebail; if(ls->ops && ls->ops->openop(ls)) goto freebail; saved = noit_log_stream_find(name); if(saved) { pthread_rwlock_t *lock = saved->lock; memcpy(&tmpbuf, saved, sizeof(*saved)); memcpy(saved, ls, sizeof(*saved)); memcpy(ls, &tmpbuf, sizeof(*saved)); saved->lock = lock; ls->lock = NULL; noit_log_stream_free(ls); ls = saved; } else { /* We strdup the name *again*. We'going to kansas city shuffle the * ls later (see memcpy above). However, if don't strdup, then the * noit_log_stream_free up there will sweep our key right our from * under us. */ if(noit_hash_store(&noit_loggers, strdup(ls->name), strlen(ls->name), ls) == 0) goto freebail; ls->lock = calloc(1, sizeof(*ls->lock)); noit_log_init_rwlock(ls); } /* This is for things that don't open on paths */ if(ctx) ls->op_ctx = ctx; return ls; freebail: fprintf(stderr, "Failed to instantiate logger(%s,%s,%s)\n", name, type ? type : "[null]", path ? path : "[null]"); free(ls->name); if(ls->path) free(ls->path); if(ls->type) free(ls->type); free(ls); return NULL; }
noit_log_stream_t noit_log_stream_new_on_fd(const char *name, int fd, noit_hash_table *config) { char *lsname; noit_log_stream_t ls; ls = calloc(1, sizeof(*ls)); ls->name = strdup(name); ls->ops = &posix_logio_ops; ls->op_ctx = (void *)(vpsized_int)fd; ls->enabled = 1; ls->config = config; ls->lock = calloc(1, sizeof(*ls->lock)); noit_log_init_rwlock(ls); /* This double strdup of ls->name is needed, look for the next one * for an explanation. */ lsname = strdup(ls->name); if(noit_hash_store(&noit_loggers, lsname, strlen(ls->name), ls) == 0) { free(lsname); free(ls->name); free(ls); return NULL; } return ls; }