/[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 29 by matty, Fri Sep 14 03:38:39 2001 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 <limits.h>             /* PATH_MAX */
26    #include <termios.h>            /* tcgetattr tcsetattr */
27  #include <sys/stat.h>           /* stat */  #include <sys/stat.h>           /* stat */
28  #include <sys/time.h>           /* gettimeofday */  #include <sys/time.h>           /* gettimeofday */
29  #include <sys/times.h>          /* times */  #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 bitmap_compression = True;  BOOL bitmap_compression = True;
41  BOOL sendmotion = True;  BOOL sendmotion = True;
42  BOOL orders = True;  BOOL orders = True;
43  BOOL licence = True;  BOOL licence = True;
44  BOOL use_encryption = True;  BOOL encryption = True;
45  BOOL desktop_save = True;  BOOL desktop_save = True;
46  BOOL fullscreen = False;  BOOL fullscreen = False;
47    BOOL grab_keyboard = True;
48    
49  /* Display usage information */  /* Display usage information */
50  static void  static void
51  usage(char *program)  usage(char *program)
52  {  {
53          STATUS("Usage: %s [options] server\n", program);          fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
54          STATUS("   -u: user name\n");          fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2002 Matt Chapman.\n");
55          STATUS("   -d: domain\n");          fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
56          STATUS("   -s: shell\n");  
57          STATUS("   -c: working directory\n");          fprintf(stderr, "Usage: %s [options] server\n", program);
58          STATUS("   -p: password (autologon)\n");          fprintf(stderr, "   -u: user name\n");
59          STATUS("   -n: client hostname\n");          fprintf(stderr, "   -d: domain\n");
60          STATUS("   -w: desktop width\n");          fprintf(stderr, "   -s: shell\n");
61          STATUS("   -h: desktop height\n");          fprintf(stderr, "   -c: working directory\n");
62          STATUS("   -k: keyboard layout (hex)\n");          fprintf(stderr, "   -p: password (- to prompt)\n");
63          STATUS("   -b: force bitmap updates\n");          fprintf(stderr, "   -P: askpass-program (autologon)\n");
64          STATUS("   -m: do not send motion events\n");          fprintf(stderr, "   -n: client hostname\n");
65          STATUS("   -l: do not request licence\n\n");          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            struct termios tios;
81            BOOL ret = False;
82            int istty = 0;
83            char *p;
84    
85            if (tcgetattr(STDIN_FILENO, &tios) == 0)
86            {
87                    fprintf(stderr, "Password: ");
88                    tios.c_lflag &= ~ECHO;
89                    tcsetattr(STDIN_FILENO, TCSANOW, &tios);
90                    istty = 1;
91            }
92    
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  int
115  main(int argc, char *argv[])  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:g:k:mbleKFVh?")) != -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));
144                                    break;
145    
146                            case 's':
147                                    STRNCPY(shell, optarg, sizeof(shell));
148                                    break;
149    
150                            case 'c':
151                                    STRNCPY(directory, optarg, sizeof(directory));
152                                  break;                                  break;
153    
154                          case 'p':                          case 'p':
155                                    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;                                  flags |= RDP_LOGON_AUTO;
                                 strncpy(password, optarg, sizeof(password));  
                                 break;  
163    
164                          case 's':                                  /* try to overwrite argument so it won't appear in ps */
165                                  strncpy(shell, optarg, sizeof(shell));                                  p = optarg;
166                                    while (*p)
167                                            *(p++) = 'X';
168                                  break;                                  break;
169    
170                          case 'c':                          case 'P':
171                                  strncpy(directory, optarg, sizeof(directory));                                  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 'n':                          case 'n':
181                                  strncpy(hostname, optarg, sizeof(hostname));                                  STRNCPY(hostname, optarg, sizeof(hostname));
182                                    break;
183    
184                            case 'k':
185                                    STRNCPY(keymapname, optarg, sizeof(keymapname));
186                                  break;                                  break;
187    
188                          case 'g':                          case 'g':
189                                    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                                          char *tgem = 0;                                          error("invalid geometry\n");
196                                          width = strtol(optarg, NULL, 10);                                          return 1;
                                         tgem = strchr(optarg, 'x');  
                                         if ((tgem == 0) || (strlen(tgem) < 2))  
                                         {  
                                                 ERROR  
                                                         ("-g: invalid parameter. Syntax example: -g 1024x768\n");  
                                                 exit(1);  
                                         }  
                                         height = strtol(tgem + 1, NULL, 10);  
197                                  }                                  }
198                                  break;                                  break;
199    
200                          case 'k':                          case 'f':
201                                  keylayout = strtol(optarg, NULL, 16);                                  fullscreen = True;
                                 /* keylayout = find_keyb_code(optarg); */  
                                 if (keylayout == 0)  
                                         return 0;  
                                 break;  
   
                         case 'm':  
                                 sendmotion = False;  
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 'e':                          case 't':
221                                  use_encryption = False;                                  tcp_port_rdp = strtol(optarg, NULL, 10);
222                                  break;                                  break;
223    
224                          case 'F':                          case 'K':
225                                  fullscreen = True;                                  grab_keyboard = False;
226                                    break;
227    
228                            case 'w':
229                                    strncpy(title, optarg, sizeof(title));
230                                  break;                                  break;
231    
232                          case 'h':                          case 'h':
# Line 172  main(int argc, char *argv[]) Line 250  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          strcpy(title, "rdesktop - ");          if (prompt_password && read_password(password, sizeof(password)))
276          strncat(title, server, sizeof(title));                  flags |= RDP_LOGON_AUTO;
277    
278          if (ui_create_window(title))          if (title[0] == 0)
279          {          {
280                  if (!rdp_connect(server, flags, domain, password, shell,                  strcpy(title, "rdesktop - ");
281                                   directory))                  strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
282                          return 1;          }
283    
284            if (!ui_init())
285                    return 1;
286    
287            if (!rdp_connect(server, flags, domain, password, shell, directory))
288                    return 1;
289    
290            DEBUG(("Connection successful.\n"));
291            memset(password, 0, sizeof(password));
292    
293                  STATUS("Connection successful.\n");          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  void
307  generate_random(uint8 *random)  generate_random(uint8 * random)
308  {  {
309          struct stat st;          struct stat st;
310          struct tms tmsbuf;          struct tms tmsbuf;
# Line 216  generate_random(uint8 *random) Line 312  generate_random(uint8 *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 241  xmalloc(int size) Line 338  xmalloc(int size)
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;
# Line 254  xrealloc(void *oldmem, int size) Line 351  xrealloc(void *oldmem, int size)
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;
# Line 267  xfree(void *mem) Line 364  xfree(void *mem)
364          free(mem);          free(mem);
365  }  }
366    
367  /* Produce a hex dump */  /* report an error */
368    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  void
395  hexdump(unsigned char *p, unsigned int len)  hexdump(unsigned char *p, unsigned int len)
396  {  {
# Line 277  hexdump(unsigned char *p, unsigned int l Line 400  hexdump(unsigned char *p, unsigned int l
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]) for (; i < 16; i++)                          printf("%02x ", line[i]);
410                                  STATUS("   ");  
411                    for (; i < 16; i++)
412                            printf("   ");
413    
414                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
415                          STATUS("%c",                          printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
                                (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.29  
changed lines
  Added in v.211

  ViewVC Help
Powered by ViewVC 1.1.26