summaryrefslogtreecommitdiffstats
path: root/include/linux/umsdos_fs.h
blob: b25f0c31e0b2ceaf21a043f034f5ce3174465734 (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
142
143
144
145
#ifndef LINUX_UMSDOS_FS_H
#define LINUX_UMSDOS_FS_H

#define UMSDOS_VERSION	0
#define UMSDOS_RELEASE	4

/* This is the file acting as a directory extension */
#define UMSDOS_EMD_FILE		"--linux-.---"
#define UMSDOS_EMD_NAMELEN	12
#define UMSDOS_PSDROOT_NAME	"linux"
#define UMSDOS_PSDROOT_LEN	5

#ifndef _LINUX_TYPES_H
#include <linux/types.h>
#endif
#ifndef _LINUX_DIRENT_H
#include <linux/dirent.h>
#endif
#ifndef _LINUX_IOCTL_H
#include <linux/ioctl.h>
#endif

struct umsdos_fake_info {
	char fname[13];
	int  len;
};

#define UMSDOS_MAXNAME	220
/* This structure is 256 bytes large, depending on the name, only part */
/* of it is written to disk */
struct umsdos_dirent {
	unsigned char name_len;	/* if == 0, then this entry is not used */
	unsigned char  flags;	/* UMSDOS_xxxx */
	unsigned short nlink;	/* How many hard links point to this entry */
	uid_t		 uid;		/* Owner user id */
	gid_t		 gid;		/* Group id */
	time_t		atime;		/* Access time */
	time_t		mtime;		/* Last modification time */
	time_t		ctime;		/* Creation time */
	dev_t		rdev;		/* major and minor number of a device */
							/* special file */
	umode_t		mode;		/* Standard UNIX permissions bits + type of */
	char	spare[12];		/* unused bytes for future extensions */
							/* file, see linux/stat.h */
	char name[UMSDOS_MAXNAME];	/* Not '\0' terminated */
							/* but '\0' padded, so it will allow */
							/* for adding news fields in this record */
							/* by reducing the size of name[] */
};
#define UMSDOS_HIDDEN	1	/* Never show this entry in directory search */
#define UMSDOS_HLINK	2	/* It is a (pseudo) hard link */

/* #Specification: EMD file / record size
	Entry are 64 bytes wide in the EMD file. It allows for a 30 characters
	name. If a name is longer, contiguous entries are allocated. So a
	umsdos_dirent may span multiple records.
*/
#define UMSDOS_REC_SIZE		64

/* Translation between MSDOS name and UMSDOS name */
struct umsdos_info{
	int msdos_reject;	/* Tell if the file name is invalid for MSDOS */
						/* See umsdos_parse */
	struct umsdos_fake_info fake;
	struct umsdos_dirent entry;
	off_t f_pos;		/* offset of the entry in the EMD file */
						/* or offset where the entry may be store */
						/* if it is a new entry */
	int recsize;		/* Record size needed to store entry */
};

/* Definitions for ioctl (number randomly chosen) */
/* The next ioctl commands operate only on the DOS directory */
/* The file umsdos_progs/umsdosio.c contain a string table */
/* based on the order of those definition. Keep it in sync */
#define UMSDOS_READDIR_DOS _IO(0x04,210) /* Do a readdir of the DOS directory */
#define UMSDOS_UNLINK_DOS  _IO(0x04,211) /* Erase in the DOS directory only */
#define UMSDOS_RMDIR_DOS   _IO(0x04,212) /* rmdir in the DOS directory only */
#define UMSDOS_STAT_DOS    _IO(0x04,213) /* Get info about a file */
/* The next ioctl commands operate only on the EMD file */
#define UMSDOS_CREAT_EMD   _IO(0x04,214) /* Create a file */
#define UMSDOS_UNLINK_EMD  _IO(0x04,215) /* unlink (rmdir) a file */
#define UMSDOS_READDIR_EMD _IO(0x04,216) /* read the EMD file only. */
#define UMSDOS_GETVERSION  _IO(0x04,217) /* Get the release number of UMSDOS */
#define UMSDOS_INIT_EMD    _IO(0x04,218) /* Create the EMD file if not there */
#define UMSDOS_DOS_SETUP   _IO(0x04,219) /* Set the defaults of the MsDOS driver */

#define UMSDOS_RENAME_DOS  _IO(0x04,220) /* rename a file/directory in the DOS */
									/* directory only */
struct umsdos_ioctl{
	struct dirent dos_dirent;
	struct umsdos_dirent umsdos_dirent;
	/* The following structure is used to exchange some data */
	/* with utilities (umsdos_progs/util/umsdosio.c). The first */
	/* releases were using struct stat from "sys/stat.h". This was */
	/* causing some problem for cross compilation of the kernel */
	/* Since I am not really using the structure stat, but only some field */
	/* of it, I have decided to replicate the structure here */
	/* for compatibility with the binaries out there */
	struct {
		dev_t		st_dev;
		unsigned short	__pad1;
		ino_t		st_ino;
		umode_t		st_mode;
		nlink_t		st_nlink;
		uid_t		st_uid;
		gid_t		st_gid;
		dev_t		st_rdev;
		unsigned short	__pad2;
		off_t		st_size;
		unsigned long	st_blksize;
		unsigned long	st_blocks;
		time_t		st_atime;
		unsigned long	__unused1;
		time_t		st_mtime;
		unsigned long	__unused2;
		time_t		st_ctime;
		unsigned long	__unused3;
		unsigned long	__unused4;
		unsigned long	__unused5;
	}stat;
	char version,release;
};

/* Different macros to access struct umsdos_dirent */
#define EDM_ENTRY_ISUSED(e) ((e)->name_len!=0)

#ifdef __KERNEL__

#ifndef LINUX_FS_H
#include <linux/fs.h>
#endif

extern struct inode_operations umsdos_dir_inode_operations;
extern struct file_operations  umsdos_file_operations;
extern struct inode_operations umsdos_file_inode_operations;
extern struct inode_operations umsdos_file_inode_operations_no_bmap;
extern struct inode_operations umsdos_symlink_inode_operations;
extern int init_umsdos_fs(void);

#include <linux/umsdos_fs.p>

#endif /* __KERNEL__ */

#endif