Changeset 2b20947 in mainline
- Timestamp:
- 2007-09-15T14:47:57Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a0edf5f
- Parents:
- d0b72c4
- Location:
- uspace
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/include/ctype.h
rd0b72c4 r2b20947 36 36 #define LIBC_CTYPE_H_ 37 37 38 static inline int islower(int c) 39 { 40 return ((c >= 'a') && (c <= 'z')); 41 } 42 43 static inline int isupper(int c) 44 { 45 return ((c >= 'A') && (c <= 'Z')); 46 } 47 38 48 static inline int isalpha(int c) 39 49 { 40 return ( ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));50 return (islower(c) || isupper(c)); 41 51 } 42 52 -
uspace/lib/libc/include/libadt/hash_table.h
rd0b72c4 r2b20947 56 56 /** Hash function. 57 57 * 58 * @param key Array of keys needed to compute hash index. All keys must be passed. 58 * @param key Array of keys needed to compute hash index. All keys 59 * must be passed. 59 60 * 60 * @return 61 * @return Index into hash table. 61 62 */ 62 63 hash_index_t (* hash)(unsigned long key[]); … … 64 65 /** Hash table item comparison function. 65 66 * 66 * @param key Array of keys that will be compared with item. It is not necessary to pass all keys. 67 * @param key Array of keys that will be compared with item. It is 68 * not necessary to pass all keys. 67 69 * 68 * @return true if the keys match, false otherwise.70 * @return true if the keys match, false otherwise. 69 71 */ 70 72 int (*compare)(unsigned long key[], hash_count_t keys, link_t *item); … … 72 74 /** Hash table item removal callback. 73 75 * 74 * @param item Item that was removed from the hash table.76 * @param item Item that was removed from the hash table. 75 77 */ 76 78 void (*remove_callback)(link_t *item); -
uspace/srv/vfs/vfs.c
rd0b72c4 r2b20947 41 41 #include <errno.h> 42 42 #include <stdlib.h> 43 #include <string.h> 44 #include <ctype.h> 43 45 #include <bool.h> 46 #include <futex.h> 47 #include <libadt/list.h> 44 48 #include "vfs.h" 45 49 50 atomic_t fs_head_futex = FUTEX_INITIALIZER; 51 link_t fs_head; 52 46 53 /** Verify the VFS info structure. 47 54 * … … 50 57 * @return Non-zero if the info structure is sane, zero otherwise. 51 58 */ 52 static int vfs_info_sane(vfs_info_t *info) 53 { 54 return 1; /* XXX */ 59 static bool vfs_info_sane(vfs_info_t *info) 60 { 61 int i; 62 63 /* 64 * Check if the name is non-empty and is composed solely of ASCII 65 * characters [a-z]+[a-z0-9_-]*. 66 */ 67 if (!islower(info->name[0])) 68 return false; 69 for (i = 1; i < FS_NAME_MAXLEN; i++) { 70 if (!(islower(info->name[i]) || isdigit(info->name[i])) && 71 (info->name[i] != '-') && (info->name[i] != '_')) { 72 if (info->name[i] == '\0') 73 break; 74 else 75 return false; 76 } 77 } 78 79 80 /* 81 * Check if the FS implements mandatory VFS operations. 82 */ 83 if (info->ops[IPC_METHOD_TO_VFS_OP(VFS_REGISTER)] != VFS_OP_DEFINED) 84 return false; 85 if (info->ops[IPC_METHOD_TO_VFS_OP(VFS_MOUNT)] != VFS_OP_DEFINED) 86 return false; 87 if (info->ops[IPC_METHOD_TO_VFS_OP(VFS_UNMOUNT)] != VFS_OP_DEFINED) 88 return false; 89 if (info->ops[IPC_METHOD_TO_VFS_OP(VFS_OPEN)] != VFS_OP_DEFINED) 90 return false; 91 if (info->ops[IPC_METHOD_TO_VFS_OP(VFS_CLOSE)] != VFS_OP_DEFINED) 92 return false; 93 if (info->ops[IPC_METHOD_TO_VFS_OP(VFS_READ)] != VFS_OP_DEFINED) 94 return false; 95 96 /* 97 * Check if each operation is either not defined, defined or default. 98 */ 99 for (i = VFS_FIRST; i < VFS_LAST; i++) { 100 if ((IPC_METHOD_TO_VFS_OP(i) != VFS_OP_NULL) && 101 (IPC_METHOD_TO_VFS_OP(i) != VFS_OP_DEFAULT) && 102 (IPC_METHOD_TO_VFS_OP(i) != VFS_OP_DEFINED)) 103 return false; 104 } 105 return true; 55 106 } 56 107 … … 81 132 82 133 /* 83 * We know the size of the info structure. See if the client understands84 * this easy concept too.134 * We know the size of the VFS info structure. See if the client 135 * understands this easy concept too. 85 136 */ 86 137 if (size != sizeof(vfs_info_t)) { … … 93 144 return; 94 145 } 95 vfs_info_t *info;96 97 /* 98 * Allocate a buffer for theinfo structure.99 */ 100 info = (vfs_info_t *) malloc(sizeof(vfs_info_t));101 if (! info) {146 fs_info_t *fs_info; 147 148 /* 149 * Allocate and initialize a buffer for the fs_info structure. 150 */ 151 fs_info = (fs_info_t *) malloc(sizeof(fs_info_t)); 152 if (!fs_info) { 102 153 ipc_answer_fast(callid, ENOMEM, 0, 0); 103 154 ipc_answer_fast(rid, ENOMEM, 0, 0); 104 155 return; 105 156 } 106 107 rc = ipc_data_send_answer(callid, &call, info, size); 157 link_initialize(&fs_info->fs_link); 158 159 rc = ipc_data_send_answer(callid, &call, &fs_info->vfs_info, size); 108 160 if (!rc) { 109 free( info);161 free(fs_info); 110 162 ipc_answer_fast(callid, rc, 0, 0); 111 163 ipc_answer_fast(rid, rc, 0, 0); … … 113 165 } 114 166 115 if (!vfs_info_sane( info)) {116 free( info);167 if (!vfs_info_sane(&fs_info->vfs_info)) { 168 free(fs_info); 117 169 ipc_answer_fast(callid, EINVAL, 0, 0); 118 170 ipc_answer_fast(rid, EINVAL, 0, 0); … … 120 172 } 121 173 174 futex_down(&fs_head_futex); 175 176 /* 177 * Check for duplicit registrations. 178 */ 179 link_t *cur; 180 for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { 181 fs_info_t *fi = list_get_instance(cur, fs_info_t, 182 fs_link); 183 /* TODO: replace strcmp with strncmp once we have it */ 184 if (strcmp(fs_info->vfs_info.name, fi->vfs_info.name) == 0) { 185 /* 186 * We already register a fs like this. 187 */ 188 futex_up(&fs_head_futex); 189 free(fs_info); 190 ipc_answer_fast(callid, EEXISTS, 0, 0); 191 ipc_answer_fast(rid, EEXISTS, 0, 0); 192 return; 193 } 194 } 195 196 /* 197 * TODO: 198 * 1. send the client the IPC_M_CONNECT_TO_ME call so that it makes a 199 * callback connection. 200 * 2. add the fs_info into fs_head 201 */ 202 203 futex_up(&fs_head_futex); 122 204 } 123 205 … … 178 260 ipcarg_t phonead; 179 261 262 list_initialize(&fs_head); 180 263 async_set_client_connection(vfs_connection); 181 264 ipc_connect_to_me(PHONE_NS, SERVICE_VFS, 0, &phonead); -
uspace/srv/vfs/vfs.h
rd0b72c4 r2b20947 38 38 #define VFS_FIRST FIRST_USER_METHOD 39 39 40 #define IPC_METHOD_TO_VFS_OP(m) ((m) - VFS_FIRST) 41 40 42 typedef enum { 41 43 VFS_REGISTER = VFS_FIRST, … … 73 75 typedef struct { 74 76 /** Unique identifier of the fs. */ 75 char fs_name[FS_NAME_MAXLEN];77 char name[FS_NAME_MAXLEN]; 76 78 77 79 /** Operations. */ 78 80 vfs_op_t ops[VFS_LAST - VFS_FIRST]; 79 81 } vfs_info_t; 82 83 typedef struct { 84 link_t fs_link; 85 vfs_info_t vfs_info; 86 } fs_info_t; 80 87 81 88 #endif
Note:
See TracChangeset
for help on using the changeset viewer.