tizen 2.3 release
[framework/system/deviced.git] / src / logd / src / liblogd / logd.c
1 #define _GNU_SOURCE
2
3 #include <assert.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <systemd/sd-journal.h>
7 #include "core/log.h"
8 #include "logd.h"
9 #include "macro.h"
10
11 #define ADD_ACTION_STR(action, str) [action]=str
12
13 #define GET_ACTION_STR(table, action) table[action]
14 /*
15  * If you want add action,
16  * you must add string of each action
17  * using ADD_ACTION_STR macro.
18  */
19 static const char *action_string[LOGD_ACTION_MAX] = {
20         ADD_ACTION_STR(LOGD_NONE_ACTION, "none"),
21         ADD_ACTION_STR(LOGD_ON, "on"),
22         ADD_ACTION_STR(LOGD_START, "start"),
23         ADD_ACTION_STR(LOGD_CONTINUE, "continue"),
24         ADD_ACTION_STR(LOGD_STOP, "stop"),
25         ADD_ACTION_STR(LOGD_OFF, "off"),
26         ADD_ACTION_STR(LOGD_CHANGED, "changed"),
27 };
28
29 static const char *get_value(enum logd_object object,
30          enum logd_action action, ...)
31 {
32         char *text = NULL;
33         va_list vl;
34
35         va_start(vl, action);
36
37         switch (object | LOGD_SHIFT_ACTION(action)) {
38         case LOGD_BATTERY_SOC | LOGD_SHIFT_ACTION(LOGD_CHANGED):
39         case LOGD_DISPLAY | LOGD_SHIFT_ACTION(LOGD_CHANGED):
40         case LOGD_POWER_MODE | LOGD_SHIFT_ACTION(LOGD_CHANGED):
41                 if (vasprintf(&text, "%d", vl) < 0)
42                         goto error;
43                 break;
44         case LOGD_FOREGRD_APP | LOGD_SHIFT_ACTION(LOGD_CHANGED):
45                 if (vasprintf(&text, "%s", vl) < 0)
46                         goto error;
47                 break;
48         default:
49                 /*
50                  * we already have defined the string of each action
51                  * as it is initialized.
52                  * we check avaliable of action and object here.
53                  * GET_ACTION_STR will return the string
54                  * which is proper of action.
55                  */
56                 if (action < LOGD_ACTION_MAX && object < LOGD_OBJECT_MAX) {
57                         text = strdup(GET_ACTION_STR(action_string, action));
58                         break;
59                 }
60                 _E("invalid logd_object or logd_action: %d, %d", object, action);
61                 goto error;
62         }
63         va_end(vl);
64         return text;
65
66 error:
67         va_end(vl);
68         return NULL;
69 }
70
71 API int logd_event(enum logd_object object, enum logd_action action, ...)
72 {
73         va_list vl;
74         const char *message = NULL;
75         int ret;
76
77         va_start(vl, action);
78         message = get_value(object, action);
79         if (!message) {
80                 va_end(vl);
81                 return LOGD_ERROR_INVALID_PARAM;
82         }
83         va_end(vl);
84
85         ret = sd_journal_send("LOGD_EVENT_TYPE=%d",
86         object | LOGD_SHIFT_ACTION(action), "MESSAGE=%s", message, NULL);
87         free((void *) message);
88
89         return ret < 0 ? LOGD_ERROR_SDJOURNAL : LOGD_ERROR_OK;
90 }