/[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 39 by matthewc, Fri Apr 5 07:57:43 2002 UTC revision 214 by matthewc, Sun Oct 6 13:57:39 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;
40  BOOL bitmap_compression = True;  BOOL bitmap_compression = True;
41  BOOL sendmotion = True;  BOOL sendmotion = True;
42  BOOL orders = True;  BOOL orders = True;
 BOOL licence = True;  
43  BOOL encryption = True;  BOOL encryption = True;
44  BOOL desktop_save = True;  BOOL desktop_save = True;
45  BOOL fullscreen = False;  BOOL fullscreen = False;
46    BOOL grab_keyboard = True;
47    
48  /* Display usage information */  /* Display usage information */
49  static void  static void
50  usage(char *program)  usage(char *program)
51  {  {
52          printf("Usage: %s [options] server\n", program);          fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
53          printf("   -u: user name\n");          fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2002 Matt Chapman.\n");
54          printf("   -d: domain\n");          fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
55          printf("   -s: shell\n");  
56          printf("   -c: working directory\n");          fprintf(stderr, "Usage: %s [options] server\n", program);
57          printf("   -p: password (autologon)\n");          fprintf(stderr, "   -u: user name\n");
58          printf("   -n: client hostname\n");          fprintf(stderr, "   -d: domain\n");
59          printf("   -k: keyboard layout\n");          fprintf(stderr, "   -s: shell\n");
60          printf("   -g: desktop geometry (WxH)\n");          fprintf(stderr, "   -c: working directory\n");
61          printf("   -f: full-screen mode\n");          fprintf(stderr, "   -p: password (- to prompt)\n");
62          printf("   -b: force bitmap updates\n");          fprintf(stderr, "   -n: client hostname\n");
63          printf("   -e: disable encryption (French TS)\n");          fprintf(stderr, "   -k: keyboard layout on terminal server (us,sv,gr etc.)\n");
64          printf("   -m: do not send motion events\n");          fprintf(stderr, "   -g: desktop geometry (WxH)\n");
65          printf("   -l: do not request licence\n\n");          fprintf(stderr, "   -f: full-screen mode\n");
66            fprintf(stderr, "   -b: force bitmap updates\n");
67            fprintf(stderr, "   -e: disable encryption (French TS)\n");
68            fprintf(stderr, "   -m: do not send motion events\n");
69            fprintf(stderr, "   -t: rdp tcp port\n");
70            fprintf(stderr, "   -K: keep window manager key bindings\n");
71            fprintf(stderr, "   -w: window title\n");
72    }
73    
74    static BOOL
75    read_password(char *password, int size)
76    {
77            struct termios tios;
78            BOOL ret = False;
79            int istty = 0;
80            char *p;
81    
82            if (tcgetattr(STDIN_FILENO, &tios) == 0)
83            {
84                    fprintf(stderr, "Password: ");
85                    tios.c_lflag &= ~ECHO;
86                    tcsetattr(STDIN_FILENO, TCSANOW, &tios);
87                    istty = 1;
88            }
89    
90            if (fgets(password, size, stdin) != NULL)
91            {
92                    ret = True;
93    
94                    /* strip final newline */
95                    p = strchr(password, '\n');
96                    if (p != NULL)
97                            *p = 0;
98            }
99    
100            if (istty)
101            {
102                    tios.c_lflag |= ECHO;
103                    tcsetattr(STDIN_FILENO, TCSANOW, &tios);
104                    fprintf(stderr, "\n");
105            }
106    
107            return ret;
108  }  }
109    
110  /* Client program */  /* Client program */
# Line 72  main(int argc, char *argv[]) Line 116  main(int argc, char *argv[])
116          char password[16];          char password[16];
117          char shell[32];          char shell[32];
118          char directory[32];          char directory[32];
119          char title[32];          BOOL prompt_password;
120          struct passwd *pw;          struct passwd *pw;
121          char *server, *p;          char *server, *p;
122          uint32 flags;          uint32 flags;
123          int c;          int c;
124    
         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");  
   
125          flags = RDP_LOGON_NORMAL;          flags = RDP_LOGON_NORMAL;
126            prompt_password = False;
127          domain[0] = password[0] = shell[0] = directory[0] = 0;          domain[0] = password[0] = shell[0] = directory[0] = 0;
128          strcpy(keymapname, "us");          strcpy(keymapname, "us");
129    
130          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:n:k:g:t:fbemKw:h?")) != -1)
131          {          {
132                  switch (c)                  switch (c)
133                  {                  {
# Line 107  main(int argc, char *argv[]) Line 148  main(int argc, char *argv[])
148                                  break;                                  break;
149    
150                          case 'p':                          case 'p':
151                                    if ((optarg[0] == '-') && (optarg[1] == 0))
152                                    {
153                                            prompt_password = True;
154                                            break;
155                                    }
156    
157                                  STRNCPY(password, optarg, sizeof(password));                                  STRNCPY(password, optarg, sizeof(password));
158                                  flags |= RDP_LOGON_AUTO;                                  flags |= RDP_LOGON_AUTO;
159    
160                                    /* try to overwrite argument so it won't appear in ps */
161                                    p = optarg;
162                                    while (*p)
163                                            *(p++) = 'X';
164                                  break;                                  break;
165    
166                          case 'n':                          case 'n':
# Line 122  main(int argc, char *argv[]) Line 174  main(int argc, char *argv[])
174                          case 'g':                          case 'g':
175                                  width = strtol(optarg, &p, 10);                                  width = strtol(optarg, &p, 10);
176                                  if (*p == 'x')                                  if (*p == 'x')
177                                          height = strtol(p+1, NULL, 10);                                          height = strtol(p + 1, NULL, 10);
178    
179                                  if ((width == 0) || (height == 0))                                  if ((width == 0) || (height == 0))
180                                  {                                  {
# Line 147  main(int argc, char *argv[]) Line 199  main(int argc, char *argv[])
199                                  sendmotion = False;                                  sendmotion = False;
200                                  break;                                  break;
201    
202                          case 'l':                          case 't':
203                                  licence = False;                                  tcp_port_rdp = strtol(optarg, NULL, 10);
204                                    break;
205    
206                            case 'K':
207                                    grab_keyboard = False;
208                                    break;
209    
210                            case 'w':
211                                    strncpy(title, optarg, sizeof(title));
212                                  break;                                  break;
213    
214                          case 'h':                          case 'h':
# Line 194  main(int argc, char *argv[]) Line 254  main(int argc, char *argv[])
254                  STRNCPY(hostname, fullhostname, sizeof(hostname));                  STRNCPY(hostname, fullhostname, sizeof(hostname));
255          }          }
256    
257          if (!strcmp(password, "-"))          if (prompt_password && read_password(password, sizeof(password)))
258          {                  flags |= RDP_LOGON_AUTO;
                 p = getpass("Password: ");  
                 if (p == NULL)  
                 {  
                         error("failed to read password\n");  
                         return 0;  
                 }  
                 STRNCPY(password, p, sizeof(password));  
         }  
259    
260          if ((width == 0) || (height == 0))          if (title[0] == 0)
261          {          {
262                  width = 800;                  strcpy(title, "rdesktop - ");
263                  height = 600;                  strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
264          }          }
265    
266          strcpy(title, "rdesktop - ");          if (!ui_init())
267          strncat(title, server, sizeof(title) - sizeof("rdesktop - "));                  return 1;
268    
269          if (ui_create_window(title))          if (!rdp_connect(server, flags, domain, password, shell, directory))
270          {                  return 1;
271                  if (!rdp_connect(server, flags, domain, password, shell,  
272                                   directory))          DEBUG(("Connection successful.\n"));
273                          return 1;          memset(password, 0, sizeof(password));
274    
275                  printf("Connection successful.\n");          if (ui_create_window())
276            {
277                  rdp_main_loop();                  rdp_main_loop();
                 printf("Disconnecting...\n");  
278                  ui_destroy_window();                  ui_destroy_window();
                 rdp_disconnect();  
279          }          }
280    
281            DEBUG(("Disconnecting...\n"));
282            rdp_disconnect();
283            ui_deinit();
284          return 0;          return 0;
285  }  }
286    
287  /* Generate a 32-byte random for the secure transport code. */  /* Generate a 32-byte random for the secure transport code. */
288  void  void
289  generate_random(uint8 *random)  generate_random(uint8 * random)
290  {  {
291          struct stat st;          struct stat st;
292          struct tms tmsbuf;          struct tms tmsbuf;
# Line 337  hexdump(unsigned char *p, unsigned int l Line 391  hexdump(unsigned char *p, unsigned int l
391                          printf("%02x ", line[i]);                          printf("%02x ", line[i]);
392    
393                  for (; i < 16; i++)                  for (; i < 16; i++)
394                                  printf("   ");                          printf("   ");
395    
396                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
397                          printf("%c",                          printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
                                (line[i] >= 0x20  
                                 && line[i] < 0x7f) ? line[i] : '.');  
398    
399                  printf("\n");                  printf("\n");
400                  offset += thisline;                  offset += thisline;
# Line 350  hexdump(unsigned char *p, unsigned int l Line 402  hexdump(unsigned char *p, unsigned int l
402          }          }
403  }  }
404    
405    #ifdef SAVE_LICENCE
406  int  int
407  load_licence(unsigned char **data)  load_licence(unsigned char **data)
408  {  {
# Line 363  load_licence(unsigned char **data) Line 416  load_licence(unsigned char **data)
416                  return -1;                  return -1;
417    
418          STRNCPY(path, home, sizeof(path));          STRNCPY(path, home, sizeof(path));
419          strncat(path, "/.rdesktop/licence", sizeof(path)-strlen(path)-1);          strncat(path, "/.rdesktop/licence", sizeof(path) - strlen(path) - 1);
420    
421          fd = open(path, O_RDONLY);          fd = open(path, O_RDONLY);
422          if (fd == -1)          if (fd == -1)
# Line 388  save_licence(unsigned char *data, int le Line 441  save_licence(unsigned char *data, int le
441                  return;                  return;
442    
443          STRNCPY(path, home, sizeof(path));          STRNCPY(path, home, sizeof(path));
444          strncat(path, "/.rdesktop", sizeof(path)-strlen(path)-1);          strncat(path, "/.rdesktop", sizeof(path) - strlen(path) - 1);
445          mkdir(path, 0700);          mkdir(path, 0700);
446    
447          strncat(path, "/licence", sizeof(path)-strlen(path)-1);          strncat(path, "/licence", sizeof(path) - strlen(path) - 1);
448    
449          fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0600);          fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
450          if (fd == -1)          if (fd == -1)
451          {          {
452                  perror("open");                  perror("open");
# Line 403  save_licence(unsigned char *data, int le Line 456  save_licence(unsigned char *data, int le
456          write(fd, data, length);          write(fd, data, length);
457          close(fd);          close(fd);
458  }  }
459    #endif

Legend:
Removed from v.39  
changed lines
  Added in v.214

  ViewVC Help
Powered by ViewVC 1.1.26