Welcome to mirror list, hosted at ThFree Co, Russian Federation.

rtc.c « zbxrtc « libs « src - github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 3037213d275fc38214c5fcb1b179b2f256402d58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
** Zabbix
** Copyright (C) 2001-2021 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
**/

//#include "zbxipcservice.h"
//#include "zbxjson.h"
//#include "daemon.h"
//#include "zbxrtc.h"
#include "rtc.h"
//#include "log.h"
//#include "zbxdiag.h"
#include "common.h"

/******************************************************************************
 *                                                                            *
 * Function: zbx_rtc_parse_loglevel_option                                    *
 *                                                                            *
 * Purpose: parse loglevel runtime control option                             *
 *                                                                            *
 * Parameters: opt       - [IN] the runtime control option                    *
 *             len       - [IN] the runtime control option length without     *
 *                              parameter                                     *
 *             pid       - [OUT] the target pid (if specified)                *
 *             proc_type - [OUT] the target process type (if specified)       *
 *             proc_num  - [OUT] the target process num (if specified)        *
 *             error     - [OUT] the error message                            *
 *                                                                            *
 * Return value: SUCCEED - the runtime control option was processed           *
 *               FAIL    - otherwise                                          *
 *                                                                            *
 ******************************************************************************/
int	zbx_rtc_parse_loglevel_option(const char *opt, size_t len, pid_t *pid, int *proc_type, int *proc_num,
		char **error)
{
	const char	*rtc_options;

	rtc_options = opt + len;

	if ('\0' == *rtc_options)
		return SUCCEED;

	if ('=' != *rtc_options)
	{
		*error = zbx_dsprintf(NULL, "invalid runtime control option \"%s\"", opt);
		return FAIL;
	}
	else if (0 != isdigit(*(++rtc_options)))
	{
		/* convert PID */
		if (FAIL == is_uint32(rtc_options, pid) || 0 == *pid)
		{
			*error = zbx_dsprintf(NULL, "invalid log level control target -"
					" invalid or unsupported process identifier");
			return FAIL;
		}
	}
	else
	{
		char	proc_name[MAX_STRING_LEN], *proc_num_ptr;

		if ('\0' == *rtc_options)
		{
			*error = zbx_dsprintf(NULL, "invalid log level control target -"
					" unspecified process identifier or type");
			return FAIL;
		}

		zbx_strlcpy(proc_name, rtc_options, sizeof(proc_name));

		if (NULL != (proc_num_ptr = strchr(proc_name, ',')))
			*proc_num_ptr++ = '\0';

		if ('\0' == *proc_name)
		{
			*error = zbx_dsprintf(NULL, "invalid log level control target - unspecified process type");
			return FAIL;
		}

		if (ZBX_PROCESS_TYPE_UNKNOWN == (*proc_type = get_process_type_by_name(proc_name)))
		{
			*error = zbx_dsprintf(NULL, "invalid log level control target - unknown process type \"%s\"",
					proc_name);
			return FAIL;
		}

		if (NULL != proc_num_ptr)
		{
			if ('\0' == *proc_num_ptr)
			{
				*error = zbx_dsprintf(NULL, "invalid log level control target -"
						" unspecified process number");
				return FAIL;
			}

			/* convert Zabbix process number (e.g. "2" in "poller,2") */
			if (FAIL == is_uint32(proc_num_ptr, proc_num) || 0 == *proc_num)
			{
				*error = zbx_dsprintf(NULL, "invalid log level control target -"
						" invalid or unsupported process number \"%s\"", proc_num_ptr);
				return FAIL;
			}
		}
	}

	return SUCCEED;
}