Subversion Repositories HelenOS

Rev

Rev 2643 | Rev 2796 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2627 jermar 1
/*
2793 jermar 2
 * Copyright (c) 2008 Jakub Jermar
2627 jermar 3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28
 
29
/** @addtogroup fs
30
 * @{
31
 */ 
32
 
33
/**
34
 * @file	fat_ops.c
35
 * @brief	Implementation of VFS operations for the FAT file system server.
36
 */
37
 
38
#include "fat.h"
2638 jermar 39
#include "../../vfs/vfs.h"
2793 jermar 40
#include <libfs.h>
2627 jermar 41
#include <ipc/ipc.h>
42
#include <async.h>
43
#include <errno.h>
2793 jermar 44
#include <string.h>
2627 jermar 45
 
2638 jermar 46
#define FAT_NAME_LEN		8
47
#define FAT_EXT_LEN		3
48
 
49
#define FAT_PAD			' ' 
50
 
51
#define FAT_DENTRY_UNUSED	0x00
52
#define FAT_DENTRY_E5_ESC	0x05
53
#define FAT_DENTRY_DOT		0x2e
54
#define FAT_DENTRY_ERASED	0xe5
55
 
2793 jermar 56
static void dentry_name_canonify(fat_dentry_t *d, char *buf)
2638 jermar 57
{
2793 jermar 58
	int i;
2639 jermar 59
 
2793 jermar 60
	for (i = 0; i < FAT_NAME_LEN; i++) {
61
		if (d->name[i] == FAT_PAD) {
62
			buf++;
63
			break;
2639 jermar 64
		}
2793 jermar 65
		if (d->name[i] == FAT_DENTRY_E5_ESC)
66
			*buf++ = 0xe5;
67
		else
68
			*buf++ = d->name[i];
69
	}
70
	if (d->ext[0] != FAT_PAD)
71
		*buf++ = '.';
72
	for (i = 0; i < FAT_EXT_LEN; i++) {
73
		if (d->ext[i] == FAT_PAD) {
74
			*buf = '\0';
75
			return;
76
		}
77
		if (d->ext[i] == FAT_DENTRY_E5_ESC)
78
			*buf++ = 0xe5;
79
		else
80
			*buf++ = d->ext[i];
81
	}
82
}
83
 
84
static fat_dentry_t *fat_dentry_get(fat_node_t *dirnode, unsigned idx)
85
{
86
	return NULL;	/* TODO */
87
}
88
 
89
static void fat_dentry_put(fat_dentry_t *dentry)
90
{
91
	/* TODO */
92
}
93
 
94
static void *fat_node_get(dev_handle_t dev_handle, fs_index_t index)
95
{
96
	return NULL;	/* TODO */
97
}
98
 
99
static void *fat_match(void *prnt, const char *component)
100
{
101
	fat_node_t *parentp = (fat_node_t *)prnt;
102
	char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1];
103
	unsigned i;
104
	unsigned dentries; 
105
	fat_dentry_t *d;
106
 
107
	dentries = parentp->size / sizeof(fat_dentry_t);
108
	for (i = 0; i < dentries; i++) {
109
		d = fat_dentry_get(parentp, i);
110
		if (d->attr & FAT_ATTR_VOLLABEL) {
111
			/* volume label entry */
112
			fat_dentry_put(d);
2639 jermar 113
			continue;
114
		}
2793 jermar 115
		if (d->name[0] == FAT_DENTRY_ERASED) {
116
			/* not-currently-used entry */
117
			fat_dentry_put(d);
118
			continue;
2639 jermar 119
		}
2793 jermar 120
		if (d->name[0] == FAT_DENTRY_UNUSED) {
121
			/* never used entry */
122
			fat_dentry_put(d);
123
			break;
124
		}
125
		if (d->name[0] == FAT_DENTRY_DOT) {
126
			/*
127
			 * Most likely '.' or '..'.
128
			 * It cannot occur in a regular file name.
129
			 */
130
			fat_dentry_put(d);
131
			continue;
132
		}
133
 
134
		dentry_name_canonify(d, name);
135
		if (strcmp(name, component) == 0) {
136
			/* hit */
137
			void *node = fat_node_get(parentp->dev_handle,
138
			    (fs_index_t)d->firstc);
139
			fat_dentry_put(d);
140
			return node;
141
 
142
		} else {
143
			/* miss */
144
			fat_dentry_put(d);
145
		}
2639 jermar 146
	}
2793 jermar 147
 
148
	return NULL;
2638 jermar 149
}
150
 
2793 jermar 151
/** libfs operations */
152
libfs_ops_t fat_libfs_ops = {
153
	.match = fat_match,
154
	.node_get = fat_node_get,
155
	.create = NULL,
156
	.destroy = NULL,
157
	.link = NULL,
158
	.unlink = NULL,
159
	.index_get = NULL,
160
	.size_get = NULL,
161
	.lnkcnt_get = NULL,
162
	.has_children = NULL,
163
	.root_get = NULL,
164
	.plb_get_char =	NULL,
165
	.is_directory = NULL,
166
	.is_file = NULL
167
};
168
 
2627 jermar 169
void fat_lookup(ipc_callid_t rid, ipc_call_t *request)
170
{
2793 jermar 171
	libfs_lookup(&fat_libfs_ops, fat_reg.fs_handle, rid, request);
2627 jermar 172
}
173
 
174
/**
175
 * @}
176
 */