Mercurial > dwindows
comparison compat.c @ 3:67a643a734d9
Import
author | ktk@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Tue, 03 Jul 2001 07:50:39 +0000 |
parents | |
children | 6a246b3bb14f |
comparison
equal
deleted
inserted
replaced
2:36c5f0ce3fbe | 3:67a643a734d9 |
---|---|
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; | |
173 | |
174 DosError(FERR_DISABLEHARDERR); | |
175 rc = DosQueryFSInfo(drive, | |
176 FSIL_ALLOC, | |
177 (PVOID)aulFSInfoBuf, | |
178 sizeof(aulFSInfoBuf)); | |
179 | |
180 DosError(FERR_ENABLEHARDERR); | |
181 if (rc != NO_ERROR) | |
182 return 0; | |
183 | |
184 return (unsigned long)((aulFSInfoBuf[3] * aulFSInfoBuf[1] * (USHORT)aulFSInfoBuf[4])/1024); | |
185 #elif defined(__WIN32__) || defined(WINNT) | |
186 char buffer[10] = "C:\\"; | |
187 DWORD spc, bps, fc, tc; | |
188 | |
189 buffer[0] = drive + 'A' - 1; | |
190 | |
191 if(GetDiskFreeSpace(buffer, &spc, &bps, &fc, &tc) == 0) | |
192 return 0; | |
193 return (unsigned long)(spc*bps*(fc/1024)); | |
194 #else | |
195 return 0; | |
196 #endif | |
197 } | |
198 | |
199 int isdrive(int drive) | |
200 { | |
201 #if defined(__EMX__) || defined(__OS2__) | |
202 APIRET rc = NO_ERROR; | |
203 FSINFO volinfo; | |
204 | |
205 DosError(FERR_DISABLEHARDERR); | |
206 rc = DosQueryFSInfo(drive, | |
207 FSIL_VOLSER, | |
208 (PVOID)&volinfo, | |
209 sizeof(FSINFO)); | |
210 | |
211 DosError(FERR_ENABLEHARDERR); | |
212 if (rc == NO_ERROR) | |
213 return 1; | |
214 | |
215 #elif defined(__WIN32__) || defined(WINNT) | |
216 char buffer[10] = "C:\\", volname[100]; | |
217 DWORD spc, bps, fc; | |
218 | |
219 buffer[0] = drive + 'A' - 1; | |
220 | |
221 if(GetVolumeInformation(buffer, volname, 100, &spc, &bps, &fc, NULL, 0) != 0) | |
222 return 1; | |
223 #endif | |
224 return 0; | |
225 } | |
226 | |
227 void setfileinfo(char *filename, char *url) | |
228 { | |
229 time_t ltime; | |
230 struct tm *tm; | |
231 char buffer[200], timebuf[200]; | |
232 #ifdef __OS2__ | |
233 const unsigned fea2listsize = 6000; | |
234 char *pData; | |
235 EAOP2 eaop2; | |
236 PFEA2 pFEA2; | |
237 #else | |
238 FILE *urlfile; | |
239 #endif | |
240 | |
241 ltime = time(NULL); | |
242 | |
243 tm = localtime(<ime); | |
244 | |
245 strftime(timebuf, 200, "%c", tm); | |
246 | |
247 sprintf(buffer, "%s %s", url, timebuf); | |
248 | |
249 #ifdef __OS2__ | |
250 eaop2.fpGEA2List = 0; | |
251 eaop2.fpFEA2List = (PFEA2LIST)malloc(fea2listsize); | |
252 pFEA2 = &eaop2.fpFEA2List->list[0]; | |
253 | |
254 pFEA2->fEA = 0; | |
255 /* .COMMENTS is 9 characters long */ | |
256 pFEA2->cbName = 9; | |
257 | |
258 /* space for the type and length field. */ | |
259 pFEA2->cbValue = strlen(buffer)+2*sizeof(USHORT); | |
260 | |
261 strcpy(pFEA2->szName, ".COMMENTS"); | |
262 pData = pFEA2->szName+pFEA2->cbName+1; | |
263 /* data begins at first byte after the name */ | |
264 | |
265 *(USHORT*)pData = EAT_ASCII; /* type */ | |
266 *((USHORT*)pData+1) = strlen(buffer); /* length */ | |
267 strcpy(pData+2*sizeof(USHORT), buffer);/* content */ | |
268 | |
269 pFEA2->oNextEntryOffset = 0; | |
270 | |
271 eaop2.fpFEA2List->cbList = ((PCHAR)pData+2*sizeof(USHORT)+ | |
272 pFEA2->cbValue)-((PCHAR)eaop2.fpFEA2List); | |
273 | |
274 DosSetPathInfo(filename, | |
275 FIL_QUERYEASIZE, | |
276 &eaop2, | |
277 sizeof(eaop2), | |
278 0); | |
279 | |
280 free((void *)eaop2.fpFEA2List); | |
281 #else | |
282 | |
283 if((urlfile = fopen("handyftp.url", "a"))!=NULL) | |
284 { | |
285 fprintf(urlfile, "%s\n", buffer); | |
286 fclose(urlfile); | |
287 } | |
288 #endif | |
289 } | |
290 | |
291 #if defined(__OS2__) || defined(__WIN32__) | |
292 typedef struct _fsinfo { | |
293 FILE *fp; | |
294 int fd; | |
295 } FSInfo; | |
296 | |
297 FSInfo *FSIRoot = NULL; | |
298 | |
299 #define FSI_MAX 100 | |
300 #endif | |
301 | |
302 /* Sharable fopen() and fclose() calls. */ | |
303 FILE *fsopen(char *path, char *modes) | |
304 { | |
305 #if defined(__OS2__) || defined(__WIN32__) | |
306 int z; | |
307 | |
308 if(!FSIRoot) | |
309 FSIRoot = calloc(sizeof(struct _fsinfo), FSI_MAX); | |
310 | |
311 for(z=0;z<FSI_MAX;z++) | |
312 { | |
313 if(FSIRoot[z].fd < 1) | |
314 { | |
315 int s, sopenmode = 0, wrmode = 0; | |
316 | |
317 /* Check the flags passed */ | |
318 for(s=0;s<3;s++) | |
319 { | |
320 if(modes[s] == 'b') | |
321 sopenmode |= O_BINARY; | |
322 if(modes[s] == 'r') | |
323 wrmode |= O_RDONLY; | |
324 if(modes[s] == 'w') | |
325 wrmode |= O_WRONLY; | |
326 if(modes[s] == 'a') | |
327 sopenmode |= O_APPEND; | |
328 if(modes[s] == 't') | |
329 sopenmode |= O_TEXT; | |
330 } | |
331 | |
332 /* Check the read/write request */ | |
333 if((wrmode & O_RDONLY) && (wrmode & O_WRONLY)) | |
334 sopenmode |= O_RDWR; | |
335 else | |
336 sopenmode |= wrmode; | |
337 FSIRoot[z].fd = _sopen(path, sopenmode, SH_DENYNO, S_IREAD|S_IWRITE); | |
338 if(FSIRoot[z].fd > 0) | |
339 { | |
340 FSIRoot[z].fp = fdopen(FSIRoot[z].fd, modes); | |
341 | |
342 return FSIRoot[z].fp; | |
343 } | |
344 } | |
345 } | |
346 return NULL; | |
347 #else | |
348 return fopen(path, modes); | |
349 #endif | |
350 } | |
351 | |
352 int fsclose(FILE *fp) | |
353 { | |
354 #if defined(__OS2__) || defined(__WIN32__) | |
355 if(FSIRoot) | |
356 { | |
357 | |
358 int z; | |
359 for(z=0;z<FSI_MAX;z++) | |
360 { | |
361 if(fp == FSIRoot[z].fp) | |
362 { | |
363 int ret = fclose(fp); | |
364 close(FSIRoot[z].fd); | |
365 FSIRoot[z].fd = 0; | |
366 FSIRoot[z].fp = NULL; | |
367 return ret; | |
368 } | |
369 } | |
370 } | |
371 #endif | |
372 return fclose(fp); | |
373 } | |
374 | |
375 char *fsgets(char *str, int size, FILE *stream) | |
376 { | |
377 return fgets(str, size, stream); | |
378 } | |
379 |