ret_t cherokee_buffer_read_file (cherokee_buffer_t *buf, char *filename) { int r, f; ret_t ret; struct stat info; /* Stat() the file */ r = cherokee_stat (filename, &info); if (r != 0) return ret_error; /* Is a regular file? */ if (S_ISREG(info.st_mode) == 0) return ret_error; /* Maybe get memory */ ret = cherokee_buffer_ensure_size (buf, buf->len + info.st_size + 1); if (unlikely (ret != ret_ok)) return ret; /* Open the file */ f = cherokee_open (filename, O_RDONLY | O_BINARY, 0); if (f < 0) { LOG_ERRNO(errno, cherokee_err_error, CHEROKEE_ERROR_BUFFER_OPEN_FILE, filename); return ret_error; } cherokee_fd_set_closexec (f); /* Read the content */ r = read (f, buf->buf + buf->len, info.st_size); if (r < 0) { buf->buf[buf->len] = '\0'; cherokee_fd_close(f); return ret_error; } /* Close it and exit */ cherokee_fd_close(f); buf->len += r; buf->buf[buf->len] = '\0'; return ret_ok; }
ret_t cherokee_logger_writer_open (cherokee_logger_writer_t *writer) { ret_t ret; switch (writer->type) { case cherokee_logger_writer_syslog: /* Nothing to do, syslog already opened at startup. */ goto out; case cherokee_logger_writer_pipe: ret = launch_logger_process (writer); if (ret != ret_ok) goto error; goto out; case cherokee_logger_writer_stderr: writer->fd = STDERR_FILENO; goto out; case cherokee_logger_writer_file: writer->fd = cherokee_open (writer->filename.buf, O_APPEND | O_WRONLY | O_CREAT | O_LARGEFILE | O_NOFOLLOW, 0640); if (writer->fd == -1) { LOG_ERROR (CHEROKEE_ERROR_LOGGER_WRITER_APPEND, writer->filename.buf); ret = ret_error; goto error; } ret = cherokee_fd_set_closexec (writer->fd); if (ret != ret_ok) goto error; goto out; default: SHOULDNT_HAPPEN; ret = ret_error; goto error; } out: writer->initialized = true; return ret_ok; error: return ret; }