summaryrefslogtreecommitdiff
path: root/src/python/pmapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/pmapi.c')
-rw-r--r--src/python/pmapi.c1364
1 files changed, 1364 insertions, 0 deletions
diff --git a/src/python/pmapi.c b/src/python/pmapi.c
new file mode 100644
index 0000000..6886214
--- /dev/null
+++ b/src/python/pmapi.c
@@ -0,0 +1,1364 @@
+/*
+ * Copyright (C) 2012-2014 Red Hat.
+ * Copyright (C) 2009-2012 Michael T. Werner
+ *
+ * This file is part of the "pcp" module, the python interfaces for the
+ * Performance Co-Pilot toolkit.
+ *
+ * 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.
+ */
+
+/**************************************************************************\
+** **
+** This C extension module mainly serves the purpose of loading constants **
+** from PCP headers into the module dictionary. The PMAPI functions and **
+** data structures are wrapped in pmapi.py and friends, using ctypes. **
+** **
+\**************************************************************************/
+
+#include <Python.h>
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+
+#if PY_MAJOR_VERSION >= 3
+#define MOD_ERROR_VAL NULL
+#define MOD_SUCCESS_VAL(val) val
+#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
+#define MOD_DEF(ob, name, doc, methods) \
+ static struct PyModuleDef moduledef = { \
+ PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \
+ ob = PyModule_Create(&moduledef);
+#else
+#define MOD_ERROR_VAL
+#define MOD_SUCCESS_VAL(val)
+#define MOD_INIT(name) void init##name(void)
+#define MOD_DEF(ob, name, doc, methods) \
+ ob = Py_InitModule3(name, methods, doc);
+#endif
+
+static pmOptions options;
+static int longOptionsCount;
+static PyObject *optionCallback;
+static PyObject *overridesCallback;
+
+static void
+dict_add_unsigned(PyObject *dict, char *symbol, unsigned long value)
+{
+ PyObject *pyvalue = PyLong_FromUnsignedLong(value);
+ PyDict_SetItemString(dict, symbol, pyvalue);
+ Py_XDECREF(pyvalue);
+}
+
+static void
+dict_add(PyObject *dict, char *symbol, long value)
+{
+#if PY_MAJOR_VERSION >= 3
+ PyObject *pyvalue = PyLong_FromLong(value);
+#else
+ PyObject *pyvalue = PyInt_FromLong(value);
+#endif
+ PyDict_SetItemString(dict, symbol, pyvalue);
+ Py_XDECREF(pyvalue);
+}
+
+static void
+edict_add(PyObject *dict, PyObject *edict, char *symbol, long value)
+{
+#if PY_MAJOR_VERSION >= 3
+ PyObject *pyvalue = PyLong_FromLong(value);
+ PyObject *pysymbol = PyUnicode_FromString(symbol);
+#else
+ PyObject *pyvalue = PyInt_FromLong(value);
+ PyObject *pysymbol = PyString_FromString(symbol);
+#endif
+
+ PyDict_SetItemString(dict, symbol, pyvalue);
+ PyDict_SetItem(edict, pyvalue, pysymbol);
+ Py_XDECREF(pysymbol);
+ Py_XDECREF(pyvalue);
+}
+
+static PyObject *
+setExtendedTimeBase(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ int type;
+ char *keyword_list[] = {"type", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "i:PM_XTB_SET", keyword_list, &type))
+ return NULL;
+ return Py_BuildValue("i", PM_XTB_SET(type));
+}
+
+static PyObject *
+getExtendedTimeBase(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ int mode;
+ char *keyword_list[] = {"mode", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "i:PM_XTB_GET", keyword_list, &mode))
+ return NULL;
+ return Py_BuildValue("i", PM_XTB_GET(mode));
+}
+
+static PyObject *
+timevalSleep(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ struct timeval ctv;
+ long seconds, useconds;
+ char *keyword_list[] = {"seconds", "useconds", NULL};
+ extern void __pmtimevalSleep(struct timeval);
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "ll:pmtimevalSleep", keyword_list, &seconds, &useconds))
+ return NULL;
+ ctv.tv_sec = seconds;
+ ctv.tv_usec = useconds;
+ __pmtimevalSleep(ctv);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+timevalToReal(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ struct timeval ctv;
+ long seconds, useconds;
+ char *keyword_list[] = {"seconds", "useconds", NULL};
+ extern double __pmtimevalToReal(const struct timeval *);
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "ll:pmtimevalToReal", keyword_list, &seconds, &useconds))
+ return NULL;
+ ctv.tv_sec = seconds;
+ ctv.tv_usec = useconds;
+ return Py_BuildValue("d", __pmtimevalToReal(&ctv));
+}
+
+static PyObject *
+setIdentity(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *name;
+ char *keyword_list[] = {"name", NULL};
+ extern int __pmSetProcessIdentity(const char *);
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetProcessIdentity", keyword_list, &name))
+ return NULL;
+ return Py_BuildValue("i", __pmSetProcessIdentity(name));
+}
+
+/*
+ * Common command line option handling code - wrapping pmOptions
+ */
+
+static int
+addLongOption(pmLongOptions *opt, int duplicate)
+{
+ size_t bytes;
+ pmLongOptions *lp;
+ int index = longOptionsCount;
+
+ if (!opt->long_opt)
+ return -EINVAL;
+
+ bytes = (index + 2) * sizeof(pmLongOptions); /* +2 for PMAPI_OPTIONS_END */
+ if ((lp = realloc(options.long_options, bytes)) == NULL)
+ return -ENOMEM;
+ options.long_options = lp;
+
+ if (!duplicate)
+ goto update;
+
+ if ((opt->long_opt = strdup(opt->long_opt)) == NULL)
+ return -ENOMEM;
+ if (opt->argname &&
+ (opt->argname = strdup(opt->argname)) == NULL) {
+ free((char *)opt->long_opt);
+ return -ENOMEM;
+ }
+ if (opt->message &&
+ (opt->message = strdup(opt->message)) == NULL) {
+ free((char *)opt->long_opt);
+ free((char *)opt->argname);
+ return -ENOMEM;
+ }
+
+update:
+ lp[index].long_opt = opt->long_opt;
+ lp[index].has_arg = opt->has_arg;
+ lp[index].short_opt = opt->short_opt;
+ lp[index].argname = opt->argname;
+ lp[index].message = opt->message;
+ memset(&lp[index+1], 0, sizeof(pmLongOptions)); /* PMAPI_OPTIONS_END */
+ longOptionsCount++;
+ return 0;
+}
+
+static PyObject *
+setLongOptionHeader(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ pmLongOptions header = PMAPI_OPTIONS_HEADER("");
+ char *keyword_list[] = {"heading", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetLongOptionHeader", keyword_list,
+ &header.message))
+ return NULL;
+ if ((header.message = strdup(header.message)) == NULL)
+ return PyErr_NoMemory();
+
+ if (addLongOption(&header, 0) < 0) {
+ free((char *)header.message);
+ return PyErr_NoMemory();
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setLongOptionText(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ pmLongOptions text = PMAPI_OPTIONS_TEXT("");
+ char *keyword_list[] = {"text", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetLongOptionText", keyword_list,
+ &text.message))
+ return NULL;
+ if ((text.message = strdup(text.message)) == NULL)
+ return PyErr_NoMemory();
+
+ if (addLongOption(&text, 0) < 0) {
+ free((char *)text.message);
+ return PyErr_NoMemory();
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+addLongOptionObject(pmLongOptions *option)
+{
+ if (addLongOption(option, 1) < 0)
+ return PyErr_NoMemory();
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setLongOption(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *short_opt = NULL;
+ pmLongOptions option = { 0 };
+ char *keyword_list[] = {"long_opt", "has_arg", "short_opt",
+ "argname", "message", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "sisss:pmSetLongOption", keyword_list,
+ &option.long_opt, &option.has_arg, &short_opt,
+ &option.argname, &option.message))
+ return NULL;
+ if (short_opt)
+ option.short_opt = (int)short_opt[0];
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionAlign(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_ALIGN;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionArchive(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_ARCHIVE;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionHostList(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_HOST_LIST;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionArchiveList(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_ARCHIVE_LIST;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionArchiveFolio(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_ARCHIVE_FOLIO;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionDebug(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_DEBUG;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionGuiMode(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_GUIMODE;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionHost(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_HOST;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionHostsFile(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_HOSTSFILE;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionSpecLocal(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_SPECLOCAL;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionLocalPMDA(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_LOCALPMDA;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionOrigin(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_ORIGIN;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionGuiPort(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_GUIPORT;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionStart(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_START;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionSamples(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_SAMPLES;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionFinish(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_FINISH;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionInterval(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_INTERVAL;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionVersion(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_VERSION;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionTimeZone(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_TIMEZONE;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionHostZone(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_HOSTZONE;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+setLongOptionHelp(PyObject *self, PyObject *args)
+{
+ pmLongOptions option = PMOPT_HELP;
+ return addLongOptionObject(&option);
+}
+
+static PyObject *
+resetAllOptions(PyObject *self, PyObject *args)
+{
+ pmFreeOptions(&options);
+ memset(&options, 0, sizeof(options));
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setShortOptions(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *short_opts;
+ char *keyword_list[] = {"short_options", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetShortOptions", keyword_list, &short_opts))
+ return NULL;
+
+ if ((short_opts = strdup(short_opts ? short_opts : "")) == NULL)
+ return PyErr_NoMemory();
+ if (options.short_options)
+ free((void *)options.short_options);
+ options.short_options = short_opts;
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setShortUsage(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *short_usage;
+ char *keyword_list[] = {"short_usage", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetShortUsage", keyword_list, &short_usage))
+ return NULL;
+
+ if ((short_usage = strdup(short_usage ? short_usage : "")) == NULL)
+ return PyErr_NoMemory();
+ if (options.short_usage)
+ free((void *)options.short_usage);
+ options.short_usage = short_usage;
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOptionFlags(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ int flags;
+ char *keyword_list[] = {"flags", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "i:pmSetOptionFlags", keyword_list, &flags))
+ return NULL;
+
+ options.flags |= flags;
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOptionArchiveFolio(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *folio;
+ char *keyword_list[] = {PMLONGOPT_ARCHIVE_FOLIO, NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetOptionArchiveFolio", keyword_list, &folio))
+ return NULL;
+
+ __pmAddOptArchiveFolio(&options, folio);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOptionArchiveList(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *archives;
+ char *keyword_list[] = {PMLONGOPT_ARCHIVE_LIST, NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetOptionArchiveList", keyword_list, &archives))
+ return NULL;
+
+ __pmAddOptArchiveList(&options, archives);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOptionHostList(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *hosts;
+ char *keyword_list[] = {PMLONGOPT_HOST_LIST, NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetOptionHostList", keyword_list, &hosts))
+ return NULL;
+
+ __pmAddOptHostList(&options, hosts);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOptionSamples(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *count, *endnum;
+ char *keyword_list[] = {"count", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetOptionSamples", keyword_list, &count))
+ return NULL;
+
+ if (options.finish_optarg) {
+ pmprintf("%s: at most one of finish time and sample count allowed\n",
+ pmProgname);
+ options.errors++;
+ } else {
+ options.samples = (int)strtol(count, &endnum, 10);
+ if (*endnum != '\0' || options.samples < 0) {
+ pmprintf("%s: sample count must be a positive numeric argument\n",
+ pmProgname);
+ options.errors++;
+ }
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOptionInterval(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *delta, *errmsg;
+ char *keyword_list[] = {"delta", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "s:pmSetOptionInterval", keyword_list, &delta))
+ return NULL;
+
+ if (pmParseInterval(delta, &options.interval, &errmsg) < 0) {
+ pmprintf("%s: interval argument not in pmParseInterval(3) format:\n",
+ pmProgname);
+ pmprintf("%s\n", errmsg);
+ options.errors++;
+ free(errmsg);
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOptionErrors(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ int errors;
+ char *keyword_list[] = {"errors", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "i:pmSetOptionErrors", keyword_list, &errors))
+ return NULL;
+
+ options.errors = errors;
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static int
+override_callback(int opt, pmOptions *opts)
+{
+ PyObject *arglist, *result;
+ char argstring[2] = { (char)opt, '\0' };
+ int sts;
+
+ arglist = Py_BuildValue("(s)", argstring);
+ if (!arglist) {
+ PyErr_Print();
+ return -ENOMEM;
+ }
+ result = PyEval_CallObject(overridesCallback, arglist);
+ Py_DECREF(arglist);
+ if (!result) {
+ PyErr_Print();
+ return -EAGAIN; /* exception thrown */
+ }
+ sts = PyLong_AsLong(result);
+ Py_DECREF(result);
+ return sts;
+}
+
+static void
+options_callback(int opt, pmOptions *opts)
+{
+ PyObject *arglist, *result;
+ char argstring[2] = { (char)opt, '\0' };
+
+ arglist = Py_BuildValue("(ssi)", argstring, options.optarg, options.index);
+ if (!arglist) {
+ PyErr_Print();
+ } else {
+ result = PyEval_CallObject(optionCallback, arglist);
+ Py_DECREF(arglist);
+ if (!result) {
+ PyErr_Print();
+ return;
+ }
+ Py_DECREF(result);
+ }
+}
+
+static PyObject *
+getNonOptionsFromList(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ int argc, length, i;
+ PyObject *result;
+ PyObject *pyargv = NULL;
+ char *keyword_list[] = {"argv", NULL};
+
+ /* Caller must perform pmGetOptions before running this, check */
+ if (!(options.flags & PM_OPTFLAG_DONE))
+ return NULL;
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "O:pmGetNonOptionsFromList", keyword_list, &pyargv))
+ if (pyargv == NULL)
+ return NULL;
+
+ if (!PyList_Check(pyargv)) {
+ PyErr_SetString(PyExc_TypeError, "pmGetNonOptionsFromList uses a list");
+ return NULL;
+ }
+
+ length = 0;
+ if ((argc = PyList_GET_SIZE(pyargv)) > 0)
+ length = argc - options.optind;
+
+ if (length <= 0) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ if ((result = PyList_New(length)) == NULL)
+ return PyErr_NoMemory();
+
+ for (i = 0; i < length; i++) {
+ PyObject *pyarg = PyList_GET_ITEM(pyargv, options.optind + i);
+ PyList_SET_ITEM(result, i, pyarg);
+ }
+ Py_INCREF(result);
+ return result;
+}
+
+static PyObject *
+getOptionsFromList(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ int i, argc;
+ char **argv;
+ PyObject *pyargv = NULL;
+ char *keyword_list[] = {"argv", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "O:pmGetOptionsFromList", keyword_list, &pyargv))
+ return NULL;
+
+ if (pyargv == NULL)
+ return Py_BuildValue("i", 0);
+
+ if (!PyList_Check(pyargv)) {
+ PyErr_SetString(PyExc_TypeError, "pmGetOptionsFromList uses a list");
+ Py_DECREF(pyargv);
+ return NULL;
+ }
+
+ if ((argc = PyList_GET_SIZE(pyargv)) <= 0) {
+ Py_DECREF(pyargv);
+ return Py_BuildValue("i", 0);
+ }
+
+ if ((argv = malloc(argc * sizeof(char *))) == NULL) {
+ Py_DECREF(pyargv);
+ return PyErr_NoMemory();
+ }
+
+ for (i = 0; i < argc; i++) {
+ PyObject *pyarg = PyList_GET_ITEM(pyargv, i);
+#if PY_MAJOR_VERSION >= 3
+ char *string = PyUnicode_AsUTF8(pyarg);
+#else
+ char *string = PyString_AsString(pyarg);
+#endif
+
+ /* argv[0] parameter will be used for pmProgname, so need to
+ * ensure the memory that backs it will be with us forever.
+ */
+ if (i == 0 && (string = strdup(string)) == NULL) {
+ free(argv);
+ Py_DECREF(pyargv);
+ return PyErr_NoMemory();
+ }
+ argv[i] = string;
+ }
+
+ if (overridesCallback)
+ options.override = override_callback;
+ while ((i = pmGetOptions(argc, argv, &options)) != -1)
+ options_callback(i, &options);
+ free(argv);
+
+ if (options.flags & PM_OPTFLAG_EXIT)
+ return Py_BuildValue("i", PM_ERR_APPVERSION);
+
+ return Py_BuildValue("i", options.errors);
+}
+
+static PyObject *
+setContextOptions(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ int sts, ctx, step, mode, delta;
+ char *keyword_list[] = {"context", "mode", "delta", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords,
+ "iii:pmSetContextOptions", keyword_list, &ctx, &mode, &delta))
+ return NULL;
+
+ /* complete time window and timezone setup */
+ if ((sts = pmGetContextOptions(ctx, &options)) < 0)
+ return Py_BuildValue("i", sts);
+
+ /* initial archive mode, position and delta */
+ if (options.context == PM_CONTEXT_ARCHIVE &&
+ (options.flags & PM_OPTFLAG_BOUNDARIES)) {
+ const int SECONDS_IN_24_DAYS = 2073600;
+ struct timeval interval = options.interval;
+ struct timeval position = options.origin;
+
+ if (interval.tv_sec > SECONDS_IN_24_DAYS) {
+ step = interval.tv_sec;
+ mode |= PM_XTB_SET(PM_TIME_SEC);
+ } else {
+ if (interval.tv_sec == 0 && interval.tv_usec == 0)
+ interval.tv_sec = delta;
+ step = interval.tv_sec * 1e3 + interval.tv_usec / 1e3;
+ mode |= PM_XTB_SET(PM_TIME_MSEC);
+ }
+ if ((sts = pmSetMode(mode, &position, step)) < 0) {
+ pmprintf("%s: pmSetMode: %s\n", pmProgname, pmErrStr(sts));
+ options.flags |= PM_OPTFLAG_RUNTIME_ERR;
+ options.errors++;
+ }
+ }
+ return Py_BuildValue("i", sts);
+}
+
+static PyObject *
+usageMessage(PyObject *self, PyObject *args)
+{
+ pmUsageMessage(&options);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOverrideCallback(PyObject *self, PyObject *args)
+{
+ PyObject *func;
+
+ if (!PyArg_ParseTuple(args, "O:pmSetOverrideCallback", &func))
+ return NULL;
+ if (!PyCallable_Check(func)) {
+ PyErr_SetString(PyExc_TypeError,
+ "pmSetOverrideCallback parameter not callable");
+ return NULL;
+ }
+ Py_XINCREF(func);
+ Py_XDECREF(overridesCallback);
+ overridesCallback = func;
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+setOptionCallback(PyObject *self, PyObject *args)
+{
+ PyObject *func;
+
+ if (!PyArg_ParseTuple(args, "O:pmSetOptionCallback", &func))
+ return NULL;
+ if (!PyCallable_Check(func)) {
+ PyErr_SetString(PyExc_TypeError,
+ "pmSetOptionCallback parameter not callable");
+ return NULL;
+ }
+ Py_XINCREF(func);
+ Py_XDECREF(optionCallback);
+ optionCallback = func;
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionErrors(PyObject *self, PyObject *args)
+{
+ return Py_BuildValue("i", options.errors);
+}
+
+static PyObject *
+getOptionFlags(PyObject *self, PyObject *args)
+{
+ return Py_BuildValue("i", options.flags);
+}
+
+static PyObject *
+getOptionContext(PyObject *self, PyObject *args)
+{
+ if (options.context > 0)
+ return Py_BuildValue("i", options.context);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionHosts(PyObject *self, PyObject *args)
+{
+ PyObject *result;
+ int i;
+
+ if (options.nhosts > 0) {
+ if ((result = PyList_New(options.nhosts)) == NULL)
+ return PyErr_NoMemory();
+ for (i = 0; i < options.nhosts; i++) {
+#if PY_MAJOR_VERSION >= 3
+ PyObject *pyent = PyUnicode_FromString(options.hosts[i]);
+#else
+ PyObject *pyent = PyString_FromString(options.hosts[i]);
+#endif
+ PyList_SET_ITEM(result, i, pyent);
+ }
+ Py_INCREF(result);
+ return result;
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionArchives(PyObject *self, PyObject *args)
+{
+ PyObject *result;
+ int i;
+
+ if (options.narchives > 0) {
+ if ((result = PyList_New(options.narchives)) == NULL)
+ return PyErr_NoMemory();
+ for (i = 0; i < options.narchives; i++) {
+#if PY_MAJOR_VERSION >= 3
+ PyObject *pyent = PyUnicode_FromString(options.archives[i]);
+#else
+ PyObject *pyent = PyString_FromString(options.archives[i]);
+#endif
+ PyList_SET_ITEM(result, i, pyent);
+ }
+ Py_INCREF(result);
+ return result;
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionStart_sec(PyObject *self, PyObject *args)
+{
+ if (options.start.tv_sec || options.start.tv_usec)
+ return Py_BuildValue("l", options.start.tv_sec);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionStart_usec(PyObject *self, PyObject *args)
+{
+ if (options.start.tv_sec || options.start.tv_usec)
+ return Py_BuildValue("l", options.start.tv_usec);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionFinish_optarg(PyObject *self, PyObject *args)
+{
+ if (options.finish_optarg)
+ return Py_BuildValue("s", options.finish_optarg);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionFinish_sec(PyObject *self, PyObject *args)
+{
+ if (options.finish.tv_sec || options.finish.tv_usec)
+ return Py_BuildValue("l", options.finish.tv_sec);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionFinish_usec(PyObject *self, PyObject *args)
+{
+ if (options.finish.tv_sec || options.finish.tv_usec)
+ return Py_BuildValue("l", options.finish.tv_usec);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionOrigin_sec(PyObject *self, PyObject *args)
+{
+ if (options.origin.tv_sec || options.origin.tv_usec)
+ return Py_BuildValue("l", options.origin.tv_sec);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionOrigin_usec(PyObject *self, PyObject *args)
+{
+ if (options.origin.tv_sec || options.origin.tv_usec)
+ return Py_BuildValue("l", options.origin.tv_usec);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionInterval_sec(PyObject *self, PyObject *args)
+{
+ if (options.interval.tv_sec || options.interval.tv_usec)
+ return Py_BuildValue("l", options.interval.tv_sec);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionInterval_usec(PyObject *self, PyObject *args)
+{
+ if (options.interval.tv_sec || options.interval.tv_usec)
+ return Py_BuildValue("l", options.interval.tv_usec);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionSamples(PyObject *self, PyObject *args)
+{
+ if (options.samples)
+ return Py_BuildValue("i", options.samples);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+getOptionTimezone(PyObject *self, PyObject *args)
+{
+ if (options.timezone)
+ return Py_BuildValue("s", options.timezone);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+
+static PyMethodDef methods[] = {
+ { .ml_name = "PM_XTB_SET",
+ .ml_meth = (PyCFunction) setExtendedTimeBase,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "PM_XTB_GET",
+ .ml_meth = (PyCFunction) getExtendedTimeBase,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmtimevalSleep",
+ .ml_meth = (PyCFunction) timevalSleep,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmtimevalToReal",
+ .ml_meth = (PyCFunction) timevalToReal,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetProcessIdentity",
+ .ml_meth = (PyCFunction) setIdentity,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmResetAllOptions",
+ .ml_meth = (PyCFunction) resetAllOptions,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionHeader",
+ .ml_meth = (PyCFunction) setLongOptionHeader,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetLongOptionText",
+ .ml_meth = (PyCFunction) setLongOptionText,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetLongOption",
+ .ml_meth = (PyCFunction) setLongOption,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetLongOptionAlign",
+ .ml_meth = (PyCFunction) setLongOptionAlign,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionArchive",
+ .ml_meth = (PyCFunction) setLongOptionArchive,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionArchiveList",
+ .ml_meth = (PyCFunction) setLongOptionArchiveList,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionArchiveFolio",
+ .ml_meth = (PyCFunction) setLongOptionArchiveFolio,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionDebug",
+ .ml_meth = (PyCFunction) setLongOptionDebug,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionGuiMode",
+ .ml_meth = (PyCFunction) setLongOptionGuiMode,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionHost",
+ .ml_meth = (PyCFunction) setLongOptionHost,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionHostList",
+ .ml_meth = (PyCFunction) setLongOptionHostList,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionHostsFile",
+ .ml_meth = (PyCFunction) setLongOptionHostsFile,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionSpecLocal",
+ .ml_meth = (PyCFunction) setLongOptionSpecLocal,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionLocalPMDA",
+ .ml_meth = (PyCFunction) setLongOptionLocalPMDA,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionOrigin",
+ .ml_meth = (PyCFunction) setLongOptionOrigin,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionGuiPort",
+ .ml_meth = (PyCFunction) setLongOptionGuiPort,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionStart",
+ .ml_meth = (PyCFunction) setLongOptionStart,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionSamples",
+ .ml_meth = (PyCFunction) setLongOptionSamples,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionFinish",
+ .ml_meth = (PyCFunction) setLongOptionFinish,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionInterval",
+ .ml_meth = (PyCFunction) setLongOptionInterval,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionVersion",
+ .ml_meth = (PyCFunction) setLongOptionVersion,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionTimeZone",
+ .ml_meth = (PyCFunction) setLongOptionTimeZone,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionHostZone",
+ .ml_meth = (PyCFunction) setLongOptionHostZone,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetLongOptionHelp",
+ .ml_meth = (PyCFunction) setLongOptionHelp,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetShortOptions",
+ .ml_meth = (PyCFunction) setShortOptions,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetShortUsage",
+ .ml_meth = (PyCFunction) setShortUsage,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetOptionFlags",
+ .ml_meth = (PyCFunction) setOptionFlags,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetOptionErrors",
+ .ml_meth = (PyCFunction) setOptionErrors,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmGetOptionErrors",
+ .ml_meth = (PyCFunction) getOptionErrors,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionFlags",
+ .ml_meth = (PyCFunction) getOptionFlags,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionsFromList",
+ .ml_meth = (PyCFunction) getOptionsFromList,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmGetNonOptionsFromList",
+ .ml_meth = (PyCFunction) getNonOptionsFromList,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetContextOptions",
+ .ml_meth = (PyCFunction) setContextOptions,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS},
+ { .ml_name = "pmUsageMessage",
+ .ml_meth = (PyCFunction) usageMessage,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetOptionCallback",
+ .ml_meth = (PyCFunction) setOptionCallback,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetOverrideCallback",
+ .ml_meth = (PyCFunction) setOverrideCallback,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmGetOptionContext",
+ .ml_meth = (PyCFunction) getOptionContext,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionHosts",
+ .ml_meth = (PyCFunction) getOptionHosts,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionArchives",
+ .ml_meth = (PyCFunction) getOptionArchives,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionStart_sec",
+ .ml_meth = (PyCFunction) getOptionStart_sec,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionStart_usec",
+ .ml_meth = (PyCFunction) getOptionStart_usec,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionFinish_optarg",
+ .ml_meth = (PyCFunction) getOptionFinish_optarg,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionFinish_sec",
+ .ml_meth = (PyCFunction) getOptionFinish_sec,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionFinish_usec",
+ .ml_meth = (PyCFunction) getOptionFinish_usec,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionOrigin_sec",
+ .ml_meth = (PyCFunction) getOptionOrigin_sec,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionOrigin_usec",
+ .ml_meth = (PyCFunction) getOptionOrigin_usec,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionInterval_sec",
+ .ml_meth = (PyCFunction) getOptionInterval_sec,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmGetOptionInterval_usec",
+ .ml_meth = (PyCFunction) getOptionInterval_usec,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetOptionInterval",
+ .ml_meth = (PyCFunction) setOptionInterval,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmGetOptionSamples",
+ .ml_meth = (PyCFunction) getOptionSamples,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetOptionSamples",
+ .ml_meth = (PyCFunction) setOptionSamples,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmGetOptionTimezone",
+ .ml_meth = (PyCFunction) getOptionTimezone,
+ .ml_flags = METH_NOARGS },
+ { .ml_name = "pmSetOptionArchiveList",
+ .ml_meth = (PyCFunction) setOptionArchiveList,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetOptionArchiveFolio",
+ .ml_meth = (PyCFunction) setOptionArchiveFolio,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { .ml_name = "pmSetOptionHostList",
+ .ml_meth = (PyCFunction) setOptionHostList,
+ .ml_flags = METH_VARARGS | METH_KEYWORDS },
+ { NULL }
+};
+
+/* called when the module is initialized. */
+MOD_INIT(cpmapi)
+{
+ PyObject *module, *dict, *edict;
+
+ MOD_DEF(module, "cpmapi", NULL, methods);
+ if (module == NULL)
+ return MOD_ERROR_VAL;
+
+ dict = PyModule_GetDict(module);
+ edict = PyDict_New();
+ Py_INCREF(edict);
+ PyModule_AddObject(module, "pmErrSymDict", edict);
+
+ dict_add(dict, "PMAPI_VERSION_2", PMAPI_VERSION_2);
+ dict_add(dict, "PMAPI_VERSION", PMAPI_VERSION);
+
+ dict_add_unsigned(dict, "PM_ID_NULL", PM_ID_NULL);
+ dict_add_unsigned(dict, "PM_INDOM_NULL", PM_INDOM_NULL);
+ dict_add_unsigned(dict, "PM_IN_NULL", PM_IN_NULL);
+
+ dict_add_unsigned(dict, "PM_NS_DEFAULT", 0);
+
+#ifdef HAVE_BITFIELDS_LTOR
+ dict_add(dict, "HAVE_BITFIELDS_LTOR", 1);
+ dict_add(dict, "HAVE_BITFIELDS_RTOL", 0);
+#else
+ dict_add(dict, "HAVE_BITFIELDS_LTOR", 0);
+ dict_add(dict, "HAVE_BITFIELDS_RTOL", 1);
+#endif
+
+ dict_add(dict, "PM_SPACE_BYTE", PM_SPACE_BYTE);
+ dict_add(dict, "PM_SPACE_KBYTE", PM_SPACE_KBYTE);
+ dict_add(dict, "PM_SPACE_MBYTE", PM_SPACE_MBYTE);
+ dict_add(dict, "PM_SPACE_GBYTE", PM_SPACE_GBYTE);
+ dict_add(dict, "PM_SPACE_TBYTE", PM_SPACE_TBYTE);
+ dict_add(dict, "PM_SPACE_PBYTE", PM_SPACE_PBYTE);
+ dict_add(dict, "PM_SPACE_EBYTE", PM_SPACE_EBYTE);
+
+ dict_add(dict, "PM_TIME_NSEC", PM_TIME_NSEC);
+ dict_add(dict, "PM_TIME_USEC", PM_TIME_USEC);
+ dict_add(dict, "PM_TIME_MSEC", PM_TIME_MSEC);
+ dict_add(dict, "PM_TIME_SEC", PM_TIME_SEC);
+ dict_add(dict, "PM_TIME_MIN", PM_TIME_MIN);
+ dict_add(dict, "PM_TIME_HOUR", PM_TIME_HOUR);
+ dict_add(dict, "PM_COUNT_ONE", PM_COUNT_ONE);
+
+ dict_add(dict, "PM_TYPE_NOSUPPORT", PM_TYPE_NOSUPPORT);
+ dict_add(dict, "PM_TYPE_32", PM_TYPE_32);
+ dict_add(dict, "PM_TYPE_U32", PM_TYPE_U32);
+ dict_add(dict, "PM_TYPE_64", PM_TYPE_64);
+ dict_add(dict, "PM_TYPE_U64", PM_TYPE_U64);
+ dict_add(dict, "PM_TYPE_FLOAT", PM_TYPE_FLOAT);
+ dict_add(dict, "PM_TYPE_DOUBLE", PM_TYPE_DOUBLE);
+ dict_add(dict, "PM_TYPE_STRING", PM_TYPE_STRING);
+ dict_add(dict, "PM_TYPE_AGGREGATE", PM_TYPE_AGGREGATE);
+ dict_add(dict, "PM_TYPE_AGGREGATE_STATIC", PM_TYPE_AGGREGATE_STATIC);
+ dict_add(dict, "PM_TYPE_EVENT", PM_TYPE_EVENT);
+ dict_add(dict, "PM_TYPE_HIGHRES_EVENT", PM_TYPE_HIGHRES_EVENT);
+ dict_add(dict, "PM_TYPE_UNKNOWN", PM_TYPE_UNKNOWN);
+
+ dict_add(dict, "PM_SEM_COUNTER", PM_SEM_COUNTER);
+ dict_add(dict, "PM_SEM_INSTANT", PM_SEM_INSTANT);
+ dict_add(dict, "PM_SEM_DISCRETE", PM_SEM_DISCRETE);
+
+ dict_add(dict, "PMNS_LOCAL", PMNS_LOCAL);
+ dict_add(dict, "PMNS_REMOTE", PMNS_REMOTE);
+ dict_add(dict, "PMNS_ARCHIVE", PMNS_ARCHIVE);
+ dict_add(dict, "PMNS_LEAF_STATUS", PMNS_LEAF_STATUS);
+ dict_add(dict, "PMNS_NONLEAF_STATUS", PMNS_NONLEAF_STATUS);
+
+ dict_add(dict, "PM_CONTEXT_UNDEF", PM_CONTEXT_UNDEF);
+ dict_add(dict, "PM_CONTEXT_HOST", PM_CONTEXT_HOST);
+ dict_add(dict, "PM_CONTEXT_ARCHIVE", PM_CONTEXT_ARCHIVE);
+ dict_add(dict, "PM_CONTEXT_LOCAL", PM_CONTEXT_LOCAL);
+ dict_add(dict, "PM_CONTEXT_TYPEMASK", PM_CONTEXT_TYPEMASK);
+ dict_add(dict, "PM_CTXFLAG_SECURE", PM_CTXFLAG_SECURE);
+ dict_add(dict, "PM_CTXFLAG_COMPRESS", PM_CTXFLAG_COMPRESS);
+ dict_add(dict, "PM_CTXFLAG_RELAXED", PM_CTXFLAG_RELAXED);
+
+ dict_add(dict, "PM_VAL_HDR_SIZE", PM_VAL_HDR_SIZE);
+ dict_add(dict, "PM_VAL_VLEN_MAX", PM_VAL_VLEN_MAX);
+ dict_add(dict, "PM_VAL_INSITU", PM_VAL_INSITU);
+ dict_add(dict, "PM_VAL_DPTR", PM_VAL_DPTR);
+ dict_add(dict, "PM_VAL_SPTR", PM_VAL_SPTR);
+
+ dict_add(dict, "PMCD_NO_CHANGE", PMCD_NO_CHANGE);
+ dict_add(dict, "PMCD_ADD_AGENT", PMCD_ADD_AGENT);
+ dict_add(dict, "PMCD_RESTART_AGENT", PMCD_RESTART_AGENT);
+ dict_add(dict, "PMCD_DROP_AGENT", PMCD_DROP_AGENT);
+
+ dict_add(dict, "PM_MAXERRMSGLEN", PM_MAXERRMSGLEN);
+ dict_add(dict, "PM_TZ_MAXLEN", PM_TZ_MAXLEN);
+
+ dict_add(dict, "PM_LOG_MAXHOSTLEN", PM_LOG_MAXHOSTLEN);
+ dict_add(dict, "PM_LOG_MAGIC", PM_LOG_MAGIC);
+ dict_add(dict, "PM_LOG_VERS02", PM_LOG_VERS02);
+ dict_add(dict, "PM_LOG_VOL_TI", PM_LOG_VOL_TI);
+ dict_add(dict, "PM_LOG_VOL_META", PM_LOG_VOL_META);
+
+ dict_add(dict, "PM_MODE_LIVE", PM_MODE_LIVE);
+ dict_add(dict, "PM_MODE_INTERP", PM_MODE_INTERP);
+ dict_add(dict, "PM_MODE_FORW", PM_MODE_FORW);
+ dict_add(dict, "PM_MODE_BACK", PM_MODE_BACK);
+
+ dict_add(dict, "PM_TEXT_ONELINE", PM_TEXT_ONELINE);
+ dict_add(dict, "PM_TEXT_HELP", PM_TEXT_HELP);
+
+ dict_add(dict, "PM_XTB_FLAG", PM_XTB_FLAG);
+
+ dict_add(dict, "PM_OPTFLAG_INIT", PM_OPTFLAG_INIT);
+ dict_add(dict, "PM_OPTFLAG_DONE", PM_OPTFLAG_DONE);
+ dict_add(dict, "PM_OPTFLAG_MULTI", PM_OPTFLAG_MULTI);
+ dict_add(dict, "PM_OPTFLAG_USAGE_ERR", PM_OPTFLAG_USAGE_ERR);
+ dict_add(dict, "PM_OPTFLAG_RUNTIME_ERR", PM_OPTFLAG_RUNTIME_ERR);
+ dict_add(dict, "PM_OPTFLAG_EXIT", PM_OPTFLAG_EXIT);
+ dict_add(dict, "PM_OPTFLAG_POSIX", PM_OPTFLAG_POSIX);
+ dict_add(dict, "PM_OPTFLAG_MIXED", PM_OPTFLAG_MIXED);
+ dict_add(dict, "PM_OPTFLAG_ENV_ONLY", PM_OPTFLAG_ENV_ONLY);
+ dict_add(dict, "PM_OPTFLAG_LONG_ONLY", PM_OPTFLAG_LONG_ONLY);
+ dict_add(dict, "PM_OPTFLAG_BOUNDARIES", PM_OPTFLAG_BOUNDARIES);
+ dict_add(dict, "PM_OPTFLAG_STDOUT_TZ", PM_OPTFLAG_STDOUT_TZ);
+ dict_add(dict, "PM_OPTFLAG_NOFLUSH", PM_OPTFLAG_NOFLUSH);
+ dict_add(dict, "PM_OPTFLAG_QUIET", PM_OPTFLAG_QUIET);
+
+ dict_add(dict, "PM_EVENT_FLAG_POINT", PM_EVENT_FLAG_POINT);
+ dict_add(dict, "PM_EVENT_FLAG_START", PM_EVENT_FLAG_START);
+ dict_add(dict, "PM_EVENT_FLAG_END", PM_EVENT_FLAG_END);
+ dict_add(dict, "PM_EVENT_FLAG_ID", PM_EVENT_FLAG_ID);
+ dict_add(dict, "PM_EVENT_FLAG_PARENT", PM_EVENT_FLAG_PARENT);
+ dict_add(dict, "PM_EVENT_FLAG_MISSED", PM_EVENT_FLAG_MISSED);
+
+ edict_add(dict, edict, "PM_ERR_GENERIC", PM_ERR_GENERIC);
+ edict_add(dict, edict, "PM_ERR_PMNS", PM_ERR_PMNS);
+ edict_add(dict, edict, "PM_ERR_NOPMNS", PM_ERR_NOPMNS);
+ edict_add(dict, edict, "PM_ERR_DUPPMNS", PM_ERR_DUPPMNS);
+ edict_add(dict, edict, "PM_ERR_TEXT", PM_ERR_TEXT);
+ edict_add(dict, edict, "PM_ERR_APPVERSION", PM_ERR_APPVERSION);
+ edict_add(dict, edict, "PM_ERR_VALUE", PM_ERR_VALUE);
+ edict_add(dict, edict, "PM_ERR_TIMEOUT", PM_ERR_TIMEOUT);
+ edict_add(dict, edict, "PM_ERR_NODATA", PM_ERR_NODATA);
+ edict_add(dict, edict, "PM_ERR_RESET", PM_ERR_RESET);
+ edict_add(dict, edict, "PM_ERR_NAME", PM_ERR_NAME);
+ edict_add(dict, edict, "PM_ERR_PMID", PM_ERR_PMID);
+ edict_add(dict, edict, "PM_ERR_INDOM", PM_ERR_INDOM);
+ edict_add(dict, edict, "PM_ERR_INST", PM_ERR_INST);
+ edict_add(dict, edict, "PM_ERR_UNIT", PM_ERR_UNIT);
+ edict_add(dict, edict, "PM_ERR_CONV", PM_ERR_CONV);
+ edict_add(dict, edict, "PM_ERR_TRUNC", PM_ERR_TRUNC);
+ edict_add(dict, edict, "PM_ERR_SIGN", PM_ERR_SIGN);
+ edict_add(dict, edict, "PM_ERR_PROFILE", PM_ERR_PROFILE);
+ edict_add(dict, edict, "PM_ERR_IPC", PM_ERR_IPC);
+ edict_add(dict, edict, "PM_ERR_EOF", PM_ERR_EOF);
+ edict_add(dict, edict, "PM_ERR_NOTHOST", PM_ERR_NOTHOST);
+ edict_add(dict, edict, "PM_ERR_EOL", PM_ERR_EOL);
+ edict_add(dict, edict, "PM_ERR_MODE", PM_ERR_MODE);
+ edict_add(dict, edict, "PM_ERR_LABEL", PM_ERR_LABEL);
+ edict_add(dict, edict, "PM_ERR_LOGREC", PM_ERR_LOGREC);
+ edict_add(dict, edict, "PM_ERR_NOTARCHIVE", PM_ERR_NOTARCHIVE);
+ edict_add(dict, edict, "PM_ERR_LOGFILE", PM_ERR_LOGFILE);
+ edict_add(dict, edict, "PM_ERR_NOCONTEXT", PM_ERR_NOCONTEXT);
+ edict_add(dict, edict, "PM_ERR_PROFILESPEC", PM_ERR_PROFILESPEC);
+ edict_add(dict, edict, "PM_ERR_PMID_LOG", PM_ERR_PMID_LOG);
+ edict_add(dict, edict, "PM_ERR_INDOM_LOG", PM_ERR_INDOM_LOG);
+ edict_add(dict, edict, "PM_ERR_INST_LOG", PM_ERR_INST_LOG);
+ edict_add(dict, edict, "PM_ERR_NOPROFILE", PM_ERR_NOPROFILE);
+ edict_add(dict, edict, "PM_ERR_NOAGENT", PM_ERR_NOAGENT);
+ edict_add(dict, edict, "PM_ERR_PERMISSION", PM_ERR_PERMISSION);
+ edict_add(dict, edict, "PM_ERR_CONNLIMIT", PM_ERR_CONNLIMIT);
+ edict_add(dict, edict, "PM_ERR_AGAIN", PM_ERR_AGAIN);
+ edict_add(dict, edict, "PM_ERR_ISCONN", PM_ERR_ISCONN);
+ edict_add(dict, edict, "PM_ERR_NOTCONN", PM_ERR_NOTCONN);
+ edict_add(dict, edict, "PM_ERR_NEEDPORT", PM_ERR_NEEDPORT);
+ edict_add(dict, edict, "PM_ERR_NONLEAF", PM_ERR_NONLEAF);
+ edict_add(dict, edict, "PM_ERR_TYPE", PM_ERR_TYPE);
+ edict_add(dict, edict, "PM_ERR_THREAD", PM_ERR_THREAD);
+ edict_add(dict, edict, "PM_ERR_TOOSMALL", PM_ERR_TOOSMALL);
+ edict_add(dict, edict, "PM_ERR_TOOBIG", PM_ERR_TOOBIG);
+ edict_add(dict, edict, "PM_ERR_FAULT", PM_ERR_FAULT);
+ edict_add(dict, edict, "PM_ERR_PMDAREADY", PM_ERR_PMDAREADY);
+ edict_add(dict, edict, "PM_ERR_PMDANOTREADY", PM_ERR_PMDANOTREADY);
+ edict_add(dict, edict, "PM_ERR_NYI", PM_ERR_NYI);
+
+ return MOD_SUCCESS_VAL(module);
+}