This file is indexed.

/usr/include/collectd/cpython.h is in collectd-dev 4.10.1-2.1ubuntu7.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/**
 * collectd - src/cpython.h
 * Copyright (C) 2009  Sven Trenkel
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Authors:
 *   Sven Trenkel <collectd at semidefinite.de>  
 **/

/* Some python versions don't include this by default. */

#include <longintrepr.h>

/* These two macros are basicly Py_BEGIN_ALLOW_THREADS and Py_BEGIN_ALLOW_THREADS
 * from the other direction. If a Python thread calls a C function
 * Py_BEGIN_ALLOW_THREADS is used to allow other python threads to run because
 * we don't intend to call any Python functions.
 *
 * These two macros are used whenever a C thread intends to call some Python
 * function, usually because some registered callback was triggered.
 * Just like Py_BEGIN_ALLOW_THREADS it opens a block so these macros have to be
 * used in pairs. They aquire the GIL, create a new Python thread state and swap
 * the current thread state with the new one. This means this thread is now allowed
 * to execute Python code. */

#define CPY_LOCK_THREADS {\
	PyGILState_STATE gil_state;\
	gil_state = PyGILState_Ensure();

#define CPY_RETURN_FROM_THREADS \
	PyGILState_Release(gil_state);\
	return

#define CPY_RELEASE_THREADS \
	PyGILState_Release(gil_state);\
}

/* Python 2.4 has this macro, older versions do not. */
#ifndef Py_VISIT
#define Py_VISIT(o) do {\
	int _vret;\
	if ((o) != NULL) {\
		_vret = visit((o), arg);\
		if (_vret != 0)\
		return _vret;\
	}\
} while (0)
#endif

/* Python 2.4 has this macro, older versions do not. */
#ifndef Py_CLEAR
#define Py_CLEAR(o) do {\
	PyObject *tmp = o;\
	(o) = NULL;\
	Py_XDECREF(tmp);\
} while (0)
#endif

/* Python 2.4 has this macro, older versions do not. */
#ifndef Py_RETURN_NONE
# define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
#endif

/* This macro is a shortcut for calls like
 * x = PyObject_Repr(x);
 * This can't be done like this example because this would leak
 * a reference the the original x and crash in case of x == NULL.
 * This calling syntax is less than elegant but it works, saves
 * a lot of lines and avoids potential refcount errors. */

#define CPY_SUBSTITUTE(func, a, ...) do {\
	if ((a) != NULL) {\
		PyObject *__tmp = (a);\
		(a) = func(__VA_ARGS__);\
		Py_DECREF(__tmp);\
	}\
} while(0)

/* Python3 compatibility layer. To keep the actual code as clean as possible
 * do a lot of defines here. */

#if PY_MAJOR_VERSION >= 3
#define IS_PY3K
#endif

#ifdef IS_PY3K

#define PyInt_FromLong PyLong_FromLong
#define CPY_INIT_TYPE         PyVarObject_HEAD_INIT(NULL, 0)
#define IS_BYTES_OR_UNICODE(o) (PyUnicode_Check(o) || PyBytes_Check(o))
#define CPY_STRCAT_AND_DEL(a, b) do {\
	CPY_STRCAT((a), (b));\
	Py_XDECREF((b));\
} while (0)
static inline void CPY_STRCAT(PyObject **a, PyObject *b) {
	PyObject *ret;
	
	if (!a || !*a)
		return;
	
	ret = PyUnicode_Concat(*a, b);
	Py_DECREF(*a);
	*a = ret;
}

#else

#define CPY_INIT_TYPE         PyObject_HEAD_INIT(NULL) 0,
#define IS_BYTES_OR_UNICODE(o) (PyUnicode_Check(o) || PyString_Check(o))
#define CPY_STRCAT_AND_DEL PyString_ConcatAndDel
#define CPY_STRCAT PyString_Concat

#endif

static inline const char *cpy_unicode_or_bytes_to_string(PyObject **o) {
	if (PyUnicode_Check(*o)) {
		PyObject *tmp;
		tmp = PyUnicode_AsEncodedString(*o, NULL, NULL); /* New reference. */
		if (tmp == NULL)
			return NULL;
		Py_DECREF(*o);
		*o = tmp;
	}
#ifdef IS_PY3K
	return PyBytes_AsString(*o);
#else
	return PyString_AsString(*o);
#endif
}

static inline PyObject *cpy_string_to_unicode_or_bytes(const char *buf) {
#ifdef IS_PY3K
/* Python3 preferrs unicode */
	PyObject *ret;
	ret = PyUnicode_Decode(buf, strlen(buf), NULL, NULL);
	if (ret != NULL)
		return ret;
	PyErr_Clear();
	return PyBytes_FromString(buf);
#else
	return PyString_FromString(buf);
#endif	
}

void cpy_log_exception(const char *context);

/* Python object declarations. */

typedef struct {
	PyObject_HEAD        /* No semicolon! */
	PyObject *parent;    /* Config */
	PyObject *key;       /* String */
	PyObject *values;    /* Sequence */
	PyObject *children;  /* Sequence */
} Config;
PyTypeObject ConfigType;

typedef struct {
	PyObject_HEAD        /* No semicolon! */
	double time;
	char host[DATA_MAX_NAME_LEN];
	char plugin[DATA_MAX_NAME_LEN];
	char plugin_instance[DATA_MAX_NAME_LEN];
	char type[DATA_MAX_NAME_LEN];
	char type_instance[DATA_MAX_NAME_LEN];
} PluginData;
PyTypeObject PluginDataType;
#define PluginData_New() PyObject_CallFunctionObjArgs((PyObject *) &PluginDataType, (void *) 0)

typedef struct {
	PluginData data;
	PyObject *values;    /* Sequence */
	PyObject *meta;      /* dict */
	int interval;
} Values;
PyTypeObject ValuesType;
#define Values_New() PyObject_CallFunctionObjArgs((PyObject *) &ValuesType, (void *) 0)

typedef struct {
	PluginData data;
	int severity;
	char message[NOTIF_MAX_MSG_LEN];
} Notification;
PyTypeObject NotificationType;
#define Notification_New() PyObject_CallFunctionObjArgs((PyObject *) &NotificationType, (void *) 0)

typedef PyLongObject Signed;
PyTypeObject SignedType;

typedef PyLongObject Unsigned;
PyTypeObject UnsignedType;