github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/cmd/snap-confine/snap-confine-args.h (about)

     1  /*
     2   * Copyright (C) 2016 Canonical Ltd
     3   *
     4   * This program is free software: you can redistribute it and/or modify
     5   * it under the terms of the GNU General Public License version 3 as
     6   * published by the Free Software Foundation.
     7   *
     8   * This program is distributed in the hope that it will be useful,
     9   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11   * GNU General Public License for more details.
    12   *
    13   * You should have received a copy of the GNU General Public License
    14   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15   *
    16   */
    17  
    18  #ifndef SC_SNAP_CONFINE_ARGS_H
    19  #define SC_SNAP_CONFINE_ARGS_H
    20  
    21  #include <stdbool.h>
    22  
    23  #include "../libsnap-confine-private/error.h"
    24  
    25  /**
    26   * Error domain for errors related to argument parsing.
    27   **/
    28  #define SC_ARGS_DOMAIN "args"
    29  
    30  enum {
    31  	/**
    32  	 * Error indicating that the command line arguments could not be parsed
    33  	 * correctly and usage message should be displayed to the user.
    34  	 **/
    35  	SC_ARGS_ERR_USAGE = 1,
    36  };
    37  
    38  /**
    39   * Opaque structure describing command-line arguments to snap-confine.
    40   **/
    41  struct sc_args;
    42  
    43  /**
    44   * Parse command line arguments for snap-confine.
    45   *
    46   * Snap confine understands very specific arguments.
    47   *
    48   * The argument vector can begin with "ubuntu-core-launcher" (with an optional
    49   * path) which implies that the first arctual argument (argv[1]) is a copy of
    50   * argv[2] and can be discarded.
    51   *
    52   * The argument vector is scanned, left to right, to look for switches that
    53   * start with the minus sign ('-'). Recognized options are stored and
    54   * memorized. Unrecognized options return an appropriate error object.
    55   *
    56   * Currently only one option is understood, that is "--version". It is simply
    57   * scanned, memorized and discarded. The presence of this switch can be
    58   * retrieved with sc_args_is_version_query().
    59   *
    60   * After all the option switches are scanned it is expected to scan two more
    61   * arguments: the security tag and the name of the executable to run.  An error
    62   * object is returned when those is missing.
    63   *
    64   * Both argc and argv are modified so the caller can look at the first unparsed
    65   * argument at argc[0]. This is only done if argument parsing is successful.
    66   **/
    67  __attribute__((warn_unused_result))
    68  struct sc_args *sc_nonfatal_parse_args(int *argcp, char ***argvp,
    69  				       sc_error ** errorp);
    70  
    71  /**
    72   * Free the object describing command-line arguments to snap-confine.
    73   **/
    74  void sc_args_free(struct sc_args *args);
    75  
    76  /**
    77   * Cleanup an error with sc_args_free()
    78   *
    79   * This function is designed to be used with
    80   * SC_CLEANUP(sc_cleanup_args).
    81   **/
    82  void sc_cleanup_args(struct sc_args **ptr);
    83  
    84  /**
    85   * Check if snap-confine was invoked with the --version switch.
    86   **/
    87  bool sc_args_is_version_query(const struct sc_args *args);
    88  
    89  /**
    90   * Check if snap-confine was invoked with the --classic switch.
    91   **/
    92  bool sc_args_is_classic_confinement(const struct sc_args *args);
    93  
    94  /**
    95   * Get the security tag passed to snap-confine.
    96   *
    97   * The return value may be NULL if snap-confine was invoked with --version. It
    98   * is never NULL otherwise.
    99   *
   100   * The return value must not be freed(). It is bound to the lifetime of
   101   * the argument parser.
   102   **/
   103  const char *sc_args_security_tag(const struct sc_args *args);
   104  
   105  /**
   106   * Get the executable name passed to snap-confine.
   107   *
   108   * The return value may be NULL if snap-confine was invoked with --version. It
   109   * is never NULL otherwise.
   110   *
   111   * The return value must not be freed(). It is bound to the lifetime of
   112   * the argument parser.
   113   **/
   114  const char *sc_args_executable(const struct sc_args *args);
   115  
   116  /**
   117   * Get the name of the base snap to use.
   118   *
   119   * The return value must not be freed(). It is bound to the lifetime of
   120   * the argument parser.
   121   **/
   122  const char *sc_args_base_snap(const struct sc_args *args);
   123  
   124  #endif