Annotation of embedaddon/sudo/doc/sudo_plugin.cat, revision 1.1.1.6

1.1.1.3   misho       1: SUDO_PLUGIN(4)                Programmer's Manual               SUDO_PLUGIN(4)
1.1       misho       2: 
                      3: NNAAMMEE
1.1.1.3   misho       4:      ssuuddoo__pplluuggiinn - Sudo Plugin API
1.1       misho       5: 
                      6: DDEESSCCRRIIPPTTIIOONN
1.1.1.3   misho       7:      Starting with version 1.8, ssuuddoo supports a plugin API for policy and
1.1.1.6 ! misho       8:      session logging.  Plugins may be compiled as dynamic shared objects (the
        !             9:      default on systems that support them) or compiled statically into the
        !            10:      ssuuddoo binary itself.  By default, the ssuuddooeerrss policy plugin and an
        !            11:      associated I/O logging plugin are used.  Via the plugin API, ssuuddoo can be
        !            12:      configured to use alternate policy and/or I/O logging plugins provided by
        !            13:      third parties.  The plugins to be used are specified in the sudo.conf(4)
        !            14:      file.
1.1.1.3   misho      15: 
                     16:      The API is versioned with a major and minor number.  The minor version
                     17:      number is incremented when additions are made.  The major number is
                     18:      incremented when incompatible changes are made.  A plugin should be check
                     19:      the version passed to it and make sure that the major version matches.
                     20: 
                     21:      The plugin API is defined by the sudo_plugin.h header file.
                     22: 
                     23:    PPoolliiccyy pplluuggiinn AAPPII
                     24:      A policy plugin must declare and populate a policy_plugin struct in the
                     25:      global scope.  This structure contains pointers to the functions that
                     26:      implement the ssuuddoo policy checks.  The name of the symbol should be
1.1.1.4   misho      27:      specified in sudo.conf(4) along with a path to the plugin so that ssuuddoo
1.1.1.3   misho      28:      can load it.
                     29: 
                     30:      struct policy_plugin {
                     31:      #define SUDO_POLICY_PLUGIN     1
                     32:          unsigned int type; /* always SUDO_POLICY_PLUGIN */
                     33:          unsigned int version; /* always SUDO_API_VERSION */
                     34:          int (*open)(unsigned int version, sudo_conv_t conversation,
                     35:                      sudo_printf_t plugin_printf, char * const settings[],
                     36:                      char * const user_info[], char * const user_env[],
                     37:                      char * const plugin_options[]);
                     38:          void (*close)(int exit_status, int error);
                     39:          int (*show_version)(int verbose);
                     40:          int (*check_policy)(int argc, char * const argv[],
                     41:                              char *env_add[], char **command_info[],
                     42:                              char **argv_out[], char **user_env_out[]);
                     43:          int (*list)(int argc, char * const argv[], int verbose,
                     44:                      const char *list_user);
                     45:          int (*validate)(void);
                     46:          void (*invalidate)(int remove);
                     47:          int (*init_session)(struct passwd *pwd, char **user_env[]);
                     48:          void (*register_hooks)(int version,
                     49:             int (*register_hook)(struct sudo_hook *hook));
                     50:          void (*deregister_hooks)(int version,
                     51:             int (*deregister_hook)(struct sudo_hook *hook));
                     52:      };
1.1       misho      53: 
1.1.1.3   misho      54:      The policy_plugin struct has the following fields:
1.1       misho      55: 
1.1.1.3   misho      56:      type  The type field should always be set to SUDO_POLICY_PLUGIN.
1.1       misho      57: 
1.1.1.3   misho      58:      version
1.1       misho      59:            The version field should be set to SUDO_API_VERSION.
                     60: 
                     61:            This allows ssuuddoo to determine the API version the plugin was built
                     62:            against.
                     63: 
1.1.1.3   misho      64:      open
                     65:            int (*open)(unsigned int version, sudo_conv_t conversation,
                     66:                        sudo_printf_t plugin_printf, char * const settings[],
                     67:                        char * const user_info[], char * const user_env[],
                     68:                        char * const plugin_options[]);
1.1       misho      69: 
                     70:            Returns 1 on success, 0 on failure, -1 if a general error occurred,
                     71:            or -2 if there was a usage error.  In the latter case, ssuuddoo will
                     72:            print a usage message before it exits.  If an error occurs, the
1.1.1.3   misho      73:            plugin may optionally call the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
1.1       misho      74:            function with SUDO_CONF_ERROR_MSG to present additional error
                     75:            information to the user.
                     76: 
                     77:            The function arguments are as follows:
                     78: 
                     79:            version
1.1.1.3   misho      80:                  The version passed in by ssuuddoo allows the plugin to determine
                     81:                  the major and minor version number of the plugin API
                     82:                  supported by ssuuddoo.
1.1       misho      83: 
                     84:            conversation
1.1.1.3   misho      85:                  A pointer to the ccoonnvveerrssaattiioonn() function that can be used by
                     86:                  the plugin to interact with the user (see below).  Returns 0
                     87:                  on success and -1 on failure.
1.1       misho      88: 
                     89:            plugin_printf
1.1.1.3   misho      90:                  A pointer to a pprriinnttff()-style function that may be used to
                     91:                  display informational or error messages (see below).  Returns
                     92:                  the number of characters printed on success and -1 on
                     93:                  failure.
1.1       misho      94: 
                     95:            settings
1.1.1.3   misho      96:                  A vector of user-supplied ssuuddoo settings in the form of
                     97:                  ``name=value'' strings.  The vector is terminated by a NULL
                     98:                  pointer.  These settings correspond to flags the user
                     99:                  specified when running ssuuddoo.  As such, they will only be
                    100:                  present when the corresponding flag has been specified on the
                    101:                  command line.
                    102: 
                    103:                  When parsing _s_e_t_t_i_n_g_s, the plugin should split on the ffiirrsstt
                    104:                  equal sign (`=') since the _n_a_m_e field will never include one
                    105:                  itself but the _v_a_l_u_e might.
                    106: 
1.1.1.4   misho     107:                  bsdauth_type=string
                    108:                        Authentication type, if specified by the --aa flag, to
                    109:                        use on systems where BSD authentication is supported.
                    110: 
                    111:                  closefrom=number
                    112:                        If specified, the user has requested via the --CC flag
                    113:                        that ssuuddoo close all files descriptors with a value of
                    114:                        _n_u_m_b_e_r or higher.  The plugin may optionally pass this,
                    115:                        or another value, back in the _c_o_m_m_a_n_d___i_n_f_o list.
                    116: 
1.1.1.3   misho     117:                  debug_flags=string
                    118:                        A comma-separated list of debug flags that correspond
1.1.1.4   misho     119:                        to ssuuddoo's Debug entry in sudo.conf(4), if there is one.
                    120:                        The flags are passed to the plugin as they appear in
                    121:                        sudo.conf(4).  The syntax used by ssuuddoo and the ssuuddooeerrss
                    122:                        plugin is _s_u_b_s_y_s_t_e_m@_p_r_i_o_r_i_t_y but the plugin is free to
                    123:                        use a different format so long as it does not include a
                    124:                        comma (`,').  There is not currently a way to specify a
                    125:                        set of debug flags specific to the plugin--the flags
                    126:                        are shared by ssuuddoo and the plugin.
1.1.1.3   misho     127: 
                    128:                  debug_level=number
                    129:                        This setting has been deprecated in favor of
                    130:                        _d_e_b_u_g___f_l_a_g_s.
                    131: 
1.1.1.4   misho     132:                  ignore_ticket=bool
                    133:                        Set to true if the user specified the --kk flag along
                    134:                        with a command, indicating that the user wishes to
                    135:                        ignore any cached authentication credentials.
                    136:                        _i_m_p_l_i_e_d___s_h_e_l_l to true.  This allows ssuuddoo with no
                    137:                        arguments to be used similarly to su(1).  If the plugin
                    138:                        does not to support this usage, it may return a value
                    139:                        of -2 from the cchheecckk__ppoolliiccyy() function, which will
                    140:                        cause ssuuddoo to print a usage message and exit.
1.1.1.3   misho     141: 
1.1.1.4   misho     142:                  implied_shell=bool
                    143:                        If the user does not specify a program on the command
                    144:                        line, ssuuddoo will pass the plugin the path to the user's
                    145:                        shell and set
1.1.1.3   misho     146: 
1.1.1.4   misho     147:                  login_class=string
                    148:                        BSD login class to use when setting resource limits and
                    149:                        nice value, if specified by the --cc flag.
1.1.1.3   misho     150: 
1.1.1.4   misho     151:                  login_shell=bool
                    152:                        Set to true if the user specified the --ii flag,
                    153:                        indicating that the user wishes to run a login shell.
                    154: 
                    155:                  max_groups=int
                    156:                        The maximum number of groups a user may belong to.
                    157:                        This will only be present if there is a corresponding
                    158:                        setting in sudo.conf(4).
                    159: 
                    160:                  network_addrs=list
                    161:                        A space-separated list of IP network addresses and
                    162:                        netmasks in the form ``addr/netmask'', e.g.
                    163:                        ``192.168.1.2/255.255.255.0''.  The address and netmask
                    164:                        pairs may be either IPv4 or IPv6, depending on what the
                    165:                        operating system supports.  If the address contains a
                    166:                        colon (`:'), it is an IPv6 address, else it is IPv4.
                    167: 
                    168:                  noninteractive=bool
                    169:                        Set to true if the user specified the --nn flag,
                    170:                        indicating that ssuuddoo should operate in non-interactive
                    171:                        mode.  The plugin may reject a command run in non-
                    172:                        interactive mode if user interaction is required.
                    173: 
                    174:                  plugin_dir=string
                    175:                        The default plugin directory used by the ssuuddoo front
                    176:                        end.  This is the default directory set at compile time
                    177:                        and may not correspond to the directory the running
                    178:                        plugin was loaded from.  It may be used by a plugin to
                    179:                        locate support files.
1.1.1.3   misho     180: 
                    181:                  preserve_environment=bool
                    182:                        Set to true if the user specified the --EE flag,
                    183:                        indicating that the user wishes to preserve the
                    184:                        environment.
                    185: 
                    186:                  preserve_groups=bool
                    187:                        Set to true if the user specified the --PP flag,
                    188:                        indicating that the user wishes to preserve the group
                    189:                        vector instead of setting it based on the runas user.
                    190: 
1.1.1.4   misho     191:                  progname=string
                    192:                        The command name that sudo was run as, typically
                    193:                        ``sudo'' or ``sudoedit''.
1.1.1.3   misho     194: 
1.1.1.4   misho     195:                  prompt=string
                    196:                        The prompt to use when requesting a password, if
                    197:                        specified via the --pp flag.
1.1.1.3   misho     198: 
1.1.1.5   misho     199:                  remote_host=string
                    200:                        The name of the remote host to run the command on, if
                    201:                        specified via the --hh option.  Support for running the
                    202:                        command on a remote host is meant to be implemented via
                    203:                        a helper program that is executed in place of the user-
                    204:                        specified command.  The ssuuddoo front end is only capable
                    205:                        of executing commands on the local host.  Only
                    206:                        available starting with API version 1.4.
                    207: 
1.1.1.4   misho     208:                  run_shell=bool
                    209:                        Set to true if the user specified the --ss flag,
                    210:                        indicating that the user wishes to run a shell.
                    211: 
                    212:                  runas_group=string
1.1.1.5   misho     213:                        The group name or gid to run the command as, if
1.1.1.4   misho     214:                        specified via the --gg flag.
                    215: 
                    216:                  runas_user=string
1.1.1.5   misho     217:                        The user name or uid to run the command as, if
1.1.1.4   misho     218:                        specified via the --uu flag.
1.1.1.3   misho     219: 
                    220:                  selinux_role=string
                    221:                        SELinux role to use when executing the command, if
                    222:                        specified by the --rr flag.
                    223: 
                    224:                  selinux_type=string
                    225:                        SELinux type to use when executing the command, if
                    226:                        specified by the --tt flag.
                    227: 
1.1.1.4   misho     228:                  set_home=bool
                    229:                        Set to true if the user specified the --HH flag.  If
                    230:                        true, set the HOME environment variable to the target
                    231:                        user's home directory.
1.1.1.3   misho     232: 
                    233:                  sudoedit=bool
                    234:                        Set to true when the --ee flag is is specified or if
                    235:                        invoked as ssuuddooeeddiitt.  The plugin shall substitute an
                    236:                        editor into _a_r_g_v in the cchheecckk__ppoolliiccyy() function or
                    237:                        return -2 with a usage error if the plugin does not
                    238:                        support _s_u_d_o_e_d_i_t.  For more information, see the
                    239:                        _c_h_e_c_k___p_o_l_i_c_y section.
                    240: 
                    241:                  Additional settings may be added in the future so the plugin
                    242:                  should silently ignore settings that it does not recognize.
1.1       misho     243: 
                    244:            user_info
1.1.1.3   misho     245:                  A vector of information about the user running the command in
                    246:                  the form of ``name=value'' strings.  The vector is terminated
                    247:                  by a NULL pointer.
                    248: 
                    249:                  When parsing _u_s_e_r___i_n_f_o, the plugin should split on the ffiirrsstt
                    250:                  equal sign (`=') since the _n_a_m_e field will never include one
                    251:                  itself but the _v_a_l_u_e might.
                    252: 
1.1.1.4   misho     253:                  cols=int
                    254:                        The number of columns the user's terminal supports.  If
                    255:                        there is no terminal device available, a default value
                    256:                        of 80 is used.
1.1.1.3   misho     257: 
1.1.1.4   misho     258:                  cwd=string
                    259:                        The user's current working directory.
1.1.1.3   misho     260: 
1.1.1.4   misho     261:                  egid=gid_t
                    262:                        The effective group ID of the user invoking ssuuddoo.
1.1.1.3   misho     263: 
                    264:                  euid=uid_t
                    265:                        The effective user ID of the user invoking ssuuddoo.
                    266: 
                    267:                  gid=gid_t
                    268:                        The real group ID of the user invoking ssuuddoo.
                    269: 
                    270:                  groups=list
                    271:                        The user's supplementary group list formatted as a
                    272:                        string of comma-separated group IDs.
                    273: 
                    274:                  host=string
                    275:                        The local machine's hostname as returned by the
                    276:                        gethostname(2) system call.
                    277: 
                    278:                  lines=int
                    279:                        The number of lines the user's terminal supports.  If
                    280:                        there is no terminal device available, a default value
                    281:                        of 24 is used.
                    282: 
1.1.1.4   misho     283:                  pgid=int
                    284:                        The ID of the process group that the running ssuuddoo
                    285:                        process is a member of.  Only available starting with
1.1.1.5   misho     286:                        API version 1.2.
1.1.1.4   misho     287: 
                    288:                  pid=int
                    289:                        The process ID of the running ssuuddoo process.  Only
1.1.1.5   misho     290:                        available starting with API version 1.2.
1.1.1.4   misho     291: 
                    292:                  plugin_options
                    293:                        Any (non-comment) strings immediately after the plugin
                    294:                        path are passed as arguments to the plugin.  These
                    295:                        arguments are split on a white space boundary and are
                    296:                        passed to the plugin in the form of a NULL-terminated
                    297:                        array of strings.  If no arguments were specified,
                    298:                        _p_l_u_g_i_n___o_p_t_i_o_n_s will be the NULL pointer.
                    299: 
                    300:                        NOTE: the _p_l_u_g_i_n___o_p_t_i_o_n_s parameter is only available
                    301:                        starting with API version 1.2.  A plugin mmuusstt check the
                    302:                        API version specified by the ssuuddoo front end before
                    303:                        using _p_l_u_g_i_n___o_p_t_i_o_n_s.  Failure to do so may result in a
                    304:                        crash.
                    305: 
                    306:                  ppid=int
                    307:                        The parent process ID of the running ssuuddoo process.
1.1.1.5   misho     308:                        Only available starting with API version 1.2.
1.1.1.4   misho     309: 
                    310:                  sid=int
                    311:                        The session ID of the running ssuuddoo process or 0 if ssuuddoo
                    312:                        is not part of a POSIX job control session.  Only
1.1.1.5   misho     313:                        available starting with API version 1.2.
1.1.1.4   misho     314: 
                    315:                  tcpgid=int
                    316:                        The ID of the foreground process group associated with
                    317:                        the terminal device associated with the ssuuddoo process or
                    318:                        -1 if there is no terminal present.  Only available
1.1.1.5   misho     319:                        starting with API version 1.2.
1.1.1.4   misho     320: 
                    321:                  tty=string
                    322:                        The path to the user's terminal device.  If the user
                    323:                        has no terminal device associated with the session, the
                    324:                        value will be empty, as in ``tty=''.
                    325: 
                    326:                  uid=uid_t
                    327:                        The real user ID of the user invoking ssuuddoo.
                    328: 
                    329:                  user=string
                    330:                        The name of the user invoking ssuuddoo.
1.1       misho     331: 
                    332:            user_env
1.1.1.3   misho     333:                  The user's environment in the form of a NULL-terminated
                    334:                  vector of ``name=value'' strings.
1.1       misho     335: 
1.1.1.3   misho     336:                  When parsing _u_s_e_r___e_n_v, the plugin should split on the ffiirrsstt
                    337:                  equal sign (`=') since the _n_a_m_e field will never include one
                    338:                  itself but the _v_a_l_u_e might.
1.1       misho     339: 
1.1.1.3   misho     340:      close
                    341:            void (*close)(int exit_status, int error);
1.1       misho     342: 
1.1.1.3   misho     343:            The cclloossee() function is called when the command being run by ssuuddoo
1.1       misho     344:            finishes.
                    345: 
                    346:            The function arguments are as follows:
                    347: 
                    348:            exit_status
1.1.1.3   misho     349:                  The command's exit status, as returned by the wait(2) system
                    350:                  call.  The value of exit_status is undefined if error is non-
                    351:                  zero.
1.1       misho     352: 
                    353:            error
1.1.1.3   misho     354:                  If the command could not be executed, this is set to the
                    355:                  value of errno set by the execve(2) system call.  The plugin
                    356:                  is responsible for displaying error information via the
                    357:                  ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff() function.  If the command
                    358:                  was successfully executed, the value of error is 0.
                    359: 
1.1.1.4   misho     360:            If no cclloossee() function is defined, no I/O logging plugins are
                    361:            loaded, and neither the _t_i_m_e_o_u_t not _u_s_e___p_t_y options are set in the
                    362:            command_info list, the ssuuddoo front end may execute the command
                    363:            directly instead of running it as a child process.
                    364: 
1.1.1.3   misho     365:      show_version
                    366:            int (*show_version)(int verbose);
                    367: 
                    368:            The sshhooww__vveerrssiioonn() function is called by ssuuddoo when the user
                    369:            specifies the --VV option.  The plugin may display its version
                    370:            information to the user via the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
                    371:            function using SUDO_CONV_INFO_MSG.  If the user requests detailed
                    372:            version information, the verbose flag will be set.
                    373: 
                    374:      check_policy
                    375:            int (*check_policy)(int argc, char * const argv[]
                    376:                                char *env_add[], char **command_info[],
                    377:                                char **argv_out[], char **user_env_out[]);
1.1       misho     378: 
1.1.1.3   misho     379:            The cchheecckk__ppoolliiccyy() function is called by ssuuddoo to determine whether
1.1       misho     380:            the user is allowed to run the specified commands.
                    381: 
                    382:            If the _s_u_d_o_e_d_i_t option was enabled in the _s_e_t_t_i_n_g_s array passed to
1.1.1.3   misho     383:            the ooppeenn() function, the user has requested _s_u_d_o_e_d_i_t mode.
                    384:            _s_u_d_o_e_d_i_t is a mechanism for editing one or more files where an
                    385:            editor is run with the user's credentials instead of with elevated
                    386:            privileges.  ssuuddoo achieves this by creating user-writable temporary
                    387:            copies of the files to be edited and then overwriting the originals
                    388:            with the temporary copies after editing is complete.  If the plugin
                    389:            supports _s_u_d_o_e_d_i_t, it should choose the editor to be used,
                    390:            potentially from a variable in the user's environment, such as
                    391:            EDITOR, and include it in _a_r_g_v___o_u_t (note that environment variables
                    392:            may include command line flags).  The files to be edited should be
                    393:            copied from _a_r_g_v into _a_r_g_v___o_u_t, separated from the editor and its
                    394:            arguments by a ``--'' element.  The ``--'' will be removed by ssuuddoo
                    395:            before the editor is executed.  The plugin should also set
                    396:            _s_u_d_o_e_d_i_t_=_t_r_u_e in the _c_o_m_m_a_n_d___i_n_f_o list.
                    397: 
                    398:            The cchheecckk__ppoolliiccyy() function returns 1 if the command is allowed, 0
                    399:            if not allowed, -1 for a general error, or -2 for a usage error or
                    400:            if _s_u_d_o_e_d_i_t was specified but is unsupported by the plugin.  In the
1.1       misho     401:            latter case, ssuuddoo will print a usage message before it exits.  If
1.1.1.3   misho     402:            an error occurs, the plugin may optionally call the ccoonnvveerrssaattiioonn()
                    403:            or pplluuggiinn__pprriinnttff() function with SUDO_CONF_ERROR_MSG to present
1.1       misho     404:            additional error information to the user.
                    405: 
                    406:            The function arguments are as follows:
                    407: 
1.1.1.3   misho     408:            argc  The number of elements in _a_r_g_v, not counting the final NULL
                    409:                  pointer.
                    410: 
                    411:            argv  The argument vector describing the command the user wishes to
                    412:                  run, in the same form as what would be passed to the
                    413:                  execve(2) system call.  The vector is terminated by a NULL
                    414:                  pointer.
1.1       misho     415: 
                    416:            env_add
1.1.1.3   misho     417:                  Additional environment variables specified by the user on the
                    418:                  command line in the form of a NULL-terminated vector of
                    419:                  ``name=value'' strings.  The plugin may reject the command if
                    420:                  one or more variables are not allowed to be set, or it may
                    421:                  silently ignore such variables.
                    422: 
                    423:                  When parsing _e_n_v___a_d_d, the plugin should split on the ffiirrsstt
                    424:                  equal sign (`=') since the _n_a_m_e field will never include one
                    425:                  itself but the _v_a_l_u_e might.
1.1       misho     426: 
                    427:            command_info
1.1.1.3   misho     428:                  Information about the command being run in the form of
                    429:                  ``name=value'' strings.  These values are used by ssuuddoo to set
                    430:                  the execution environment when running a command.  The plugin
                    431:                  is responsible for creating and populating the vector, which
                    432:                  must be terminated with a NULL pointer.  The following values
                    433:                  are recognized by ssuuddoo:
                    434: 
1.1.1.4   misho     435:                  chroot=string
                    436:                        The root directory to use when running the command.
1.1.1.3   misho     437: 
1.1.1.4   misho     438:                  closefrom=number
                    439:                        If specified, ssuuddoo will close all files descriptors
                    440:                        with a value of _n_u_m_b_e_r or higher.
1.1.1.3   misho     441: 
1.1.1.4   misho     442:                  command=string
                    443:                        Fully qualified path to the command to be executed.
1.1.1.3   misho     444: 
                    445:                  cwd=string
                    446:                        The current working directory to change to when
                    447:                        executing the command.
                    448: 
1.1.1.4   misho     449:                  exec_background=bool
                    450:                        By default, ssuuddoo runs a command as the foreground
                    451:                        process as long as ssuuddoo itself is running in the
                    452:                        foreground.  When _e_x_e_c___b_a_c_k_g_r_o_u_n_d is enabled and the
                    453:                        command is being run in a pty (due to I/O logging or
                    454:                        the _u_s_e___p_t_y setting), the command will be run as a
                    455:                        background process.  Attempts to read from the
                    456:                        controlling terminal (or to change terminal settings)
                    457:                        will result in the command being suspended with the
                    458:                        SIGTTIN signal (or SIGTTOU in the case of terminal
                    459:                        settings).  If this happens when ssuuddoo is a foreground
                    460:                        process, the command will be granted the controlling
                    461:                        terminal and resumed in the foreground with no user
                    462:                        intervention required.  The advantage of initially
                    463:                        running the command in the background is that ssuuddoo need
                    464:                        not read from the terminal unless the command
                    465:                        explicitly requests it.  Otherwise, any terminal input
                    466:                        must be passed to the command, whether it has required
                    467:                        it or not (the kernel buffers terminals so it is not
                    468:                        possible to tell whether the command really wants the
                    469:                        input).  This is different from historic _s_u_d_o behavior
                    470:                        or when the command is not being run in a pty.
                    471: 
                    472:                        For this to work seamlessly, the operating system must
                    473:                        support the automatic restarting of system calls.
                    474:                        Unfortunately, not all operating systems do this by
                    475:                        default, and even those that do may have bugs.  For
                    476:                        example, Mac OS X fails to restart the ttccggeettaattttrr() and
                    477:                        ttccsseettaattttrr() system calls (this is a bug in Mac OS X).
                    478:                        Furthermore, because this behavior depends on the
                    479:                        command stopping with the SIGTTIN or SIGTTOU signals,
                    480:                        programs that catch these signals and suspend
                    481:                        themselves with a different signal (usually SIGTOP)
                    482:                        will not be automatically foregrounded.  Some versions
                    483:                        of the linux su(1) command behave this way.  Because of
                    484:                        this, a plugin should not set _e_x_e_c___b_a_c_k_g_r_o_u_n_d unless it
                    485:                        is explicitly enabled by the administrator and there
                    486:                        should be a way to enabled or disable it on a per-
                    487:                        command basis.
1.1.1.3   misho     488: 
1.1.1.4   misho     489:                        This setting has no effect unless I/O logging is
                    490:                        enabled or _u_s_e___p_t_y is enabled.
1.1.1.3   misho     491: 
                    492:                  iolog_compress=bool
                    493:                        Set to true if the I/O logging plugins, if any, should
                    494:                        compress the log data.  This is a hint to the I/O
                    495:                        logging plugin which may choose to ignore it.
                    496: 
                    497:                  iolog_path=string
                    498:                        Fully qualified path to the file or directory in which
                    499:                        I/O log is to be stored.  This is a hint to the I/O
                    500:                        logging plugin which may choose to ignore it.  If no
                    501:                        I/O logging plugin is loaded, this setting has no
                    502:                        effect.
                    503: 
                    504:                  iolog_stdin=bool
                    505:                        Set to true if the I/O logging plugins, if any, should
                    506:                        log the standard input if it is not connected to a
                    507:                        terminal device.  This is a hint to the I/O logging
                    508:                        plugin which may choose to ignore it.
                    509: 
                    510:                  iolog_stdout=bool
                    511:                        Set to true if the I/O logging plugins, if any, should
                    512:                        log the standard output if it is not connected to a
                    513:                        terminal device.  This is a hint to the I/O logging
                    514:                        plugin which may choose to ignore it.
                    515: 
                    516:                  iolog_stderr=bool
                    517:                        Set to true if the I/O logging plugins, if any, should
                    518:                        log the standard error if it is not connected to a
                    519:                        terminal device.  This is a hint to the I/O logging
                    520:                        plugin which may choose to ignore it.
                    521: 
                    522:                  iolog_ttyin=bool
                    523:                        Set to true if the I/O logging plugins, if any, should
                    524:                        log all terminal input.  This only includes input typed
                    525:                        by the user and not from a pipe or redirected from a
                    526:                        file.  This is a hint to the I/O logging plugin which
                    527:                        may choose to ignore it.
                    528: 
                    529:                  iolog_ttyout=bool
                    530:                        Set to true if the I/O logging plugins, if any, should
                    531:                        log all terminal output.  This only includes output to
                    532:                        the screen, not output to a pipe or file.  This is a
                    533:                        hint to the I/O logging plugin which may choose to
                    534:                        ignore it.
                    535: 
1.1.1.4   misho     536:                  login_class=string
                    537:                        BSD login class to use when setting resource limits and
                    538:                        nice value (optional).  This option is only set on
                    539:                        systems that support login classes.
                    540: 
                    541:                  nice=int
                    542:                        Nice value (priority) to use when executing the
                    543:                        command.  The nice value, if specified, overrides the
                    544:                        priority associated with the _l_o_g_i_n___c_l_a_s_s on BSD
                    545:                        systems.
                    546: 
                    547:                  noexec=bool
                    548:                        If set, prevent the command from executing other
                    549:                        programs.
                    550: 
1.1.1.6 ! misho     551:                  preserve_fds=list
        !           552:                        A comma-separated list of file descriptors that should
        !           553:                        be preserved, regardless of the value of the _c_l_o_s_e_f_r_o_m
        !           554:                        setting.  Only available starting with API version 1.5.
        !           555: 
1.1.1.4   misho     556:                  preserve_groups=bool
                    557:                        If set, ssuuddoo will preserve the user's group vector
                    558:                        instead of initializing the group vector based on
                    559:                        runas_user.
                    560: 
                    561:                  runas_egid=gid
                    562:                        Effective group ID to run the command as.  If not
                    563:                        specified, the value of _r_u_n_a_s___g_i_d is used.
                    564: 
                    565:                  runas_euid=uid
                    566:                        Effective user ID to run the command as.  If not
                    567:                        specified, the value of _r_u_n_a_s___u_i_d is used.
                    568: 
                    569:                  runas_gid=gid
                    570:                        Group ID to run the command as.
                    571: 
                    572:                  runas_groups=list
                    573:                        The supplementary group vector to use for the command
                    574:                        in the form of a comma-separated list of group IDs.  If
                    575:                        _p_r_e_s_e_r_v_e___g_r_o_u_p_s is set, this option is ignored.
                    576: 
                    577:                  runas_uid=uid
                    578:                        User ID to run the command as.
                    579: 
                    580:                  selinux_role=string
                    581:                        SELinux role to use when executing the command.
                    582: 
                    583:                  selinux_type=string
                    584:                        SELinux type to use when executing the command.
1.1.1.3   misho     585: 
                    586:                  set_utmp=bool
                    587:                        Create a utmp (or utmpx) entry when a pseudo-tty is
                    588:                        allocated.  By default, the new entry will be a copy of
                    589:                        the user's existing utmp entry (if any), with the tty,
                    590:                        time, type and pid fields updated.
                    591: 
1.1.1.4   misho     592:                  sudoedit=bool
                    593:                        Set to true when in _s_u_d_o_e_d_i_t mode.  The plugin may
                    594:                        enable _s_u_d_o_e_d_i_t mode even if ssuuddoo was not invoked as
                    595:                        ssuuddooeeddiitt.  This allows the plugin to perform command
                    596:                        substitution and transparently enable _s_u_d_o_e_d_i_t when the
                    597:                        user attempts to run an editor.
                    598: 
                    599:                  timeout=int
                    600:                        Command timeout.  If non-zero then when the timeout
                    601:                        expires the command will be killed.
                    602: 
                    603:                  umask=octal
                    604:                        The file creation mask to use when executing the
                    605:                        command.
                    606: 
                    607:                  use_pty=bool
                    608:                        Allocate a pseudo-tty to run the command in, regardless
                    609:                        of whether or not I/O logging is in use.  By default,
                    610:                        ssuuddoo will only run the command in a pty when an I/O log
                    611:                        plugin is loaded.
                    612: 
1.1.1.3   misho     613:                  utmp_user=string
                    614:                        User name to use when constructing a new utmp (or
                    615:                        utmpx) entry when _s_e_t___u_t_m_p is enabled.  This option can
                    616:                        be used to set the user field in the utmp entry to the
                    617:                        user the command runs as rather than the invoking user.
                    618:                        If not set, ssuuddoo will base the new entry on the
                    619:                        invoking user's existing entry.
1.1       misho     620: 
1.1.1.3   misho     621:                  Unsupported values will be ignored.
1.1       misho     622: 
                    623:            argv_out
1.1.1.3   misho     624:                  The NULL-terminated argument vector to pass to the execve(2)
                    625:                  system call when executing the command.  The plugin is
                    626:                  responsible for allocating and populating the vector.
1.1       misho     627: 
                    628:            user_env_out
1.1.1.3   misho     629:                  The NULL-terminated environment vector to use when executing
                    630:                  the command.  The plugin is responsible for allocating and
                    631:                  populating the vector.
                    632: 
                    633:      list
                    634:            int (*list)(int verbose, const char *list_user,
                    635:                        int argc, char * const argv[]);
1.1       misho     636: 
                    637:            List available privileges for the invoking user.  Returns 1 on
                    638:            success, 0 on failure and -1 on error.  On error, the plugin may
1.1.1.3   misho     639:            optionally call the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff() function with
1.1       misho     640:            SUDO_CONF_ERROR_MSG to present additional error information to the
                    641:            user.
                    642: 
1.1.1.3   misho     643:            Privileges should be output via the ccoonnvveerrssaattiioonn() or
                    644:            pplluuggiinn__pprriinnttff() function using SUDO_CONV_INFO_MSG,
1.1       misho     645: 
                    646:            verbose
1.1.1.3   misho     647:                  Flag indicating whether to list in verbose mode or not.
1.1       misho     648: 
                    649:            list_user
1.1.1.3   misho     650:                  The name of a different user to list privileges for if the
                    651:                  policy allows it.  If NULL, the plugin should list the
                    652:                  privileges of the invoking user.
                    653: 
                    654:            argc  The number of elements in _a_r_g_v, not counting the final NULL
                    655:                  pointer.
                    656: 
                    657:            argv  If non-NULL, an argument vector describing a command the user
                    658:                  wishes to check against the policy in the same form as what
                    659:                  would be passed to the execve(2) system call.  If the command
                    660:                  is permitted by the policy, the fully-qualified path to the
                    661:                  command should be displayed along with any command line
                    662:                  arguments.
1.1       misho     663: 
1.1.1.3   misho     664:      validate
                    665:            int (*validate)(void);
1.1       misho     666: 
1.1.1.3   misho     667:            The vvaalliiddaattee() function is called when ssuuddoo is run with the --vv
1.1.1.4   misho     668:            flag.  For policy plugins such as ssuuddooeerrss that cache authentication
1.1       misho     669:            credentials, this function will validate and cache the credentials.
                    670: 
1.1.1.3   misho     671:            The vvaalliiddaattee() function should be NULL if the plugin does not
                    672:            support credential caching.
1.1       misho     673: 
                    674:            Returns 1 on success, 0 on failure and -1 on error.  On error, the
1.1.1.3   misho     675:            plugin may optionally call the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
1.1       misho     676:            function with SUDO_CONF_ERROR_MSG to present additional error
                    677:            information to the user.
                    678: 
1.1.1.3   misho     679:      invalidate
                    680:            void (*invalidate)(int remove);
1.1       misho     681: 
1.1.1.3   misho     682:            The iinnvvaalliiddaattee() function is called when ssuuddoo is called with the --kk
1.1.1.4   misho     683:            or --KK flag.  For policy plugins such as ssuuddooeerrss that cache
1.1       misho     684:            authentication credentials, this function will invalidate the
                    685:            credentials.  If the _r_e_m_o_v_e flag is set, the plugin may remove the
                    686:            credentials instead of simply invalidating them.
                    687: 
1.1.1.3   misho     688:            The iinnvvaalliiddaattee() function should be NULL if the plugin does not
1.1       misho     689:            support credential caching.
                    690: 
1.1.1.3   misho     691:      init_session
                    692:            int (*init_session)(struct passwd *pwd, char **user_envp[);
1.1       misho     693: 
1.1.1.3   misho     694:            The iinniitt__sseessssiioonn() function is called before ssuuddoo sets up the
1.1.1.2   misho     695:            execution environment for the command.  It is run in the parent
                    696:            ssuuddoo process and before any uid or gid changes.  This can be used
                    697:            to perform session setup that is not supported by _c_o_m_m_a_n_d___i_n_f_o,
1.1.1.3   misho     698:            such as opening the PAM session.  The cclloossee() function can be used
                    699:            to tear down the session that was opened by init_session.
1.1       misho     700: 
                    701:            The _p_w_d argument points to a passwd struct for the user the command
                    702:            will be run as if the uid the command will run as was found in the
                    703:            password database, otherwise it will be NULL.
                    704: 
1.1.1.2   misho     705:            The _u_s_e_r___e_n_v argument points to the environment the command will
1.1.1.3   misho     706:            run in, in the form of a NULL-terminated vector of ``name=value''
1.1.1.2   misho     707:            strings.  This is the same string passed back to the front end via
1.1.1.3   misho     708:            the Policy Plugin's _u_s_e_r___e_n_v___o_u_t parameter.  If the iinniitt__sseessssiioonn()
1.1.1.2   misho     709:            function needs to modify the user environment, it should update the
                    710:            pointer stored in _u_s_e_r___e_n_v.  The expected use case is to merge the
                    711:            contents of the PAM environment (if any) with the contents of
                    712:            _u_s_e_r___e_n_v.  NOTE: the _u_s_e_r___e_n_v parameter is only available starting
                    713:            with API version 1.2.  A plugin mmuusstt check the API version
                    714:            specified by the ssuuddoo front end before using _u_s_e_r___e_n_v.  Failure to
                    715:            do so may result in a crash.
                    716: 
1.1       misho     717:            Returns 1 on success, 0 on failure and -1 on error.  On error, the
1.1.1.3   misho     718:            plugin may optionally call the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
1.1       misho     719:            function with SUDO_CONF_ERROR_MSG to present additional error
                    720:            information to the user.
                    721: 
1.1.1.3   misho     722:      register_hooks
                    723:            void (*register_hooks)(int version,
                    724:               int (*register_hook)(struct sudo_hook *hook));
1.1.1.2   misho     725: 
1.1.1.3   misho     726:            The rreeggiisstteerr__hhooookkss() function is called by the sudo front end to
1.1.1.2   misho     727:            register any hooks the plugin needs.  If the plugin does not
                    728:            support hooks, register_hooks should be set to the NULL pointer.
                    729: 
                    730:            The _v_e_r_s_i_o_n argument describes the version of the hooks API
                    731:            supported by the ssuuddoo front end.
                    732: 
1.1.1.3   misho     733:            The rreeggiisstteerr__hhooookk() function should be used to register any
                    734:            supported hooks the plugin needs.  It returns 0 on success, 1 if
                    735:            the hook type is not supported and -1 if the major version in
                    736:            struct hook does not match the front end's major hook API version.
1.1.1.2   misho     737: 
1.1.1.3   misho     738:            See the _H_o_o_k _f_u_n_c_t_i_o_n _A_P_I section below for more information about
                    739:            hooks.
1.1.1.2   misho     740: 
1.1.1.3   misho     741:            NOTE: the rreeggiisstteerr__hhooookkss() function is only available starting with
1.1.1.2   misho     742:            API version 1.2.  If the ssuuddoo front end doesn't support API version
                    743:            1.2 or higher, register_hooks will not be called.
                    744: 
1.1.1.3   misho     745:      deregister_hooks
                    746:            void (*deregister_hooks)(int version,
                    747:               int (*deregister_hook)(struct sudo_hook *hook));
1.1.1.2   misho     748: 
1.1.1.3   misho     749:            The ddeerreeggiisstteerr__hhooookkss() function is called by the sudo front end to
1.1.1.2   misho     750:            deregister any hooks the plugin has registered.  If the plugin does
                    751:            not support hooks, deregister_hooks should be set to the NULL
                    752:            pointer.
                    753: 
                    754:            The _v_e_r_s_i_o_n argument describes the version of the hooks API
                    755:            supported by the ssuuddoo front end.
                    756: 
1.1.1.3   misho     757:            The ddeerreeggiisstteerr__hhooookk() function should be used to deregister any
                    758:            hooks that were put in place by the rreeggiisstteerr__hhooookk() function.  If
                    759:            the plugin tries to deregister a hook that the front end does not
1.1.1.2   misho     760:            support, deregister_hook will return an error.
                    761: 
1.1.1.3   misho     762:            See the _H_o_o_k _f_u_n_c_t_i_o_n _A_P_I section below for more information about
                    763:            hooks.
1.1       misho     764: 
1.1.1.3   misho     765:            NOTE: the ddeerreeggiisstteerr__hhooookkss() function is only available starting
                    766:            with API version 1.2.  If the ssuuddoo front end doesn't support API
                    767:            version 1.2 or higher, deregister_hooks will not be called.
                    768: 
                    769:      _P_o_l_i_c_y _P_l_u_g_i_n _V_e_r_s_i_o_n _M_a_c_r_o_s
                    770: 
                    771:      /* Plugin API version major/minor. */
                    772:      #define SUDO_API_VERSION_MAJOR 1
                    773:      #define SUDO_API_VERSION_MINOR 2
                    774:      #define SUDO_API_MKVERSION(x, y) ((x << 16) | y)
                    775:      #define SUDO_API_VERSION SUDO_API_MKVERSION(SUDO_API_VERSION_MAJOR,\
                    776:                                                  SUDO_API_VERSION_MINOR)
                    777: 
                    778:      /* Getters and setters for API version */
                    779:      #define SUDO_API_VERSION_GET_MAJOR(v) ((v) >> 16)
                    780:      #define SUDO_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
                    781:      #define SUDO_API_VERSION_SET_MAJOR(vp, n) do { \
                    782:          *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
                    783:      } while(0)
                    784:      #define SUDO_VERSION_SET_MINOR(vp, n) do { \
                    785:          *(vp) = (*(vp) & 0xffff0000) | (n); \
                    786:      } while(0)
                    787: 
                    788:    II//OO pplluuggiinn AAPPII
                    789:      struct io_plugin {
                    790:      #define SUDO_IO_PLUGIN 2
                    791:          unsigned int type; /* always SUDO_IO_PLUGIN */
                    792:          unsigned int version; /* always SUDO_API_VERSION */
1.1.1.4   misho     793:          int (*open)(unsigned int version, sudo_conv_t conversation,
1.1.1.3   misho     794:                      sudo_printf_t plugin_printf, char * const settings[],
1.1.1.4   misho     795:                      char * const user_info[], char * const command_info[],
                    796:                      int argc, char * const argv[], char * const user_env[],
                    797:                      char * const plugin_options[]);
1.1.1.3   misho     798:          void (*close)(int exit_status, int error); /* wait status or error */
                    799:          int (*show_version)(int verbose);
                    800:          int (*log_ttyin)(const char *buf, unsigned int len);
                    801:          int (*log_ttyout)(const char *buf, unsigned int len);
                    802:          int (*log_stdin)(const char *buf, unsigned int len);
                    803:          int (*log_stdout)(const char *buf, unsigned int len);
                    804:          int (*log_stderr)(const char *buf, unsigned int len);
                    805:          void (*register_hooks)(int version,
                    806:             int (*register_hook)(struct sudo_hook *hook));
                    807:          void (*deregister_hooks)(int version,
                    808:             int (*deregister_hook)(struct sudo_hook *hook));
                    809:      };
                    810: 
                    811:      When an I/O plugin is loaded, ssuuddoo runs the command in a pseudo-tty.
                    812:      This makes it possible to log the input and output from the user's
                    813:      session.  If any of the standard input, standard output or standard error
                    814:      do not correspond to a tty, ssuuddoo will open a pipe to capture the I/O for
                    815:      logging before passing it on.
                    816: 
                    817:      The log_ttyin function receives the raw user input from the terminal
                    818:      device (note that this will include input even when echo is disabled,
                    819:      such as when a password is read).  The log_ttyout function receives
                    820:      output from the pseudo-tty that is suitable for replaying the user's
                    821:      session at a later time.  The lloogg__ssttddiinn(), lloogg__ssttddoouutt() and lloogg__ssttddeerrrr()
                    822:      functions are only called if the standard input, standard output or
                    823:      standard error respectively correspond to something other than a tty.
                    824: 
                    825:      Any of the logging functions may be set to the NULL pointer if no logging
                    826:      is to be performed.  If the open function returns 0, no I/O will be sent
                    827:      to the plugin.
1.1       misho     828: 
1.1.1.3   misho     829:      The io_plugin struct has the following fields:
1.1       misho     830: 
1.1.1.3   misho     831:      type  The type field should always be set to SUDO_IO_PLUGIN.
1.1       misho     832: 
1.1.1.3   misho     833:      version
1.1       misho     834:            The version field should be set to SUDO_API_VERSION.
                    835: 
                    836:            This allows ssuuddoo to determine the API version the plugin was built
                    837:            against.
                    838: 
1.1.1.3   misho     839:      open
1.1.1.4   misho     840:            int (*open)(unsigned int version, sudo_conv_t conversation,
1.1.1.3   misho     841:                        sudo_printf_t plugin_printf, char * const settings[],
                    842:                        char * const user_info[], int argc, char * const argv[],
                    843:                        char * const user_env[], char * const plugin_options[]);
                    844: 
                    845:            The ooppeenn() function is run before the lloogg__iinnppuutt(), lloogg__oouuttppuutt() or
                    846:            sshhooww__vveerrssiioonn() functions are called.  It is only called if the
                    847:            version is being requested or the cchheecckk__ppoolliiccyy() function has
1.1       misho     848:            returned successfully.  It returns 1 on success, 0 on failure, -1
                    849:            if a general error occurred, or -2 if there was a usage error.  In
                    850:            the latter case, ssuuddoo will print a usage message before it exits.
1.1.1.3   misho     851:            If an error occurs, the plugin may optionally call the
                    852:            ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff() function with SUDO_CONF_ERROR_MSG
                    853:            to present additional error information to the user.
1.1       misho     854: 
                    855:            The function arguments are as follows:
                    856: 
                    857:            version
1.1.1.3   misho     858:                  The version passed in by ssuuddoo allows the plugin to determine
                    859:                  the major and minor version number of the plugin API
                    860:                  supported by ssuuddoo.
1.1       misho     861: 
                    862:            conversation
1.1.1.3   misho     863:                  A pointer to the ccoonnvveerrssaattiioonn() function that may be used by
                    864:                  the sshhooww__vveerrssiioonn() function to display version information
                    865:                  (see sshhooww__vveerrssiioonn() below).  The ccoonnvveerrssaattiioonn() function may
                    866:                  also be used to display additional error message to the user.
                    867:                  The ccoonnvveerrssaattiioonn() function returns 0 on success and -1 on
                    868:                  failure.
1.1       misho     869: 
                    870:            plugin_printf
1.1.1.3   misho     871:                  A pointer to a pprriinnttff()-style function that may be used by
                    872:                  the sshhooww__vveerrssiioonn() function to display version information
                    873:                  (see show_version below).  The pplluuggiinn__pprriinnttff() function may
                    874:                  also be used to display additional error message to the user.
                    875:                  The pplluuggiinn__pprriinnttff() function returns number of characters
                    876:                  printed on success and -1 on failure.
1.1       misho     877: 
                    878:            settings
1.1.1.3   misho     879:                  A vector of user-supplied ssuuddoo settings in the form of
                    880:                  ``name=value'' strings.  The vector is terminated by a NULL
                    881:                  pointer.  These settings correspond to flags the user
                    882:                  specified when running ssuuddoo.  As such, they will only be
                    883:                  present when the corresponding flag has been specified on the
                    884:                  command line.
                    885: 
                    886:                  When parsing _s_e_t_t_i_n_g_s, the plugin should split on the ffiirrsstt
                    887:                  equal sign (`=') since the _n_a_m_e field will never include one
                    888:                  itself but the _v_a_l_u_e might.
1.1       misho     889: 
1.1.1.3   misho     890:                  See the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I section for a list of all possible
                    891:                  settings.
1.1       misho     892: 
                    893:            user_info
1.1.1.3   misho     894:                  A vector of information about the user running the command in
                    895:                  the form of ``name=value'' strings.  The vector is terminated
                    896:                  by a NULL pointer.
                    897: 
                    898:                  When parsing _u_s_e_r___i_n_f_o, the plugin should split on the ffiirrsstt
                    899:                  equal sign (`=') since the _n_a_m_e field will never include one
                    900:                  itself but the _v_a_l_u_e might.
                    901: 
                    902:                  See the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I section for a list of all possible
                    903:                  strings.
                    904: 
                    905:            argc  The number of elements in _a_r_g_v, not counting the final NULL
                    906:                  pointer.
                    907: 
                    908:            argv  If non-NULL, an argument vector describing a command the user
                    909:                  wishes to run in the same form as what would be passed to the
                    910:                  execve(2) system call.
1.1       misho     911: 
                    912:            user_env
1.1.1.3   misho     913:                  The user's environment in the form of a NULL-terminated
                    914:                  vector of ``name=value'' strings.
1.1       misho     915: 
1.1.1.3   misho     916:                  When parsing _u_s_e_r___e_n_v, the plugin should split on the ffiirrsstt
                    917:                  equal sign (`=') since the _n_a_m_e field will never include one
                    918:                  itself but the _v_a_l_u_e might.
1.1       misho     919: 
1.1.1.2   misho     920:            plugin_options
1.1.1.3   misho     921:                  Any (non-comment) strings immediately after the plugin path
                    922:                  are treated as arguments to the plugin.  These arguments are
                    923:                  split on a white space boundary and are passed to the plugin
                    924:                  in the form of a NULL-terminated array of strings.  If no
                    925:                  arguments were specified, _p_l_u_g_i_n___o_p_t_i_o_n_s will be the NULL
                    926:                  pointer.
                    927: 
                    928:                  NOTE: the _p_l_u_g_i_n___o_p_t_i_o_n_s parameter is only available starting
                    929:                  with API version 1.2.  A plugin mmuusstt check the API version
                    930:                  specified by the ssuuddoo front end before using _p_l_u_g_i_n___o_p_t_i_o_n_s.
                    931:                  Failure to do so may result in a crash.
1.1.1.2   misho     932: 
1.1.1.3   misho     933:      close
                    934:            void (*close)(int exit_status, int error);
1.1       misho     935: 
1.1.1.3   misho     936:            The cclloossee() function is called when the command being run by ssuuddoo
1.1       misho     937:            finishes.
                    938: 
                    939:            The function arguments are as follows:
                    940: 
                    941:            exit_status
1.1.1.3   misho     942:                  The command's exit status, as returned by the wait(2) system
                    943:                  call.  The value of exit_status is undefined if error is non-
                    944:                  zero.
1.1       misho     945: 
                    946:            error
1.1.1.3   misho     947:                  If the command could not be executed, this is set to the
                    948:                  value of errno set by the execve(2) system call.  If the
                    949:                  command was successfully executed, the value of error is 0.
                    950: 
                    951:      show_version
                    952:            int (*show_version)(int verbose);
                    953: 
                    954:            The sshhooww__vveerrssiioonn() function is called by ssuuddoo when the user
                    955:            specifies the --VV option.  The plugin may display its version
                    956:            information to the user via the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
                    957:            function using SUDO_CONV_INFO_MSG.  If the user requests detailed
                    958:            version information, the verbose flag will be set.
                    959: 
                    960:      log_ttyin
                    961:            int (*log_ttyin)(const char *buf, unsigned int len);
                    962: 
                    963:            The lloogg__ttttyyiinn() function is called whenever data can be read from
                    964:            the user but before it is passed to the running command.  This
                    965:            allows the plugin to reject data if it chooses to (for instance if
                    966:            the input contains banned content).  Returns 1 if the data should
                    967:            be passed to the command, 0 if the data is rejected (which will
1.1       misho     968:            terminate the command) or -1 if an error occurred.
                    969: 
                    970:            The function arguments are as follows:
                    971: 
1.1.1.3   misho     972:            buf   The buffer containing user input.
1.1       misho     973: 
1.1.1.3   misho     974:            len   The length of _b_u_f in bytes.
1.1       misho     975: 
1.1.1.3   misho     976:      log_ttyout
                    977:            int (*log_ttyout)(const char *buf, unsigned int len);
1.1       misho     978: 
1.1.1.3   misho     979:            The lloogg__ttttyyoouutt() function is called whenever data can be read from
1.1       misho     980:            the command but before it is written to the user's terminal.  This
                    981:            allows the plugin to reject data if it chooses to (for instance if
                    982:            the output contains banned content).  Returns 1 if the data should
                    983:            be passed to the user, 0 if the data is rejected (which will
                    984:            terminate the command) or -1 if an error occurred.
                    985: 
                    986:            The function arguments are as follows:
                    987: 
1.1.1.3   misho     988:            buf   The buffer containing command output.
1.1       misho     989: 
1.1.1.3   misho     990:            len   The length of _b_u_f in bytes.
1.1       misho     991: 
1.1.1.3   misho     992:      log_stdin
                    993:            int (*log_stdin)(const char *buf, unsigned int len);
1.1       misho     994: 
1.1.1.3   misho     995:            The lloogg__ssttddiinn() function is only used if the standard input does
                    996:            not correspond to a tty device.  It is called whenever data can be
                    997:            read from the standard input but before it is passed to the running
1.1       misho     998:            command.  This allows the plugin to reject data if it chooses to
                    999:            (for instance if the input contains banned content).  Returns 1 if
                   1000:            the data should be passed to the command, 0 if the data is rejected
                   1001:            (which will terminate the command) or -1 if an error occurred.
                   1002: 
                   1003:            The function arguments are as follows:
                   1004: 
1.1.1.3   misho    1005:            buf   The buffer containing user input.
1.1       misho    1006: 
1.1.1.3   misho    1007:            len   The length of _b_u_f in bytes.
1.1       misho    1008: 
1.1.1.3   misho    1009:      log_stdout
                   1010:            int (*log_stdout)(const char *buf, unsigned int len);
1.1       misho    1011: 
1.1.1.3   misho    1012:            The lloogg__ssttddoouutt() function is only used if the standard output does
1.1       misho    1013:            not correspond to a tty device.  It is called whenever data can be
                   1014:            read from the command but before it is written to the standard
                   1015:            output.  This allows the plugin to reject data if it chooses to
                   1016:            (for instance if the output contains banned content).  Returns 1 if
                   1017:            the data should be passed to the user, 0 if the data is rejected
                   1018:            (which will terminate the command) or -1 if an error occurred.
                   1019: 
                   1020:            The function arguments are as follows:
                   1021: 
1.1.1.3   misho    1022:            buf   The buffer containing command output.
1.1       misho    1023: 
1.1.1.3   misho    1024:            len   The length of _b_u_f in bytes.
1.1       misho    1025: 
1.1.1.3   misho    1026:      log_stderr
                   1027:            int (*log_stderr)(const char *buf, unsigned int len);
1.1       misho    1028: 
1.1.1.3   misho    1029:            The lloogg__ssttddeerrrr() function is only used if the standard error does
                   1030:            not correspond to a tty device.  It is called whenever data can be
                   1031:            read from the command but before it is written to the standard
                   1032:            error.  This allows the plugin to reject data if it chooses to (for
1.1       misho    1033:            instance if the output contains banned content).  Returns 1 if the
                   1034:            data should be passed to the user, 0 if the data is rejected (which
                   1035:            will terminate the command) or -1 if an error occurred.
                   1036: 
                   1037:            The function arguments are as follows:
                   1038: 
1.1.1.3   misho    1039:            buf   The buffer containing command output.
1.1       misho    1040: 
1.1.1.3   misho    1041:            len   The length of _b_u_f in bytes.
1.1       misho    1042: 
1.1.1.3   misho    1043:      register_hooks
                   1044:            See the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I section for a description of
1.1.1.2   misho    1045:            register_hooks.
                   1046: 
1.1.1.3   misho    1047:      deregister_hooks
                   1048:            See the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I section for a description of
1.1.1.2   misho    1049:            deregister_hooks.
                   1050: 
1.1.1.3   misho    1051:      _I_/_O _P_l_u_g_i_n _V_e_r_s_i_o_n _M_a_c_r_o_s
1.1       misho    1052: 
1.1.1.3   misho    1053:      Same as for the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I.
1.1       misho    1054: 
1.1.1.4   misho    1055:    SSiiggnnaall hhaannddlleerrss
                   1056:      The ssuuddoo front end installs default signal handlers to trap common
                   1057:      signals while the plugin functions are run.  The following signals are
                   1058:      trapped by default before the command is executed:
                   1059: 
                   1060:      oo   SIGALRM
                   1061:      oo   SIGHUP
                   1062:      oo   SIGINT
                   1063:      oo   SIGQUIT
                   1064:      oo   SIGTERM
                   1065:      oo   SIGTSTP
                   1066:      oo   SIGUSR1
                   1067:      oo   SIGUSR2
                   1068: 
                   1069:      If a fatal signal is received before the command is executed, ssuuddoo will
                   1070:      call the plugin's cclloossee() function with an exit status of 128 plus the
                   1071:      value of the signal that was received.  This allows for consistent
                   1072:      logging of commands killed by a signal for plugins that log such
                   1073:      information in their cclloossee() function.
                   1074: 
                   1075:      A plugin may temporarily install its own signal handlers but must restore
                   1076:      the original handler before the plugin function returns.
                   1077: 
1.1.1.3   misho    1078:    HHooookk ffuunnccttiioonn AAPPII
                   1079:      Beginning with plugin API version 1.2, it is possible to install hooks
                   1080:      for certain functions called by the ssuuddoo front end.
1.1.1.2   misho    1081: 
1.1.1.3   misho    1082:      Currently, the only supported hooks relate to the handling of environment
                   1083:      variables.  Hooks can be used to intercept attempts to get, set, or
                   1084:      remove environment variables so that these changes can be reflected in
                   1085:      the version of the environment that is used to execute a command.  A
                   1086:      future version of the API will support hooking internal ssuuddoo front end
                   1087:      functions as well.
1.1.1.2   misho    1088: 
1.1.1.3   misho    1089:      _H_o_o_k _s_t_r_u_c_t_u_r_e
1.1.1.2   misho    1090: 
1.1.1.3   misho    1091:      Hooks in ssuuddoo are described by the following structure:
1.1.1.2   misho    1092: 
1.1.1.3   misho    1093:      typedef int (*sudo_hook_fn_t)();
1.1.1.2   misho    1094: 
1.1.1.3   misho    1095:      struct sudo_hook {
                   1096:          int hook_version;
                   1097:          int hook_type;
                   1098:          sudo_hook_fn_t hook_fn;
                   1099:          void *closure;
                   1100:      };
1.1.1.2   misho    1101: 
1.1.1.3   misho    1102:      The sudo_hook structure has the following fields:
1.1.1.2   misho    1103: 
1.1.1.3   misho    1104:      hook_version
1.1.1.2   misho    1105:            The hook_version field should be set to SUDO_HOOK_VERSION.
                   1106: 
1.1.1.3   misho    1107:      hook_type
1.1.1.2   misho    1108:            The hook_type field may be one of the following supported hook
                   1109:            types:
                   1110: 
                   1111:            SUDO_HOOK_SETENV
1.1.1.3   misho    1112:                  The C library setenv(3) function.  Any registered hooks will
                   1113:                  run before the C library implementation.  The hook_fn field
                   1114:                  should be a function that matches the following typedef:
1.1.1.2   misho    1115: 
1.1.1.3   misho    1116:                  typedef int (*sudo_hook_fn_setenv_t)(const char *name,
                   1117:                     const char *value, int overwrite, void *closure);
1.1.1.2   misho    1118: 
1.1.1.3   misho    1119:                  If the registered hook does not match the typedef the results
                   1120:                  are unspecified.
1.1.1.2   misho    1121: 
                   1122:            SUDO_HOOK_UNSETENV
1.1.1.3   misho    1123:                  The C library unsetenv(3) function.  Any registered hooks
                   1124:                  will run before the C library implementation.  The hook_fn
                   1125:                  field should be a function that matches the following
                   1126:                  typedef:
1.1.1.2   misho    1127: 
1.1.1.3   misho    1128:                  typedef int (*sudo_hook_fn_unsetenv_t)(const char *name,
                   1129:                     void *closure);
1.1.1.2   misho    1130: 
                   1131:            SUDO_HOOK_GETENV
1.1.1.3   misho    1132:                  The C library getenv(3) function.  Any registered hooks will
                   1133:                  run before the C library implementation.  The hook_fn field
                   1134:                  should be a function that matches the following typedef:
1.1.1.2   misho    1135: 
1.1.1.3   misho    1136:                  typedef int (*sudo_hook_fn_getenv_t)(const char *name,
                   1137:                     char **value, void *closure);
1.1.1.2   misho    1138: 
1.1.1.3   misho    1139:                  If the registered hook does not match the typedef the results
                   1140:                  are unspecified.
1.1.1.2   misho    1141: 
                   1142:            SUDO_HOOK_PUTENV
1.1.1.3   misho    1143:                  The C library putenv(3) function.  Any registered hooks will
                   1144:                  run before the C library implementation.  The hook_fn field
                   1145:                  should be a function that matches the following typedef:
1.1.1.2   misho    1146: 
1.1.1.3   misho    1147:                  typedef int (*sudo_hook_fn_putenv_t)(char *string,
                   1148:                     void *closure);
1.1.1.2   misho    1149: 
1.1.1.3   misho    1150:                  If the registered hook does not match the typedef the results
                   1151:                  are unspecified.
1.1.1.2   misho    1152: 
1.1.1.3   misho    1153:      hook_fn
                   1154:            sudo_hook_fn_t hook_fn;
1.1.1.2   misho    1155: 
                   1156:            The hook_fn field should be set to the plugin's hook
                   1157:            implementation.  The actual function arguments will vary depending
                   1158:            on the hook_type (see hook_type above).  In all cases, the closure
                   1159:            field of struct sudo_hook is passed as the last function parameter.
                   1160:            This can be used to pass arbitrary data to the plugin's hook
                   1161:            implementation.
                   1162: 
                   1163:            The function return value may be one of the following:
                   1164: 
                   1165:            SUDO_HOOK_RET_ERROR
1.1.1.3   misho    1166:                  The hook function encountered an error.
1.1.1.2   misho    1167: 
                   1168:            SUDO_HOOK_RET_NEXT
1.1.1.3   misho    1169:                  The hook completed without error, go on to the next hook
                   1170:                  (including the native implementation if applicable).  For
                   1171:                  example, a getenv(3) hook might return SUDO_HOOK_RET_NEXT if
                   1172:                  the specified variable was not found in the private copy of
                   1173:                  the environment.
1.1.1.2   misho    1174: 
                   1175:            SUDO_HOOK_RET_STOP
1.1.1.3   misho    1176:                  The hook completed without error, stop processing hooks for
                   1177:                  this invocation.  This can be used to replace the native
                   1178:                  implementation.  For example, a setenv hook that operates on
                   1179:                  a private copy of the environment but leaves environ
                   1180:                  unchanged.
                   1181: 
                   1182:      Note that it is very easy to create an infinite loop when hooking C
                   1183:      library functions.  For example, a getenv(3) hook that calls the
                   1184:      snprintf(3) function may create a loop if the snprintf(3) implementation
                   1185:      calls getenv(3) to check the locale.  To prevent this, you may wish to
                   1186:      use a static variable in the hook function to guard against nested calls.
                   1187:      For example:
                   1188: 
                   1189:      static int in_progress = 0; /* avoid recursion */
                   1190:      if (in_progress)
                   1191:          return SUDO_HOOK_RET_NEXT;
                   1192:      in_progress = 1;
                   1193:      ...
                   1194:      in_progress = 0;
                   1195:      return SUDO_HOOK_RET_STOP;
                   1196: 
                   1197:      _H_o_o_k _A_P_I _V_e_r_s_i_o_n _M_a_c_r_o_s
                   1198: 
                   1199:      /* Hook API version major/minor */
                   1200:      #define SUDO_HOOK_VERSION_MAJOR 1
                   1201:      #define SUDO_HOOK_VERSION_MINOR 0
                   1202:      #define SUDO_HOOK_MKVERSION(x, y) ((x << 16) | y)
                   1203:      #define SUDO_HOOK_VERSION SUDO_HOOK_MKVERSION(SUDO_HOOK_VERSION_MAJOR,\
                   1204:                                                    SUDO_HOOK_VERSION_MINOR)
                   1205: 
                   1206:      /* Getters and setters for hook API version */
                   1207:      #define SUDO_HOOK_VERSION_GET_MAJOR(v) ((v) >> 16)
                   1208:      #define SUDO_HOOK_VERSION_GET_MINOR(v) ((v) & 0xffff)
                   1209:      #define SUDO_HOOK_VERSION_SET_MAJOR(vp, n) do { \
                   1210:          *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
                   1211:      } while(0)
                   1212:      #define SUDO_HOOK_VERSION_SET_MINOR(vp, n) do { \
                   1213:          *(vp) = (*(vp) & 0xffff0000) | (n); \
                   1214:      } while(0)
1.1.1.2   misho    1215: 
1.1.1.5   misho    1216:    RReemmoottee ccoommmmaanndd eexxeeccuuttiioonn
                   1217:      The ssuuddoo front end does not have native support for running remote
                   1218:      commands.  However, starting with ssuuddoo 1.8.8, the --hh option may be used
                   1219:      to specify a remote host that is passed to the policy plugin.  A plugin
                   1220:      may also accept a _r_u_n_a_s___u_s_e_r in the form of ``user@hostname'' which will
                   1221:      work with older versions of ssuuddoo.  It is anticipated that remote commands
                   1222:      will be supported by executing a ``helper'' program.  The policy plugin
                   1223:      should setup the execution environment such that the ssuuddoo front end will
                   1224:      run the helper which, in turn, will connect to the remote host and run
                   1225:      the command.
                   1226: 
                   1227:      For example, the policy plugin could utilize sssshh to perform remote
                   1228:      command execution.  The helper program would be responsible for running
                   1229:      sssshh with the proper options to use a private key or certificate that the
                   1230:      remote host will accept and run a program on the remote host that would
                   1231:      setup the execution environment accordingly.
                   1232: 
                   1233:      Note that remote ssuuddooeeddiitt functionality must be handled by the policy
                   1234:      plugin, not ssuuddoo itself as the front end has no knowledge that a remote
                   1235:      command is being executed.  This may be addressed in a future revision of
                   1236:      the plugin API.
                   1237: 
1.1       misho    1238:    CCoonnvveerrssaattiioonn AAPPII
1.1.1.3   misho    1239:      If the plugin needs to interact with the user, it may do so via the
                   1240:      ccoonnvveerrssaattiioonn() function.  A plugin should not attempt to read directly
                   1241:      from the standard input or the user's tty (neither of which are
                   1242:      guaranteed to exist).  The caller must include a trailing newline in msg
                   1243:      if one is to be printed.
                   1244: 
                   1245:      A pprriinnttff()-style function is also available that can be used to display
                   1246:      informational or error messages to the user, which is usually more
                   1247:      convenient for simple messages where no use input is required.
                   1248: 
                   1249:      struct sudo_conv_message {
                   1250:      #define SUDO_CONV_PROMPT_ECHO_OFF  0x0001 /* do not echo user input */
                   1251:      #define SUDO_CONV_PROMPT_ECHO_ON   0x0002 /* echo user input */
                   1252:      #define SUDO_CONV_ERROR_MSG        0x0003 /* error message */
                   1253:      #define SUDO_CONV_INFO_MSG         0x0004 /* informational message */
                   1254:      #define SUDO_CONV_PROMPT_MASK      0x0005 /* mask user input */
                   1255:      #define SUDO_CONV_DEBUG_MSG        0x0006 /* debugging message */
                   1256:      #define SUDO_CONV_PROMPT_ECHO_OK   0x1000 /* flag: allow echo if no tty */
                   1257:          int msg_type;
                   1258:          int timeout;
                   1259:          const char *msg;
                   1260:      };
                   1261: 
1.1.1.5   misho    1262:      #define SUDO_CONV_REPL_MAX      255
                   1263: 
1.1.1.3   misho    1264:      struct sudo_conv_reply {
                   1265:          char *reply;
                   1266:      };
                   1267: 
                   1268:      typedef int (*sudo_conv_t)(int num_msgs,
                   1269:                   const struct sudo_conv_message msgs[],
                   1270:                   struct sudo_conv_reply replies[]);
                   1271: 
                   1272:      typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...);
                   1273: 
                   1274:      Pointers to the ccoonnvveerrssaattiioonn() and pprriinnttff()-style functions are passed in
                   1275:      to the plugin's ooppeenn() function when the plugin is initialized.
                   1276: 
                   1277:      To use the ccoonnvveerrssaattiioonn() function, the plugin must pass an array of
                   1278:      sudo_conv_message and sudo_conv_reply structures.  There must be a struct
                   1279:      sudo_conv_message and struct sudo_conv_reply for each message in the
                   1280:      conversation.  The plugin is responsible for freeing the reply buffer
1.1.1.5   misho    1281:      located in each struct sudo_conv_reply, if it is not NULL.
                   1282:      SUDO_CONV_REPL_MAX represents the maximum length of the reply buffer (not
                   1283:      including the trailing NUL character).  In practical terms, this is the
                   1284:      longest password ssuuddoo will support.  It is also useful as a maximum value
                   1285:      for the mmeemmsseett__ss() function when clearing passwords filled in by the
                   1286:      conversation function.
1.1.1.3   misho    1287: 
                   1288:      The pprriinnttff()-style function uses the same underlying mechanism as the
                   1289:      ccoonnvveerrssaattiioonn() function but only supports SUDO_CONV_INFO_MSG,
                   1290:      SUDO_CONV_ERROR_MSG and SUDO_CONV_DEBUG_MSG for the _m_s_g___t_y_p_e parameter.
                   1291:      It can be more convenient than using the ccoonnvveerrssaattiioonn() function if no
                   1292:      user reply is needed and supports standard pprriinnttff() escape sequences.
                   1293: 
                   1294:      Unlike, SUDO_CONV_INFO_MSG and Dv SUDO_CONV_ERROR_MSG , messages sent
                   1295:      with the SUDO_CONV_DEBUG_MSG _m_s_g___t_y_p_e are not directly user-visible.
                   1296:      Instead, they are logged to the file specified in the Debug statement (if
1.1.1.4   misho    1297:      any) in the sudo.conf(4).  file.  This allows a plugin to log debugging
                   1298:      information and is intended to be used in conjunction with the
                   1299:      _d_e_b_u_g___f_l_a_g_s setting.
1.1.1.3   misho    1300: 
                   1301:      See the sample plugin for an example of the ccoonnvveerrssaattiioonn() function
                   1302:      usage.
                   1303: 
                   1304:    SSuuddooeerrss ggrroouupp pplluuggiinn AAPPII
1.1.1.4   misho    1305:      The ssuuddooeerrss plugin supports its own plugin interface to allow non-Unix
                   1306:      group lookups.  This can be used to query a group source other than the
                   1307:      standard Unix group database.  Two sample group plugins are bundled with
                   1308:      ssuuddoo, _g_r_o_u_p___f_i_l_e and _s_y_s_t_e_m___g_r_o_u_p, are detailed in sudoers(4).  Third
                   1309:      party group plugins include a QAS AD plugin available from Quest
                   1310:      Software.
1.1.1.3   misho    1311: 
                   1312:      A group plugin must declare and populate a sudoers_group_plugin struct in
                   1313:      the global scope.  This structure contains pointers to the functions that
                   1314:      implement plugin initialization, cleanup and group lookup.
                   1315: 
                   1316:      struct sudoers_group_plugin {
                   1317:         unsigned int version;
                   1318:         int (*init)(int version, sudo_printf_t sudo_printf,
                   1319:                     char *const argv[]);
                   1320:         void (*cleanup)(void);
                   1321:         int (*query)(const char *user, const char *group,
                   1322:                      const struct passwd *pwd);
                   1323:      };
1.1       misho    1324: 
1.1.1.3   misho    1325:      The sudoers_group_plugin struct has the following fields:
1.1       misho    1326: 
1.1.1.3   misho    1327:      version
1.1       misho    1328:            The version field should be set to GROUP_API_VERSION.
                   1329: 
1.1.1.4   misho    1330:            This allows ssuuddooeerrss to determine the API version the group plugin
1.1       misho    1331:            was built against.
                   1332: 
1.1.1.3   misho    1333:      init
                   1334:            int (*init)(int version, sudo_printf_t plugin_printf,
                   1335:                        char *const argv[]);
1.1       misho    1336: 
1.1.1.3   misho    1337:            The iinniitt() function is called after _s_u_d_o_e_r_s has been parsed but
1.1       misho    1338:            before any policy checks.  It returns 1 on success, 0 on failure
                   1339:            (or if the plugin is not configured), and -1 if a error occurred.
1.1.1.3   misho    1340:            If an error occurs, the plugin may call the pplluuggiinn__pprriinnttff()
                   1341:            function with SUDO_CONF_ERROR_MSG to present additional error
                   1342:            information to the user.
1.1       misho    1343: 
                   1344:            The function arguments are as follows:
                   1345: 
                   1346:            version
1.1.1.4   misho    1347:                  The version passed in by ssuuddooeerrss allows the plugin to
1.1.1.3   misho    1348:                  determine the major and minor version number of the group
1.1.1.4   misho    1349:                  plugin API supported by ssuuddooeerrss.
1.1       misho    1350: 
                   1351:            plugin_printf
1.1.1.3   misho    1352:                  A pointer to a pprriinnttff()-style function that may be used to
                   1353:                  display informational or error message to the user.  Returns
                   1354:                  the number of characters printed on success and -1 on
                   1355:                  failure.
                   1356: 
                   1357:            argv  A NULL-terminated array of arguments generated from the
                   1358:                  _g_r_o_u_p___p_l_u_g_i_n option in _s_u_d_o_e_r_s.  If no arguments were given,
                   1359:                  _a_r_g_v will be NULL.
                   1360: 
                   1361:      cleanup
                   1362:            void (*cleanup)();
                   1363: 
1.1.1.4   misho    1364:            The cclleeaannuupp() function is called when ssuuddooeerrss has finished its
1.1.1.3   misho    1365:            group checks.  The plugin should free any memory it has allocated
                   1366:            and close open file handles.
                   1367: 
                   1368:      query
                   1369:            int (*query)(const char *user, const char *group,
                   1370:                         const struct passwd *pwd);
1.1       misho    1371: 
1.1.1.3   misho    1372:            The qquueerryy() function is used to ask the group plugin whether _u_s_e_r
                   1373:            is a member of _g_r_o_u_p.
1.1       misho    1374: 
                   1375:            The function arguments are as follows:
                   1376: 
1.1.1.3   misho    1377:            user  The name of the user being looked up in the external group
                   1378:                  database.
1.1       misho    1379: 
                   1380:            group
1.1.1.3   misho    1381:                  The name of the group being queried.
1.1       misho    1382: 
1.1.1.3   misho    1383:            pwd   The password database entry for _u_s_e_r, if any.  If _u_s_e_r is not
                   1384:                  present in the password database, _p_w_d will be NULL.
1.1       misho    1385: 
1.1.1.3   misho    1386:      _G_r_o_u_p _A_P_I _V_e_r_s_i_o_n _M_a_c_r_o_s
1.1       misho    1387: 
1.1.1.3   misho    1388:      /* Sudoers group plugin version major/minor */
                   1389:      #define GROUP_API_VERSION_MAJOR 1
                   1390:      #define GROUP_API_VERSION_MINOR 0
                   1391:      #define GROUP_API_VERSION ((GROUP_API_VERSION_MAJOR << 16) | \
                   1392:                                 GROUP_API_VERSION_MINOR)
                   1393: 
                   1394:      /* Getters and setters for group version */
                   1395:      #define GROUP_API_VERSION_GET_MAJOR(v) ((v) >> 16)
                   1396:      #define GROUP_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
                   1397:      #define GROUP_API_VERSION_SET_MAJOR(vp, n) do { \
                   1398:          *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
                   1399:      } while(0)
                   1400:      #define GROUP_API_VERSION_SET_MINOR(vp, n) do { \
                   1401:          *(vp) = (*(vp) & 0xffff0000) | (n); \
                   1402:      } while(0)
1.1       misho    1403: 
1.1.1.2   misho    1404: PPLLUUGGIINN AAPPII CCHHAANNGGEELLOOGG
1.1.1.3   misho    1405:      The following revisions have been made to the Sudo Plugin API.
1.1.1.2   misho    1406: 
1.1.1.3   misho    1407:      Version 1.0
1.1.1.2   misho    1408:            Initial API version.
                   1409: 
1.1.1.4   misho    1410:      Version 1.1 (sudo 1.8.0)
1.1.1.3   misho    1411:            The I/O logging plugin's ooppeenn() function was modified to take the
1.1.1.2   misho    1412:            command_info list as an argument.
                   1413: 
1.1.1.4   misho    1414:      Version 1.2 (sudo 1.8.5)
1.1.1.3   misho    1415:            The Policy and I/O logging plugins' ooppeenn() functions are now passed
1.1.1.4   misho    1416:            a list of plugin parameters if any are specified in sudo.conf(4).
1.1.1.2   misho    1417: 
                   1418:            A simple hooks API has been introduced to allow plugins to hook in
                   1419:            to the system's environment handling functions.
                   1420: 
                   1421:            The init_session Policy plugin function is now passed a pointer to
                   1422:            the user environment which can be updated as needed.  This can be
                   1423:            used to merge in environment variables stored in the PAM handle
                   1424:            before a command is run.
                   1425: 
1.1.1.4   misho    1426:      Version 1.3 (sudo 1.8.7)
                   1427:            Support for the _e_x_e_c___b_a_c_k_g_r_o_u_n_d entry has been added to the
                   1428:            command_info list.
                   1429: 
                   1430:            The _m_a_x___g_r_o_u_p_s and _p_l_u_g_i_n___d_i_r entries were added to the settings
                   1431:            list.
                   1432: 
                   1433:            The vveerrssiioonn() and cclloossee() functions are now optional.  Previously,
                   1434:            a missing vveerrssiioonn() or cclloossee() function would result in a crash.
                   1435:            If no policy plugin cclloossee() function is defined, a default cclloossee()
                   1436:            function will be provided by the ssuuddoo front end that displays a
                   1437:            warning if the command could not be executed.
                   1438: 
                   1439:            The ssuuddoo front end now installs default signal handlers to trap
                   1440:            common signals while the plugin functions are run.
                   1441: 
1.1.1.5   misho    1442:      Version 1.4 (sudo 1.8.8)
                   1443:            The _r_e_m_o_t_e___h_o_s_t entry was added to the settings list.
                   1444: 
1.1.1.6 ! misho    1445:      Version 1.5 (sudo 1.8.9)
        !          1446:            The entry was added to the command_info list.
        !          1447: 
1.1       misho    1448: SSEEEE AALLSSOO
1.1.1.4   misho    1449:      sudo.conf(4), sudoers(4), sudo(1m)
1.1       misho    1450: 
                   1451: BBUUGGSS
1.1.1.3   misho    1452:      If you feel you have found a bug in ssuuddoo, please submit a bug report at
                   1453:      http://www.sudo.ws/sudo/bugs/
1.1       misho    1454: 
                   1455: SSUUPPPPOORRTT
1.1.1.3   misho    1456:      Limited free support is available via the sudo-users mailing list, see
                   1457:      http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or search the
                   1458:      archives.
1.1       misho    1459: 
                   1460: DDIISSCCLLAAIIMMEERR
1.1.1.3   misho    1461:      ssuuddoo is provided ``AS IS'' and any express or implied warranties,
                   1462:      including, but not limited to, the implied warranties of merchantability
                   1463:      and fitness for a particular purpose are disclaimed.  See the LICENSE
                   1464:      file distributed with ssuuddoo or http://www.sudo.ws/sudo/license.html for
                   1465:      complete details.
1.1       misho    1466: 
1.1.1.6 ! misho    1467: Sudo 1.8.10                    December 20, 2013                   Sudo 1.8.10

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>