/[rdesktop]/sourceforge.net/trunk/rdesktop/rdesktop.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/rdesktop.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 21 by matty, Mon Oct 16 08:44:48 2000 UTC revision 211 by matthewc, Fri Oct 4 14:28:14 2002 UTC
# Line 1  Line 1 
1  /*  /*
2     rdesktop: A Remote Desktop Protocol client.     rdesktop: A Remote Desktop Protocol client.
3     Entrypoint and utility functions     Entrypoint and utility functions
4     Copyright (C) Matthew Chapman 1999-2000     Copyright (C) Matthew Chapman 1999-2002
5      
6     This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.     (at your option) any later version.
10      
11     This program is distributed in the hope that it will be useful,     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.     GNU General Public License for more details.
15      
16     You should have received a copy of the GNU General Public License     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  */  */
20    
21  #include <stdlib.h>     /* malloc realloc free */  #include <stdarg.h>             /* va_list va_start va_end */
22  #include <unistd.h>     /* read close getuid getgid getpid getppid gethostname */  #include <unistd.h>             /* read close getuid getgid getpid getppid gethostname */
23  #include <fcntl.h>      /* open */  #include <fcntl.h>              /* open */
24  #include <pwd.h>        /* getpwuid */  #include <pwd.h>                /* getpwuid */
25  #include <sys/stat.h>   /* stat */  #include <limits.h>             /* PATH_MAX */
26  #include <sys/time.h>   /* gettimeofday */  #include <termios.h>            /* tcgetattr tcsetattr */
27  #include <sys/times.h>  /* times */  #include <sys/stat.h>           /* stat */
28    #include <sys/time.h>           /* gettimeofday */
29    #include <sys/times.h>          /* times */
30  #include "rdesktop.h"  #include "rdesktop.h"
31    
32    char title[32] = "";
33  char username[16];  char username[16];
34  char hostname[16];  char hostname[16];
35    char keymapname[16];
36    int keylayout = 0x409;          /* Defaults to US keyboard layout */
37  int width = 800;  int width = 800;
38  int height = 600;  int height = 600;
39  int keylayout = 0x409;  int tcp_port_rdp = TCP_PORT_RDP;
40  BOOL motion = True;  BOOL bitmap_compression = True;
41    BOOL sendmotion = True;
42  BOOL orders = True;  BOOL orders = True;
43  BOOL licence = True;  BOOL licence = True;
44    BOOL encryption = True;
45    BOOL desktop_save = True;
46    BOOL fullscreen = False;
47    BOOL grab_keyboard = True;
48    
49  /* Display usage information */  /* Display usage information */
50  static void usage(char *program)  static void
51    usage(char *program)
52    {
53            fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
54            fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2002 Matt Chapman.\n");
55            fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
56    
57            fprintf(stderr, "Usage: %s [options] server\n", program);
58            fprintf(stderr, "   -u: user name\n");
59            fprintf(stderr, "   -d: domain\n");
60            fprintf(stderr, "   -s: shell\n");
61            fprintf(stderr, "   -c: working directory\n");
62            fprintf(stderr, "   -p: password (- to prompt)\n");
63            fprintf(stderr, "   -P: askpass-program (autologon)\n");
64            fprintf(stderr, "   -n: client hostname\n");
65            fprintf(stderr, "   -k: keyboard layout on terminal server (us,sv,gr etc.)\n");
66            fprintf(stderr, "   -g: desktop geometry (WxH)\n");
67            fprintf(stderr, "   -f: full-screen mode\n");
68            fprintf(stderr, "   -b: force bitmap updates\n");
69            fprintf(stderr, "   -e: disable encryption (French TS)\n");
70            fprintf(stderr, "   -m: do not send motion events\n");
71            fprintf(stderr, "   -l: do not request licence\n");
72            fprintf(stderr, "   -t: rdp tcp port\n");
73            fprintf(stderr, "   -K: keep window manager key bindings\n");
74            fprintf(stderr, "   -w: window title\n");
75    }
76    
77    static BOOL
78    read_password(char *password, int size)
79  {  {
80          STATUS("Usage: %s [options] server\n", program);          struct termios tios;
81          STATUS("   -u: user name\n");          BOOL ret = False;
82          STATUS("   -d: domain\n");          int istty = 0;
83          STATUS("   -s: shell\n");          char *p;
84          STATUS("   -c: working directory\n");  
85          STATUS("   -p: password (autologon)\n");          if (tcgetattr(STDIN_FILENO, &tios) == 0)
86          STATUS("   -n: client hostname\n");          {
87          STATUS("   -w: desktop width\n");                  fprintf(stderr, "Password: ");
88          STATUS("   -h: desktop height\n");                  tios.c_lflag &= ~ECHO;
89          STATUS("   -k: keyboard layout (hex)\n");                  tcsetattr(STDIN_FILENO, TCSANOW, &tios);
90          STATUS("   -b: force bitmap updates\n");                  istty = 1;
91          STATUS("   -m: do not send motion events\n");          }
92          STATUS("   -l: do not request licence\n\n");  
93            if (fgets(password, size, stdin) != NULL)
94            {
95                    ret = True;
96    
97                    /* strip final newline */
98                    p = strchr(password, '\n');
99                    if (p != NULL)
100                            *p = 0;
101            }
102    
103            if (istty)
104            {
105                    tios.c_lflag |= ECHO;
106                    tcsetattr(STDIN_FILENO, TCSANOW, &tios);
107                    fprintf(stderr, "\n");
108            }
109    
110            return ret;
111  }  }
112    
113  /* Client program */  /* Client program */
114  int main(int argc, char *argv[])  int
115    main(int argc, char *argv[])
116  {  {
117          struct passwd *pw;          char fullhostname[64];
         char *server;  
         uint32 flags;  
118          char domain[16];          char domain[16];
119          char password[16];          char password[16];
120            char *askpass_result;
121          char shell[32];          char shell[32];
122          char directory[32];          char directory[32];
123          char title[32];          BOOL prompt_password;
124            struct passwd *pw;
125            char *server, *p;
126            uint32 flags;
127          int c;          int c;
128    
         STATUS("rdesktop: A Remote Desktop Protocol client.\n");  
         STATUS("Version "VERSION". Copyright (C) 1999-2000 Matt Chapman.\n");  
         STATUS("See http://www.rdesktop.org/ for more information.\n\n");  
   
129          flags = RDP_LOGON_NORMAL;          flags = RDP_LOGON_NORMAL;
130            prompt_password = False;
131          domain[0] = password[0] = shell[0] = directory[0] = 0;          domain[0] = password[0] = shell[0] = directory[0] = 0;
132            strcpy(keymapname, "us");
133    
134          while ((c = getopt(argc, argv, "u:d:s:c:p:n:w:h:k:bml?")) != -1)          while ((c = getopt(argc, argv, "u:d:s:c:p:P:n:k:g:t:fbemlKw:h?")) != -1)
135          {          {
136                  switch (c)                  switch (c)
137                  {                  {
138                          case 'u':                          case 'u':
139                                  strncpy(username, optarg, sizeof(username));                                  STRNCPY(username, optarg, sizeof(username));
140                                  break;                                  break;
141    
142                          case 'd':                          case 'd':
143                                  strncpy(domain, optarg, sizeof(domain));                                  STRNCPY(domain, optarg, sizeof(domain));
                                 break;  
   
                         case 'p':  
                                 flags |= RDP_LOGON_AUTO;  
                                 strncpy(password, optarg, sizeof(password));  
144                                  break;                                  break;
145    
146                          case 's':                          case 's':
147                                  strncpy(shell, optarg, sizeof(shell));                                  STRNCPY(shell, optarg, sizeof(shell));
148                                  break;                                  break;
149    
150                          case 'c':                          case 'c':
151                                  strncpy(directory, optarg, sizeof(directory));                                  STRNCPY(directory, optarg, sizeof(directory));
152                                  break;                                  break;
153    
154                          case 'n':                          case 'p':
155                                  strncpy(hostname, optarg, sizeof(hostname));                                  if ((optarg[0] == '-') && (optarg[1] == 0))
156                                    {
157                                            prompt_password = True;
158                                            break;
159                                    }
160    
161                                    STRNCPY(password, optarg, sizeof(password));
162                                    flags |= RDP_LOGON_AUTO;
163    
164                                    /* try to overwrite argument so it won't appear in ps */
165                                    p = optarg;
166                                    while (*p)
167                                            *(p++) = 'X';
168                                  break;                                  break;
169    
170                          case 'w':                          case 'P':
171                                  width = strtol(optarg, NULL, 10);                                  askpass_result = askpass(optarg, "Enter password");
172                                    if (askpass_result == NULL)
173                                            exit(1);
174    
175                                    STRNCPY(password, askpass_result, sizeof(password));
176                                    free(askpass_result);
177                                    flags |= RDP_LOGON_AUTO;
178                                  break;                                  break;
179    
180                          case 'h':                          case 'n':
181                                  height = strtol(optarg, NULL, 10);                                  STRNCPY(hostname, optarg, sizeof(hostname));
182                                  break;                                  break;
183    
184                          case 'k':                          case 'k':
185                                  keylayout = strtol(optarg, NULL, 16);                                  STRNCPY(keymapname, optarg, sizeof(keymapname));
186                                  break;                                  break;
187    
188                          case 'm':                          case 'g':
189                                  motion = False;                                  width = strtol(optarg, &p, 10);
190                                    if (*p == 'x')
191                                            height = strtol(p + 1, NULL, 10);
192    
193                                    if ((width == 0) || (height == 0))
194                                    {
195                                            error("invalid geometry\n");
196                                            return 1;
197                                    }
198                                    break;
199    
200                            case 'f':
201                                    fullscreen = True;
202                                  break;                                  break;
203    
204                          case 'b':                          case 'b':
205                                  orders = False;                                  orders = False;
206                                  break;                                  break;
207    
208                            case 'e':
209                                    encryption = False;
210                                    break;
211    
212                            case 'm':
213                                    sendmotion = False;
214                                    break;
215    
216                          case 'l':                          case 'l':
217                                  licence = False;                                  licence = False;
218                                  break;                                  break;
219    
220                            case 't':
221                                    tcp_port_rdp = strtol(optarg, NULL, 10);
222                                    break;
223    
224                            case 'K':
225                                    grab_keyboard = False;
226                                    break;
227    
228                            case 'w':
229                                    strncpy(title, optarg, sizeof(title));
230                                    break;
231    
232                            case 'h':
233                          case '?':                          case '?':
234                          default:                          default:
235                                  usage(argv[0]);                                  usage(argv[0]);
# Line 147  int main(int argc, char *argv[]) Line 250  int main(int argc, char *argv[])
250                  pw = getpwuid(getuid());                  pw = getpwuid(getuid());
251                  if ((pw == NULL) || (pw->pw_name == NULL))                  if ((pw == NULL) || (pw->pw_name == NULL))
252                  {                  {
253                          STATUS("Could not determine user name.\n");                          error("could not determine username, use -u\n");
254                          return 1;                          return 1;
255                  }                  }
256    
257                  strncpy(username, pw->pw_name, sizeof(username));                  STRNCPY(username, pw->pw_name, sizeof(username));
258          }          }
259    
260          if (hostname[0] == 0)          if (hostname[0] == 0)
261          {          {
262                  if (gethostname(hostname, sizeof(hostname)) == -1)                  if (gethostname(fullhostname, sizeof(fullhostname)) == -1)
263                  {                  {
264                          STATUS("Could not determine host name.\n");                          error("could not determine local hostname, use -n\n");
265                          return 1;                          return 1;
266                  }                  }
267    
268                    p = strchr(fullhostname, '.');
269                    if (p != NULL)
270                            *p = 0;
271    
272                    STRNCPY(hostname, fullhostname, sizeof(hostname));
273          }          }
274    
275          if (!rdp_connect(server, flags, domain, password, shell, directory))          if (prompt_password && read_password(password, sizeof(password)))
276                    flags |= RDP_LOGON_AUTO;
277    
278            if (title[0] == 0)
279            {
280                    strcpy(title, "rdesktop - ");
281                    strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
282            }
283    
284            if (!ui_init())
285                  return 1;                  return 1;
286    
287          STATUS("Connection successful.\n");          if (!rdp_connect(server, flags, domain, password, shell, directory))
288                    return 1;
289    
290          strcpy(title, "rdesktop - ");          DEBUG(("Connection successful.\n"));
291          strncat(title, server, sizeof(title));          memset(password, 0, sizeof(password));
292    
293          if (ui_create_window(title))          if (ui_create_window())
294          {          {
295                  rdp_main_loop();                  rdp_main_loop();
296                  ui_destroy_window();                  ui_destroy_window();
297          }          }
298    
299            DEBUG(("Disconnecting...\n"));
300          rdp_disconnect();          rdp_disconnect();
301            ui_deinit();
302          return 0;          return 0;
303  }  }
304    
305  /* Generate a 32-byte random for the secure transport code. */  /* Generate a 32-byte random for the secure transport code. */
306  void generate_random(uint8 *random)  void
307    generate_random(uint8 * random)
308  {  {
309          struct stat st;          struct stat st;
310          uint32 *r = (uint32 *)random;          struct tms tmsbuf;
311            uint32 *r = (uint32 *) random;
312          int fd;          int fd;
313    
314          /* If we have a kernel random device, use it. */          /* If we have a kernel random device, use it. */
315          if ((fd = open("/dev/urandom", O_RDONLY)) != -1)          if (((fd = open("/dev/urandom", O_RDONLY)) != -1)
316                || ((fd = open("/dev/random", O_RDONLY)) != -1))
317          {          {
318                  read(fd, random, 32);                  read(fd, random, 32);
319                  close(fd);                  close(fd);
# Line 199  void generate_random(uint8 *random) Line 323  void generate_random(uint8 *random)
323          /* Otherwise use whatever entropy we can gather - ideas welcome. */          /* Otherwise use whatever entropy we can gather - ideas welcome. */
324          r[0] = (getpid()) | (getppid() << 16);          r[0] = (getpid()) | (getppid() << 16);
325          r[1] = (getuid()) | (getgid() << 16);          r[1] = (getuid()) | (getgid() << 16);
326          r[2] = times(NULL); /* system uptime (clocks) */          r[2] = times(&tmsbuf);  /* system uptime (clocks) */
327          gettimeofday((struct timeval *)&r[3], NULL); /* sec and usec */          gettimeofday((struct timeval *) &r[3], NULL);   /* sec and usec */
328          stat("/tmp", &st);          stat("/tmp", &st);
329          r[5] = st.st_atime;          r[5] = st.st_atime;
330          r[6] = st.st_mtime;          r[6] = st.st_mtime;
# Line 208  void generate_random(uint8 *random) Line 332  void generate_random(uint8 *random)
332  }  }
333    
334  /* malloc; exit if out of memory */  /* malloc; exit if out of memory */
335  void *xmalloc(int size)  void *
336    xmalloc(int size)
337  {  {
338          void *mem = malloc(size);          void *mem = malloc(size);
339          if (mem == NULL)          if (mem == NULL)
340          {          {
341                  ERROR("xmalloc %d\n", size);                  error("xmalloc %d\n", size);
342                  exit(1);                  exit(1);
343          }          }
344          return mem;          return mem;
345  }  }
346    
347  /* realloc; exit if out of memory */  /* realloc; exit if out of memory */
348  void *xrealloc(void *oldmem, int size)  void *
349    xrealloc(void *oldmem, int size)
350  {  {
351          void *mem = realloc(oldmem, size);          void *mem = realloc(oldmem, size);
352          if (mem == NULL)          if (mem == NULL)
353          {          {
354                  ERROR("xrealloc %d\n", size);                  error("xrealloc %d\n", size);
355                  exit(1);                  exit(1);
356          }          }
357          return mem;          return mem;
358  }  }
359    
360  /* free */  /* free */
361  void xfree(void *mem)  void
362    xfree(void *mem)
363  {  {
364          free(mem);          free(mem);
365  }  }
366    
367  /* Produce a hex dump */  /* report an error */
368  void hexdump(unsigned char *p, unsigned int len)  void
369    error(char *format, ...)
370    {
371            va_list ap;
372    
373            fprintf(stderr, "ERROR: ");
374    
375            va_start(ap, format);
376            vfprintf(stderr, format, ap);
377            va_end(ap);
378    }
379    
380    /* report an unimplemented protocol feature */
381    void
382    unimpl(char *format, ...)
383    {
384            va_list ap;
385    
386            fprintf(stderr, "NOT IMPLEMENTED: ");
387    
388            va_start(ap, format);
389            vfprintf(stderr, format, ap);
390            va_end(ap);
391    }
392    
393    /* produce a hex dump */
394    void
395    hexdump(unsigned char *p, unsigned int len)
396  {  {
397          unsigned char *line = p;          unsigned char *line = p;
398          unsigned int thisline, offset = 0;          unsigned int thisline, offset = 0;
# Line 246  void hexdump(unsigned char *p, unsigned Line 400  void hexdump(unsigned char *p, unsigned
400    
401          while (offset < len)          while (offset < len)
402          {          {
403                  STATUS("%04x ", offset);                  printf("%04x ", offset);
404                  thisline = len - offset;                  thisline = len - offset;
405                  if (thisline > 16)                  if (thisline > 16)
406                          thisline = 16;                          thisline = 16;
407    
408                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
409                          STATUS("%02x ", line[i])                          printf("%02x ", line[i]);
410    
411                  for (; i < 16; i++)                  for (; i < 16; i++)
412                          STATUS("   ");                          printf("   ");
413    
414                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
415                          STATUS("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');                          printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
416    
417                  STATUS("\n");                  printf("\n");
418                  offset += thisline;                  offset += thisline;
419                  line += thisline;                  line += thisline;
420          }          }
421  }  }
422    
423    #ifdef SAVE_LICENCE
424    int
425    load_licence(unsigned char **data)
426    {
427            char path[PATH_MAX];
428            char *home;
429            struct stat st;
430            int fd;
431    
432            home = getenv("HOME");
433            if (home == NULL)
434                    return -1;
435    
436            STRNCPY(path, home, sizeof(path));
437            strncat(path, "/.rdesktop/licence", sizeof(path) - strlen(path) - 1);
438    
439            fd = open(path, O_RDONLY);
440            if (fd == -1)
441                    return -1;
442    
443            if (fstat(fd, &st))
444                    return -1;
445    
446            *data = xmalloc(st.st_size);
447            return read(fd, *data, st.st_size);
448    }
449    
450    void
451    save_licence(unsigned char *data, int length)
452    {
453            char path[PATH_MAX];
454            char *home;
455            int fd;
456    
457            home = getenv("HOME");
458            if (home == NULL)
459                    return;
460    
461            STRNCPY(path, home, sizeof(path));
462            strncat(path, "/.rdesktop", sizeof(path) - strlen(path) - 1);
463            mkdir(path, 0700);
464    
465            strncat(path, "/licence", sizeof(path) - strlen(path) - 1);
466    
467            fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
468            if (fd == -1)
469            {
470                    perror("open");
471                    return;
472            }
473    
474            write(fd, data, length);
475            close(fd);
476    }
477    #endif

Legend:
Removed from v.21  
changed lines
  Added in v.211

  ViewVC Help
Powered by ViewVC 1.1.26