Blame src/conf-parse.y

Packit Service 102278
/* Authors: Jason Tang     <jtang@tresys.com>
Packit Service 102278
 *          James Athey    <jathey@tresys.com>
Packit Service 102278
 *
Packit Service 102278
 * Copyright (C) 2004-2006 Tresys Technology, LLC
Packit Service 102278
 *
Packit Service 102278
 *  This library is free software; you can redistribute it and/or
Packit Service 102278
 *  modify it under the terms of the GNU Lesser General Public
Packit Service 102278
 *  License as published by the Free Software Foundation; either
Packit Service 102278
 *  version 2.1 of the License, or (at your option) any later version.
Packit Service 102278
 *
Packit Service 102278
 *  This library is distributed in the hope that it will be useful,
Packit Service 102278
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 102278
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 102278
 *  Lesser General Public License for more details.
Packit Service 102278
 *
Packit Service 102278
 *  You should have received a copy of the GNU Lesser General Public
Packit Service 102278
 *  License along with this library; if not, write to the Free Software
Packit Service 102278
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service 102278
 */
Packit Service 102278
Packit Service 102278
%{
Packit Service 102278
Packit Service 102278
#include "semanage_conf.h"
Packit Service 102278
Packit Service 102278
#include <sepol/policydb.h>
Packit Service 102278
#include <selinux/selinux.h>
Packit Service 102278
#include <semanage/handle.h>
Packit Service 102278
Packit Service 102278
#include <unistd.h>
Packit Service 102278
#include <stdio.h>
Packit Service 102278
#include <stdlib.h>
Packit Service 102278
#include <string.h>
Packit Service 102278
Packit Service 102278
extern int semanage_lex(void);                /* defined in conf-scan.c */
Packit Service 102278
extern int semanage_lex_destroy(void);        /* defined in conf-scan.c */
Packit Service 102278
int semanage_error(const char *msg);
Packit Service 102278
Packit Service 102278
extern FILE *semanage_in;
Packit Service 102278
extern char *semanage_text;
Packit Service 102278
Packit Service 102278
static int parse_module_store(char *arg);
Packit Service 102278
static int parse_store_root_path(char *arg);
Packit Service 102278
static int parse_compiler_path(char *arg);
Packit Service 102278
static void semanage_conf_external_prog_destroy(external_prog_t *ep);
Packit Service 102278
static int new_external_prog(external_prog_t **chain);
Packit Service 102278
Packit Service 102278
static semanage_conf_t *current_conf;
Packit Service 102278
static external_prog_t *new_external;
Packit Service 102278
static int parse_errors;
Packit Service 102278
Packit Service 102278
#define PASSIGN(p1,p2) { free(p1); p1 = p2; }
Packit Service 102278
Packit Service 102278
%}
Packit Service 102278
Packit Service 102278
%name-prefix "semanage_"
Packit Service 102278
Packit Service 102278
%union {
Packit Service 102278
        int d;
Packit Service 102278
        char *s;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
%token MODULE_STORE VERSION EXPAND_CHECK FILE_MODE SAVE_PREVIOUS SAVE_LINKED TARGET_PLATFORM COMPILER_DIR IGNORE_MODULE_CACHE STORE_ROOT
Packit Service 102278
%token LOAD_POLICY_START SETFILES_START SEFCONTEXT_COMPILE_START DISABLE_GENHOMEDIRCON HANDLE_UNKNOWN USEPASSWD IGNOREDIRS
Packit Service 102278
%token BZIP_BLOCKSIZE BZIP_SMALL REMOVE_HLL
Packit Service 102278
%token VERIFY_MOD_START VERIFY_LINKED_START VERIFY_KERNEL_START BLOCK_END
Packit Service 102278
%token PROG_PATH PROG_ARGS
Packit Service 102278
%token <s> ARG
Packit Service 102278
%type <d> verify_start_tok
Packit Service 102278
Packit Service 102278
%%
Packit Service 102278
Packit Service 102278
config_file:    config_line config_file
Packit Service 102278
        |       /* empty */
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
config_line:    single_opt
Packit Service 102278
        |       command_block
Packit Service 102278
        |       verify_block
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
single_opt:     module_store
Packit Service 102278
        |       version
Packit Service 102278
        |       target_platform
Packit Service 102278
        |       store_root
Packit Service 102278
        |       compiler_dir
Packit Service 102278
        |       ignore_module_cache
Packit Service 102278
        |       expand_check
Packit Service 102278
        |       file_mode
Packit Service 102278
        |       save_previous
Packit Service 102278
        |       save_linked
Packit Service 102278
        |       disable_genhomedircon
Packit Service 102278
        |       usepasswd
Packit Service 102278
        |       ignoredirs
Packit Service 102278
        |       handle_unknown
Packit Service 102278
	|	bzip_blocksize
Packit Service 102278
	|	bzip_small
Packit Service 102278
	|	remove_hll
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
module_store:   MODULE_STORE '=' ARG {
Packit Service 102278
                        if (parse_module_store($3) != 0) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                        free($3);
Packit Service 102278
                }
Packit Service 102278
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
store_root:     STORE_ROOT '=' ARG  {
Packit Service 102278
                        if (parse_store_root_path($3) != 0) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                        free($3);
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
compiler_dir:       COMPILER_DIR '=' ARG  {
Packit Service 102278
                        if (parse_compiler_path($3) != 0) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                        free($3);
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
ignore_module_cache:	IGNORE_MODULE_CACHE '=' ARG  {
Packit Service 102278
							if (strcasecmp($3, "true") == 0)
Packit Service 102278
								current_conf->ignore_module_cache = 1;
Packit Service 102278
							else if (strcasecmp($3, "false") == 0)
Packit Service 102278
								current_conf->ignore_module_cache = 0;
Packit Service 102278
							else {
Packit Service 102278
								yyerror("disable-caching can only be 'true' or 'false'");
Packit Service 102278
							}
Packit Service 102278
							free($3);
Packit Service 102278
						}
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
version:        VERSION '=' ARG  {
Packit Service 102278
                        current_conf->policyvers = atoi($3);
Packit Service 102278
                        free($3);
Packit Service 102278
                        if (current_conf->policyvers < sepol_policy_kern_vers_min() ||
Packit Service 102278
                            current_conf->policyvers > sepol_policy_kern_vers_max()) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
target_platform: TARGET_PLATFORM '=' ARG  {
Packit Service 102278
                        if (strcasecmp($3, "selinux") == 0)
Packit Service 102278
                                current_conf->target_platform = SEPOL_TARGET_SELINUX;
Packit Service 102278
                        else if (strcasecmp($3, "xen") == 0)
Packit Service 102278
                                current_conf->target_platform = SEPOL_TARGET_XEN;
Packit Service 102278
                        else {
Packit Service 102278
                                yyerror("target_platform can only be 'selinux' or 'xen'");
Packit Service 102278
                        }
Packit Service 102278
                        free($3);
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
expand_check:   EXPAND_CHECK '=' ARG  {
Packit Service 102278
                        current_conf->expand_check = atoi($3);
Packit Service 102278
                        free($3);
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
file_mode:   FILE_MODE '=' ARG  {
Packit Service 102278
                        current_conf->file_mode = strtoul($3, NULL, 8);
Packit Service 102278
                        free($3);
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
save_previous:    SAVE_PREVIOUS '=' ARG {
Packit Service 102278
	                if (strcasecmp($3, "true") == 0)
Packit Service 102278
		                current_conf->save_previous = 1;
Packit Service 102278
			else if (strcasecmp($3, "false") == 0)
Packit Service 102278
				current_conf->save_previous = 0;		
Packit Service 102278
			else {
Packit Service 102278
				yyerror("save-previous can only be 'true' or 'false'");
Packit Service 102278
			}
Packit Service 102278
			free($3);
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
Packit Service 102278
save_linked:    SAVE_LINKED '=' ARG {
Packit Service 102278
	                if (strcasecmp($3, "true") == 0)
Packit Service 102278
		                current_conf->save_linked = 1;
Packit Service 102278
			else if (strcasecmp($3, "false") == 0)
Packit Service 102278
				current_conf->save_linked = 0;		
Packit Service 102278
			else {
Packit Service 102278
				yyerror("save-linked can only be 'true' or 'false'");
Packit Service 102278
			}
Packit Service 102278
			free($3);
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
disable_genhomedircon: DISABLE_GENHOMEDIRCON '=' ARG {
Packit Service 102278
	if (strcasecmp($3, "false") == 0) {
Packit Service 102278
		current_conf->disable_genhomedircon = 0;
Packit Service 102278
	} else if (strcasecmp($3, "true") == 0) {
Packit Service 102278
		current_conf->disable_genhomedircon = 1;
Packit Service 102278
	} else {
Packit Service 102278
		yyerror("disable-genhomedircon can only be 'true' or 'false'");
Packit Service 102278
	}
Packit Service 102278
	free($3);
Packit Service 102278
 }
Packit Service 102278
Packit Service 102278
usepasswd: USEPASSWD '=' ARG {
Packit Service 102278
	if (strcasecmp($3, "false") == 0) {
Packit Service 102278
		current_conf->usepasswd = 0;
Packit Service 102278
	} else if (strcasecmp($3, "true") == 0) {
Packit Service 102278
		current_conf->usepasswd = 1;
Packit Service 102278
	} else {
Packit Service 102278
		yyerror("usepasswd can only be 'true' or 'false'");
Packit Service 102278
	}
Packit Service 102278
	free($3);
Packit Service 102278
 }
Packit Service 102278
Packit Service 102278
ignoredirs: IGNOREDIRS '=' ARG {
Packit Service 102278
	current_conf->ignoredirs = strdup($3);
Packit Service 102278
	free($3);
Packit Service 102278
 }
Packit Service 102278
Packit Service 102278
handle_unknown: HANDLE_UNKNOWN '=' ARG {
Packit Service 102278
	if (strcasecmp($3, "deny") == 0) {
Packit Service 102278
		current_conf->handle_unknown = SEPOL_DENY_UNKNOWN;
Packit Service 102278
	} else if (strcasecmp($3, "reject") == 0) {
Packit Service 102278
		current_conf->handle_unknown = SEPOL_REJECT_UNKNOWN;
Packit Service 102278
	} else if (strcasecmp($3, "allow") == 0) {
Packit Service 102278
		current_conf->handle_unknown = SEPOL_ALLOW_UNKNOWN;
Packit Service 102278
	} else {
Packit Service 102278
		yyerror("handle-unknown can only be 'deny', 'reject' or 'allow'");
Packit Service 102278
	}
Packit Service 102278
	free($3);
Packit Service 102278
 }
Packit Service 102278
Packit Service 102278
bzip_blocksize:  BZIP_BLOCKSIZE '=' ARG {
Packit Service 102278
	int blocksize = atoi($3);
Packit Service 102278
	free($3);
Packit Service 102278
	if (blocksize > 9)
Packit Service 102278
		yyerror("bzip-blocksize can only be in the range 0-9");
Packit Service 102278
	else
Packit Service 102278
		current_conf->bzip_blocksize = blocksize;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
bzip_small:  BZIP_SMALL '=' ARG {
Packit Service 102278
	if (strcasecmp($3, "false") == 0) {
Packit Service 102278
		current_conf->bzip_small = 0;
Packit Service 102278
	} else if (strcasecmp($3, "true") == 0) {
Packit Service 102278
		current_conf->bzip_small = 1;
Packit Service 102278
	} else {
Packit Service 102278
		yyerror("bzip-small can only be 'true' or 'false'");
Packit Service 102278
	}
Packit Service 102278
	free($3);
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
remove_hll:  REMOVE_HLL'=' ARG {
Packit Service 102278
	if (strcasecmp($3, "false") == 0) {
Packit Service 102278
		current_conf->remove_hll = 0;
Packit Service 102278
	} else if (strcasecmp($3, "true") == 0) {
Packit Service 102278
		current_conf->remove_hll = 1;
Packit Service 102278
	} else {
Packit Service 102278
		yyerror("remove-hll can only be 'true' or 'false'");
Packit Service 102278
	}
Packit Service 102278
	free($3);
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
command_block: 
Packit Service 102278
                command_start external_opts BLOCK_END  {
Packit Service 102278
                        if (new_external->path == NULL) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
command_start:
Packit Service 102278
                LOAD_POLICY_START {
Packit Service 102278
                        semanage_conf_external_prog_destroy(current_conf->load_policy);
Packit Service 102278
                        current_conf->load_policy = NULL;
Packit Service 102278
                        if (new_external_prog(&current_conf->load_policy) == -1) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                }
Packit Service 102278
        |       SETFILES_START {
Packit Service 102278
                        semanage_conf_external_prog_destroy(current_conf->setfiles);
Packit Service 102278
                        current_conf->setfiles = NULL;
Packit Service 102278
                        if (new_external_prog(&current_conf->setfiles) == -1) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                }
Packit Service 102278
        |       SEFCONTEXT_COMPILE_START {
Packit Service 102278
                        semanage_conf_external_prog_destroy(current_conf->sefcontext_compile);
Packit Service 102278
                        current_conf->sefcontext_compile = NULL;
Packit Service 102278
                        if (new_external_prog(&current_conf->sefcontext_compile) == -1) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
verify_block:   verify_start external_opts BLOCK_END  {
Packit Service 102278
                        if (new_external->path == NULL) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
verify_start:   verify_start_tok {
Packit Service 102278
                        if ($1 == -1) {
Packit Service 102278
                                parse_errors++;
Packit Service 102278
                                YYABORT;
Packit Service 102278
                        }
Packit Service 102278
                }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
verify_start_tok: VERIFY_MOD_START  {$$ = new_external_prog(&current_conf->mod_prog);}
Packit Service 102278
        |       VERIFY_LINKED_START {$$ = new_external_prog(&current_conf->linked_prog);}
Packit Service 102278
        |       VERIFY_KERNEL_START {$$ = new_external_prog(&current_conf->kernel_prog);}
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
external_opts:  external_opt external_opts
Packit Service 102278
        |       /* empty */
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
external_opt:   PROG_PATH '=' ARG  { PASSIGN(new_external->path, $3); }
Packit Service 102278
        |       PROG_ARGS '=' ARG  { PASSIGN(new_external->args, $3); }
Packit Service 102278
        ;
Packit Service 102278
Packit Service 102278
%%
Packit Service 102278
Packit Service 102278
static int semanage_conf_init(semanage_conf_t * conf)
Packit Service 102278
{
Packit Service 102278
	conf->store_type = SEMANAGE_CON_DIRECT;
Packit Service 102278
	conf->store_path = strdup(basename(selinux_policy_root()));
Packit Service 102278
	conf->ignoredirs = NULL;
Packit Service 102278
	conf->store_root_path = strdup("/var/lib/selinux");
Packit Service 102278
	conf->compiler_directory_path = strdup("/usr/libexec/selinux/hll");
Packit Service 102278
	conf->policyvers = sepol_policy_kern_vers_max();
Packit Service 102278
	conf->target_platform = SEPOL_TARGET_SELINUX;
Packit Service 102278
	conf->expand_check = 1;
Packit Service 102278
	conf->handle_unknown = -1;
Packit Service 102278
	conf->usepasswd = 1;
Packit Service 102278
	conf->file_mode = 0644;
Packit Service 102278
	conf->bzip_blocksize = 9;
Packit Service 102278
	conf->bzip_small = 0;
Packit Service 102278
	conf->ignore_module_cache = 0;
Packit Service 102278
	conf->remove_hll = 0;
Packit Service 102278
Packit Service 102278
	conf->save_previous = 0;
Packit Service 102278
	conf->save_linked = 0;
Packit Service 102278
Packit Service 102278
	if ((conf->load_policy =
Packit Service 102278
	     calloc(1, sizeof(*(current_conf->load_policy)))) == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
Packit Service 102278
	if (access("/sbin/load_policy", X_OK) == 0) {
Packit Service 102278
		conf->load_policy->path = strdup("/sbin/load_policy");
Packit Service 102278
	} else {
Packit Service 102278
		conf->load_policy->path = strdup("/usr/sbin/load_policy");
Packit Service 102278
	}
Packit Service 102278
	if (conf->load_policy->path == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
	conf->load_policy->args = NULL;
Packit Service 102278
Packit Service 102278
	if ((conf->setfiles =
Packit Service 102278
	     calloc(1, sizeof(*(current_conf->setfiles)))) == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
	if (access("/sbin/setfiles", X_OK) == 0) {
Packit Service 102278
		conf->setfiles->path = strdup("/sbin/setfiles");
Packit Service 102278
	} else {
Packit Service 102278
		conf->setfiles->path = strdup("/usr/sbin/setfiles");
Packit Service 102278
	}
Packit Service 102278
	if ((conf->setfiles->path == NULL) ||
Packit Service 102278
	    (conf->setfiles->args = strdup("-q -c $@ $<")) == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
Packit Service 102278
	if ((conf->sefcontext_compile =
Packit Service 102278
	     calloc(1, sizeof(*(current_conf->sefcontext_compile)))) == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
	if (access("/sbin/sefcontext_compile", X_OK) == 0) {
Packit Service 102278
		conf->sefcontext_compile->path = strdup("/sbin/sefcontext_compile");
Packit Service 102278
	} else {
Packit Service 102278
		conf->sefcontext_compile->path = strdup("/usr/sbin/sefcontext_compile");
Packit Service 102278
	}
Packit Service 102278
	if ((conf->sefcontext_compile->path == NULL) ||
Packit Service 102278
	    (conf->sefcontext_compile->args = strdup("$@")) == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
Packit Service 102278
	return 0;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
/* Parse a libsemanage configuration file.  THIS FUNCTION IS NOT
Packit Service 102278
 * THREAD-SAFE!	 Return a newly allocated semanage_conf_t *.  If the
Packit Service 102278
 * configuration file could be read, parse it; otherwise rely upon
Packit Service 102278
 * default values.  If the file could not be parsed correctly or if
Packit Service 102278
 * out of memory return NULL.
Packit Service 102278
 */
Packit Service 102278
semanage_conf_t *semanage_conf_parse(const char *config_filename)
Packit Service 102278
{
Packit Service 102278
	if ((current_conf = calloc(1, sizeof(*current_conf))) == NULL) {
Packit Service 102278
		return NULL;
Packit Service 102278
	}
Packit Service 102278
	if (semanage_conf_init(current_conf) == -1) {
Packit Service 102278
		goto cleanup;
Packit Service 102278
	}
Packit Service 102278
	if ((semanage_in = fopen(config_filename, "r")) == NULL) {
Packit Service 102278
		/* configuration file does not exist or could not be
Packit Service 102278
		 * read.  THIS IS NOT AN ERROR.  just rely on the
Packit Service 102278
		 * defaults. */
Packit Service 102278
		return current_conf;
Packit Service 102278
	}
Packit Service 102278
	parse_errors = 0;
Packit Service 102278
	semanage_parse();
Packit Service 102278
	fclose(semanage_in);
Packit Service 102278
	semanage_lex_destroy();
Packit Service 102278
	if (parse_errors != 0) {
Packit Service 102278
		goto cleanup;
Packit Service 102278
	}
Packit Service 102278
	return current_conf;
Packit Service 102278
      cleanup:
Packit Service 102278
	semanage_conf_destroy(current_conf);
Packit Service 102278
	return NULL;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
static void semanage_conf_external_prog_destroy(external_prog_t * ep)
Packit Service 102278
{
Packit Service 102278
	while (ep != NULL) {
Packit Service 102278
		external_prog_t *next = ep->next;
Packit Service 102278
		free(ep->path);
Packit Service 102278
		free(ep->args);
Packit Service 102278
		free(ep);
Packit Service 102278
		ep = next;
Packit Service 102278
	}
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
/* Deallocates all space associated with a configuration struct,
Packit Service 102278
 * including the pointer itself. */
Packit Service 102278
void semanage_conf_destroy(semanage_conf_t * conf)
Packit Service 102278
{
Packit Service 102278
	if (conf != NULL) {
Packit Service 102278
		free(conf->store_path);
Packit Service 102278
		free(conf->ignoredirs);
Packit Service 102278
		free(conf->store_root_path);
Packit Service 102278
		free(conf->compiler_directory_path);
Packit Service 102278
		semanage_conf_external_prog_destroy(conf->load_policy);
Packit Service 102278
		semanage_conf_external_prog_destroy(conf->setfiles);
Packit Service 102278
		semanage_conf_external_prog_destroy(conf->sefcontext_compile);
Packit Service 102278
		semanage_conf_external_prog_destroy(conf->mod_prog);
Packit Service 102278
		semanage_conf_external_prog_destroy(conf->linked_prog);
Packit Service 102278
		semanage_conf_external_prog_destroy(conf->kernel_prog);
Packit Service 102278
		free(conf);
Packit Service 102278
	}
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
int semanage_error(const char *msg)
Packit Service 102278
{
Packit Service 102278
	fprintf(stderr, "error parsing semanage configuration file: %s\n", msg);
Packit Service 102278
	parse_errors++;
Packit Service 102278
	return 0;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
/* Take the string argument for a module store.	 If it is exactly the
Packit Service 102278
 * word "direct" then have libsemanage directly manipulate the module
Packit Service 102278
 * store. The policy path will default to the active policy directory.
Packit Service 102278
 * Otherwise if it begins with a forward slash interpret it as
Packit Service 102278
 * an absolute path to a named socket, to which a policy server is
Packit Service 102278
 * listening on the other end.	Otherwise treat it as the host name to
Packit Service 102278
 * an external server; if there is a colon in the name then everything
Packit Service 102278
 * after gives a port number.  The default port number is 4242.
Packit Service 102278
 * Returns 0 on success, -1 if out of memory, -2 if a port number is
Packit Service 102278
 * illegal.
Packit Service 102278
 */
Packit Service 102278
static int parse_module_store(char *arg)
Packit Service 102278
{
Packit Service 102278
	/* arg is already a strdup()ed copy of yytext */
Packit Service 102278
	if (arg == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
	free(current_conf->store_path);
Packit Service 102278
	if (strcmp(arg, "direct") == 0) {
Packit Service 102278
		current_conf->store_type = SEMANAGE_CON_DIRECT;
Packit Service 102278
		current_conf->store_path =
Packit Service 102278
		    strdup(basename(selinux_policy_root()));
Packit Service 102278
		current_conf->server_port = -1;
Packit Service 102278
	} else if (*arg == '/') {
Packit Service 102278
		current_conf->store_type = SEMANAGE_CON_POLSERV_LOCAL;
Packit Service 102278
		current_conf->store_path = strdup(arg);
Packit Service 102278
		current_conf->server_port = -1;
Packit Service 102278
	} else {
Packit Service 102278
		char *s;
Packit Service 102278
		current_conf->store_type = SEMANAGE_CON_POLSERV_REMOTE;
Packit Service 102278
		if ((s = strchr(arg, ':')) == NULL) {
Packit Service 102278
			current_conf->store_path = arg;
Packit Service 102278
			current_conf->server_port = 4242;
Packit Service 102278
		} else {
Packit Service 102278
			char *endptr;
Packit Service 102278
			*s = '\0';
Packit Service 102278
			current_conf->store_path = arg;
Packit Service 102278
			current_conf->server_port = strtol(s + 1, &endptr, 10);
Packit Service 102278
			if (*(s + 1) == '\0' || *endptr != '\0') {
Packit Service 102278
				return -2;
Packit Service 102278
			}
Packit Service 102278
		}
Packit Service 102278
	}
Packit Service 102278
	return 0;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
static int parse_store_root_path(char *arg)
Packit Service 102278
{
Packit Service 102278
	if (arg == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
Packit Service 102278
	free(current_conf->store_root_path);
Packit Service 102278
	current_conf->store_root_path = strdup(arg);
Packit Service 102278
	return 0;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
static int parse_compiler_path(char *arg)
Packit Service 102278
{
Packit Service 102278
	if (arg == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
	free(current_conf->compiler_directory_path);
Packit Service 102278
	current_conf->compiler_directory_path = strdup(arg);
Packit Service 102278
	return 0;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
/* Helper function; called whenever configuration file specifies
Packit Service 102278
 * another external program.  Returns 0 on success, -1 if out of
Packit Service 102278
 * memory.
Packit Service 102278
 */
Packit Service 102278
static int new_external_prog(external_prog_t ** chain)
Packit Service 102278
{
Packit Service 102278
	if ((new_external = calloc(1, sizeof(*new_external))) == NULL) {
Packit Service 102278
		return -1;
Packit Service 102278
	}
Packit Service 102278
	/* hook this new external program to the end of the chain */
Packit Service 102278
	if (*chain == NULL) {
Packit Service 102278
		*chain = new_external;
Packit Service 102278
	} else {
Packit Service 102278
		external_prog_t *prog = *chain;
Packit Service 102278
		while (prog->next != NULL) {
Packit Service 102278
			prog = prog->next;
Packit Service 102278
		}
Packit Service 102278
		prog->next = new_external;
Packit Service 102278
	}
Packit Service 102278
	return 0;
Packit Service 102278
}