/[rdesktop]/sourceforge.net/branches/seamlessrdp-branch/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/branches/seamlessrdp-branch/rdesktop/rdesktop.c

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

revision 30 by matty, Fri Sep 14 13:51:38 2001 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 */
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;
 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 (hex)\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 70  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");
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 104  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 113  main(int argc, char *argv[]) Line 168  main(int argc, char *argv[])
168                                  break;                                  break;
169    
170                          case 'k':                          case 'k':
171                                  keylayout = strtol(optarg, NULL, 16);                                  STRNCPY(keymapname, optarg, sizeof(keymapname));
                                 if (keylayout == 0)  
                                 {  
                                         error("invalid keyboard layout\n");  
                                         return 1;  
                                 }  
172                                  break;                                  break;
173    
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 149  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 196  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 (!rdp_connect(server, flags, domain, password, shell, directory))
270                    return 1;
271    
272          if (ui_create_window(title))          DEBUG(("Connection successful.\n"));
273          {          memset(password, 0, sizeof(password));
                 if (!rdp_connect(server, flags, domain, password, shell,  
                                  directory))  
                         return 1;  
274    
275                  printf("Connection successful.\n");          if (ui_create_window())
276            {
277                  rdp_main_loop();                  rdp_main_loop();
278                  ui_destroy_window();                  ui_destroy_window();
279          }          }
280    
281            DEBUG(("Disconnecting...\n"));
282          rdp_disconnect();          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 338  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;
401                  line += thisline;                  line += thisline;
402          }          }
403  }  }
404    
405    #ifdef SAVE_LICENCE
406    int
407    load_licence(unsigned char **data)
408    {
409            char path[PATH_MAX];
410            char *home;
411            struct stat st;
412            int fd;
413    
414            home = getenv("HOME");
415            if (home == NULL)
416                    return -1;
417    
418            STRNCPY(path, home, sizeof(path));
419            strncat(path, "/.rdesktop/licence", sizeof(path) - strlen(path) - 1);
420    
421            fd = open(path, O_RDONLY);
422            if (fd == -1)
423                    return -1;
424    
425            if (fstat(fd, &st))
426                    return -1;
427    
428            *data = xmalloc(st.st_size);
429            return read(fd, *data, st.st_size);
430    }
431    
432    void
433    save_licence(unsigned char *data, int length)
434    {
435            char path[PATH_MAX];
436            char *home;
437            int fd;
438    
439            home = getenv("HOME");
440            if (home == NULL)
441                    return;
442    
443            STRNCPY(path, home, sizeof(path));
444            strncat(path, "/.rdesktop", sizeof(path) - strlen(path) - 1);
445            mkdir(path, 0700);
446    
447            strncat(path, "/licence", sizeof(path) - strlen(path) - 1);
448    
449            fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
450            if (fd == -1)
451            {
452                    perror("open");
453                    return;
454            }
455    
456            write(fd, data, length);
457            close(fd);
458    }
459    #endif

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

  ViewVC Help
Powered by ViewVC 1.1.26