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