src/server/daemon/vfs.c

Wed, 05 Jun 2024 19:50:44 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 05 Jun 2024 19:50:44 +0200
changeset 537
ad44e72fbf50
parent 490
d218607f5a7e
permissions
-rw-r--r--

add extra nullptr check in the event loop to handle the case when the finish ptr is set to NULL after it was already scheduled

54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2013 Olaf Wintermann. All rights reserved.
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
105
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
29 #define _POSIX_PTHREAD_SEMANTIS
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
30
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <stdio.h>
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <stdlib.h>
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <unistd.h>
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include <sys/types.h>
172
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
35 #include <aio.h>
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
36 #include <cx/hash_map.h>
92
382bff43c6eb fixed some includes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 87
diff changeset
37
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 #include "../util/pool.h"
171
af7e2d80dee6 adds wrapper for close syscall with error handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
39 #include "netsite.h"
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
40 #include "acl.h"
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 #include "vfs.h"
187
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
42 #include "threadpools.h"
172
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
43 #include "event.h"
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
45 #define VFS_MALLOC(pool, size) pool ? pool_malloc(pool, size) : malloc(size)
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
46 #define VFS_FREE(pool, ptr) pool ? pool_free(pool, ptr) : free(ptr)
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
47
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
48 static CxMap *vfs_type_map;
59
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
49
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
50 static VFS sys_vfs = {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
51 sys_vfs_open,
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
52 sys_vfs_stat,
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
53 sys_vfs_fstat,
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
54 sys_vfs_opendir,
211
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
55 sys_vfs_fdopendir,
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
56 sys_vfs_mkdir,
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
57 sys_vfs_unlink,
247
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
58 sys_vfs_rmdir,
211
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
59 VFS_CHECKS_ACL,
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
60 NULL
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
61 };
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
62
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 static VFS_IO sys_file_io = {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 sys_file_read,
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 sys_file_write,
189
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
66 sys_file_pread,
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
67 sys_file_pwrite,
66
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
68 sys_file_seek,
172
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
69 sys_file_close,
187
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
70 //sys_file_aioread,
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
71 //sys_file_aiowrite,
345
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
72 NULL, // aioread
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
73 NULL, // aiowrite
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
74 NULL // getetag
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 };
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
77 static VFS_DIRIO sys_dir_io = {
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
78 sys_dir_read,
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
79 sys_dir_close
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
80 };
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
81
289
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 286
diff changeset
82 int vfs_init(void) {
490
d218607f5a7e update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 486
diff changeset
83 vfs_type_map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16);
276
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
84 if(!vfs_type_map) {
59
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
85 return -1;
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
86 }
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
87 return 0;
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
88 }
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
89
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
90 int vfs_register_type(const char *name, vfs_init_func vfsInit, vfs_create_func vfsCreate) {
87
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
91 WS_ASSERT(name);
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
92
276
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
93 if(!vfs_type_map) {
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
94 if(vfs_init()) {
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
95 return 1;
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
96 }
59
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
97 }
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
98
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
99 VfsType *vfsType = malloc(sizeof(VfsType));
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
100 if(!vfsType) {
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
101 return 1;
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
102 }
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
103 vfsType->init = vfsInit;
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
104 vfsType->create = vfsCreate;
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
105
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
106 return cxMapPut(vfs_type_map, cx_hash_key_str(name), vfsType);
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
107 }
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
108
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
109 VfsType* vfs_get_type(cxstring vfs_class) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
110 return cxMapGet(vfs_type_map, cx_hash_key_bytes((const unsigned char*)vfs_class.ptr, vfs_class.length));
59
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
111 }
ab25c0a231d0 some fixes and new public APIs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 58
diff changeset
112
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
113 void* vfs_init_backend(ServerConfiguration *cfg, pool_handle_t *pool, VfsType *vfs_class, WSConfigNode *config, int *error) {
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
114 *error = 0;
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
115 if(vfs_class->init) {
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
116 void *initData = vfs_class->init(cfg, pool, config);
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
117 if(!initData) {
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
118 *error = 1;
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
119 }
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
120 return initData;
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
121 } else {
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
122 return NULL;
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
123 }
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
124 }
277
7608af69739f add support for vfsclass parameter in nametrans safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
125
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
126 VFS* vfs_create(Session *sn, Request *rq, const char *vfs_class, pblock *pb, void *initData) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
127 VfsType *vfsType = cxMapGet(vfs_type_map, cx_hash_key_str(vfs_class));
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
128 if(!vfsType) {
277
7608af69739f add support for vfsclass parameter in nametrans safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
129 log_ereport(LOG_MISCONFIG, "vfs_create: unkown VFS type %s", vfs_class);
7608af69739f add support for vfsclass parameter in nametrans safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
130 return NULL;
7608af69739f add support for vfsclass parameter in nametrans safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
131 }
7608af69739f add support for vfsclass parameter in nametrans safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
132
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
133 return vfsType->create(sn, rq, pb, initData);
277
7608af69739f add support for vfsclass parameter in nametrans safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
134 }
7608af69739f add support for vfsclass parameter in nametrans safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
135
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 VFSContext* vfs_request_context(Session *sn, Request *rq) {
87
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
137 WS_ASSERT(sn);
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
138 WS_ASSERT(rq);
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
139
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 VFSContext *ctx = pool_malloc(sn->pool, sizeof(VFSContext));
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
141 if(!ctx) {
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
142 return NULL;
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
143 }
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 ctx->sn = sn;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 ctx->rq = rq;
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
146 ctx->vfs = rq->vfs ? rq->vfs : &sys_vfs;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 ctx->user = acllist_getuser(sn, rq, rq->acllist);
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 ctx->acllist = rq->acllist;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 ctx->aclreqaccess = rq->aclreqaccess;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 ctx->pool = sn->pool;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 ctx->vfs_errno = 0;
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
152 ctx->error_response_set = 0;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 return ctx;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
156 SYS_FILE vfs_open(VFSContext *ctx, const char *path, int oflags) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
157 WS_ASSERT(ctx);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
158 WS_ASSERT(path);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
159
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
160 uint32_t access_mask = ctx->aclreqaccess | acl_oflag2mask(oflags);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
161
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
162 // ctx->aclreqaccess should be the complete access mask
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
163 uint32_t m = ctx->aclreqaccess; // save original access mask
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
164 ctx->aclreqaccess = access_mask; // set mask for vfs->open call
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
165 if((ctx->vfs->flags & VFS_CHECKS_ACL) != VFS_CHECKS_ACL) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
166 // VFS does not evaluates the ACL itself, so we have to do it here
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
167 SysACL sysacl;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
168 if(sys_acl_check(ctx, access_mask, &sysacl)) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
169 return NULL;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
170 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
171 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
172 SYS_FILE file = ctx->vfs->open(ctx, path, oflags);
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
173 ctx->aclreqaccess = m; // restore original access mask
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
174 if(!file && ctx) {
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
175 sys_set_error_status(ctx);
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
176 }
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
177 return file;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
178 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
179
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
180 SYS_FILE vfs_openRO(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
181 return vfs_open(ctx, path, O_RDONLY);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
182 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
183
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
184 SYS_FILE vfs_openWO(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
185 return vfs_open(ctx, path, O_WRONLY | O_CREAT);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
186 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
187
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
188 SYS_FILE vfs_openRW(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
189 return vfs_open(ctx, path, O_RDONLY | O_WRONLY | O_CREAT);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
190 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
191
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
192 int vfs_stat(VFSContext *ctx, const char *path, struct stat *buf) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
193 WS_ASSERT(ctx);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
194 WS_ASSERT(path);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
195
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
196 uint32_t access_mask = ctx->aclreqaccess | ACL_READ_ATTRIBUTES;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
197
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
198 // ctx->aclreqaccess should be the complete access mask
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
199 uint32_t m = ctx->aclreqaccess; // save original access mask
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
200 ctx->aclreqaccess = access_mask; // set mask for vfs->open call
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
201 if((ctx->vfs->flags & VFS_CHECKS_ACL) != VFS_CHECKS_ACL) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
202 // VFS does not evaluates the ACL itself, so we have to do it here
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
203 SysACL sysacl;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
204 if(sys_acl_check(ctx, access_mask, &sysacl)) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
205 return -1;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
206 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
207 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
208 int ret = ctx->vfs->stat(ctx, path, buf);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
209 ctx->aclreqaccess = m; // restore original access mask
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
210 if(ret && ctx) {
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
211 sys_set_error_status(ctx);
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
212 }
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
213 return ret;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
214 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
215
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
216 int vfs_fstat(VFSContext *ctx, SYS_FILE fd, struct stat *buf) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
217 WS_ASSERT(ctx);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
218 WS_ASSERT(fd);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
219 WS_ASSERT(buf);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
220
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
221 int ret = ctx->vfs->fstat(ctx, fd, buf);
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
222 if(ret && ctx) {
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
223 sys_set_error_status(ctx);
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
224 }
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
225 return ret;
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
226 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
227
345
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
228 const char * vfs_getetag(SYS_FILE fd) {
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
229 WS_ASSERT(fd);
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
230
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
231 if(fd->io->opt_getetag) {
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
232 return fd->io->opt_getetag(fd);
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
233 }
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
234 return NULL;
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
235 }
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
236
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
237 void vfs_close(SYS_FILE fd) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
238 WS_ASSERT(fd);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
239
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
240 fd->io->close(fd);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
241 if(fd->ctx) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
242 pool_free(fd->ctx->pool, fd);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
243 } else {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
244 free(fd);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
245 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
246 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
247
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
248 VFS_DIR vfs_opendir(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
249 WS_ASSERT(ctx);
87
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
250 WS_ASSERT(path);
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
251
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
252 uint32_t access_mask = ctx->aclreqaccess | ACL_LIST;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
253
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
254 // ctx->aclreqaccess should be the complete access mask
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
255 uint32_t m = ctx->aclreqaccess; // save original access mask
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
256 ctx->aclreqaccess = access_mask; // set mask for vfs->open call
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
257 if((ctx->vfs->flags & VFS_CHECKS_ACL) != VFS_CHECKS_ACL) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
258 // VFS does not evaluates the ACL itself, so we have to do it here
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
259 SysACL sysacl;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
260 if(sys_acl_check(ctx, access_mask, &sysacl)) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
261 return NULL;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
262 }
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
263 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
264 VFS_DIR dir = ctx->vfs->opendir(ctx, path);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
265 ctx->aclreqaccess = m; // restore original access mask
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
266 if(!dir && ctx) {
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
267 sys_set_error_status(ctx);
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
268 }
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
269 return dir;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
270 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
271
211
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
272 VFS_DIR vfs_fdopendir(VFSContext *ctx, SYS_FILE fd) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
273 WS_ASSERT(ctx);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
274 WS_ASSERT(path);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
275
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
276 uint32_t access_mask = ctx->aclreqaccess | ACL_LIST;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
277
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
278 // ctx->aclreqaccess should be the complete access mask
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
279 uint32_t m = ctx->aclreqaccess; // save original access mask
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
280 ctx->aclreqaccess = access_mask; // set mask for vfs->open call
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
281 if((ctx->vfs->flags & VFS_CHECKS_ACL) != VFS_CHECKS_ACL) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
282 // VFS does not evaluates the ACL itself, so we have to do it here
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
283 SysACL sysacl;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
284 if(sys_acl_check(ctx, access_mask, &sysacl)) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
285 return NULL;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
286 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
287 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
288 VFS_DIR dir = ctx->vfs->fdopendir(ctx, fd);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
289 ctx->aclreqaccess = m; // restore original access mask
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
290 if(!dir && ctx) {
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
291 sys_set_error_status(ctx);
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
292 }
211
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
293 return dir;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
294 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
295
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
296 int vfs_readdir(VFS_DIR dir, VFS_ENTRY *entry) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
297 WS_ASSERT(dir);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
298 WS_ASSERT(entry);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
299
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
300 return dir->io->readdir(dir, entry, 0);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
301 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
302
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
303 int vfs_readdir_stat(VFS_DIR dir, VFS_ENTRY *entry) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
304 WS_ASSERT(dir);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
305 WS_ASSERT(entry);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
306
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
307 return dir->io->readdir(dir, entry, 1);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
308 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
309
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
310 void vfs_closedir(VFS_DIR dir) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
311 WS_ASSERT(dir);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
312
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
313 dir->io->close(dir);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
314 if(dir->ctx) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
315 VFS_FREE(dir->ctx->pool, dir);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
316 } else {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
317 free(dir);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
318 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
319 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
320
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
321 int vfs_mkdir(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
322 WS_ASSERT(ctx);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
323 WS_ASSERT(path);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
324
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
325 return vfs_path_op(ctx, path, ctx->vfs->mkdir, ACL_ADD_FILE);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
326 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
327
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
328 int vfs_unlink(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
329 WS_ASSERT(ctx);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
330 WS_ASSERT(path);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
331
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
332 return vfs_path_op(ctx, path, ctx->vfs->unlink, ACL_DELETE);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
333 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
334
247
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
335 int vfs_rmdir(VFSContext *ctx, const char *path) {
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
336 WS_ASSERT(ctx);
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
337 WS_ASSERT(path);
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
338
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
339 return vfs_path_op(ctx, path, ctx->vfs->rmdir, ACL_DELETE);
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
340 }
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
341
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
342 // private
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
343 int vfs_path_op(VFSContext *ctx, const char *path, vfs_op_f op, uint32_t access) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
344 uint32_t access_mask = ctx->aclreqaccess;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
345 access_mask |= access;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
346
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
347 // ctx->aclreqaccess should be the complete access mask
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
348 uint32_t m = ctx->aclreqaccess; // save original access mask
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
349 ctx->aclreqaccess = access_mask; // set mask for vfs function call
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
350 if((ctx->vfs->flags & VFS_CHECKS_ACL) != VFS_CHECKS_ACL) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
351 // VFS does not evaluates the ACL itself, so we have to do it here
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
352 SysACL sysacl;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
353 if(sys_acl_check(ctx, access_mask, &sysacl)) {
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
354 return -1;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
355 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
356 }
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
357 int ret = op(ctx, path);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
358 ctx->aclreqaccess = m; // restore original access mask
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
359 if(ret && ctx) {
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
360 sys_set_error_status(ctx);
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
361 }
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
362 return ret;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
363 }
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
364
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
365 /* system vfs implementation */
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
366
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
367 SYS_FILE sys_vfs_open(VFSContext *ctx, const char *path, int oflags) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
368 uint32_t access_mask = ctx->aclreqaccess;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
369 pool_handle_t *pool = ctx->pool;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
370
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
371 // check ACLs
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
372 SysACL sysacl;
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
373 if(sys_acl_check(ctx, access_mask, &sysacl)) {
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
374 return NULL;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
375 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
376
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
377 if(sysacl.acl) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
378 if(!fs_acl_check(&sysacl, ctx->user, path, access_mask)) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
379 acl_set_error_status(ctx->sn, ctx->rq, sysacl.acl, ctx->user);
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
380 return NULL;
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
381 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
382 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
383
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
384 // open file
58
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
385 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
386 int fd = open(path, oflags, mode);
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
387 if(fd == -1) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
388 if(ctx) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
389 ctx->vfs_errno = errno;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
390 sys_set_error_status(ctx);
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
391 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
392 return NULL;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
393 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
394
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
395 // if a file system acl is active, we set the owner for newly created files
486
133118c79f4e fix uninitialized memory usage in sys_vfs_open, resulting in unwanted fchown calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 450
diff changeset
396 if(((oflags & O_CREAT) == O_CREAT) && sysacl.acl) {
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
397 if(fchown(fd, sysacl.user_uid, sysacl.user_gid)) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
398 perror("vfs_open: fchown");
171
af7e2d80dee6 adds wrapper for close syscall with error handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
399 system_close(fd);
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
400 return NULL;
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
401 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
402 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
403
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
404 VFSFile *file = VFS_MALLOC(pool, sizeof(VFSFile));
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
405 if(!file) {
171
af7e2d80dee6 adds wrapper for close syscall with error handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
406 system_close(fd);
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
407 return NULL;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
408 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
409 file->ctx = ctx;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
410 file->data = NULL;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
411 file->fd = fd;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
412 file->io = &sys_file_io;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
413 return file;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
414 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
415
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
416 int sys_vfs_stat(VFSContext *ctx, const char *path, struct stat *buf) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
417 uint32_t access_mask = ctx->aclreqaccess;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
418
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
419 // check ACLs
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
420 SysACL sysacl;
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
421 if(sys_acl_check(ctx, access_mask, &sysacl)) {
57
b3a89736b23e some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
422 return -1;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
423 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
424
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
425 if(sysacl.acl) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
426 if(!fs_acl_check(&sysacl, ctx->user, path, access_mask)) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
427 acl_set_error_status(ctx->sn, ctx->rq, sysacl.acl, ctx->user);
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
428 return -1;
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
429 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
430 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
431
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
432 // stat
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
433 if(stat(path, buf)) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
434 if(ctx) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
435 ctx->vfs_errno = errno;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
436 sys_set_error_status(ctx);
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
437 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
438 return -1;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
439 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
440
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
441 return 0;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
442 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
443
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
444 int sys_vfs_fstat(VFSContext *ctx, SYS_FILE fd, struct stat *buf) {
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
445 // stat
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
446 if(fstat(fd->fd, buf)) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
447 if(ctx) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
448 ctx->vfs_errno = errno;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
449 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
450 return -1;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
451 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
452
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
453 return 0;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
454 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
455
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
456 VFS_DIR sys_vfs_opendir(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
457 uint32_t access_mask = ctx->aclreqaccess;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
458 pool_handle_t *pool = ctx->pool;
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
459
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
460 // check ACLs
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
461 SysACL sysacl;
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
462 if(sys_acl_check(ctx, access_mask, &sysacl)) {
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
463 return NULL;
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
464 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
465
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
466 if(sysacl.acl) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
467 if(!fs_acl_check(&sysacl, ctx->user, path, access_mask)) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
468 acl_set_error_status(ctx->sn, ctx->rq, sysacl.acl, ctx->user);
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
469 return NULL;
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
470 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
471 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
472
72
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
473 // open directory
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
474 #ifdef BSD
69
4a10bc0ee80d compiles on os x
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
475 DIR *sys_dir = opendir(path);
97
09fbefc0e6a9 added ldap group support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 92
diff changeset
476 int dir_fd = sys_dir ? dirfd(sys_dir) : 0;
72
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
477 #else
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
478 int dir_fd = open(path, O_RDONLY);
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
479 if(dir_fd == -1) {
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
480 if(ctx) {
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
481 ctx->vfs_errno = errno;
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
482 sys_set_error_status(ctx);
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
483 }
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
484 return NULL;
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
485 }
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
486 DIR *sys_dir = fdopendir(dir_fd);
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
487 #endif
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
488 if(!sys_dir) {
269
3dfbd0b91950 add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 247
diff changeset
489 if(dir_fd > 0) {
3dfbd0b91950 add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 247
diff changeset
490 close(dir_fd);
3dfbd0b91950 add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 247
diff changeset
491 }
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
492 if(ctx) {
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
493 ctx->vfs_errno = errno;
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
494 sys_set_error_status(ctx);
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
495 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
496 return NULL;
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
497 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
498
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
499 SysVFSDir *dir_data = VFS_MALLOC(pool, sizeof(SysVFSDir));
105
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
500 if(!dir_data) {
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
501 closedir(sys_dir);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
502 return NULL;
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
503 }
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
504 long maxfilelen = fpathconf(dir_fd, _PC_NAME_MAX);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
505 size_t entry_len = offsetof(struct dirent, d_name) + maxfilelen + 1;
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
506 dir_data->cur = VFS_MALLOC(pool, entry_len);
105
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
507 if(!dir_data->cur) {
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
508 closedir(sys_dir);
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
509 VFS_FREE(pool, dir_data);
105
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
510 return NULL;
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
511 }
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
512 dir_data->dir = sys_dir;
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
513
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
514 VFSDir *dir = VFS_MALLOC(pool, sizeof(VFSDir));
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
515 if(!dir) {
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
516 closedir(sys_dir);
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
517 VFS_FREE(pool, dir_data->cur);
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
518 VFS_FREE(pool, dir_data);
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
519 return NULL;
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
520 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
521 dir->ctx = ctx;
105
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
522 dir->data = dir_data;
72
9b888965f3ee some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
523 dir->fd = dir_fd;
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
524 dir->io = &sys_dir_io;
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
525 return dir;
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
526 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
527
211
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
528 VFS_DIR sys_vfs_fdopendir(VFSContext *ctx, SYS_FILE fd) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
529 uint32_t access_mask = ctx->aclreqaccess;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
530 pool_handle_t *pool = ctx->pool;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
531
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
532 // check ACLs
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
533 SysACL sysacl;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
534 if(sys_acl_check(ctx, access_mask, &sysacl)) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
535 return NULL;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
536 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
537
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
538 if(sysacl.acl) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
539 if(!fs_acl_check_fd(&sysacl, ctx->user, fd->fd, access_mask)) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
540 acl_set_error_status(ctx->sn, ctx->rq, sysacl.acl, ctx->user);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
541 return NULL;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
542 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
543 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
544
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
545 // open directory
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
546 DIR *sys_dir = fdopendir(fd->fd);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
547 if(!sys_dir) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
548 if(ctx) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
549 ctx->vfs_errno = errno;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
550 sys_set_error_status(ctx);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
551 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
552 return NULL;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
553 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
554
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
555 SysVFSDir *dir_data = VFS_MALLOC(pool, sizeof(SysVFSDir));
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
556 if(!dir_data) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
557 closedir(sys_dir);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
558 return NULL;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
559 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
560 long maxfilelen = fpathconf(fd->fd, _PC_NAME_MAX);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
561 size_t entry_len = offsetof(struct dirent, d_name) + maxfilelen + 1;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
562 dir_data->cur = VFS_MALLOC(pool, entry_len);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
563 if(!dir_data->cur) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
564 closedir(sys_dir);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
565 VFS_FREE(pool, dir_data);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
566 return NULL;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
567 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
568 dir_data->dir = sys_dir;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
569
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
570 VFSDir *dir = VFS_MALLOC(pool, sizeof(VFSDir));
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
571 if(!dir) {
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
572 closedir(sys_dir);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
573 VFS_FREE(pool, dir_data->cur);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
574 VFS_FREE(pool, dir_data);
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
575 return NULL;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
576 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
577 dir->ctx = ctx;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
578 dir->data = dir_data;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
579 dir->fd = fd->fd;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
580 dir->io = &sys_dir_io;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
581 return dir;
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
582 }
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
583
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
584 int sys_vfs_mkdir(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
585 return sys_path_op(ctx, path, sys_mkdir);
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
586 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
587
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
588 int sys_vfs_unlink(VFSContext *ctx, const char *path) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
589 return sys_path_op(ctx, path, sys_unlink);
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
590 }
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
591
247
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
592 int sys_vfs_rmdir(VFSContext *ctx, const char *path) {
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
593 return sys_path_op(ctx, path, sys_rmdir);
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
594 }
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
595
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
596
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
597 int sys_path_op(VFSContext *ctx, const char *path, sys_op_f op) {
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
598 uint32_t access_mask = ctx->aclreqaccess;
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
599
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
600 // check ACLs
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
601 SysACL sysacl;
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
602 if(sys_acl_check(ctx, access_mask, &sysacl)) {
57
b3a89736b23e some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
603 return -1;
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
604 }
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
605
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
606 if(sysacl.acl) {
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
607 if(!fs_acl_check(&sysacl, ctx->user, path, access_mask)) {
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
608 acl_set_error_status(ctx->sn, ctx->rq, sysacl.acl, ctx->user);
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
609 return -1;
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
610 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
611 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
612
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
613 // do path operation
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
614 if(op(ctx, path, &sysacl)) {
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
615 // error
165
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
616 ctx->vfs_errno = errno;
6942a8c3e737 refactors vfs code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
617 sys_set_error_status(ctx);
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
618 return -1;
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
619 }
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
620
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
621 return 0;
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
622 }
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
623
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
624 int sys_acl_check(VFSContext *ctx, uint32_t access_mask, SysACL *sysacl) {
67
50505dc3f8a6 dynamic thread pool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 66
diff changeset
625 if(sysacl) {
50505dc3f8a6 dynamic thread pool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 66
diff changeset
626 sysacl->acl = NULL;
50505dc3f8a6 dynamic thread pool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 66
diff changeset
627 }
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
628 if(!ctx) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
629 return 0;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
630 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
631
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
632 ACLListHandle *acllist = ctx->acllist;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
633 if(acllist) {
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
634 ACLList *acl = acl_evallist(
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
635 acllist,
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
636 ctx->user,
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
637 access_mask,
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
638 &sysacl->acl);
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
639
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
640 if(acl) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
641 acl_set_error_status(ctx->sn, ctx->rq, acl, ctx->user);
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
642 return 1;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
643 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
644 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
645
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
646 return 0;
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
647 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
648
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
649 void sys_set_error_status(VFSContext *ctx) {
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
650 if(ctx->sn && ctx->rq && !ctx->error_response_set) {
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
651 int status = util_errno2status(ctx->vfs_errno);
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
652 protocol_status(ctx->sn, ctx->rq, status, NULL);
286
864e2d701dd4 set error status code directly in vfs_* calls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 277
diff changeset
653 ctx->error_response_set = TRUE;
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
654 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
655 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
656
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
657 ssize_t sys_file_read(SYS_FILE fd, void *buf, size_t nbyte) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
658 return read(fd->fd, buf, nbyte);
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
659 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
660
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
661 ssize_t sys_file_write(SYS_FILE fd, const void *buf, size_t nbyte) {
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
662 return write(fd->fd, buf, nbyte);
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
663 }
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
664
189
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
665 ssize_t sys_file_pread(SYS_FILE fd, void *buf, size_t nbyte, off_t offset) {
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
666 return pread(fd->fd, buf, nbyte, offset);
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
667 }
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
668
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
669 ssize_t sys_file_pwrite(SYS_FILE fd, const void *buf, size_t nbyte, off_t offset) {
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
670 return pwrite(fd->fd, buf, nbyte, offset);
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
671 }
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
672
66
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
673 off_t sys_file_seek(SYS_FILE fd, off_t offset, int whence) {
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
674 return lseek(fd->fd, offset, whence);
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
675 }
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
676
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
677 void sys_file_close(SYS_FILE fd) {
171
af7e2d80dee6 adds wrapper for close syscall with error handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 105
diff changeset
678 system_close(fd->fd);
54
3a1d5a52adfc new vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
679 }
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
680
172
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
681 int sys_file_aioread(aiocb_s *aiocb) {
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
682 WS_ASSERT(aiocb->buf);
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
683 WS_ASSERT(aiocb->nbytes > 0);
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
684 return ev_aioread(aiocb->filedes->fd, aiocb);
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
685 }
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
686
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
687 int sys_file_aiowrite(aiocb_s *aiocb) {
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
688 WS_ASSERT(aiocb->buf);
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
689 WS_ASSERT(aiocb->nbytes > 0);
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
690 return ev_aiowrite(aiocb->filedes->fd, aiocb);
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
691 }
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
692
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
693
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
694 int sys_dir_read(VFS_DIR dir, VFS_ENTRY *entry, int getstat) {
105
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
695 SysVFSDir *dirdata = dir->data;
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
696 struct dirent *result = NULL;
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
697 int s = readdir_r(dirdata->dir, dirdata->cur, &result);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
698 if(!s && result) {
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
699 char *name = result->d_name;
58
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
700 if(!strcmp(name, ".") || !strcmp(name, "..")) {
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
701 return sys_dir_read(dir, entry, getstat);
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
702 } else {
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
703 entry->name = name;
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
704 if(getstat) {
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
705 // TODO: check ACLs again for new path
211
2160585200ac add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 193
diff changeset
706 entry->stat_errno = 0;
105
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
707 if(fstatat(dir->fd, result->d_name, &entry->stat, 0)) {
58
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
708 entry->stat_errno = errno;
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
709 }
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
710 entry->stat_extra = NULL;
185
b4d7ccf4e06d implements new event handler and aio on linux
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 172
diff changeset
711 }
58
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
712 return 1;
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
713 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
714 } else {
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
715 return 0;
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
716 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
717 }
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
718
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
719 void sys_dir_close(VFS_DIR dir) {
105
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
720 SysVFSDir *dirdata = dir->data;
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
721 closedir(dirdata->dir);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
722
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
723 pool_handle_t *pool = dir->ctx->pool;
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
724 if(pool) {
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
725 pool_free(pool, dirdata->cur);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
726 pool_free(pool, dirdata);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
727 pool_free(pool, dir);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
728 } else {
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
729 free(dirdata->cur);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
730 free(dirdata);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
731 free(dir);
63d9051fe35c using readdir_r instead of readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 97
diff changeset
732 }
55
b7908bf38f9f vfs can read directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
733 }
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
734
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
735 int sys_mkdir(VFSContext *ctx, const char *path, SysACL *sysacl) {
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
736 mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
63
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
737 int ret = mkdir(path, mode);
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
738 if(ret == 0) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
739 if(sysacl->user_uid != -1) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
740 if(chown(path, sysacl->user_uid, sysacl->user_gid)) {
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
741 // TODO: error
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
742 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
743 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
744 }
66442f81f823 supports file system ACLs on Solaris
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 59
diff changeset
745 return ret;
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
746 }
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
747
241
4adad7faf452 add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 211
diff changeset
748 int sys_unlink(VFSContext *ctx, const char *path, SysACL *sysacl) {
56
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
749 return unlink(path);
c6cf20b09043 added vfs_mkdir and vfs_unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 55
diff changeset
750 }
58
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
751
247
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
752 int sys_rmdir(VFSContext *ctx, const char *path, SysACL *sysacl) {
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
753 return rmdir(path);
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
754 }
1df803e06076 implement webdav delete for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 241
diff changeset
755
58
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
756 /* public file api */
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
757
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
758 NSAPI_PUBLIC int system_fread(SYS_FILE fd, void *buf, int nbyte) {
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
759 return fd->io->read(fd, buf, nbyte);
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
760 }
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
761
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
762 NSAPI_PUBLIC int system_fwrite(SYS_FILE fd, const void *buf, int nbyte) {
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
763 return fd->io->write(fd, buf, nbyte);
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
764 }
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
765
189
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
766 NSAPI_PUBLIC int system_pread(SYS_FILE fd, void *buf, int nbyte, off_t offset) {
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
767 return fd->io->pread(fd, buf, nbyte, offset);
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
768 }
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
769
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
770 NSAPI_PUBLIC int system_pwrite(SYS_FILE fd, const void *buf, int nbyte, off_t offset) {
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
771 return fd->io->pwrite(fd, buf, nbyte, offset);
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
772 }
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
773
66
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
774 NSAPI_PUBLIC off_t system_lseek(SYS_FILE fd, off_t offset, int whence) {
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
775 return fd->io->seek(fd, offset, whence);
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
776 }
74babc0082b7 added authentication cache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 63
diff changeset
777
58
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
778 NSAPI_PUBLIC int system_fclose(SYS_FILE fd) {
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
779 vfs_close(fd);
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
780 return 0;
66c22e54aa90 webdav uses the vfs api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 57
diff changeset
781 }
172
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
782
450
d7b276de183b fix cgi pipes not closed in some error case + minor improvements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
783 NSAPI_PUBLIC int vfs_is_sys(VFS *vfs) {
d7b276de183b fix cgi pipes not closed in some error case + minor improvements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
784 if(!vfs) return 1;
d7b276de183b fix cgi pipes not closed in some error case + minor improvements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
785 if(vfs == &sys_vfs) return 1;
d7b276de183b fix cgi pipes not closed in some error case + minor improvements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
786 return 0;
d7b276de183b fix cgi pipes not closed in some error case + minor improvements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
787 }
d7b276de183b fix cgi pipes not closed in some error case + minor improvements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
788
172
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
789 // AIO API
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
790
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
791 NSAPI_PUBLIC int system_aio_read(aiocb_s *aiocb) {
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
792 if(!aiocb->event || !aiocb->evhandler) {
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
793 return -1;
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
794 }
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
795
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
796 SYS_FILE file = aiocb->filedes;
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
797 aiocb->event->object = (intptr_t)aiocb;
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
798 if(file->io->opt_aioread) {
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
799 return file->io->opt_aioread(aiocb);
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
800 } else {
187
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
801 vfs_queue_aio(aiocb, VFS_AIO_READ);
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
802 return 0;
172
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
803 }
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
804 }
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
805
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
806 NSAPI_PUBLIC int system_aio_write(aiocb_s *aiocb) {
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
807 if(!aiocb->event || !aiocb->evhandler) {
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
808 return -1;
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
809 }
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
810
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
811 SYS_FILE file = aiocb->filedes;
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
812 aiocb->event->object = (intptr_t)aiocb;
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
813 if(file->io->opt_aiowrite) {
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
814 return file->io->opt_aiowrite(aiocb);
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
815 } else {
187
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
816 vfs_queue_aio(aiocb, VFS_AIO_WRITE);
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
817 return 0;
172
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
818 }
5580517faafc adds public aio and poll api and asynchronous send_range function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 165
diff changeset
819 }
187
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
820
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
821 static void* vfs_aio_read(aiocb_s *aiocb) {
189
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
822 int result = system_pread(aiocb->filedes, aiocb->buf, aiocb->nbytes, aiocb->offset);
187
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
823 aiocb->result = result;
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
824 if(result < 0) {
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
825 aiocb->result_errno = errno;
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
826 }
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
827 event_send(aiocb->evhandler, aiocb->event);
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
828 return NULL;
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
829 }
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
830
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
831 static void* vfs_aio_write(aiocb_s *aiocb) {
189
a2438f6d1e73 adds vfs pread/pwrite functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 187
diff changeset
832 int result = system_pwrite(aiocb->filedes, aiocb->buf, aiocb->nbytes, aiocb->offset);
187
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
833 aiocb->result = result;
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
834 if(result < 0) {
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
835 aiocb->result_errno = errno;
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
836 }
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
837 event_send(aiocb->evhandler, aiocb->event);
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
838 return NULL;
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
839 }
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
840
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
841 void vfs_queue_aio(aiocb_s *aiocb, VFSAioOp op) {
190
1f73302461e0 adds IO threadpool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 189
diff changeset
842 threadpool_t *pool = get_default_iopool(); // TODO: use specific IOPool
187
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
843 if(op == VFS_AIO_READ) {
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
844 threadpool_run(pool, (job_callback_f)vfs_aio_read, aiocb);
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
845 } else if(VFS_AIO_WRITE) {
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
846 threadpool_run(pool, (job_callback_f)vfs_aio_write, aiocb);
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
847 }
4384bfbb7e26 adds platform independent aio functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
848 }

mercurial