/[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 58 by jsorg71, Sun Jul 14 00:34:21 2002 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 */  #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];  char keymapname[16];
36  int keylayout;  int keylayout = 0x409;          /* Defaults to US keyboard layout */
37  int width;  int width = 800;
38  int height;  int height = 600;
39  int tcp_port_rdp = TCP_PORT_RDP;  int tcp_port_rdp = TCP_PORT_RDP;
40  BOOL bitmap_compression = True;  BOOL bitmap_compression = True;
41  BOOL sendmotion = True;  BOOL sendmotion = True;
# Line 43  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\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");          fprintf(stderr, "   -g: desktop geometry (WxH)\n");
67          printf("   -t: rdp tcp port\n\n");          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 72  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");          strcpy(keymapname, "us");
133    
134          while ((c = getopt(argc, argv, "u:d:s:c:p:n:k:g:t: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 109  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 124  main(int argc, char *argv[]) Line 188  main(int argc, char *argv[])
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 157  main(int argc, char *argv[]) Line 221  main(int argc, char *argv[])
221                                  tcp_port_rdp = strtol(optarg, NULL, 10);                                  tcp_port_rdp = strtol(optarg, NULL, 10);
222                                  break;                                  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 200  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 (!rdp_connect(server, flags, domain, password, shell, directory))          if (!rdp_connect(server, flags, domain, password, shell, directory))
288                  return 1;                  return 1;
289    
290          printf("Connection successful.\n");          DEBUG(("Connection successful.\n"));
291            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          printf("Disconnecting...\n");          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 343  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;
# Line 356  hexdump(unsigned char *p, unsigned int l Line 420  hexdump(unsigned char *p, unsigned int l
420          }          }
421  }  }
422    
423    #ifdef SAVE_LICENCE
424  int  int
425  load_licence(unsigned char **data)  load_licence(unsigned char **data)
426  {  {
# Line 369  load_licence(unsigned char **data) Line 434  load_licence(unsigned char **data)
434                  return -1;                  return -1;
435    
436          STRNCPY(path, home, sizeof(path));          STRNCPY(path, home, sizeof(path));
437          strncat(path, "/.rdesktop/licence", sizeof(path)-strlen(path)-1);          strncat(path, "/.rdesktop/licence", sizeof(path) - strlen(path) - 1);
438    
439          fd = open(path, O_RDONLY);          fd = open(path, O_RDONLY);
440          if (fd == -1)          if (fd == -1)
# Line 394  save_licence(unsigned char *data, int le Line 459  save_licence(unsigned char *data, int le
459                  return;                  return;
460    
461          STRNCPY(path, home, sizeof(path));          STRNCPY(path, home, sizeof(path));
462          strncat(path, "/.rdesktop", sizeof(path)-strlen(path)-1);          strncat(path, "/.rdesktop", sizeof(path) - strlen(path) - 1);
463          mkdir(path, 0700);          mkdir(path, 0700);
464    
465          strncat(path, "/licence", sizeof(path)-strlen(path)-1);          strncat(path, "/licence", sizeof(path) - strlen(path) - 1);
466    
467          fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0600);          fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
468          if (fd == -1)          if (fd == -1)
469          {          {
470                  perror("open");                  perror("open");
# Line 409  save_licence(unsigned char *data, int le Line 474  save_licence(unsigned char *data, int le
474          write(fd, data, length);          write(fd, data, length);
475          close(fd);          close(fd);
476  }  }
477    #endif

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

  ViewVC Help
Powered by ViewVC 1.1.26