Home | History | Annotate | Download | only in src
      1 /* Copyright (C) 2005 Red Hat, Inc. */
      2 
      3 struct semanage_user_extra;
      4 struct semanage_user_key;
      5 typedef struct semanage_user_extra record_t;
      6 typedef struct semanage_user_key record_key_t;
      7 #define DBASE_RECORD_DEFINED
      8 
      9 struct dbase_file;
     10 typedef struct dbase_file dbase_t;
     11 #define DBASE_DEFINED
     12 
     13 #include <stdlib.h>
     14 #include <stdio.h>
     15 #include <strings.h>
     16 
     17 #include "user_internal.h"
     18 #include "database_file.h"
     19 #include "parse_utils.h"
     20 #include "debug.h"
     21 #include "handle.h"
     22 
     23 static int user_extra_print(semanage_handle_t * handle,
     24 			    semanage_user_extra_t * user_extra, FILE * str)
     25 {
     26 
     27 	const char *name = semanage_user_extra_get_name(user_extra);
     28 	const char *prefix = semanage_user_extra_get_prefix(user_extra);
     29 
     30 	if (fprintf(str, "user %s prefix %s;\n", name, prefix) < 0)
     31 		goto err;
     32 
     33 	return STATUS_SUCCESS;
     34 
     35       err:
     36 	ERR(handle, "could not print user extra data "
     37 	    "for %s to stream", name);
     38 	return STATUS_ERR;
     39 }
     40 
     41 static int user_extra_parse(semanage_handle_t * handle,
     42 			    parse_info_t * info,
     43 			    semanage_user_extra_t * user_extra)
     44 {
     45 
     46 	char *str = NULL;
     47 
     48 	if (parse_skip_space(handle, info) < 0)
     49 		goto err;
     50 	if (!info->ptr)
     51 		goto last;
     52 
     53 	/* User string */
     54 	if (parse_assert_str(handle, info, "user") < 0)
     55 		goto err;
     56 	if (parse_assert_space(handle, info) < 0)
     57 		goto err;
     58 
     59 	/* Extract name */
     60 	if (parse_fetch_string(handle, info, &str, ' ') < 0)
     61 		goto err;
     62 	if (semanage_user_extra_set_name(handle, user_extra, str) < 0)
     63 		goto err;
     64 	free(str);
     65 	str = NULL;
     66 
     67 	/* Prefix string */
     68 	if (parse_assert_space(handle, info) < 0)
     69 		goto err;
     70 	if (parse_assert_str(handle, info, "prefix") < 0)
     71 		goto err;
     72 	if (parse_assert_space(handle, info) < 0)
     73 		goto err;
     74 
     75 	/* Extract prefix */
     76 	if (parse_fetch_string(handle, info, &str, ';') < 0)
     77 		goto err;
     78 	if (semanage_user_extra_set_prefix(handle, user_extra, str) < 0)
     79 		goto err;
     80 	free(str);
     81 	str = NULL;
     82 
     83 	/* Semicolon */
     84 	if (parse_skip_space(handle, info) < 0)
     85 		goto err;
     86 	if (parse_assert_ch(handle, info, ';') < 0)
     87 		goto err;
     88 
     89 	return STATUS_SUCCESS;
     90 
     91       last:
     92 	parse_dispose_line(info);
     93 	return STATUS_NODATA;
     94 
     95       err:
     96 	ERR(handle, "could not parse user extra data");
     97 	free(str);
     98 	parse_dispose_line(info);
     99 	return STATUS_ERR;
    100 }
    101 
    102 /* USER EXTRA RECORD: FILE extension: method table */
    103 record_file_table_t SEMANAGE_USER_EXTRA_FILE_RTABLE = {
    104 	.parse = user_extra_parse,
    105 	.print = user_extra_print,
    106 };
    107 
    108 int user_extra_file_dbase_init(semanage_handle_t * handle,
    109 			       const char *path_ro,
    110 			       const char *path_rw,
    111 			       dbase_config_t * dconfig)
    112 {
    113 
    114 	if (dbase_file_init(handle,
    115 			    path_ro,
    116 			    path_rw,
    117 			    &SEMANAGE_USER_EXTRA_RTABLE,
    118 			    &SEMANAGE_USER_EXTRA_FILE_RTABLE,
    119 			    &dconfig->dbase) < 0)
    120 		return STATUS_ERR;
    121 
    122 	dconfig->dtable = &SEMANAGE_FILE_DTABLE;
    123 	return STATUS_SUCCESS;
    124 }
    125 
    126 void user_extra_file_dbase_release(dbase_config_t * dconfig)
    127 {
    128 
    129 	dbase_file_release(dconfig->dbase);
    130 }
    131