File: fs.h

package info (click to toggle)
criu 4.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,584 kB
  • sloc: ansic: 139,280; python: 7,484; sh: 3,824; java: 2,799; makefile: 2,659; asm: 1,137; perl: 206; xml: 117; exp: 45
file content (77 lines) | stat: -rw-r--r-- 2,105 bytes parent folder | download | duplicates (4)
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
#ifndef ZDTM_FS_H_
#define ZDTM_FS_H_

#ifndef _BSD_SOURCE
#define _BSD_SOURCE
#endif

#include <sys/types.h>
#include <sys/sysmacros.h>

#include <limits.h>

#define KDEV_MINORBITS 20
#define KDEV_MINORMASK ((1UL << KDEV_MINORBITS) - 1)
#define MKKDEV(ma, mi) (((ma) << KDEV_MINORBITS) | (mi))

static inline unsigned int kdev_major(unsigned int kdev)
{
	return kdev >> KDEV_MINORBITS;
}

static inline unsigned int kdev_minor(unsigned int kdev)
{
	return kdev & KDEV_MINORMASK;
}

static inline dev_t kdev_to_odev(unsigned int kdev)
{
	/*
	 * New kernels encode devices in a new form.
	 * See kernel's fs/stat.c for details, there
	 * choose_32_64 helpers which are the key.
	 */
	unsigned major = kdev_major(kdev);
	unsigned minor = kdev_minor(kdev);

	return makedev(major, minor);
}

typedef struct {
	int mnt_id;
	int parent_mnt_id;
	unsigned int s_dev;
	char root[PATH_MAX];
	char mountpoint[PATH_MAX];
	char fsname[64];
} mnt_info_t;

extern mnt_info_t *mnt_info_alloc(void);
extern void mnt_info_free(mnt_info_t **m);
extern mnt_info_t *get_cwd_mnt_info(void);

/*
 * get_cwd_check_perm is called to check that cwd is actually usable for a calling
 * process.
 *
 * Example output of a stat command on a '/root' path shows file access bits:
 * > stat /root
 * File: ‘/root’
 *   ...
 *   Access: (0550/dr-xr-x---) Uid: (  0/root)   Gid: (  0/root)
 *                          ^- no 'x' bit for other
 *
 * Here we can see that '/root' dir (that often can be part of cwd path) does not
 * allow non-root user and non-root group to list contents of this directory.
 * Calling process matching 'other' access category may succeed getting cwd path, but will
 * fail performing further filesystem operations based on this path with confusing errors.
 *
 * This function calls get_current_dir_name and explicitly checks that bit 'x' is enabled for
 * a calling process and logs the error.
 *
 * If check passes, stores get_current_dir's result in *result and returns 0
 * If check fails, stores 0 in *result and returns -1
 */
extern int get_cwd_check_perm(char **result);

#endif /* ZDTM_FS_H_ */