diff options
| -rw-r--r-- | include/cutils/klog.h | 18 | ||||
| -rw-r--r-- | init/init.c | 25 | ||||
| -rw-r--r-- | libcutils/klog.c | 14 | ||||
| -rw-r--r-- | sdcard/sdcard.c | 10 |
4 files changed, 54 insertions, 13 deletions
diff --git a/include/cutils/klog.h b/include/cutils/klog.h index ba728ac..4bcdd09 100644 --- a/include/cutils/klog.h +++ b/include/cutils/klog.h @@ -18,6 +18,7 @@ #define _CUTILS_KLOG_H_ #include <sys/cdefs.h> +#include <stdarg.h> __BEGIN_DECLS @@ -26,14 +27,21 @@ void klog_set_level(int level); void klog_close(void); void klog_write(int level, const char *fmt, ...) __attribute__ ((format(printf, 2, 3))); +void klog_vwrite(int level, const char *fmt, va_list ap); __END_DECLS -#define KLOG_ERROR(tag,x...) klog_write(3, "<3>" tag ": " x) -#define KLOG_WARNING(tag,x...) klog_write(4, "<4>" tag ": " x) -#define KLOG_NOTICE(tag,x...) klog_write(5, "<5>" tag ": " x) -#define KLOG_INFO(tag,x...) klog_write(6, "<6>" tag ": " x) -#define KLOG_DEBUG(tag,x...) klog_write(7, "<7>" tag ": " x) +#define KLOG_ERROR_LEVEL 3 +#define KLOG_WARNING_LEVEL 4 +#define KLOG_NOTICE_LEVEL 5 +#define KLOG_INFO_LEVEL 6 +#define KLOG_DEBUG_LEVEL 7 + +#define KLOG_ERROR(tag,x...) klog_write(KLOG_ERROR_LEVEL, "<3>" tag ": " x) +#define KLOG_WARNING(tag,x...) klog_write(KLOG_WARNING_LEVEL, "<4>" tag ": " x) +#define KLOG_NOTICE(tag,x...) klog_write(KLOG_NOTICE_LEVEL, "<5>" tag ": " x) +#define KLOG_INFO(tag,x...) klog_write(KLOG_INFO_LEVEL, "<6>" tag ": " x) +#define KLOG_DEBUG(tag,x...) klog_write(KLOG_DEBUG_LEVEL, "<7>" tag ": " x) #define KLOG_DEFAULT_LEVEL 3 /* messages <= this level are logged */ diff --git a/init/init.c b/init/init.c index 0250e97..1473fbc 100644 --- a/init/init.c +++ b/init/init.c @@ -934,12 +934,33 @@ int selinux_reload_policy(void) return 0; } -int audit_callback(void *data, security_class_t cls, char *buf, size_t len) +static int audit_callback(void *data, security_class_t cls __attribute__((unused)), char *buf, size_t len) { snprintf(buf, len, "property=%s", !data ? "NULL" : (char *)data); return 0; } +static int log_callback(int type, const char *fmt, ...) +{ + int level; + va_list ap; + switch (type) { + case SELINUX_WARNING: + level = KLOG_WARNING_LEVEL; + break; + case SELINUX_INFO: + level = KLOG_INFO_LEVEL; + break; + default: + level = KLOG_ERROR_LEVEL; + break; + } + va_start(ap, fmt); + klog_vwrite(level, fmt, ap); + va_end(ap); + return 0; +} + static void selinux_initialize(void) { if (selinux_is_disabled()) { @@ -1013,7 +1034,7 @@ int main(int argc, char **argv) process_kernel_cmdline(); union selinux_callback cb; - cb.func_log = klog_write; + cb.func_log = log_callback; selinux_set_callback(SELINUX_CB_LOG, cb); cb.func_audit = audit_callback; diff --git a/libcutils/klog.c b/libcutils/klog.c index d69fb10..d3c40df 100644 --- a/libcutils/klog.c +++ b/libcutils/klog.c @@ -49,18 +49,24 @@ void klog_init(void) #define LOG_BUF_MAX 512 -void klog_write(int level, const char *fmt, ...) +void klog_vwrite(int level, const char *fmt, va_list ap) { char buf[LOG_BUF_MAX]; - va_list ap; if (level > klog_level) return; if (klog_fd < 0) klog_init(); if (klog_fd < 0) return; - va_start(ap, fmt); vsnprintf(buf, LOG_BUF_MAX, fmt, ap); buf[LOG_BUF_MAX - 1] = 0; - va_end(ap); + write(klog_fd, buf, strlen(buf)); } + +void klog_write(int level, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + klog_vwrite(level, fmt, ap); + va_end(ap); +} diff --git a/sdcard/sdcard.c b/sdcard/sdcard.c index 3bc8cd3..6a9c2eb 100644 --- a/sdcard/sdcard.c +++ b/sdcard/sdcard.c @@ -1244,6 +1244,12 @@ static int handle_write(struct fuse* fuse, struct fuse_handler* handler, struct fuse_write_out out; struct handle *h = id_to_ptr(req->fh); int res; + __u8 aligned_buffer[req->size] __attribute__((__aligned__(PAGESIZE))); + + if (req->flags & O_DIRECT) { + memcpy(aligned_buffer, buffer, req->size); + buffer = (const __u8*) aligned_buffer; + } TRACE("[%d] WRITE %p(%d) %u@%llu\n", handler->token, h, h->fd, req->size, req->offset); @@ -1497,7 +1503,8 @@ static int handle_fuse_request(struct fuse *fuse, struct fuse_handler* handler, return handle_release(fuse, handler, hdr, req); } - case FUSE_FSYNC: { + case FUSE_FSYNC: + case FUSE_FSYNCDIR: { const struct fuse_fsync_in *req = data; return handle_fsync(fuse, handler, hdr, req); } @@ -1525,7 +1532,6 @@ static int handle_fuse_request(struct fuse *fuse, struct fuse_handler* handler, return handle_releasedir(fuse, handler, hdr, req); } -// case FUSE_FSYNCDIR: case FUSE_INIT: { /* init_in -> init_out */ const struct fuse_init_in *req = data; return handle_init(fuse, handler, hdr, req); |
