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(&ltime);
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