summaryrefslogtreecommitdiff
path: root/src/include/decision_graph.h
blob: f0f170fcd8a01af9a3955fc860d9e5dc1d6f93e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/**
 * Header file for eCryptfs decision graph
 * 
 * Copyright (C) 2004-2006 International Business Machines Corp.
 *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
 *              Trevor Highland <trevor.highland@gmail.com>
 *
 * The structs here are shared between kernel and userspace, so if you
 * are running a 64-bit kernel, you need to compile your userspace
 * applications as 64-bit binaries.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program 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
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 */

#ifndef DECISION_GRAPH_H
#define DECISION_GRAPH_H

#ifndef S_SPLINT_S
#include <stdio.h>
#endif

struct param_node;

struct val_node {
        void *val;
        struct val_node *next;
};

struct ecryptfs_ctx;

/**
 * transition_node
 * @val: If this value and the value set for the parent param_node
 *       match, then this transition_node is followed. This value is
 *       part of the transition_node's definition. For internal use
 *       only.
 * @pretty_val: The value displayed to the user.
 * @next_token: The param_node that we transition to if this
 *              transition_node is followed.
 * @trans_func: The function to execute when this transition node is
 *              followed.
 *
 * See src/libecryptfs/decision_graph.c::do_transition()
 *
 * If @val is set to NULL on definition, then this transition node
 * will be followed by default, no matter what the parent param_node's
 * val is set to.
 *
 * If @next_token is NULL, then @trans_func must be defined.
 *
 * If @trans_func is defined and returns NULL_TOK, then @next_token is
 * used as the next param_node.
 */
struct transition_node {
#define ECRYPTFS_TN_FLAG_REQ_FREE 0x00000001
	uint32_t flags;
        char *val;
        char *pretty_val;
        struct param_node *next_token;
        int (*trans_func)(struct ecryptfs_ctx *, struct param_node *,
			  struct val_node **, void **);
};

struct param_node {
#define NULL_TOK 1
#define DEFAULT_TOK 2
#define MOUNT_ERROR 3
#define WRONG_VALUE 4
        int num_mnt_opt_names;
#define MAX_NUM_MNT_OPT_NAMES 8
        char *mnt_opt_names[MAX_NUM_MNT_OPT_NAMES];
        char *prompt;
#define VAL_STR 0
#define VAL_HEX 1
        int val_type;
        char *val;
        char *default_val;
        char *suggested_val;
        void (*display_opts)(struct param_node *);
#define ECRYPTFS_PARAM_FLAG_ECHO_INPUT	   0x00000001
#define ECRYPTFS_PARAM_FLAG_MASK_OUTPUT    0x00000002
#define ECRYPTFS_ALLOW_IMPLICIT_TRANSITION 0x00000004
#define ECRYPTFS_PARAM_FLAG_NO_VALUE       0x00000008
#define DISPLAY_TRANSITION_NODE_VALS       0x00000010
#define VERIFY_VALUE			   0x00000020
#define STDIN_REQUIRED			   0x00000040
#define PARAMETER_SET			   0x00000080
#define ECRYPTFS_PARAM_FLAG_LOCK_MEM       0x00000100
#define ECRYPTFS_PARAM_FORCE_DISPLAY_NODES 0x00000200
#define ECRYPTFS_DISPLAY_PRETTY_VALS       0x00000400
#define ECRYPTFS_NO_AUTO_TRANSITION        0x00000800
#define ECRYPTFS_IMPLICIT_OVERRIDE_DEFAULT 0x00001000
#define ECRYPTFS_NONEMPTY_VALUE_REQUIRED   0x00002000
        uint32_t flags;
        int num_transitions;
#define MAX_NUM_TRANSITIONS 64
        struct transition_node tl[MAX_NUM_TRANSITIONS];
};

struct prompt_elem;

struct prompt_elem {
	char *str;
	struct prompt_elem *next;
};

int add_transition_node_to_param_node(struct param_node *param_node,
				      struct transition_node *trans_node);
void ecryptfs_dump_param_node(FILE *file_stream,
			      struct param_node *param_node, int depth,
			      int recursive);
void ecryptfs_dump_transition_node(FILE *file_stream,
				   struct transition_node *trans_node,
				   int depth, int recursive);
void ecryptfs_dump_decision_graph(FILE *file_stream,
				  struct param_node *param_node, int depth);
int ecryptfs_set_exit_param_on_graph(struct param_node *param_node,
				     struct param_node *exit_param_node);

struct ecryptfs_name_val_pair;

int ecryptfs_insert_params_in_subgraph(struct ecryptfs_name_val_pair *nvp,
				       struct transition_node *trans_node);
int eval_param_tree(struct ecryptfs_ctx *ctx, struct param_node *node,
		    struct ecryptfs_name_val_pair *nvp_head,
		    struct val_node **val_stack_head);

#endif