/[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 33 by matty, Sat Sep 15 12:34:34 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-2001     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    
 #include <stdlib.h>             /* malloc realloc free */  
21  #include <stdarg.h>             /* va_list va_start va_end */  #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  int width;  char keymapname[16];
36  int height;  int keylayout = 0x409;          /* Defaults to US keyboard layout */
37  int keylayout = 0x409;  int width = 800;
38    int height = 600;
39    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;
# Line 40  BOOL licence = True; Line 44  BOOL licence = True;
44  BOOL 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          printf("Usage: %s [options] server\n", program);          fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
54          printf("   -u: user name\n");          fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2002 Matt Chapman.\n");
55          printf("   -d: domain\n");          fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
56          printf("   -s: shell\n");  
57          printf("   -c: working directory\n");          fprintf(stderr, "Usage: %s [options] server\n", program);
58          printf("   -p: password (autologon)\n");          fprintf(stderr, "   -u: user name\n");
59          printf("   -n: client hostname\n");          fprintf(stderr, "   -d: domain\n");
60          printf("   -k: keyboard layout (hex)\n");          fprintf(stderr, "   -s: shell\n");
61          printf("   -g: desktop geometry (WxH)\n");          fprintf(stderr, "   -c: working directory\n");
62          printf("   -f: full-screen mode\n");          fprintf(stderr, "   -p: password (- to prompt)\n");
63          printf("   -b: force bitmap updates\n");          fprintf(stderr, "   -P: askpass-program (autologon)\n");
64          printf("   -e: disable encryption (French TS)\n");          fprintf(stderr, "   -n: client hostname\n");
65          printf("   -m: do not send motion events\n");          fprintf(stderr, "   -k: keyboard layout on terminal server (us,sv,gr etc.)\n");
66          printf("   -l: do not request licence\n\n");          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 */
# Line 68  main(int argc, char *argv[]) Line 117  main(int argc, char *argv[])
117          char fullhostname[64];          char fullhostname[64];
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;          struct passwd *pw;
125          char *server, *p;          char *server, *p;
126          uint32 flags;          uint32 flags;
127          int c;          int c;
128    
         printf("rdesktop: A Remote Desktop Protocol client.\n");  
         printf("Version " VERSION ". Copyright (C) 1999-2001 Matt Chapman.\n");  
         printf("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:k:g:fbemlh?")) != -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                  {                  {
# Line 104  main(int argc, char *argv[]) Line 152  main(int argc, char *argv[])
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));                                  STRNCPY(password, optarg, sizeof(password));
162                                  flags |= RDP_LOGON_AUTO;                                  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;
169    
170                            case 'P':
171                                    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':
# Line 113  main(int argc, char *argv[]) Line 182  main(int argc, char *argv[])
182                                  break;                                  break;
183    
184                          case 'k':                          case 'k':
185                                  keylayout = strtol(optarg, NULL, 16);                                  STRNCPY(keymapname, optarg, sizeof(keymapname));
                                 if (keylayout == 0)  
                                 {  
                                         error("invalid keyboard layout\n");  
                                         return 1;  
                                 }  
186                                  break;                                  break;
187    
188                          case 'g':                          case 'g':
189                                  width = strtol(optarg, &p, 10);                                  width = strtol(optarg, &p, 10);
190                                  if (*p == 'x')                                  if (*p == 'x')
191                                          height = strtol(p+1, NULL, 10);                                          height = strtol(p + 1, NULL, 10);
192    
193                                  if ((width == 0) || (height == 0))                                  if ((width == 0) || (height == 0))
194                                  {                                  {
# Line 153  main(int argc, char *argv[]) Line 217  main(int argc, char *argv[])
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':                          case 'h':
233                          case '?':                          case '?':
234                          default:                          default:
# Line 196  main(int argc, char *argv[]) Line 272  main(int argc, char *argv[])
272                  STRNCPY(hostname, fullhostname, sizeof(hostname));                  STRNCPY(hostname, fullhostname, sizeof(hostname));
273          }          }
274    
275          if (!strcmp(password, "-"))          if (prompt_password && read_password(password, sizeof(password)))
276          {                  flags |= RDP_LOGON_AUTO;
                 p = getpass("Password: ");  
                 if (p == NULL)  
                 {  
                         error("failed to read password\n");  
                         return 0;  
                 }  
                 STRNCPY(password, p, sizeof(password));  
         }  
277    
278          if ((width == 0) || (height == 0))          if (title[0] == 0)
279          {          {
280                  width = 800;                  strcpy(title, "rdesktop - ");
281                  height = 600;                  strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
282          }          }
283    
284          strcpy(title, "rdesktop - ");          if (!ui_init())
285          strncat(title, server, sizeof(title) - sizeof("rdesktop - "));                  return 1;
286    
287          if (ui_create_window(title))          if (!rdp_connect(server, flags, domain, password, shell, directory))
288          {                  return 1;
289                  if (!rdp_connect(server, flags, domain, password, shell,  
290                                   directory))          DEBUG(("Connection successful.\n"));
291                          return 1;          memset(password, 0, sizeof(password));
292    
293                  printf("Connection successful.\n");          if (ui_create_window())
294            {
295                  rdp_main_loop();                  rdp_main_loop();
                 printf("Disconnecting...\n");  
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 339  hexdump(unsigned char *p, unsigned int l Line 409  hexdump(unsigned char *p, unsigned int l
409                          printf("%02x ", line[i]);                          printf("%02x ", line[i]);
410    
411                  for (; i < 16; i++)                  for (; i < 16; i++)
412                                  printf("   ");                          printf("   ");
413    
414                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
415                          printf("%c",                          printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
                                (line[i] >= 0x20  
                                 && line[i] < 0x7f) ? line[i] : '.');  
416    
417                  printf("\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.33  
changed lines
  Added in v.211

  ViewVC Help
Powered by ViewVC 1.1.26