summaryrefslogtreecommitdiff
path: root/man/man3/pmgetoptions.3
diff options
context:
space:
mode:
Diffstat (limited to 'man/man3/pmgetoptions.3')
-rw-r--r--man/man3/pmgetoptions.3481
1 files changed, 481 insertions, 0 deletions
diff --git a/man/man3/pmgetoptions.3 b/man/man3/pmgetoptions.3
new file mode 100644
index 0000000..a713b2b
--- /dev/null
+++ b/man/man3/pmgetoptions.3
@@ -0,0 +1,481 @@
+.\"
+.\" Copyright (c) 2014 Red Hat.
+.\"
+.\" 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.
+.\"
+.TH PMGETOPTIONS 3 "PCP" "Performance Co-Pilot"
+.SH NAME
+\f3pmgetopt_r\f1,
+\f3pmGetOptions\f1,
+\f3pmGetContextOptions\f1,
+\f3pmFreeOptions\f1,
+\f3pmUsageMessage\f1 \- command line handling for PMAPI tools
+.SH "C SYNOPSIS"
+.ft 3
+#include <pcp/pmapi.h>
+.sp
+.br
+int pmgetopt_r(int \fIargc\fP, char *const *\fIargv\fP, pmOptions *\fIopts\fP);
+.br
+int pmGetOptions(int \fIargc\fP, char *const *\fIargv\fP, pmOptions *\fIopts\fP);
+.br
+int pmGetContextOptions(int \fIctx\fP, pmOptions *\fIopts\fP);
+.br
+void pmUsageMessage(pmOptions *\fIopts\fP);
+.br
+void pmFreeOptions(pmOptions *\fIopts\fP);
+.fi
+.sp
+cc ... \-lpcp
+.ft 1
+.SH DESCRIPTION
+The
+.B pmGetOptions
+function provides command line option processing services for both
+monitor and collector
+.BR PMAPI (3)
+tools.
+It is modelled on the thread-safe variants of the GNU
+.BR getopt_long (3)
+API, and primarily differs in its focus on providing generalised
+processing for the (de-facto) standard PCP command line options
+described in
+.BR PCPIntro (1).
+These common options include the host and archive specification,
+time windows, timezones, sample counts, time intervals, and so on.
+.PP
+The primary interface is
+.BR pmGetOptions ,
+which should be passed the
+.I argc
+argument count and
+.I argv
+array, as passed to the
+.IR main()
+function on program invocation.
+The final
+.I opts
+argument describes the set of long and short options the tools is
+prepared to process, and other metadata regarding how those options
+should be processed.
+.PP
+The
+.B pmgetopt_r
+interface, used internally by
+.BR pmGetOptions ,
+behaves in a similar fashion, but it does not perform any common
+option processing.
+It is more suited to PCP collector processes, whereas PCP monitor
+tools tend to use
+.BR pmGetOptions .
+.PP
+The
+.I opts
+argument consists of an array of
+.I pmLongOpts
+entries describing the arguments, as well as the enclosing
+.I pmOptions
+struct, which are defined as follows (internal fields are not
+presented, for brevity):
+.PP
+.sp 0.5v
+.ft CW
+.nf
+.in +0.25i
+typedef struct {
+ const char * long_opt;
+ int has_arg;
+ int short_opt;
+ const char * argname;
+ const char * message;
+} pmLongOptions;
+
+typedef struct {
+ int version;
+ int flags;
+ const char * short_options;
+ pmLongOptions * long_options;
+ const char * short_usage;
+ pmOptionOverride override;
+
+ int index;
+ int optind;
+ int opterr;
+ int optopt;
+ char *optarg;
+ /* [internal fields, undocumented] */
+
+ int errors;
+ int context; /* PM_CONTEXT_{HOST,ARCHIVE,LOCAL} */
+ int nhosts;
+ int narchives;
+ char ** hosts;
+ char ** archives;
+ struct timeval start;
+ struct timeval finish;
+ struct timeval origin;
+ struct timeval interval;
+ char * align_optarg;
+ char * start_optarg;
+ char * finish_optarg;
+ char * origin_optarg;
+ char * guiport_optarg;
+ char * timezone;
+ int samples;
+ int guiport;
+ int padding;
+ unsigned int guiflag : 1;
+ unsigned int tzflag : 1;
+ unsigned int nsflag : 1;
+ unsigned int Lflag : 1;
+ unsigned int zeroes : 28;
+} pmOptions;
+.in -0.25i
+.fi
+.ft R
+.PP
+The initial
+.I flags
+and
+.I version
+fields describe how the rest of the pmOptions structure is to be
+interpreted.
+These fields can be zeroed, specifying a default interpretation.
+Alternatively, the PMAPI_VERSION macro can be used to specify the
+API level to use (currently, values of 2 or less are allowed).
+The
+.I flags
+field can be used to modify option processing behaviour as
+described in the ``FLAGS VALUES'' section below.
+.PP
+The array of
+.I long_options
+pmLongOpts structures must be terminated by a sentinel and the
+PMAPI_OPTIONS_END macro can be used to effect this termination.
+Individual records within the
+.I long_options
+array can be of two types \- options headers, or actual options.
+An options header is constructed using the PMAPI_OPTIONS_HEADER
+macro, and is used for usage message option grouping.
+Free form text can be inserted into the usage message at any
+point using the PMAPI_OPTIONS_TEXT macro \- this is intended
+for additional explanatory text covering detailed usage that
+is beyond the scope of the individual headers or options.
+Otherwise, the array entry specifies an option.
+These should be named (\c
+.IR long_opt )
+if a long-option form is allowed,
+specify whether or not they take an argument (\c
+.IR has_arg ),
+specify the single character variant argument (\c
+.IR short_opt )
+if a short-option form is allowed,
+and finally specify how to present the option in the usage message.
+This latter component consists of a short, one-word description of
+the optional argument (\c
+.IR argname )
+and a one-line description of what the command-line option does (\c
+.IR message ).
+.PP
+The
+.I short_usage
+string is also used only when constructing the usage message.
+It forms the component of the usage message that follows the
+program name (i.e. \c
+.IR argv[0] ).
+.PP
+The optional
+.I short_options
+string is the normal
+.I getopt
+command-line option specification string, using individual
+characters (those with arguments are designated as such
+using the ':' character) \- as used by all
+.I getopt
+implementations.
+.PP
+A facility is provided to extend the existing set of common options
+with additional options, as well as to re-task the standard options
+into non-standard roles for individual tools.
+The latter is achieved using the
+.I override
+method, which allows a callback function to be provided which will
+be called on receipt of every argument, prior to common processing.
+If this callback returns a non-zero value the common processing will
+be short-circuited for that option, otherwise processing continues.
+Thus, aach client tool is free to choose exactly which of the standard
+options they wish to support \- this can be all, some, or none, and
+no matter what they choose, each tool always has access to the long
+option parsing capability and the usage message generation facility.
+.PP
+The remaining pmOptions structure fields are filled in as a result
+of processing the arguments, and are largely self-explanatory.
+Further discussion of these is deferred to the ``FLAGS VALUES''
+section below.
+The
+.I error
+field contains a count of errors detected during option processing.
+These can be either usage or runtime errors, as indicated by the
+.I flags
+field (set, and passed out to the caller).
+Typically, a command line tool will fail to start successfully and
+will produce an error message (e.g. via
+.BR pmUsageMessage )
+if the
+.I error
+field is non-zero at the end of either
+.B pmGetOptions
+or
+.BR pmGetContextOptions .
+.PP
+Some command line option post-processing can only be performed once
+the tool has established a PMAPI context via
+.BR pmNewContext (3).
+This processing includes use of context-aware timezones (\f3\-z\f1),
+and time window processing (\f3\-A\f1, \f3\-O\f1, \f3\-S\f1, \f3\-T\f1)
+that may be affected by the timezone, for example.
+The
+.B pmGetContextOptions
+function is available for such situations, and it completes any
+remaining processing of
+.I opts
+with respect to the
+.I ctx
+context identifier given.
+.PP
+The
+.B pmUsageMessage
+function generates a usage message for the tool, and included both
+standard PCP options and custom options for each tool, as specified
+by the pmLongOptions array.
+It supports grouping of options (via PMAPI_OPTIONS_HEADER) as well
+as neat formatting of all options \- short and long \- their
+arguments, and individual explanatory messages.
+It will build this usage message using
+.BR pmprintf (3)
+upon which it will issue a single
+.BR pmflush (3)
+before returning to the caller, provided the PM_OPTFLAG_USAGE_ERR
+flag is set in
+.IR flags ,
+which will happen automatically during option parsing, when usage
+errors are detected.
+.PP
+In certain situations, such as recording lists of host specifications
+or PCP archive paths, the
+.B pmGetOptions
+routine may allocate memory, and store pointers to it within
+.IR opts .
+Should a program wish to free this memory before exiting, it can
+use the
+.B pmFreeOptions
+routine to do so.
+This is safe to call irrespective of whether memory was allocated
+dynamically, provided that
+.I opts
+was zeroed initially.
+.SH "FLAGS VALUES"
+.TP
+.B PM_OPTFLAG_INIT
+Used internally within the library to indicate initialisation has been
+done, so that on subsequent calls it will not be done again.
+.TP
+.B PM_OPTFLAG_DONE
+Used primarily internally within the library to indicate that the final
+option processing has been completed.
+This processing involves cross-referencing a number of the options, to
+check for mutual exclusion, for example.
+There may be other post-processing at this stage also, provided it does
+not require a PMAPI context.
+.TP
+.B PM_OPTFLAG_MULTI
+Allow more than one host or archive to be specified.
+The default is to allow one source of metrics only, however some of the
+more sophisticated tools permit multiple metric sources.
+See also
+.BR PM_OPTFLAG_MIXED .
+.TP
+.B PM_OPTFLAG_USAGE_ERR
+Indicates that the library has detected a command-line usage error.
+This is an error such as when an option requires an argument but none
+is supplied, or conflicting options are specified (such as \f3\-s\f1
+and \f3-T\f1).
+.TP
+.B PM_OPTFLAG_RUNTIME_ERR
+Indicates that the library has detected an error at run time.
+This is an error such as failing to retrieve timezone information
+from
+.B pmcd (1)
+or
+failing to load an alternate metric namespace from a local file
+(via the \f3-n\f1 option).
+.TP
+.B PM_OPTFLAG_EXIT
+Indicates a suggestion from the library that the tool exit cleanly.
+This is used when the version number is requested, for example (the
+\f3\-V\f1 option and PMOPT_VERSION macro).
+.TP
+.B PM_OPTFLAG_POSIX
+Use strict POSIX command line argument handling.
+This means options and following arguments will not be reordered,
+so additional options cannot follow command line arguments.
+This may be important for tools where the arguments can be negative
+numbers, for example, as these should not be treated as command line
+options in this case.
+.TP
+.B PM_OPTFLAG_MIXED
+Allow both live and archive metric sources to be specified.
+The default is to allow one type of metric context only, however some
+of the more sophisticated tools permit multiple context types.
+See also
+.BR PM_OPTFLAG_MULTI .
+.TP
+.B PM_OPTFLAG_ENV_ONLY
+Many options can be specified through the either the command line
+or from similarly-named environment variables.
+This flag disables all argument parsing, and only changes
+.I opts
+based on the environment variables.
+This may be useful for tools wishing to ensure no command line option
+conflicts occur between their own set and the standard PCP option set
+(such as an existing tool, reimplemented using PMAPI services).
+.TP
+.B PM_OPTFLAG_LONG_ONLY
+Only process long options, not short options.
+.TP
+.B PM_OPTFLAG_BOUNDARIES
+The default
+.B pmGetOptions
+behaviour is to parse the time window options (namely, \f3\-A\f1,
+\f3\-O\f1, \f3\-S\f1 and \f3\-T\f1), only if one of those options
+has been specified on the command line.
+However, this flag can be used (particularly with archive contexts)
+to find the
+.I start
+and
+.I finish
+times associated with the context(s) even if no time window options
+were specified.
+In the case of multiple archives, the time window is defined as the
+time window spanning all of the archives.
+.TP
+.B PM_OPTFLAG_STDOUT_TZ
+The timezone being used will be reported on the standard output
+stream during option parsing.
+The default behaviour is to not report, but simply return timezone
+information via the
+.I timezone
+(\f3\-Z\f1)
+and
+.I tzflag
+(\f3\-z\f1)
+fields in the
+.I opts
+structure.
+.TP
+.B PM_OPTFLAG_NOFLUSH
+The final
+.B pmflush
+call issued by
+.B pmUsageMessage
+will be skipped if this flag is set.
+This is useful in situations where the caller wishes to append
+additional test to the generated usage message before flushing.
+.TP
+.B PM_OPTFLAG_QUIET
+Suppress messages from
+.B pmgetopt_r
+about unrecognised command line options.
+This is the equivalent to setting the
+.I opterr
+field in the
+.I opt
+parameter (which mimics the
+.B getopt
+variable of the same name).
+.SH "RETURN VALUE"
+The
+.B pmGetOptions
+function returns either when it detects a command-line option that
+is not one of the standard PCP set, or when the end of the command
+line options has been reached (at which point -1 is returned).
+Both the
+.B pmgetopt_r
+and
+.B pmGetOptions
+routines return control to the caller in the same way that a regular
+.B getopt
+call would, with the return value indicating either the end of all
+processing (-1), or the single character form of the option currently
+being processed, or zero for the special long-option-only case.
+For all option-processing cases, the
+.I opts
+structure is returned containing filled out
+.IR optarg ,
+.IR opterr ,
+.IR optopt ,
+.IR optind ,
+and
+.I index
+fields as normal (do
+.B NOT
+use the global optarg or optind from your platform C library,
+these will
+.B NOT
+be modified).
+.PP
+.B pmGetOptions
+does not return to the caller when any of the standard PCP options are
+being processed (although the
+.I override
+mechanism can be used to still detect such options if needed).
+.PP
+The
+.B pmGetContextOptions
+function returns zero on success, or a negative PCP error code
+on failure.
+The
+.I error
+field within the
+.I
+opts
+parameter will also be non-zero in the latter case.
+.SH "PCP ENVIRONMENT"
+Environment variables with the prefix
+.B PCP_
+are used to parameterize the file and directory names
+used by PCP.
+On each installation, the file
+.I /etc/pcp.conf
+contains the local values for these variables.
+The
+.B $PCP_CONF
+variable may be used to specify an alternative
+configuration file,
+as described in
+.BR pcp.conf (5).
+Values for these variables may be obtained programmatically
+using the
+.BR pmGetOptions (3)
+function.
+.SH SEE ALSO
+.BR PCPIntro (1),
+.BR pmcd (1),
+.BR pminfo (1),
+.BR pmstat (1),
+.BR getopt (3),
+.BR getopt_long (3),
+.BR pmNewContext (3),
+.BR pmconfig (3),
+.BR pmprintf (3),
+.BR pmflush (3)
+and
+.BR PMAPI (3).