File: hashtable.h

package info (click to toggle)
vuos 0.9.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,616 kB
  • sloc: ansic: 22,155; python: 284; makefile: 28; sh: 4
file content (109 lines) | stat: -rw-r--r-- 4,224 bytes parent folder | download
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
#ifndef HASHTABLE_H
#define HASHTABLE_H
#include <stdio.h>
#include <epoch.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mount.h>

/* This hashtable data structure has a central role in umvu.
 * A module adds a hashtable entry to start a virtualization.
 * e.g. if it adds a CHECKPATH element it means that the module
 * virtualizes a subtree of the file system, if it adds
 * a CHECKSOCKET it virtualizes an address family */
struct vuht_entry_t;
struct vu_service_t;

#define PSEUDO_CHECK 0x80

/* Supported object types */
#define CHECKMODULE 0        // Module name
#define CHECKPATH 1          // Path
#define CHECKSOCKET 2        // Address Family
#define CHECKCHRDEVICE 3     // chr device maj/min
#define CHECKBLKDEVICE 4     // blk device
#define CHECKSC 5            // Syscall #
#define CHECKIOCTL 6         // ioctl request
#define CHECKBINFMT 7        // Binfmt search
#define CHECKFSALIAS 8       // FSAlias (just a string->string matching)
#define NCHECKS 9
#define CHECKFSTYPE (PSEUDO_CHECK | CHECKMODULE)
#define CHECKPATHEXACT (PSEUDO_CHECK | CHECKPATH)

#define SET_EPOCH 1
#define NEGATIVE_MOUNT ((confirmfun_t)1)

#define VUFLAG_PERMANENT 1
#define VUFLAG_PREFIX    2

/* hashtable elements may have exception. when a confirm function
	 is defined (as an argument adding the hashtable element) that
	 confirm function is called prior to confirm each match */
typedef int (*confirmfun_t)(uint8_t type, void *arg, int arglen,
		struct vuht_entry_t *ht);

/* add an element to the hashtable */
/* confirmfun is a cleanup function for CHECKMODULE */
struct vuht_entry_t *vuht_add(uint8_t type, const void *obj, int objlen,
		struct vu_service_t *service, int vuflags,
		confirmfun_t confirmfun, void *private_data);

/* add a path element to the hashtable: This function is similar to vuht_add
 * extra parameters are provided to generate teh mounttab line (see /proc/mounts) */
struct vuht_entry_t *vuht_pathadd(uint8_t type, const char *source,
		const char *path, const char *fstype,
		unsigned long mountflags, const char *mountopts,
		struct vu_service_t *service, int vuflags,
		confirmfun_t confirmfun, void *private_data);

/* del takes the element out from the data structure.... */
/* supported flags: MNT_FORCE MNT_DETACH (both provide
	 immediate detach and lazy delete) */
int vuht_del(struct vuht_entry_t *hte, int umountflags);

/* pick searches an entry in this hashtable.
	 pick and drop respectively increment/decrement the usage count
	 of the hashtable element to check if it is in use and to implemented
	 delayed delection */
struct vuht_entry_t *vuht_pick(uint8_t type, void *arg, struct stat *st, int setepoch);

/* increment the usage count of the hash table element */
void vuht_pick_again(struct vuht_entry_t *hte);

/* decrement the usage count of the hash table element.
 * the element is deallocated when count is 0 */
void vuht_drop(struct vuht_entry_t *hte);

void forall_vuht_do(uint8_t type,
		void (*fun)(struct vuht_entry_t *ht, void *arg),
		void *arg);

/* write the mount table in f.
	 It is in the format of /proc/mounts or /etc/mtab */
void vuht_get_mtab(FILE *f);

/* return the object i.e. the key of hte */
const void *vuht_get_obj(struct vuht_entry_t *hte);

/* modules get the relative path to the mountpoint
	 this function converts paths to paths-for-modules (mpaths) */
const char *vuht_path2mpath(struct vuht_entry_t *hte, const char *path);

/* each hashtable entry has a private data field */
void *vuht_get_private_data(struct vuht_entry_t *hte);
void vuht_set_private_data(struct vuht_entry_t *hte, void *private_data);

/* set the cleanup function for modules */
void vuht_set_service_cleanupfun(struct vuht_entry_t *hte, confirmfun_t cleanup_fun);

/* change the epoch of a hashtable entry to the current epoch (it this useful? )*/
// void vuht_renew(struct vuht_entry_t *hte);
//char *vuht_get_servicename(struct vuht_entry_t *hte);
struct vu_service_t *vuht_get_service(struct vuht_entry_t *hte);
unsigned long vuht_get_mountflags(struct vuht_entry_t *hte);
epoch_t vuht_get_vepoch(struct vuht_entry_t *hte);
int vuht_get_count(struct vuht_entry_t *hte);
int vuht_get_objlen(struct vuht_entry_t *hte);

void vuht_terminate();
#endif