/[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 17 by matty, Thu Sep 28 15:54:11 2000 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 <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    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 motion = False;  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");          domain[0] = password[0] = shell[0] = directory[0] = 0;
94          STATUS("See http://www.rdesktop.org/ for more information.\n\n");          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                                    p = optarg;
120                                    while (*p)
121                                            *(p++) = 'X';
122                                    break;
123    
124                            case 'P':
125                                    askpass_result = askpass(optarg, "Enter password");
126                                    if (askpass_result == NULL)
127                                            exit(1);
128    
129                                    STRNCPY(password, askpass_result, sizeof(password));
130                                    free(askpass_result);
131                                    flags |= RDP_LOGON_AUTO;
132                                    break;
133    
134                            case 'n':
135                                    STRNCPY(hostname, optarg, sizeof(hostname));
136                                  break;                                  break;
137    
138                          case 'k':                          case 'k':
139                                  keylayout = strtol(optarg, NULL, 16);                                  STRNCPY(keymapname, optarg, sizeof(keymapname));
140                                  break;                                  break;
141    
142                          case 'm':                          case 'g':
143                                  motion = True;                                  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                                            error("invalid geometry\n");
150                                            return 1;
151                                    }
152                                    break;
153    
154                            case 'f':
155                                    fullscreen = True;
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 't':
175                                    tcp_port_rdp = strtol(optarg, NULL, 10);
176                                    break;
177    
178                            case 'K':
179                                    grab_keyboard = False;
180                                    break;
181    
182                            case 'w':
183                                    strncpy(title, optarg, sizeof(title));
184                                    break;
185    
186                            case 'h':
187                          case '?':                          case '?':
188                          default:                          default:
189                                  usage(argv[0]);                                  usage(argv[0]);
# Line 118  int main(int argc, char *argv[]) Line 204  int 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            if (!strcmp(password, "-"))
230            {
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 (!rdp_connect(server))          if (!strlen(title))
241            {
242                    strcpy(title, "rdesktop - ");
243                    strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
244            }
245    
246            if (!ui_init())
247                  return 1;                  return 1;
248    
249          STATUS("Connection successful.\n");          if (!rdp_connect(server, flags, domain, password, shell, directory))
250                    return 1;
251    
252          strcpy(title, "rdesktop - ");          DEBUG(("Connection successful.\n"));
         strncat(title, server, sizeof(title));  
253    
254          if (ui_create_window(title))          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 generate_random(uint8 *random)  void
268    generate_random(uint8 * random)
269  {  {
270          struct stat st;          struct stat st;
271          uint32 *r = (uint32 *)random;          struct tms tmsbuf;
272            uint32 *r = (uint32 *) 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 170  void generate_random(uint8 *random) Line 284  void generate_random(uint8 *random)
284          /* Otherwise use whatever entropy we can gather - ideas welcome. */          /* Otherwise use whatever entropy we can gather - ideas welcome. */
285          r[0] = (getpid()) | (getppid() << 16);          r[0] = (getpid()) | (getppid() << 16);
286          r[1] = (getuid()) | (getgid() << 16);          r[1] = (getuid()) | (getgid() << 16);
287          r[2] = times(NULL); /* system uptime (clocks) */          r[2] = times(&tmsbuf);  /* system uptime (clocks) */
288          gettimeofday((struct timeval *)&r[3], NULL); /* sec and usec */          gettimeofday((struct timeval *) &r[3], NULL);   /* sec and usec */
289          stat("/tmp", &st);          stat("/tmp", &st);
290          r[5] = st.st_atime;          r[5] = st.st_atime;
291          r[6] = st.st_mtime;          r[6] = st.st_mtime;
# Line 179  void generate_random(uint8 *random) Line 293  void generate_random(uint8 *random)
293  }  }
294    
295  /* malloc; exit if out of memory */  /* malloc; exit if out of memory */
296  void *xmalloc(int size)  void *
297    xmalloc(int size)
298  {  {
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;
306  }  }
307    
308  /* realloc; exit if out of memory */  /* realloc; exit if out of memory */
309  void *xrealloc(void *oldmem, int size)  void *
310    xrealloc(void *oldmem, int size)
311  {  {
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;
319  }  }
320    
321  /* free */  /* free */
322  void xfree(void *mem)  void
323    xfree(void *mem)
324  {  {
325          free(mem);          free(mem);
326  }  }
327    
328  /* Produce a hex dump */  /* report an error */
329  void hexdump(unsigned char *p, unsigned int len)  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
356    hexdump(unsigned char *p, unsigned int len)
357  {  {
358          unsigned char *line = p;          unsigned char *line = p;
359          unsigned int thisline, offset = 0;          unsigned int thisline, offset = 0;
# Line 217  void hexdump(unsigned char *p, unsigned Line 361  void hexdump(unsigned char *p, unsigned
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])                          printf("%02x ", line[i]);
371    
372                  for (; i < 16; i++)                  for (; i < 16; i++)
373                          STATUS("   ");                          printf("   ");
374    
375                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
376                          STATUS("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');                          printf("%c", (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.17  
changed lines
  Added in v.188

  ViewVC Help
Powered by ViewVC 1.1.26