uc-sdk
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
filesystem.c
Go to the documentation of this file.
1 #include "filesystem.h"
2 #include "fio.h"
3 #include "osdebug.h"
4 
5 #include <stdint.h>
6 #include <string.h>
7 #include <hash-djb2.h>
8 
9 #define MAX_FS 16
10 
11 struct fs_t {
12  uint32_t hash;
14  void * opaque;
15 };
16 
17 static struct fs_t fss[MAX_FS];
18 
19 __attribute__((constructor)) void fs_init() {
20  memset(fss, 0, sizeof(fss));
21 }
22 
23 int register_fs(const char * mountpoint, fs_open_t callback, void * opaque) {
24  int i;
25  DBGOUT("register_fs(\"%s\", %p, %p)\r\n", mountpoint, callback, opaque);
26 
27  for (i = 0; i < MAX_FS; i++) {
28  if (!fss[i].cb) {
29  fss[i].hash = hash_djb2((const uint8_t *) mountpoint, -1);
30  fss[i].cb = callback;
31  fss[i].opaque = opaque;
32  return 0;
33  }
34  }
35 
36  return -1;
37 }
38 
39 int fs_open(const char * path, int flags, int mode) {
40  const char * slash;
41  uint32_t hash;
42  int i;
43 // DBGOUT("fs_open(\"%s\", %i, %i)\r\n", path, flags, mode);
44 
45  while (path[0] == '/')
46  path++;
47 
48  slash = strchr(path, '/');
49 
50  if (!slash)
51  return -2;
52 
53  hash = hash_djb2((const uint8_t *) path, slash - path);
54  path = slash + 1;
55 
56  for (i = 0; i < MAX_FS; i++) {
57  if (fss[i].hash == hash)
58  return fss[i].cb(fss[i].opaque, path, flags, mode);
59  }
60 
61  return -2;
62 }