/** * @file * * An opaque structure that represents a policy "path". A policy path * may really be a base policy and a number of modules, thus a single * string is not sufficient. * * @author Jeremy A. Mowery jmowery@tresys.com * @author Jason Tang jtang@tresys.com * * Copyright (C) 2006-2007 Tresys Technology, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef APOL_POLICY_PATH_H #define APOL_POLICY_PATH_H #ifdef __cplusplus extern "C" { #endif #include "vector.h" typedef struct apol_policy_path apol_policy_path_t; /** * Type of policy this path represents - either a single path, for a * monolithic policy, or a path + multiple modules for modular policy. */ typedef enum apol_policy_path_type { APOL_POLICY_PATH_TYPE_MONOLITHIC = 0, APOL_POLICY_PATH_TYPE_MODULAR } apol_policy_path_type_e; /** * Create a policy path from scratch. The resulting object represents * the file or files needed to load a policy. * * @param path_type Type of policy to represent. * @param path Primary path name. For modular policies this is the * base policy's path. * @param modules Vector of strings representing modules' paths. The * vector can be NULL to mean no modules. This parameter is ignored * if path_type is not APOL_POLICY_PATH_TYPE_MODULAR. The function * will duplicate the vector and its contents. * * @return An apol_policy_path object, or NULL upon error. */ extern apol_policy_path_t *apol_policy_path_create(apol_policy_path_type_e path_type, const char *path, const apol_vector_t * modules); /** * Create a policy path, initialized from another policy path. This * function recursively duplicates all data within the original path. * * @param path Policy path to duplicate. * * @return An apol_policy_path object, or NULL upon error. */ extern apol_policy_path_t *apol_policy_path_create_from_policy_path(const apol_policy_path_t * path); /** * Create a policy path, initialize by the contents of a policy * path list file. Call apol_policy_path_to_filename() to write * a policy path list to disk. * * @param filename Name of the file containing a policy path list. * * @return An apol_policy_path object, or NULL upon error. */ extern apol_policy_path_t *apol_policy_path_create_from_file(const char *filename); /** * Create a policy path, initialized by a special path format string. * Call apol_policy_path_to_string() to create this string. * * @param path_string String containing initialization data for the * object. * * @return An apol_policy_path object, or NULL upon error. */ extern apol_policy_path_t *apol_policy_path_create_from_string(const char *path_string); /** * Destroy the referencened policy path object. * * @param path Policy path to destroy. The pointer will be set to * NULL afterwards. (If pointer is already NULL then do nothing.) */ extern void apol_policy_path_destroy(apol_policy_path_t ** path); /** * Compare two policy paths, determining if one is different than the * other. The returned value is stable, in that it may be used as the * basis for sorting a list of policy paths. Monolithic policies are * considered "less than" modular policies. * * @param a First policy path to compare. * @param b Second policy path to compare. * * @return < 0 if path A is "less than" B, > 0 if A is "greater than" * B, or 0 if equivalent or undeterminable. */ extern int apol_policy_path_compare(const apol_policy_path_t * a, const apol_policy_path_t * b); /** * Get the type of policy this path object represents. * * @param path Policy path object to query. * * @return Type of policy the object represents. */ extern apol_policy_path_type_e apol_policy_path_get_type(const apol_policy_path_t * path); /** * Get the primary path name from a path object. For monolithic * policies this is the path to the policy. For modular policies this * is the base policy path. * * @param path Policy path object to query. * * @return Primary path, or NULL upon error. Do not modify * this string. */ extern const char *apol_policy_path_get_primary(const apol_policy_path_t * path); /** * Get the list of modules from a path object. This will be a vector * of strings. It is an error to call this function for non-modular * policies. * * @param path Policy path object to query. * * @return Vector of module paths, or NULL upon error. Do not modify * this vector or its contents. Note that the vector could be empty. */ extern const apol_vector_t *apol_policy_path_get_modules(const apol_policy_path_t * path); /** * Write a human-readable policy path list to disk. This * file describes a policy path and is suitable as input to * apol_policy_path_create_from_file(). * * @param path Policy path to write to disk. * @param filename Name of the file to write policy path list. If the * file already exists it will be overwritten. * * @return 0 on successful write, < 0 on error. */ extern int apol_policy_path_to_file(const apol_policy_path_t * path, const char *filename); /** * Encode a path object into a specially formatted string. The * resulting string is suitable as input to * apol_policy_path_create_from_string(). * * @param path Policy path object to encode. * * @return Formatted string for the path object, or NULL upon error. * The caller is responsible for calling free() upon the returned * value. */ extern char *apol_policy_path_to_string(const apol_policy_path_t * path); /** * Determine if a file is a policy path list. * * @param filename Name of the file to test. * * @return > 0 if the file is a policy path list, 0 if it is not, * and < 0 on error. */ extern int apol_file_is_policy_path_list(const char *filename); #ifdef __cplusplus } #endif #endif