/[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 188 by matthewc, Tue Sep 24 06:09:09 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 <stdlib.h>             /* malloc realloc free */
22    #include <stdarg.h>             /* va_list va_start va_end */
23  #include <unistd.h>             /* read close getuid getgid getpid getppid gethostname */  #include <unistd.h>             /* read close getuid getgid getpid getppid gethostname */
24  #include <fcntl.h>              /* open */  #include <fcntl.h>              /* open */
25  #include <pwd.h>                /* getpwuid */  #include <pwd.h>                /* getpwuid */
26    #include <limits.h>             /* PATH_MAX */
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 (autologon)\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  /* Client program */  /* Client program */
78  int  int
79  main(int argc, char *argv[])  main(int argc, char *argv[])
80  {  {
81          struct passwd *pw;          char fullhostname[64];
         char *server;  
         uint32 flags;  
82          char domain[16];          char domain[16];
83          char password[16];          char password[16];
84            char *askpass_result;
85          char shell[32];          char shell[32];
86          char directory[32];          char directory[32];
87          char title[32];          struct passwd *pw;
88            char *server, *p;
89            uint32 flags;
90          int c;          int c;
91    
         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");  
   
92          flags = RDP_LOGON_NORMAL;          flags = RDP_LOGON_NORMAL;
93          domain[0] = password[0] = shell[0] = directory[0] = 0;          domain[0] = password[0] = shell[0] = directory[0] = 0;
94            strcpy(keymapname, "us");
95    
96          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)
97          {          {
98                  switch (c)                  switch (c)
99                  {                  {
100                          case 'u':                          case 'u':
101                                  strncpy(username, optarg, sizeof(username));                                  STRNCPY(username, optarg, sizeof(username));
102                                  break;                                  break;
103    
104                          case 'd':                          case 'd':
105                                  strncpy(domain, optarg, sizeof(domain));                                  STRNCPY(domain, optarg, sizeof(domain));
106                                    break;
107    
108                            case 's':
109                                    STRNCPY(shell, optarg, sizeof(shell));
110                                    break;
111    
112                            case 'c':
113                                    STRNCPY(directory, optarg, sizeof(directory));
114                                  break;                                  break;
115    
116                          case 'p':                          case 'p':
117                                    STRNCPY(password, optarg, sizeof(password));
118                                  flags |= RDP_LOGON_AUTO;                                  flags |= RDP_LOGON_AUTO;
119                                  strncpy(password, optarg, sizeof(password));                                  p = optarg;
120                                    while (*p)
121                                            *(p++) = 'X';
122                                  break;                                  break;
123    
124                          case 's':                          case 'P':
125                                  strncpy(shell, optarg, sizeof(shell));                                  askpass_result = askpass(optarg, "Enter password");
126                                  break;                                  if (askpass_result == NULL)
127                                            exit(1);
128    
129                          case 'c':                                  STRNCPY(password, askpass_result, sizeof(password));
130                                  strncpy(directory, optarg, sizeof(directory));                                  free(askpass_result);
131                                    flags |= RDP_LOGON_AUTO;
132                                  break;                                  break;
133    
134                          case 'n':                          case 'n':
135                                  strncpy(hostname, optarg, sizeof(hostname));                                  STRNCPY(hostname, optarg, sizeof(hostname));
136                                  break;                                  break;
137    
138                            case 'k':
139                                    STRNCPY(keymapname, optarg, sizeof(keymapname));
140                                    break;
141    
142                          case 'g':                          case 'g':
143                                    width = strtol(optarg, &p, 10);
144                                    if (*p == 'x')
145                                            height = strtol(p + 1, NULL, 10);
146    
147                                    if ((width == 0) || (height == 0))
148                                  {                                  {
149                                          char *tgem = 0;                                          error("invalid geometry\n");
150                                          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);  
151                                  }                                  }
152                                  break;                                  break;
153    
154                          case 'k':                          case 'f':
155                                  keylayout = strtol(optarg, NULL, 16);                                  fullscreen = True;
                                 /* keylayout = find_keyb_code(optarg); */  
                                 if (keylayout == 0)  
                                         return 0;  
                                 break;  
   
                         case 'm':  
                                 sendmotion = False;  
156                                  break;                                  break;
157    
158                          case 'b':                          case 'b':
159                                  orders = False;                                  orders = False;
160                                  break;                                  break;
161    
162                            case 'e':
163                                    encryption = False;
164                                    break;
165    
166                            case 'm':
167                                    sendmotion = False;
168                                    break;
169    
170                          case 'l':                          case 'l':
171                                  licence = False;                                  licence = False;
172                                  break;                                  break;
173    
174                          case 'e':                          case 't':
175                                  use_encryption = False;                                  tcp_port_rdp = strtol(optarg, NULL, 10);
176                                  break;                                  break;
177    
178                          case 'F':                          case 'K':
179                                  fullscreen = True;                                  grab_keyboard = False;
180                                    break;
181    
182                            case 'w':
183                                    strncpy(title, optarg, sizeof(title));
184                                  break;                                  break;
185    
186                          case 'h':                          case 'h':
# Line 172  main(int argc, char *argv[]) Line 204  main(int argc, char *argv[])
204                  pw = getpwuid(getuid());                  pw = getpwuid(getuid());
205                  if ((pw == NULL) || (pw->pw_name == NULL))                  if ((pw == NULL) || (pw->pw_name == NULL))
206                  {                  {
207                          STATUS("Could not determine user name.\n");                          error("could not determine username, use -u\n");
208                          return 1;                          return 1;
209                  }                  }
210    
211                  strncpy(username, pw->pw_name, sizeof(username));                  STRNCPY(username, pw->pw_name, sizeof(username));
212          }          }
213    
214          if (hostname[0] == 0)          if (hostname[0] == 0)
215          {          {
216                  if (gethostname(hostname, sizeof(hostname)) == -1)                  if (gethostname(fullhostname, sizeof(fullhostname)) == -1)
217                  {                  {
218                          STATUS("Could not determine host name.\n");                          error("could not determine local hostname, use -n\n");
219                          return 1;                          return 1;
220                  }                  }
221    
222                    p = strchr(fullhostname, '.');
223                    if (p != NULL)
224                            *p = 0;
225    
226                    STRNCPY(hostname, fullhostname, sizeof(hostname));
227          }          }
228    
229          strcpy(title, "rdesktop - ");          if (!strcmp(password, "-"))
230          strncat(title, server, sizeof(title));          {
231                    p = getpass("Password: ");
232                    if (p == NULL)
233                    {
234                            error("failed to read password\n");
235                            return 0;
236                    }
237                    STRNCPY(password, p, sizeof(password));
238            }
239    
240          if (ui_create_window(title))          if (!strlen(title))
241          {          {
242                  if (!rdp_connect(server, flags, domain, password, shell,                  strcpy(title, "rdesktop - ");
243                                   directory))                  strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
244                          return 1;          }
245    
246            if (!ui_init())
247                    return 1;
248    
249            if (!rdp_connect(server, flags, domain, password, shell, directory))
250                    return 1;
251    
252            DEBUG(("Connection successful.\n"));
253    
254                  STATUS("Connection successful.\n");          if (ui_create_window())
255            {
256                  rdp_main_loop();                  rdp_main_loop();
257                  ui_destroy_window();                  ui_destroy_window();
258          }          }
259    
260            DEBUG(("Disconnecting...\n"));
261          rdp_disconnect();          rdp_disconnect();
262            ui_deinit();
263          return 0;          return 0;
264  }  }
265    
266  /* Generate a 32-byte random for the secure transport code. */  /* Generate a 32-byte random for the secure transport code. */
267  void  void
268  generate_random(uint8 *random)  generate_random(uint8 * random)
269  {  {
270          struct stat st;          struct stat st;
271          struct tms tmsbuf;          struct tms tmsbuf;
# Line 216  generate_random(uint8 *random) Line 273  generate_random(uint8 *random)
273          int fd;          int fd;
274    
275          /* If we have a kernel random device, use it. */          /* If we have a kernel random device, use it. */
276          if ((fd = open("/dev/urandom", O_RDONLY)) != -1)          if (((fd = open("/dev/urandom", O_RDONLY)) != -1)
277                || ((fd = open("/dev/random", O_RDONLY)) != -1))
278          {          {
279                  read(fd, random, 32);                  read(fd, random, 32);
280                  close(fd);                  close(fd);
# Line 241  xmalloc(int size) Line 299  xmalloc(int size)
299          void *mem = malloc(size);          void *mem = malloc(size);
300          if (mem == NULL)          if (mem == NULL)
301          {          {
302                  ERROR("xmalloc %d\n", size);                  error("xmalloc %d\n", size);
303                  exit(1);                  exit(1);
304          }          }
305          return mem;          return mem;
# Line 254  xrealloc(void *oldmem, int size) Line 312  xrealloc(void *oldmem, int size)
312          void *mem = realloc(oldmem, size);          void *mem = realloc(oldmem, size);
313          if (mem == NULL)          if (mem == NULL)
314          {          {
315                  ERROR("xrealloc %d\n", size);                  error("xrealloc %d\n", size);
316                  exit(1);                  exit(1);
317          }          }
318          return mem;          return mem;
# Line 267  xfree(void *mem) Line 325  xfree(void *mem)
325          free(mem);          free(mem);
326  }  }
327    
328  /* Produce a hex dump */  /* report an error */
329    void
330    error(char *format, ...)
331    {
332            va_list ap;
333    
334            fprintf(stderr, "ERROR: ");
335    
336            va_start(ap, format);
337            vfprintf(stderr, format, ap);
338            va_end(ap);
339    }
340    
341    /* report an unimplemented protocol feature */
342    void
343    unimpl(char *format, ...)
344    {
345            va_list ap;
346    
347            fprintf(stderr, "NOT IMPLEMENTED: ");
348    
349            va_start(ap, format);
350            vfprintf(stderr, format, ap);
351            va_end(ap);
352    }
353    
354    /* produce a hex dump */
355  void  void
356  hexdump(unsigned char *p, unsigned int len)  hexdump(unsigned char *p, unsigned int len)
357  {  {
# Line 277  hexdump(unsigned char *p, unsigned int l Line 361  hexdump(unsigned char *p, unsigned int l
361    
362          while (offset < len)          while (offset < len)
363          {          {
364                  STATUS("%04x ", offset);                  printf("%04x ", offset);
365                  thisline = len - offset;                  thisline = len - offset;
366                  if (thisline > 16)                  if (thisline > 16)
367                          thisline = 16;                          thisline = 16;
368    
369                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
370                          STATUS("%02x ", line[i]) for (; i < 16; i++)                          printf("%02x ", line[i]);
371                                  STATUS("   ");  
372                    for (; i < 16; i++)
373                            printf("   ");
374    
375                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
376                          STATUS("%c",                          printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
                                (line[i] >= 0x20  
                                 && line[i] < 0x7f) ? line[i] : '.');  
377    
378                  STATUS("\n");                  printf("\n");
379                  offset += thisline;                  offset += thisline;
380                  line += thisline;                  line += thisline;
381          }          }
382  }  }
383    
384    #ifdef SAVE_LICENCE
385    int
386    load_licence(unsigned char **data)
387    {
388            char path[PATH_MAX];
389            char *home;
390            struct stat st;
391            int fd;
392    
393            home = getenv("HOME");
394            if (home == NULL)
395                    return -1;
396    
397            STRNCPY(path, home, sizeof(path));
398            strncat(path, "/.rdesktop/licence", sizeof(path) - strlen(path) - 1);
399    
400            fd = open(path, O_RDONLY);
401            if (fd == -1)
402                    return -1;
403    
404            if (fstat(fd, &st))
405                    return -1;
406    
407            *data = xmalloc(st.st_size);
408            return read(fd, *data, st.st_size);
409    }
410    
411    void
412    save_licence(unsigned char *data, int length)
413    {
414            char path[PATH_MAX];
415            char *home;
416            int fd;
417    
418            home = getenv("HOME");
419            if (home == NULL)
420                    return;
421    
422            STRNCPY(path, home, sizeof(path));
423            strncat(path, "/.rdesktop", sizeof(path) - strlen(path) - 1);
424            mkdir(path, 0700);
425    
426            strncat(path, "/licence", sizeof(path) - strlen(path) - 1);
427    
428            fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
429            if (fd == -1)
430            {
431                    perror("open");
432                    return;
433            }
434    
435            write(fd, data, length);
436            close(fd);
437    }
438    #endif

Legend:
Removed from v.29  
changed lines
  Added in v.188

  ViewVC Help
Powered by ViewVC 1.1.26