1 #include <stdlib.h>
2 #include <string.h>
3 #include <errno.h>
4 #include <osbind.h>
5
6 #include "bosmeta.h"
7 #include "list.h"
8 #include "dosdir.h"
9
10 #if 0
11 #include "nfd.h"
12 #define TRACE(x) NFD(x)
13 #define DEBUG(x) NFD(x)
14 #else
15 #define TRACE(x)
16 #define DEBUG(x)
17 #endif
18
19
20 long __CDECL
sys_dl_opendir(DIR * dirh,LIST * list,int flag)21 sys_dl_opendir (DIR *dirh, LIST *list, int flag)
22 {
23 DEBUG(("dl_opendir: %lx list=%lx\n", dirh, list));
24 dirh->list = list;
25 dirh->mode = flag;
26 dirh->current = (FCOOKIE*)listRewind(dirh->list);
27 return 0;
28 }
29
30 long __CDECL
sys_dl_readdir(DIR * dirh,char * buf,int len)31 sys_dl_readdir (DIR *dirh, char *buf, int len)
32 {
33 dirh->current = (FCOOKIE *)listNext((LINKABLE*)dirh->current);
34 DEBUG(("dl_readdir: %lx list=%lx: len %d, '%s'\n", dirh, dirh->list, len, dirh->current ? dirh->current->name : "ENMFILES"));
35 if (!dirh->current)
36 return -ENMFILES;
37
38 /* Insert file index if needed */
39 if (!dirh->mode) {
40 *(long*)buf = (long)dirh->current;
41 buf += 4;
42 len -= 4;
43 }
44 if ( len <= 0 )
45 return -ERANGE;
46
47 strncpy(buf, dirh->current->name, len-1);
48 return 0;
49 }
50
51 long __CDECL
sys_dl_closedir(DIR * dirh)52 sys_dl_closedir (DIR *dirh)
53 {
54 DEBUG(("dl_closedir: %lx list=%lx\n", dirh, dirh->list));
55 dirh->list = NULL;
56 dirh->current = NULL;
57 return 0;
58 }
59
60 long __CDECL
sys_dl_readlabel(char * buf,int buflen)61 sys_dl_readlabel (char *buf, int buflen)
62 {
63 strncpy(buf, "nfstderr", buflen-1);
64 return 0;
65 }
66
67
68 long __CDECL
sys_d_free(MetaDOSDir long * buf,int d)69 sys_d_free (MetaDOSDir long *buf, int d)
70 {
71 #if 1
72 return -ENOSYS;
73 #else
74 PROC *p = curproc;
75 fcookie *dir = 0;
76
77 d = (int)tolower(pathNameMD[0])-'a';
78 dir = &p->p_cwd->root[d];
79 #endif
80 }
81
82 long __CDECL
sys_d_create(MetaDOSDir const char * path)83 sys_d_create (MetaDOSDir const char *path)
84 {
85 return -EACCES;
86 }
87
88 long __CDECL
sys_d_delete(MetaDOSDir const char * path)89 sys_d_delete (MetaDOSDir const char *path)
90 {
91 return -EACCES;
92 }
93
94
95 long __CDECL
sys_f_xattr(MetaDOSFile int flag,const char * name,struct xattr * xattr)96 sys_f_xattr (MetaDOSFile int flag, const char *name, struct xattr *xattr)
97 {
98 FCOOKIE *fc;
99 long r = path2cookie (name, NULL, &fc);
100 if (r)
101 {
102 DEBUG(("Fattrib(%s): error %ld", name, r));
103 return r;
104 }
105
106 return getxattr( fc, xattr);
107 }
108
109 long __CDECL
sys_f_attrib(MetaDOSFile const char * name,int rwflag,int attr)110 sys_f_attrib (MetaDOSFile const char *name, int rwflag, int attr)
111 {
112 FCOOKIE *fc;
113 long r = path2cookie (name, NULL, &fc);
114 if (r)
115 {
116 DEBUG(("Fattrib(%s): error %ld", name, r));
117 return r;
118 }
119
120 return fc->attr;
121 }
122
123 long __CDECL
sys_f_delete(MetaDOSFile const char * name)124 sys_f_delete (MetaDOSFile const char *name)
125 {
126 return -EACCES;
127 }
128
129 long __CDECL
sys_f_rename(MetaDOSFile int junk,const char * old,const char * new)130 sys_f_rename (MetaDOSFile int junk, const char *old, const char *new)
131 {
132 return -EACCES;
133 }
134
135 /*
136 * GEMDOS extension: Dpathconf(name, which)
137 *
138 * returns information about filesystem-imposed limits; "name" is the name
139 * of a file or directory about which the limit information is requested;
140 * "which" is the limit requested, as follows:
141 * -1 max. value of "which" allowed
142 * 0 internal limit on open files, if any
143 * 1 max. number of links to a file {LINK_MAX}
144 * 2 max. path name length {PATH_MAX}
145 * 3 max. file name length {NAME_MAX}
146 * 4 no. of bytes in atomic write to FIFO {PIPE_BUF}
147 * 5 file name truncation rules
148 * 6 file name case translation rules
149 *
150 * unlimited values are returned as 0x7fffffffL
151 *
152 * see also Sysconf() in dos.c
153 */
154 long __CDECL
sys_d_pathconf(MetaDOSDir const char * name,int which)155 sys_d_pathconf (MetaDOSDir const char *name, int which)
156 {
157 /* FIXME? now from cookfs */
158 switch (which)
159 {
160 case -1: return 7;
161 case 0: return 0x7fffffffL;
162 case 1: return 1;
163 case 2: return PATH_MAX;
164 case 3: return PATH_MAX;
165 case 4: return 0;
166 case 5: return 0;
167 case 6: return 0;
168 case 7: return 0x00800000L;
169 default: return -ENOSYS;
170 }
171 }
172
173 long __CDECL
sys_d_opendir(MetaDOSDir const char * name,int flag)174 sys_d_opendir (MetaDOSDir const char *name, int flag)
175 {
176 DIR *dirh = (DIR *) dirMD;
177 FCOOKIE *fc;
178 long r = path2cookie( name, NULL, &fc);
179 if (r)
180 {
181 DEBUG(("Dopendir(%s): path2cookie returned %ld", name, r));
182 return r;
183 }
184
185 r = sys_dl_opendir( dirh, fc->folder, flag);
186 if (r)
187 return r;
188
189 return (long)dirh;
190 }
191
192 long __CDECL
sys_d_readdir(MetaDOSDir int len,long handle,char * buf)193 sys_d_readdir (MetaDOSDir int len, long handle, char *buf)
194 {
195 DIR *dirh = (DIR *) dirMD;
196 return sys_dl_readdir( dirh, buf, len);
197 }
198
199 long __CDECL
sys_d_xreaddir(MetaDOSDir int len,long handle,char * buf,struct xattr * xattr,long * xret)200 sys_d_xreaddir (MetaDOSDir int len, long handle, char *buf, struct xattr *xattr, long *xret)
201 {
202 DIR *dirh = (DIR *) dirMD;
203 long ret = sys_dl_readdir( dirh, buf, len);
204 if ( ret )
205 return ret;
206
207 *xret = getxattr( dirh->current, xattr);
208 return 0;
209 }
210
211 long __CDECL
sys_d_rewind(MetaDOSDir long handle)212 sys_d_rewind (MetaDOSDir long handle)
213 {
214 DIR *dirh = (DIR *) dirMD;
215 dirh->current = (FCOOKIE *)listRewind(dirh->list);
216 return 0;
217 }
218
219 long __CDECL
sys_d_closedir(MetaDOSDir long handle)220 sys_d_closedir (MetaDOSDir long handle)
221 {
222 return sys_dl_closedir( (DIR*)dirMD);
223 }
224
225 long __CDECL
sys_d_readlabel(MetaDOSDir const char * name,char * buf,int buflen)226 sys_d_readlabel (MetaDOSDir const char *name, char *buf, int buflen)
227 {
228 return sys_dl_readlabel(buf, buflen);
229 }
230
231 long __CDECL
sys_d_writelabel(MetaDOSDir const char * name,const char * label)232 sys_d_writelabel (MetaDOSDir const char *name, const char *label)
233 {
234 return -ENOSYS;
235 }
236
237