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