/[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 12 by matty, Tue Aug 15 12:01:01 2000 UTC revision 159 by matthewc, Sun Sep 15 12:36:55 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 <unistd.h>     /* read close getuid getgid getpid getppid gethostname */  #include <stdarg.h>             /* va_list va_start va_end */
23  #include <fcntl.h>      /* open */  #include <unistd.h>             /* read close getuid getgid getpid getppid gethostname */
24  #include <pwd.h>        /* getpwuid */  #include <fcntl.h>              /* open */
25  #include <sys/stat.h>   /* stat */  #include <pwd.h>                /* getpwuid */
26  #include <sys/time.h>   /* gettimeofday */  #include <limits.h>             /* PATH_MAX */
27  #include <sys/times.h>  /* times */  #include <sys/stat.h>           /* stat */
28    #include <sys/time.h>           /* gettimeofday */
29    #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  BOOL motion = False;  int height;
39    int tcp_port_rdp = TCP_PORT_RDP;
40    BOOL bitmap_compression = True;
41    BOOL sendmotion = True;
42  BOOL orders = True;  BOOL orders = True;
43  BOOL licence = True;  BOOL licence = True;
44    BOOL encryption = True;
45    BOOL desktop_save = True;
46    BOOL fullscreen = False;
47    BOOL grab_keyboard = True;
48    
49  /* Display usage information */  /* Display usage information */
50  static void usage(char *program)  static void
51    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("   -n: client hostname\n");          fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
56          STATUS("   -w: desktop width\n");  
57          STATUS("   -h: desktop height\n");          fprintf(stderr, "Usage: %s [options] server\n", program);
58          STATUS("   -k: keyboard layout (hex)\n");          fprintf(stderr, "   -u: user name\n");
59          STATUS("   -m: send motion events\n");          fprintf(stderr, "   -d: domain\n");
60          STATUS("   -b: force bitmap updates\n");          fprintf(stderr, "   -s: shell\n");
61          STATUS("   -l: do not request licence\n\n");          fprintf(stderr, "   -c: working directory\n");
62            fprintf(stderr, "   -p: password (autologon)\n");
63            fprintf(stderr, "   -P: askpass-program (autologon)\n");
64            fprintf(stderr, "   -n: client hostname\n");
65            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 main(int argc, char *argv[])  int
79    main(int argc, char *argv[])
80  {  {
81            char fullhostname[64];
82            char domain[16];
83            char password[16];
84            char *askpass_result;
85            char shell[32];
86            char directory[32];
87          struct passwd *pw;          struct passwd *pw;
88          char *server;          char *server, *p;
89          char title[32];          uint32 flags;
90          int c;          int c;
91    
92          STATUS("rdesktop: A Remote Desktop Protocol client.\n");          flags = RDP_LOGON_NORMAL;
93          STATUS("Version "VERSION". Copyright (C) 1999-2000 Matt Chapman.\n\n");          domain[0] = password[0] = shell[0] = directory[0] = 0;
94            strcpy(keymapname, "us");
95    
96          while ((c = getopt(argc, argv, "u:n:w:h:k:mbl?")) != -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 'n':                          case 'd':
105                                  strncpy(hostname, optarg, sizeof(hostname));                                  STRNCPY(domain, optarg, sizeof(domain));
106                                  break;                                  break;
107    
108                          case 'w':                          case 's':
109                                  width = strtol(optarg, NULL, 10);                                  STRNCPY(shell, optarg, sizeof(shell));
110                                  break;                                  break;
111    
112                          case 'h':                          case 'c':
113                                  height = strtol(optarg, NULL, 10);                                  STRNCPY(directory, optarg, sizeof(directory));
114                                    break;
115    
116                            case 'p':
117                                    STRNCPY(password, optarg, sizeof(password));
118                                    flags |= RDP_LOGON_AUTO;
119                                    break;
120    
121                            case 'P':
122                                    askpass_result = askpass(optarg, "Enter password");
123                                    if (askpass_result == NULL)
124                                            exit(1);
125    
126                                    STRNCPY(password, askpass_result, sizeof(password));
127                                    free(askpass_result);
128                                    flags |= RDP_LOGON_AUTO;
129                                    break;
130    
131                            case 'n':
132                                    STRNCPY(hostname, optarg, sizeof(hostname));
133                                  break;                                  break;
134    
135                          case 'k':                          case 'k':
136                                  keylayout = strtol(optarg, NULL, 16);                                  STRNCPY(keymapname, optarg, sizeof(keymapname));
137                                  break;                                  break;
138    
139                          case 'm':                          case 'g':
140                                  motion = True;                                  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                                            error("invalid geometry\n");
147                                            return 1;
148                                    }
149                                    break;
150    
151                            case 'f':
152                                    fullscreen = True;
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 't':
172                                    tcp_port_rdp = strtol(optarg, NULL, 10);
173                                    break;
174    
175                            case 'K':
176                                    grab_keyboard = False;
177                                    break;
178    
179                            case 'w':
180                                    strncpy(title, optarg, sizeof(title));
181                                    break;
182    
183                            case 'h':
184                          case '?':                          case '?':
185                          default:                          default:
186                                  usage(argv[0]);                                  usage(argv[0]);
# Line 117  int main(int argc, char *argv[]) Line 201  int 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            if (!strcmp(password, "-"))
227            {
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 ((width == 0) || (height == 0))
238            {
239                    width = 800;
240                    height = 600;
241            }
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          if (!rdp_connect(server))          if (!ui_init())
255                  return 1;                  return 1;
256    
257          STATUS("Connection successful.\n");          if (!rdp_connect(server, flags, domain, password, shell, directory))
258                    return 1;
259    
260          strcpy(title, "rdesktop - ");          DEBUG(("Connection successful.\n"));
         strncat(title, server, sizeof(title));  
261    
262          if (ui_create_window(title))          if (ui_create_window())
263          {          {
264                  rdp_main_loop();                  rdp_main_loop();
265                  ui_destroy_window();                  ui_destroy_window();
266          }          }
267    
268            DEBUG(("Disconnecting...\n"));
269          rdp_disconnect();          rdp_disconnect();
270          return 0;          return 0;
271  }  }
272    
273  /* Generate a 32-byte random for the secure transport code. */  /* Generate a 32-byte random for the secure transport code. */
274  void generate_random(uint8 *random)  void
275    generate_random(uint8 * random)
276  {  {
277          struct stat st;          struct stat st;
278          uint32 *r = (uint32 *)random;          struct tms tmsbuf;
279            uint32 *r = (uint32 *) random;
280          int fd;          int fd;
281    
282          /* If we have a kernel random device, use it. */          /* If we have a kernel random device, use it. */
283          if ((fd = open("/dev/urandom", O_RDONLY)) != -1)          if (((fd = open("/dev/urandom", O_RDONLY)) != -1)
284                || ((fd = open("/dev/random", O_RDONLY)) != -1))
285          {          {
286                  read(fd, random, 32);                  read(fd, random, 32);
287                  close(fd);                  close(fd);
# Line 169  void generate_random(uint8 *random) Line 291  void generate_random(uint8 *random)
291          /* Otherwise use whatever entropy we can gather - ideas welcome. */          /* Otherwise use whatever entropy we can gather - ideas welcome. */
292          r[0] = (getpid()) | (getppid() << 16);          r[0] = (getpid()) | (getppid() << 16);
293          r[1] = (getuid()) | (getgid() << 16);          r[1] = (getuid()) | (getgid() << 16);
294          r[2] = times(NULL); /* system uptime (clocks) */          r[2] = times(&tmsbuf);  /* system uptime (clocks) */
295          gettimeofday((struct timeval *)&r[3], NULL); /* sec and usec */          gettimeofday((struct timeval *) &r[3], NULL);   /* sec and usec */
296          stat("/tmp", &st);          stat("/tmp", &st);
297          r[5] = st.st_atime;          r[5] = st.st_atime;
298          r[6] = st.st_mtime;          r[6] = st.st_mtime;
# Line 178  void generate_random(uint8 *random) Line 300  void generate_random(uint8 *random)
300  }  }
301    
302  /* malloc; exit if out of memory */  /* malloc; exit if out of memory */
303  void *xmalloc(int size)  void *
304    xmalloc(int size)
305  {  {
306          void *mem = malloc(size);          void *mem = malloc(size);
307          if (mem == NULL)          if (mem == NULL)
308          {          {
309                  ERROR("xmalloc %d\n", size);                  error("xmalloc %d\n", size);
310                  exit(1);                  exit(1);
311          }          }
312          return mem;          return mem;
313  }  }
314    
315  /* realloc; exit if out of memory */  /* realloc; exit if out of memory */
316  void *xrealloc(void *oldmem, int size)  void *
317    xrealloc(void *oldmem, int size)
318  {  {
319          void *mem = realloc(oldmem, size);          void *mem = realloc(oldmem, size);
320          if (mem == NULL)          if (mem == NULL)
321          {          {
322                  ERROR("xrealloc %d\n", size);                  error("xrealloc %d\n", size);
323                  exit(1);                  exit(1);
324          }          }
325          return mem;          return mem;
326  }  }
327    
328  /* free */  /* free */
329  void xfree(void *mem)  void
330    xfree(void *mem)
331  {  {
332          free(mem);          free(mem);
333  }  }
334    
335  /* Produce a hex dump */  /* report an error */
336  void hexdump(unsigned char *p, unsigned int len)  void
337    error(char *format, ...)
338    {
339            va_list ap;
340    
341            fprintf(stderr, "ERROR: ");
342    
343            va_start(ap, format);
344            vfprintf(stderr, format, ap);
345            va_end(ap);
346    }
347    
348    /* report an unimplemented protocol feature */
349    void
350    unimpl(char *format, ...)
351    {
352            va_list ap;
353    
354            fprintf(stderr, "NOT IMPLEMENTED: ");
355    
356            va_start(ap, format);
357            vfprintf(stderr, format, ap);
358            va_end(ap);
359    }
360    
361    /* produce a hex dump */
362    void
363    hexdump(unsigned char *p, unsigned int len)
364  {  {
365          unsigned char *line = p;          unsigned char *line = p;
366          unsigned int thisline, offset = 0;          unsigned int thisline, offset = 0;
# Line 216  void hexdump(unsigned char *p, unsigned Line 368  void hexdump(unsigned char *p, unsigned
368    
369          while (offset < len)          while (offset < len)
370          {          {
371                  STATUS("%04x ", offset);                  fprintf(stderr, "%04x ", offset);
372                  thisline = len - offset;                  thisline = len - offset;
373                  if (thisline > 16)                  if (thisline > 16)
374                          thisline = 16;                          thisline = 16;
375    
376                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
377                          STATUS("%02x ", line[i])                          fprintf(stderr, "%02x ", line[i]);
378    
379                  for (; i < 16; i++)                  for (; i < 16; i++)
380                          STATUS("   ");                          fprintf(stderr, "   ");
381    
382                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
383                          STATUS("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');                          fprintf(stderr, "%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
384    
385                  STATUS("\n");                  fprintf(stderr, "\n");
386                  offset += thisline;                  offset += thisline;
387                  line += thisline;                  line += thisline;
388          }          }
389  }  }
390    
391    #ifdef SAVE_LICENCE
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    }
445    #endif

Legend:
Removed from v.12  
changed lines
  Added in v.159

  ViewVC Help
Powered by ViewVC 1.1.26