1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3 * Copyright (c) 2020, Open Mobile Platform LLC
4 */
5
6 #include <stddef.h>
7 #include <syslog.h>
8 #include <tee_plugin_method.h>
9
10 /*
11 * OPTEE has access to the plugin by the UUID
12 */
13 #define SYSLOG_PLUGIN_UUID { 0x96bcf744, 0x4f72, 0x4866, \
14 { 0xbf, 0x1d, 0x86, 0x34, 0xfd, 0x9c, 0x65, 0xe5 } }
15
16 /* plugin cmd */
17 #define TO_SYSLOG 0
18
syslog_plugin_init(void)19 static TEEC_Result syslog_plugin_init(void)
20 {
21 return TEEC_SUCCESS;
22 }
23
write_syslog(unsigned int sub_cmd,void * data,size_t data_len)24 static TEEC_Result write_syslog(unsigned int sub_cmd, void *data, size_t data_len)
25 {
26 /* 'sub_cmd' in this case means priority according syslog.h */
27 openlog(NULL, LOG_CONS | LOG_PID, LOG_DAEMON);
28 syslog(sub_cmd, "%*s", (int)data_len, (const char *)data);
29 closelog();
30
31 return TEEC_SUCCESS;
32 }
33
syslog_plugin_invoke(unsigned int cmd,unsigned int sub_cmd,void * data,size_t data_len,size_t * out_len)34 static TEEC_Result syslog_plugin_invoke(unsigned int cmd, unsigned int sub_cmd,
35 void *data, size_t data_len,
36 size_t *out_len)
37 {
38 /*
39 * The pointer 'out_len' is used to save length of
40 * output data from the plugin for TEE, when TEE will be needed
41 * by the data.
42 *
43 * Buffer 'data' is used like input and output.
44 */
45 (void)out_len;
46
47 switch (cmd) {
48 case TO_SYSLOG:
49 return write_syslog(sub_cmd, data, data_len);
50 default:
51 break;
52 }
53
54 return TEEC_ERROR_NOT_SUPPORTED;
55 }
56
57 struct plugin_method plugin_method = {
58 "syslog",
59 SYSLOG_PLUGIN_UUID,
60 syslog_plugin_init, /* can be NULL */
61 syslog_plugin_invoke,
62 };
63