Mercurial > dwindows
annotate compat.c @ 35:432c39a4ff86
New code for checking drive size on OS/2 and Windows.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Fri, 07 Sep 2001 15:27:55 +0000 |
parents | 6a246b3bb14f |
children | cddb02f847e1 |
rev | line source |
---|---|
3 | 1 /* $Id$ */ |
2 | |
3 #include "compat.h" | |
4 #if defined(__OS2__) || defined(__WIN32__) | |
5 #include <share.h> | |
6 #endif | |
7 | |
8 int sockread (int a, void *b, int c, int d) | |
9 { | |
10 #if defined(__IBMC__) || (defined(__WIN32__) && !defined(__CYGWIN32__)) | |
11 return recv(a,b,c,d); | |
12 #else | |
13 return read(a,b,c); | |
14 #endif | |
15 } | |
16 | |
17 int sockwrite (int a, void *b, int c, int d) | |
18 { | |
19 #if defined(__IBMC__) || (defined(__WIN32__) && !defined(__CYGWIN32__)) | |
20 return send(a,b,c,d); | |
21 #else | |
22 return write(a,b,c); | |
23 #endif | |
24 } | |
25 | |
26 int sockclose(int a) | |
27 { | |
28 #ifdef __IBMC__ | |
29 return soclose(a); | |
30 #elif defined(__WIN32__) && !defined(__CYGWIN32__) | |
31 return closesocket(a); | |
32 #else | |
33 return close(a); | |
34 #endif | |
35 } | |
36 | |
37 int makedir(char *path) | |
38 { | |
39 #if defined(__IBMC__) || (defined(__WIN32__) && !defined(__CYGWIN32__)) | |
40 return mkdir(path); | |
41 #else | |
42 return mkdir(path,S_IRWXU); | |
43 #endif | |
44 } | |
45 | |
46 void nonblock(int fd) | |
47 { | |
48 #ifdef __IBMC__ | |
49 static int _nonblock = 1; | |
50 | |
51 ioctl(fd, FIONBIO, (char *)&_nonblock, sizeof(_nonblock)); | |
52 #elif defined(__WIN32__) && !defined(__CYGWIN32__) | |
53 static unsigned long _nonblock = 1; | |
54 | |
55 ioctlsocket(fd, FIONBIO, &_nonblock); | |
56 #else | |
57 fcntl(fd, F_SETFL, O_NONBLOCK); | |
58 #endif | |
59 } | |
60 | |
61 int socksprintf(int fd, char *format, ...) | |
62 { | |
63 va_list args; | |
64 char outbuf[1024]; | |
65 int len; | |
66 | |
67 va_start(args, format); | |
68 vsprintf(outbuf, format, args); | |
69 va_end(args); | |
70 | |
71 len = strlen(outbuf); | |
72 sockwrite(fd, outbuf, len, 0); | |
73 | |
74 return len; | |
75 } | |
76 | |
77 void sockinit(void) | |
78 { | |
79 #ifdef __IBMC__ | |
80 sock_init(); | |
81 #elif defined(__WIN32__) || defined(WINNT) | |
82 WSADATA wsa; | |
83 | |
84 WSAStartup(MAKEWORD (1, 1), &wsa); | |
85 #endif /* !WIN32 */ | |
86 } | |
87 | |
88 void sockshutdown(void) | |
89 { | |
90 #if defined(__WIN32__) || defined(WINNT) | |
91 WSACleanup(); | |
92 #endif /* !WIN32 */ | |
93 } | |
94 | |
95 int sockpipe(int *pipes) | |
96 { | |
97 #ifndef NO_DOMAIN_SOCKETS | |
98 #ifndef HAVE_PIPE | |
99 struct sockaddr_un un; | |
100 #endif | |
101 #else | |
102 struct sockaddr_in server_addr; | |
103 struct sockaddr_in listen_addr = { 0 }; | |
104 int len = sizeof(struct sockaddr_in); | |
105 struct hostent *he; | |
106 #endif | |
107 #ifndef HAVE_PIPE | |
108 int tmpsock; | |
109 #endif | |
110 | |
111 #ifdef HAVE_PIPE | |
112 return pipe(pipes); | |
113 #elif !defined(NO_DOMAIN_SOCKETS) | |
114 static int instance = -1; | |
115 | |
116 instance++; | |
117 | |
118 /* Use UNIX domain sockets to pass messages */ | |
119 tmpsock = socket(AF_UNIX, SOCK_STREAM, 0); | |
120 pipes[1] = socket(AF_UNIX, SOCK_STREAM, 0); | |
121 memset(&un, 0, sizeof(un)); | |
122 un.sun_family=AF_UNIX; | |
123 sprintf(un.sun_path, PIPENAME, instance); | |
124 bind(tmpsock, (struct sockaddr *)&un, sizeof(un)); | |
125 listen(tmpsock, 0); | |
126 connect(pipes[1], (struct sockaddr *)&un, sizeof(un)); | |
127 pipes[0] = accept(tmpsock, 0, 0); | |
128 sockclose(tmpsock); | |
129 #else | |
130 /* Use localhost socket to pass messages if no domain sockets */ | |
131 he = gethostbyname("localhost"); | |
132 | |
133 if(he) | |
134 { | |
135 memset(&server_addr, 0, sizeof(server_addr)); | |
136 server_addr.sin_family = AF_INET; | |
137 server_addr.sin_port = 0; | |
138 server_addr.sin_addr.s_addr = INADDR_ANY; | |
139 if ((tmpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0 || bind(tmpsock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0 || listen(tmpsock, 0) < 0) | |
140 return -1; | |
141 | |
142 memset(&listen_addr, 0, sizeof(listen_addr)); | |
143 getsockname(tmpsock, (struct sockaddr *)&listen_addr, &len); | |
144 | |
145 server_addr.sin_family = AF_INET; | |
146 server_addr.sin_port = listen_addr.sin_port; | |
147 server_addr.sin_addr.s_addr = *((unsigned long *)he->h_addr); | |
148 if((pipes[1] = socket(AF_INET, SOCK_STREAM, 0)) < 0 || connect(pipes[1], (struct sockaddr *)&server_addr, sizeof(server_addr))) | |
149 return -1; | |
150 else | |
151 pipes[0] = accept(tmpsock, 0, 0); | |
152 sockclose(tmpsock); | |
153 } | |
154 else | |
155 return -1; | |
156 #endif | |
157 if(pipes[0] < 0 || pipes[1] < 0) | |
158 return -1; | |
159 return 0; | |
160 } | |
161 | |
162 /* Return in K to avoid big problems exceeding an | |
163 unsigned long when no 64bit integers are available */ | |
164 #if defined(__IBMC__) || (defined(__WIN32__) && !defined(__CYGWIN32__)) | |
165 unsigned long drivefree(int drive) | |
166 #else | |
167 unsigned long long drivefree(int drive) | |
168 #endif | |
169 { | |
170 #if defined(__EMX__) || defined(__OS2__) | |
171 ULONG aulFSInfoBuf[40] = {0}; | |
172 APIRET rc = NO_ERROR; | |
35
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
173 ULONG kbytes; |
3 | 174 |
175 DosError(FERR_DISABLEHARDERR); | |
176 rc = DosQueryFSInfo(drive, | |
35
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
177 FSIL_ALLOC, |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
178 (PVOID)aulFSInfoBuf, |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
179 sizeof(aulFSInfoBuf)); |
3 | 180 |
181 DosError(FERR_ENABLEHARDERR); | |
182 if (rc != NO_ERROR) | |
183 return 0; | |
184 | |
35
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
185 kbytes = aulFSInfoBuf[3]/1024; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
186 |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
187 return (unsigned long)(kbytes * aulFSInfoBuf[1] * aulFSInfoBuf[4]); |
3 | 188 #elif defined(__WIN32__) || defined(WINNT) |
189 char buffer[10] = "C:\\"; | |
190 DWORD spc, bps, fc, tc; | |
191 | |
192 buffer[0] = drive + 'A' - 1; | |
193 | |
194 if(GetDiskFreeSpace(buffer, &spc, &bps, &fc, &tc) == 0) | |
195 return 0; | |
196 return (unsigned long)(spc*bps*(fc/1024)); | |
197 #else | |
198 return 0; | |
199 #endif | |
200 } | |
201 | |
35
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
202 /* Return in K to avoid big problems exceeding an |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
203 unsigned long when no 64bit integers are available */ |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
204 #if defined(__IBMC__) || (defined(__WIN32__) && !defined(__CYGWIN32__)) |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
205 unsigned long drivesize(int drive) |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
206 #else |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
207 unsigned long long drivesize(int drive) |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
208 #endif |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
209 { |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
210 #if defined(__EMX__) || defined(__OS2__) |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
211 ULONG aulFSInfoBuf[40] = {0}; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
212 APIRET rc = NO_ERROR; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
213 ULONG kbytes; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
214 |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
215 DosError(FERR_DISABLEHARDERR); |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
216 rc = DosQueryFSInfo(drive, |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
217 FSIL_ALLOC, |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
218 (PVOID)aulFSInfoBuf, |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
219 sizeof(aulFSInfoBuf)); |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
220 |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
221 DosError(FERR_ENABLEHARDERR); |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
222 if (rc != NO_ERROR) |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
223 return 0; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
224 |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
225 kbytes = aulFSInfoBuf[2]/1024; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
226 |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
227 return (unsigned long)(kbytes * aulFSInfoBuf[1] * aulFSInfoBuf[4]); |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
228 #elif defined(__WIN32__) || defined(WINNT) |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
229 char buffer[10] = "C:\\"; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
230 DWORD spc, bps, fc, tc; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
231 |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
232 buffer[0] = drive + 'A' - 1; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
233 |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
234 if(GetDiskFreeSpace(buffer, &spc, &bps, &fc, &tc) == 0) |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
235 return 0; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
236 return (unsigned long)(spc*bps*(tc/1024)); |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
237 #else |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
238 return 0; |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
239 #endif |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
240 } |
432c39a4ff86
New code for checking drive size on OS/2 and Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
22
diff
changeset
|
241 |
3 | 242 int isdrive(int drive) |
243 { | |
244 #if defined(__EMX__) || defined(__OS2__) | |
245 APIRET rc = NO_ERROR; | |
246 FSINFO volinfo; | |
247 | |
248 DosError(FERR_DISABLEHARDERR); | |
249 rc = DosQueryFSInfo(drive, | |
250 FSIL_VOLSER, | |
251 (PVOID)&volinfo, | |
252 sizeof(FSINFO)); | |
253 | |
254 DosError(FERR_ENABLEHARDERR); | |
255 if (rc == NO_ERROR) | |
256 return 1; | |
257 | |
258 #elif defined(__WIN32__) || defined(WINNT) | |
259 char buffer[10] = "C:\\", volname[100]; | |
260 DWORD spc, bps, fc; | |
261 | |
262 buffer[0] = drive + 'A' - 1; | |
263 | |
264 if(GetVolumeInformation(buffer, volname, 100, &spc, &bps, &fc, NULL, 0) != 0) | |
265 return 1; | |
266 #endif | |
267 return 0; | |
268 } | |
269 | |
270 void setfileinfo(char *filename, char *url) | |
271 { | |
272 time_t ltime; | |
273 struct tm *tm; | |
274 char buffer[200], timebuf[200]; | |
275 #ifdef __OS2__ | |
276 const unsigned fea2listsize = 6000; | |
277 char *pData; | |
278 EAOP2 eaop2; | |
279 PFEA2 pFEA2; | |
280 #else | |
281 FILE *urlfile; | |
282 #endif | |
283 | |
284 ltime = time(NULL); | |
285 | |
286 tm = localtime(<ime); | |
287 | |
288 strftime(timebuf, 200, "%c", tm); | |
289 | |
290 sprintf(buffer, "%s %s", url, timebuf); | |
291 | |
292 #ifdef __OS2__ | |
293 eaop2.fpGEA2List = 0; | |
294 eaop2.fpFEA2List = (PFEA2LIST)malloc(fea2listsize); | |
295 pFEA2 = &eaop2.fpFEA2List->list[0]; | |
296 | |
297 pFEA2->fEA = 0; | |
298 /* .COMMENTS is 9 characters long */ | |
299 pFEA2->cbName = 9; | |
300 | |
301 /* space for the type and length field. */ | |
302 pFEA2->cbValue = strlen(buffer)+2*sizeof(USHORT); | |
303 | |
304 strcpy(pFEA2->szName, ".COMMENTS"); | |
305 pData = pFEA2->szName+pFEA2->cbName+1; | |
306 /* data begins at first byte after the name */ | |
307 | |
308 *(USHORT*)pData = EAT_ASCII; /* type */ | |
309 *((USHORT*)pData+1) = strlen(buffer); /* length */ | |
310 strcpy(pData+2*sizeof(USHORT), buffer);/* content */ | |
311 | |
312 pFEA2->oNextEntryOffset = 0; | |
313 | |
314 eaop2.fpFEA2List->cbList = ((PCHAR)pData+2*sizeof(USHORT)+ | |
315 pFEA2->cbValue)-((PCHAR)eaop2.fpFEA2List); | |
316 | |
317 DosSetPathInfo(filename, | |
318 FIL_QUERYEASIZE, | |
319 &eaop2, | |
320 sizeof(eaop2), | |
321 0); | |
322 | |
323 free((void *)eaop2.fpFEA2List); | |
324 #else | |
325 | |
326 if((urlfile = fopen("handyftp.url", "a"))!=NULL) | |
327 { | |
328 fprintf(urlfile, "%s\n", buffer); | |
329 fclose(urlfile); | |
330 } | |
331 #endif | |
332 } | |
333 | |
334 #if defined(__OS2__) || defined(__WIN32__) | |
335 typedef struct _fsinfo { | |
336 FILE *fp; | |
337 int fd; | |
338 } FSInfo; | |
339 | |
340 FSInfo *FSIRoot = NULL; | |
341 | |
342 #define FSI_MAX 100 | |
343 #endif | |
344 | |
345 /* Sharable fopen() and fclose() calls. */ | |
346 FILE *fsopen(char *path, char *modes) | |
347 { | |
348 #if defined(__OS2__) || defined(__WIN32__) | |
349 int z; | |
350 | |
351 if(!FSIRoot) | |
352 FSIRoot = calloc(sizeof(struct _fsinfo), FSI_MAX); | |
353 | |
354 for(z=0;z<FSI_MAX;z++) | |
355 { | |
356 if(FSIRoot[z].fd < 1) | |
357 { | |
358 int s, sopenmode = 0, wrmode = 0; | |
359 | |
360 /* Check the flags passed */ | |
361 for(s=0;s<3;s++) | |
362 { | |
363 if(modes[s] == 'b') | |
364 sopenmode |= O_BINARY; | |
365 if(modes[s] == 'r') | |
366 wrmode |= O_RDONLY; | |
367 if(modes[s] == 'w') | |
368 wrmode |= O_WRONLY; | |
369 if(modes[s] == 'a') | |
370 sopenmode |= O_APPEND; | |
371 if(modes[s] == 't') | |
372 sopenmode |= O_TEXT; | |
373 } | |
374 | |
375 /* Check the read/write request */ | |
376 if((wrmode & O_RDONLY) && (wrmode & O_WRONLY)) | |
377 sopenmode |= O_RDWR; | |
378 else | |
379 sopenmode |= wrmode; | |
380 FSIRoot[z].fd = _sopen(path, sopenmode, SH_DENYNO, S_IREAD|S_IWRITE); | |
381 if(FSIRoot[z].fd > 0) | |
382 { | |
383 FSIRoot[z].fp = fdopen(FSIRoot[z].fd, modes); | |
384 | |
385 return FSIRoot[z].fp; | |
386 } | |
387 } | |
388 } | |
389 return NULL; | |
390 #else | |
391 return fopen(path, modes); | |
392 #endif | |
393 } | |
394 | |
395 int fsclose(FILE *fp) | |
396 { | |
397 #if defined(__OS2__) || defined(__WIN32__) | |
398 if(FSIRoot) | |
399 { | |
400 | |
401 int z; | |
402 for(z=0;z<FSI_MAX;z++) | |
403 { | |
404 if(fp == FSIRoot[z].fp) | |
405 { | |
406 int ret = fclose(fp); | |
407 close(FSIRoot[z].fd); | |
408 FSIRoot[z].fd = 0; | |
409 FSIRoot[z].fp = NULL; | |
410 return ret; | |
411 } | |
412 } | |
413 } | |
414 #endif | |
415 return fclose(fp); | |
416 } | |
417 | |
418 char *fsgets(char *str, int size, FILE *stream) | |
419 { | |
420 return fgets(str, size, stream); | |
421 } | |
422 | |
22
6a246b3bb14f
Added tree widgets, fixed some delete event processing, fixed a layout bug
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
3
diff
changeset
|
423 int fsseek(FILE *stream, long offset, int whence) |
6a246b3bb14f
Added tree widgets, fixed some delete event processing, fixed a layout bug
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
3
diff
changeset
|
424 { |
6a246b3bb14f
Added tree widgets, fixed some delete event processing, fixed a layout bug
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
3
diff
changeset
|
425 return fseek(stream, offset, whence); |
6a246b3bb14f
Added tree widgets, fixed some delete event processing, fixed a layout bug
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
3
diff
changeset
|
426 } |