xref: /reactos/base/applications/network/ftp/fake.c (revision c2c66aff)
1 #include "precomp.h"
2 
3 #include <wincon.h>
4 
5 #define MAX_ASCII 100
6 
7 int checkRecv(SOCKET s);
8 
checkRecv(SOCKET s)9 int checkRecv(SOCKET s)
10 {
11    int testVal;
12    fd_set sSet;
13    struct timeval timeout;
14    timeout.tv_sec = 60;
15 
16    FD_ZERO(&sSet);
17 
18    FD_SET(s, &sSet);
19 
20    testVal = select(0, &sSet, NULL, NULL, &timeout);
21 
22    if (testVal == SOCKET_ERROR)
23       fprintf(stderr, "Socket Error");
24 
25    return testVal;
26 }
27 
blkfree(char ** av0)28 void blkfree(char **av0)
29 {
30     register char **av = av0;
31 
32     while (*av)
33         free(*av++);
34 }
35 
glob(const char * v)36 char **glob(const char *v)
37 {
38    return NULL;
39 }
40 
sleep(int time)41 int sleep(int time)
42 {
43    return time;
44 }
45 
herror(char * string)46 int herror(char *string)
47 {
48    return 0;
49 }
50 
51 #if 0
52 int gettimeofday(struct timeval *timenow,
53                  struct timezone *zone)
54 {
55     time_t t;
56 
57     t = clock();
58 
59     timenow->tv_usec = t;
60     timenow->tv_sec = t / CLK_TCK;
61 
62     return 0;
63 }
64 
65 int fgetcSocket(int s)
66 {
67    int c;
68    char buffer[10];
69 
70 //   checkRecv(s);
71 
72    c = recv(s, buffer, 1, 0);
73 
74 #ifdef DEBUG_IN
75    printf("%c", buffer[0]);
76 #endif
77 
78    if (c == INVALID_SOCKET)
79       return c;
80 
81    if (c == 0)
82       return EOF;
83 
84    return buffer[0];
85 }
86 
87 #else
88 
fgetcSocket(int s)89 int fgetcSocket(int s)
90 {
91    static int index = 0;
92    static int total = 0;
93    static char buffer[4096];
94 
95    if (index == total)
96      {
97        index = 0;
98        total = recv(s, buffer, sizeof(buffer), 0);
99 
100        if (total == SOCKET_ERROR)
101      {
102        total = 0;
103        return ERROR;
104      }
105 
106        if (total == 0)
107      return EOF;
108      }
109    return buffer[index++];
110 }
111 
112 #endif
113 
fprintfSocket(int s,const char * format,...)114 const char *fprintfSocket(int s, const char *format, ...)
115 {
116    va_list argptr;
117    char buffer[10009];
118 
119    va_start(argptr, format);
120    vsprintf(buffer, format, argptr);
121    va_end(argptr);
122 
123    send(s, buffer, strlen(buffer), 0);
124 
125    return NULL;
126 }
127 
fputsSocket(const char * format,int s)128 const char *fputsSocket(const char *format, int s)
129 {
130    send(s, format, strlen(format), 0);
131 
132    return NULL;
133 }
134 
fputcSocket(int s,char putChar)135 int fputcSocket(int s, char putChar)
136 {
137    char buffer[2];
138 
139    buffer[0] = putChar;
140    buffer[1] = '\0';
141 
142    if(SOCKET_ERROR==send(s, buffer, 1, 0)) {
143        int iret=WSAGetLastError ();
144        fprintf(stdout,"fputcSocket: %d\n",iret);
145        return 0;
146    }
147    else {
148     return putChar;
149    }
150 }
fputSocket(int s,char * buffer,int len)151 int fputSocket(int s, char *buffer, int len)
152 {
153     int iret;
154     while(len) {
155         if(SOCKET_ERROR==(iret=send(s, buffer, len, 0)))
156         {
157             iret=WSAGetLastError ();
158             fprintf(stdout,"fputcSocket: %d\n",iret);
159             return 0;
160         }
161         else {
162             return len-=iret;
163         }
164     }
165     return 0;
166 }
167 
fgetsSocket(int s,char * string)168 char *fgetsSocket(int s, char *string)
169 {
170    char buffer[2] = {0};
171    int i, count;
172 
173    for (i = 0, count = 1; count != 0 && buffer[0] != '\n'; i++)
174    {
175       checkRecv(s);
176 
177       count = recv(s, buffer, 1, 0);
178 
179       if (count == SOCKET_ERROR)
180       {
181      printf("Error in fgetssocket");
182      return NULL;
183       }
184 
185       if (count == 1)
186       {
187      string[i] = buffer[0];
188 
189      if (i == MAX_ASCII - 3)
190      {
191         count = 0;
192         string[++i] = '\n';
193         string[++i] = '\0';
194      }
195       }
196       else
197       {
198      if (i == 0)
199         return NULL;
200      else
201      {
202         string[i] = '\n';
203         string[i + 1] = '\0'; // This is risky
204         return string;
205      }
206 
207       }
208 
209    }
210    string[i] = '\0';
211 
212 #ifdef DEBUG_IN
213    printf("%s", string);
214 #endif
215    return string;
216 }
217 
218 
219 #if 0
220 char *getpass(const char *prompt)
221 {
222    static char string[64];
223 
224    printf("%s", prompt);
225 
226    gets(string);
227 
228    return string;
229 }
230 #endif
getpass(const char * prompt)231 char *getpass (const char * prompt)
232 {
233   static char input[256];
234   HANDLE in;
235   HANDLE err;
236   DWORD    count;
237 
238   in = GetStdHandle (STD_INPUT_HANDLE);
239   err = GetStdHandle (STD_ERROR_HANDLE);
240 
241   if (in == INVALID_HANDLE_VALUE || err == INVALID_HANDLE_VALUE)
242     return NULL;
243 
244   if (WriteFile (err, prompt, strlen (prompt), &count, NULL))
245     {
246       int istty = (GetFileType (in) == FILE_TYPE_CHAR);
247       DWORD old_flags;
248       int rc;
249 
250       if (istty)
251     {
252       if (GetConsoleMode (in, &old_flags))
253         SetConsoleMode (in, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);
254       else
255         istty = 0;
256     }
257       /* Need to read line one byte at time to avoid blocking, if not a
258          tty, so always do it this way.  */
259       count = 0;
260       while (1)
261     {
262       DWORD  dummy;
263       char   one_char;
264 
265       rc = ReadFile (in, &one_char, 1, &dummy, NULL);
266       if (rc == 0)
267         break;
268       if (one_char == '\r')
269         {
270           /* CR is always followed by LF if reading from tty.  */
271           if (istty)
272         continue;
273           else
274         break;
275         }
276       if (one_char == '\n')
277         break;
278       /* Silently truncate password string if overly long.  */
279       if (count < sizeof (input) - 1)
280         input[count++] = one_char;
281     }
282       input[count] = '\0';
283 
284       WriteFile (err, "\r\n", 2, &count, NULL);
285       if (istty)
286     SetConsoleMode (in, old_flags);
287       if (rc)
288     return input;
289     }
290 
291   return NULL;
292 }
293 
294 #if 0
295 // Stubbed out here. Should be changed in Source code...
296 int access(const char *filename, int accessmethod)
297 {
298    return 0;
299 }
300 #endif
301 
302 #ifndef __GNUC__
303 #define EPOCHFILETIME (116444736000000000i64)
304 #else
305 #define EPOCHFILETIME (116444736000000000LL)
306 #endif
307 
gettimeofday(struct timeval * tv,struct timezone * tz)308 int gettimeofday(struct timeval *tv, struct timezone *tz)
309 {
310     FILETIME        ft;
311     LARGE_INTEGER   li;
312     __int64         t;
313     static int      tzflag;
314 
315     if (tv)
316     {
317         GetSystemTimeAsFileTime(&ft);
318         li.LowPart  = ft.dwLowDateTime;
319         li.HighPart = ft.dwHighDateTime;
320         t  = li.QuadPart;       /* In 100-nanosecond intervals */
321         t -= EPOCHFILETIME;     /* Offset to the Epoch time */
322         t /= 10;                /* In microseconds */
323         tv->tv_sec  = (long)(t / 1000000);
324         tv->tv_usec = (long)(t % 1000000);
325     }
326 
327     if (tz)
328     {
329         if (!tzflag)
330         {
331             _tzset();
332             tzflag++;
333         }
334         tz->tz_minuteswest = _timezone / 60;
335         tz->tz_dsttime = _daylight;
336     }
337 
338     return 0;
339 }
340