/[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 111 by astrand, Sun Sep 1 12:03:33 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-2001
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  int width = 800;  char keymapname[16];
36  int height = 600;  int keylayout = 0x409;          /* Defaults to US keyboard layout */
37  int keylayout = 0x409;  int width;
38    int height;
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;
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, "Usage: %s [options] server\n", program);
54          STATUS("   -u: user name\n");          fprintf(stderr, "   -u: user name\n");
55          STATUS("   -d: domain\n");          fprintf(stderr, "   -d: domain\n");
56          STATUS("   -s: shell\n");          fprintf(stderr, "   -s: shell\n");
57          STATUS("   -c: working directory\n");          fprintf(stderr, "   -c: working directory\n");
58          STATUS("   -p: password (autologon)\n");          fprintf(stderr, "   -p: password (autologon)\n");
59          STATUS("   -n: client hostname\n");          fprintf(stderr, "   -P: askpass-program (autologon)\n");
60          STATUS("   -w: desktop width\n");          fprintf(stderr, "   -n: client hostname\n");
61          STATUS("   -h: desktop height\n");          fprintf(stderr, "   -k: keyboard layout on terminal server (us,sv,gr etc.)\n");
62          STATUS("   -k: keyboard layout (hex)\n");          fprintf(stderr, "   -g: desktop geometry (WxH)\n");
63          STATUS("   -b: force bitmap updates\n");          fprintf(stderr, "   -f: full-screen mode\n");
64          STATUS("   -m: do not send motion events\n");          fprintf(stderr, "   -b: force bitmap updates\n");
65          STATUS("   -l: do not request licence\n\n");          fprintf(stderr, "   -e: disable encryption (French TS)\n");
66            fprintf(stderr, "   -m: do not send motion events\n");
67            fprintf(stderr, "   -l: do not request licence\n");
68            fprintf(stderr, "   -t: rdp tcp port\n");
69            fprintf(stderr, "   -K: keep window manager key bindings\n");
70            fprintf(stderr, "   -w: window title\n");
71  }  }
72    
73  /* Client program */  /* Client program */
74  int  int
75  main(int argc, char *argv[])  main(int argc, char *argv[])
76  {  {
77          struct passwd *pw;          char fullhostname[64];
         char *server;  
         uint32 flags;  
78          char domain[16];          char domain[16];
79          char password[16];          char password[16];
80            char *askpass_result;
81          char shell[32];          char shell[32];
82          char directory[32];          char directory[32];
83          char title[32];          struct passwd *pw;
84            char *server, *p;
85            uint32 flags;
86          int c;          int c;
87    
88          STATUS("rdesktop: A Remote Desktop Protocol client.\n");          fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
89          STATUS("Version " VERSION          fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2001 Matt Chapman.\n");
90                 ". Copyright (C) 1999-2000 Matt Chapman.\n");          fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
         STATUS("See http://www.rdesktop.org/ for more information.\n\n");  
91    
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;
                                 strncpy(password, optarg, sizeof(password));  
119                                  break;                                  break;
120    
121                          case 's':                          case 'P':
122                                  strncpy(shell, optarg, sizeof(shell));                                  askpass_result = askpass(optarg, "Enter password");
123                                  break;                                  if (askpass_result == NULL)
124                                            exit(1);
125    
126                          case 'c':                                  STRNCPY(password, askpass_result, sizeof(password));
127                                  strncpy(directory, optarg, sizeof(directory));                                  free(askpass_result);
128                                    flags |= RDP_LOGON_AUTO;
129                                  break;                                  break;
130    
131                          case 'n':                          case 'n':
132                                  strncpy(hostname, optarg, sizeof(hostname));                                  STRNCPY(hostname, optarg, sizeof(hostname));
133                                    break;
134    
135                            case 'k':
136                                    STRNCPY(keymapname, optarg, sizeof(keymapname));
137                                  break;                                  break;
138    
139                          case 'g':                          case 'g':
140                                    width = strtol(optarg, &p, 10);
141                                    if (*p == 'x')
142                                            height = strtol(p + 1, NULL, 10);
143    
144                                    if ((width == 0) || (height == 0))
145                                  {                                  {
146                                          char *tgem = 0;                                          error("invalid geometry\n");
147                                          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);  
148                                  }                                  }
149                                  break;                                  break;
150    
151                          case 'k':                          case 'f':
152                                  keylayout = strtol(optarg, NULL, 16);                                  fullscreen = True;
                                 /* keylayout = find_keyb_code(optarg); */  
                                 if (keylayout == 0)  
                                         return 0;  
                                 break;  
   
                         case 'm':  
                                 sendmotion = False;  
153                                  break;                                  break;
154    
155                          case 'b':                          case 'b':
156                                  orders = False;                                  orders = False;
157                                  break;                                  break;
158    
159                            case 'e':
160                                    encryption = False;
161                                    break;
162    
163                            case 'm':
164                                    sendmotion = False;
165                                    break;
166    
167                          case 'l':                          case 'l':
168                                  licence = False;                                  licence = False;
169                                  break;                                  break;
170    
171                          case 'e':                          case 't':
172                                  use_encryption = False;                                  tcp_port_rdp = strtol(optarg, NULL, 10);
173                                  break;                                  break;
174    
175                          case 'F':                          case 'K':
176                                  fullscreen = True;                                  grab_keyboard = False;
177                                    break;
178    
179                            case 'w':
180                                    strncpy(title, optarg, sizeof(title));
181                                  break;                                  break;
182    
183                          case 'h':                          case 'h':
# Line 172  main(int argc, char *argv[]) Line 201  main(int argc, char *argv[])
201                  pw = getpwuid(getuid());                  pw = getpwuid(getuid());
202                  if ((pw == NULL) || (pw->pw_name == NULL))                  if ((pw == NULL) || (pw->pw_name == NULL))
203                  {                  {
204                          STATUS("Could not determine user name.\n");                          error("could not determine username, use -u\n");
205                          return 1;                          return 1;
206                  }                  }
207    
208                  strncpy(username, pw->pw_name, sizeof(username));                  STRNCPY(username, pw->pw_name, sizeof(username));
209          }          }
210    
211          if (hostname[0] == 0)          if (hostname[0] == 0)
212          {          {
213                  if (gethostname(hostname, sizeof(hostname)) == -1)                  if (gethostname(fullhostname, sizeof(fullhostname)) == -1)
214                  {                  {
215                          STATUS("Could not determine host name.\n");                          error("could not determine local hostname, use -n\n");
216                          return 1;                          return 1;
217                  }                  }
218    
219                    p = strchr(fullhostname, '.');
220                    if (p != NULL)
221                            *p = 0;
222    
223                    STRNCPY(hostname, fullhostname, sizeof(hostname));
224          }          }
225    
226          strcpy(title, "rdesktop - ");          if (!strcmp(password, "-"))
227          strncat(title, server, sizeof(title));          {
228                    p = getpass("Password: ");
229                    if (p == NULL)
230                    {
231                            error("failed to read password\n");
232                            return 0;
233                    }
234                    STRNCPY(password, p, sizeof(password));
235            }
236    
237          if (ui_create_window(title))          if ((width == 0) || (height == 0))
238          {          {
239                  if (!rdp_connect(server, flags, domain, password, shell,                  width = 800;
240                                   directory))                  height = 600;
241                          return 1;          }
242            else
243            {
244                    /* make sure width is a multiple of 4 */
245                    width = (width + 3) & ~3;
246            }
247    
248            if (!strlen(title))
249            {
250                    strcpy(title, "rdesktop - ");
251                    strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
252            }
253    
254            xkeymap_init1();
255            if (!ui_init())
256                    return 1;
257    
258            if (!rdp_connect(server, flags, domain, password, shell, directory))
259                    return 1;
260    
261                  STATUS("Connection successful.\n");          fprintf(stderr, "Connection successful.\n");
262    
263            if (ui_create_window())
264            {
265                  rdp_main_loop();                  rdp_main_loop();
266                  ui_destroy_window();                  ui_destroy_window();
267          }          }
268    
269            fprintf(stderr, "Disconnecting...\n");
270          rdp_disconnect();          rdp_disconnect();
271          return 0;          return 0;
272  }  }
273    
274  /* Generate a 32-byte random for the secure transport code. */  /* Generate a 32-byte random for the secure transport code. */
275  void  void
276  generate_random(uint8 *random)  generate_random(uint8 * random)
277  {  {
278          struct stat st;          struct stat st;
279          struct tms tmsbuf;          struct tms tmsbuf;
# Line 216  generate_random(uint8 *random) Line 281  generate_random(uint8 *random)
281          int fd;          int fd;
282    
283          /* If we have a kernel random device, use it. */          /* If we have a kernel random device, use it. */
284          if ((fd = open("/dev/urandom", O_RDONLY)) != -1)          if (((fd = open("/dev/urandom", O_RDONLY)) != -1)
285                || ((fd = open("/dev/random", O_RDONLY)) != -1))
286          {          {
287                  read(fd, random, 32);                  read(fd, random, 32);
288                  close(fd);                  close(fd);
# Line 241  xmalloc(int size) Line 307  xmalloc(int size)
307          void *mem = malloc(size);          void *mem = malloc(size);
308          if (mem == NULL)          if (mem == NULL)
309          {          {
310                  ERROR("xmalloc %d\n", size);                  error("xmalloc %d\n", size);
311                  exit(1);                  exit(1);
312          }          }
313          return mem;          return mem;
# Line 254  xrealloc(void *oldmem, int size) Line 320  xrealloc(void *oldmem, int size)
320          void *mem = realloc(oldmem, size);          void *mem = realloc(oldmem, size);
321          if (mem == NULL)          if (mem == NULL)
322          {          {
323                  ERROR("xrealloc %d\n", size);                  error("xrealloc %d\n", size);
324                  exit(1);                  exit(1);
325          }          }
326          return mem;          return mem;
# Line 267  xfree(void *mem) Line 333  xfree(void *mem)
333          free(mem);          free(mem);
334  }  }
335    
336  /* Produce a hex dump */  /* report an error */
337    void
338    error(char *format, ...)
339    {
340            va_list ap;
341    
342            fprintf(stderr, "ERROR: ");
343    
344            va_start(ap, format);
345            vfprintf(stderr, format, ap);
346            va_end(ap);
347    }
348    
349    /* report an unimplemented protocol feature */
350    void
351    unimpl(char *format, ...)
352    {
353            va_list ap;
354    
355            fprintf(stderr, "NOT IMPLEMENTED: ");
356    
357            va_start(ap, format);
358            vfprintf(stderr, format, ap);
359            va_end(ap);
360    }
361    
362    /* produce a hex dump */
363  void  void
364  hexdump(unsigned char *p, unsigned int len)  hexdump(unsigned char *p, unsigned int len)
365  {  {
# Line 277  hexdump(unsigned char *p, unsigned int l Line 369  hexdump(unsigned char *p, unsigned int l
369    
370          while (offset < len)          while (offset < len)
371          {          {
372                  STATUS("%04x ", offset);                  fprintf(stderr, "%04x ", offset);
373                  thisline = len - offset;                  thisline = len - offset;
374                  if (thisline > 16)                  if (thisline > 16)
375                          thisline = 16;                          thisline = 16;
376    
377                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
378                          STATUS("%02x ", line[i]) for (; i < 16; i++)                          fprintf(stderr, "%02x ", line[i]);
379                                  STATUS("   ");  
380                    for (; i < 16; i++)
381                            fprintf(stderr, "   ");
382    
383                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
384                          STATUS("%c",                          fprintf(stderr, "%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
                                (line[i] >= 0x20  
                                 && line[i] < 0x7f) ? line[i] : '.');  
385    
386                  STATUS("\n");                  fprintf(stderr, "\n");
387                  offset += thisline;                  offset += thisline;
388                  line += thisline;                  line += thisline;
389          }          }
390  }  }
391    
392    int
393    load_licence(unsigned char **data)
394    {
395            char path[PATH_MAX];
396            char *home;
397            struct stat st;
398            int fd;
399    
400            home = getenv("HOME");
401            if (home == NULL)
402                    return -1;
403    
404            STRNCPY(path, home, sizeof(path));
405            strncat(path, "/.rdesktop/licence", sizeof(path) - strlen(path) - 1);
406    
407            fd = open(path, O_RDONLY);
408            if (fd == -1)
409                    return -1;
410    
411            if (fstat(fd, &st))
412                    return -1;
413    
414            *data = xmalloc(st.st_size);
415            return read(fd, *data, st.st_size);
416    }
417    
418    void
419    save_licence(unsigned char *data, int length)
420    {
421            char path[PATH_MAX];
422            char *home;
423            int fd;
424    
425            home = getenv("HOME");
426            if (home == NULL)
427                    return;
428    
429            STRNCPY(path, home, sizeof(path));
430            strncat(path, "/.rdesktop", sizeof(path) - strlen(path) - 1);
431            mkdir(path, 0700);
432    
433            strncat(path, "/licence", sizeof(path) - strlen(path) - 1);
434    
435            fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
436            if (fd == -1)
437            {
438                    perror("open");
439                    return;
440            }
441    
442            write(fd, data, length);
443            close(fd);
444    }

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

  ViewVC Help
Powered by ViewVC 1.1.26