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;
|
|
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
|