diff options
Diffstat (limited to 'src/dbpmda/src/dbpmda.c')
-rw-r--r-- | src/dbpmda/src/dbpmda.c | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/src/dbpmda/src/dbpmda.c b/src/dbpmda/src/dbpmda.c new file mode 100644 index 0000000..9af6e23 --- /dev/null +++ b/src/dbpmda/src/dbpmda.c @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2012-2014 Red Hat. + * Copyright (c) 1995-2002 Silicon Graphics, Inc. All Rights Reserved. + * + * 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. + */ + +#include "dbpmda.h" +#include "lex.h" +#include "gram.h" +#include <ctype.h> + +char *configfile; +__pmLogCtl logctl; +int parse_done; +int primary; /* Non-zero for primary pmlc */ +pid_t pid = (pid_t) -1; +char *pmnsfile = PM_NS_DEFAULT; +char *cmd_namespace = NULL; /* namespace given from command */ +int _creds_timeout = 3; /* Timeout for agents credential PDU */ + +int connmode = NO_CONN; +int stmt_type; +int eflag; +int iflag; + +extern int yyparse(void); + +static pmLongOptions longopts[] = { + PMAPI_OPTIONS_HEADER("General options"), + PMOPT_DEBUG, + PMOPT_NAMESPACE, + { "creds-timeout", 1, 'q', "N", "initial negotiation timeout (seconds)" }, + { "username", 1, 'U', "USER", "run under named user account" }, + PMOPT_HELP, + PMAPI_OPTIONS_HEADER("Input options"), + { "echo-input", 0, 'e', 0, "echo input" }, + { "interactive", 0, 'i', 0, "be interactive and prompt" }, + PMAPI_OPTIONS_END +}; + +static pmOptions opts = { + .flags = PM_OPTFLAG_POSIX, + .short_options = "q:D:ein:U:?", + .long_options = longopts, +}; + +/* + * called before regular exit() or as atexit() handler + */ +static void +cleanup() +{ + if (connmode == CONN_DSO) + closedso(); + else if (connmode == CONN_DAEMON) + closepmda(); + connmode = NO_CONN; +} + +int +main(int argc, char **argv) +{ + int c; + int sts; + char *endnum; + + iflag = isatty(0); + + while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { + switch (c) { + + case 'D': /* debug flag */ + sts = __pmParseDebug(opts.optarg); + if (sts < 0) { + fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n", + pmProgname, opts.optarg); + opts.errors++; + } + else + pmDebug |= sts; + break; + + case 'e': /* echo input */ + eflag++; + break; + + case 'i': /* be interactive */ + iflag = 1; + break; + + case 'n': /* alternative name space file */ + pmnsfile = opts.optarg; + break; + + case 'q': + sts = (int)strtol(opts.optarg, &endnum, 10); + if (*endnum != '\0' || sts <= 0.0) { + pmprintf("%s: -q requires a positive numeric argument\n", + pmProgname); + opts.errors++; + } else { + _creds_timeout = sts; + } + break; + + case 'U': /* run under alternate user account */ + __pmSetProcessIdentity(opts.optarg); + break; + + default: + case '?': + opts.errors++; + break; + } + } + + if ((c = argc - opts.optind) > 0) { + if (c > 1) + opts.errors++; + else { + /* pid was specified */ + if (primary) { + pmprintf("%s: you may not specify both -P and a pid\n", + pmProgname); + opts.errors++; + } + else { + pid = (int)strtol(argv[opts.optind], &endnum, 10); + if (*endnum != '\0') { + pmprintf("%s: pid must be a numeric process id\n", + pmProgname); + opts.errors++; + } + } + } + } + + if (opts.errors) { + pmUsageMessage(&opts); + exit(1); + } + + if ((sts = pmLoadNameSpace(pmnsfile)) < 0) { + if (pmnsfile == PM_NS_DEFAULT) { + fprintf(stderr, "%s: Cannot load default namespace: %s\n", + pmProgname, pmErrStr(sts)); + } else { + fprintf(stderr, "%s: Cannot load namespace from \"%s\": %s\n", + pmProgname, pmnsfile, pmErrStr(sts)); + } + exit(1); + } + + /* initialize the "fake context" ... */ + setup_context(); + + setlinebuf(stdout); + setlinebuf(stderr); + +#ifdef HAVE_ATEXIT + atexit(cleanup); +#endif + + for ( ; ; ) { + initmetriclist(); + yyparse(); + if (yywrap()) { + if (iflag) + putchar('\n'); + break; + } + + __pmSetInternalState(PM_STATE_PMCS); + + switch (stmt_type) { + + case OPEN: + profile_changed = 1; + break; + + case CLOSE: + switch (connmode) { + case CONN_DSO: + closedso(); + break; + + case CONN_DAEMON: + closepmda(); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + connmode = NO_CONN; + break; + + case DESC: + switch (connmode) { + case CONN_DSO: + dodso(PDU_DESC_REQ); + break; + + case CONN_DAEMON: + dopmda(PDU_DESC_REQ); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + case FETCH: + switch (connmode) { + case CONN_DSO: + dodso(PDU_FETCH); + break; + + case CONN_DAEMON: + dopmda(PDU_FETCH); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + case INSTANCE: + switch (connmode) { + case CONN_DSO: + dodso(PDU_INSTANCE_REQ); + break; + + case CONN_DAEMON: + dopmda(PDU_INSTANCE_REQ); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + case STORE: + switch (connmode) { + case CONN_DSO: + dodso(PDU_RESULT); + break; + + case CONN_DAEMON: + dopmda(PDU_RESULT); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + case HELP: + dohelp(param.number, param.pmid); + break; + + case WATCH: + break; + + case DBG: + pmDebug = param.number; + break; + + case QUIT: + goto done; + + case STATUS: + dostatus(); + break; + + case INFO: + switch (connmode) { + case CONN_DSO: + dodso(PDU_TEXT_REQ); + break; + + case CONN_DAEMON: + dopmda(PDU_TEXT_REQ); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + case NAMESPACE: + if (cmd_namespace != NULL) + free(cmd_namespace); + cmd_namespace = strdup(param.name); + if (cmd_namespace == NULL) { + fprintf(stderr, "%s: No memory for new namespace\n", + pmProgname); + exit(1); + } + pmUnloadNameSpace(); + strcpy(cmd_namespace, param.name); + if ((sts = pmLoadNameSpace(cmd_namespace)) < 0) { + fprintf(stderr, "%s: Cannot load namespace from \"%s\": %s\n", + pmProgname, cmd_namespace, pmErrStr(sts)); + + pmUnloadNameSpace(); + if (pmnsfile == PM_NS_DEFAULT) { + fprintf(stderr, "%s: Reload default namespace\n", + pmProgname); + } else { + fprintf(stderr, "%s: Reload namespace from \"%s\"\n", + pmProgname, pmnsfile); + } + if ((sts = pmLoadNameSpace(pmnsfile)) < 0) { + if (pmnsfile == PM_NS_DEFAULT) { + fprintf(stderr, + "%s: Cannot load default namespace: %s\n", + pmProgname, pmErrStr(sts)); + } else { + fprintf(stderr, + "%s: Cannot load namespace from \"%s\"" + ": %s\n", + pmProgname, pmnsfile, pmErrStr(sts)); + } + exit(1); + } + } + break; + + case EOL: + break; + + case PMNS_NAME: + switch (connmode) { + case CONN_DSO: + dodso(PDU_PMNS_IDS); + break; + + case CONN_DAEMON: + dopmda(PDU_PMNS_IDS); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + case PMNS_PMID: + switch (connmode) { + case CONN_DSO: + dodso(PDU_PMNS_NAMES); + break; + + case CONN_DAEMON: + dopmda(PDU_PMNS_NAMES); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + case PMNS_CHILDREN: + switch (connmode) { + case CONN_DSO: + dodso(PDU_PMNS_CHILD); + break; + + case CONN_DAEMON: + dopmda(PDU_PMNS_CHILD); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + case PMNS_TRAVERSE: + switch (connmode) { + case CONN_DSO: + dodso(PDU_PMNS_TRAVERSE); + break; + + case CONN_DAEMON: + dopmda(PDU_PMNS_TRAVERSE); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + case ATTR: + switch (connmode) { + case CONN_DSO: + dodso(PDU_AUTH); + break; + + case CONN_DAEMON: + dopmda(PDU_AUTH); + break; + + case NO_CONN: + yywarn("No PMDA currently opened"); + break; + } + break; + + default: + printf("Unexpected result (%d) from parser?\n", stmt_type); + break; + } + __pmSetInternalState(PM_STATE_APPL); + } + +done: + cleanup(); + + exit(0); +} |