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
 */