/[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 213 by matthewc, Sun Oct 6 13:30:30 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 <stdarg.h>             /* va_list va_start va_end */
22  #include <unistd.h>     /* read close getuid getgid getpid getppid gethostname */  #include <unistd.h>             /* read close getuid getgid getpid getppid gethostname */
23  #include <fcntl.h>      /* open */  #include <fcntl.h>              /* open */
24  #include <pwd.h>        /* getpwuid */  #include <pwd.h>                /* getpwuid */
25  #include <sys/stat.h>   /* stat */  #include <limits.h>             /* PATH_MAX */
26  #include <sys/time.h>   /* gettimeofday */  #include <termios.h>            /* tcgetattr tcsetattr */
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            fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
54            fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2002 Matt Chapman.\n");
55            fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
56    
57            fprintf(stderr, "Usage: %s [options] server\n", program);
58            fprintf(stderr, "   -u: user name\n");
59            fprintf(stderr, "   -d: domain\n");
60            fprintf(stderr, "   -s: shell\n");
61            fprintf(stderr, "   -c: working directory\n");
62            fprintf(stderr, "   -p: password (- to prompt)\n");
63            fprintf(stderr, "   -n: client hostname\n");
64            fprintf(stderr, "   -k: keyboard layout on terminal server (us,sv,gr etc.)\n");
65            fprintf(stderr, "   -g: desktop geometry (WxH)\n");
66            fprintf(stderr, "   -f: full-screen mode\n");
67            fprintf(stderr, "   -b: force bitmap updates\n");
68            fprintf(stderr, "   -e: disable encryption (French TS)\n");
69            fprintf(stderr, "   -m: do not send motion events\n");
70            fprintf(stderr, "   -l: do not request licence\n");
71            fprintf(stderr, "   -t: rdp tcp port\n");
72            fprintf(stderr, "   -K: keep window manager key bindings\n");
73            fprintf(stderr, "   -w: window title\n");
74    }
75    
76    static BOOL
77    read_password(char *password, int size)
78  {  {
79          STATUS("Usage: %s [options] server\n", program);          struct termios tios;
80          STATUS("   -u: user name\n");          BOOL ret = False;
81          STATUS("   -n: client hostname\n");          int istty = 0;
82          STATUS("   -w: desktop width\n");          char *p;
83          STATUS("   -h: desktop height\n");  
84          STATUS("   -k: keyboard layout (hex)\n");          if (tcgetattr(STDIN_FILENO, &tios) == 0)
85          STATUS("   -m: send motion events\n");          {
86          STATUS("   -b: force bitmap updates\n");                  fprintf(stderr, "Password: ");
87          STATUS("   -l: do not request licence\n\n");                  tios.c_lflag &= ~ECHO;
88                    tcsetattr(STDIN_FILENO, TCSANOW, &tios);
89                    istty = 1;
90            }
91    
92            if (fgets(password, size, stdin) != NULL)
93            {
94                    ret = True;
95    
96                    /* strip final newline */
97                    p = strchr(password, '\n');
98                    if (p != NULL)
99                            *p = 0;
100            }
101    
102            if (istty)
103            {
104                    tios.c_lflag |= ECHO;
105                    tcsetattr(STDIN_FILENO, TCSANOW, &tios);
106                    fprintf(stderr, "\n");
107            }
108    
109            return ret;
110  }  }
111    
112  /* Client program */  /* Client program */
113  int main(int argc, char *argv[])  int
114    main(int argc, char *argv[])
115  {  {
116            char fullhostname[64];
117            char domain[16];
118            char password[16];
119            char shell[32];
120            char directory[32];
121            BOOL prompt_password;
122          struct passwd *pw;          struct passwd *pw;
123          char *server;          char *server, *p;
124          char title[32];          uint32 flags;
125          int c;          int c;
126    
127          STATUS("rdesktop: A Remote Desktop Protocol client.\n");          flags = RDP_LOGON_NORMAL;
128          STATUS("Version "VERSION". Copyright (C) 1999-2000 Matt Chapman.\n\n");          prompt_password = False;
129            domain[0] = password[0] = shell[0] = directory[0] = 0;
130            strcpy(keymapname, "us");
131    
132          while ((c = getopt(argc, argv, "u:n:w:h:k:mbl?")) != -1)          while ((c = getopt(argc, argv, "u:d:s:c:p:n:k:g:t:fbemlKw:h?")) != -1)
133          {          {
134                  switch (c)                  switch (c)
135                  {                  {
136                          case 'u':                          case 'u':
137                                  strncpy(username, optarg, sizeof(username));                                  STRNCPY(username, optarg, sizeof(username));
138                                  break;                                  break;
139    
140                          case 'n':                          case 'd':
141                                  strncpy(hostname, optarg, sizeof(hostname));                                  STRNCPY(domain, optarg, sizeof(domain));
142                                  break;                                  break;
143    
144                          case 'w':                          case 's':
145                                  width = strtol(optarg, NULL, 10);                                  STRNCPY(shell, optarg, sizeof(shell));
146                                  break;                                  break;
147    
148                          case 'h':                          case 'c':
149                                  height = strtol(optarg, NULL, 10);                                  STRNCPY(directory, optarg, sizeof(directory));
150                                    break;
151    
152                            case 'p':
153                                    if ((optarg[0] == '-') && (optarg[1] == 0))
154                                    {
155                                            prompt_password = True;
156                                            break;
157                                    }
158    
159                                    STRNCPY(password, optarg, sizeof(password));
160                                    flags |= RDP_LOGON_AUTO;
161    
162                                    /* try to overwrite argument so it won't appear in ps */
163                                    p = optarg;
164                                    while (*p)
165                                            *(p++) = 'X';
166                                    break;
167    
168                            case 'n':
169                                    STRNCPY(hostname, optarg, sizeof(hostname));
170                                  break;                                  break;
171    
172                          case 'k':                          case 'k':
173                                  keylayout = strtol(optarg, NULL, 16);                                  STRNCPY(keymapname, optarg, sizeof(keymapname));
174                                  break;                                  break;
175    
176                          case 'm':                          case 'g':
177                                  motion = True;                                  width = strtol(optarg, &p, 10);
178                                    if (*p == 'x')
179                                            height = strtol(p + 1, NULL, 10);
180    
181                                    if ((width == 0) || (height == 0))
182                                    {
183                                            error("invalid geometry\n");
184                                            return 1;
185                                    }
186                                    break;
187    
188                            case 'f':
189                                    fullscreen = True;
190                                  break;                                  break;
191    
192                          case 'b':                          case 'b':
193                                  orders = False;                                  orders = False;
194                                  break;                                  break;
195    
196                            case 'e':
197                                    encryption = False;
198                                    break;
199    
200                            case 'm':
201                                    sendmotion = False;
202                                    break;
203    
204                          case 'l':                          case 'l':
205                                  licence = False;                                  licence = False;
206                                  break;                                  break;
207    
208                            case 't':
209                                    tcp_port_rdp = strtol(optarg, NULL, 10);
210                                    break;
211    
212                            case 'K':
213                                    grab_keyboard = False;
214                                    break;
215    
216                            case 'w':
217                                    strncpy(title, optarg, sizeof(title));
218                                    break;
219    
220                            case 'h':
221                          case '?':                          case '?':
222                          default:                          default:
223                                  usage(argv[0]);                                  usage(argv[0]);
# Line 117  int main(int argc, char *argv[]) Line 238  int main(int argc, char *argv[])
238                  pw = getpwuid(getuid());                  pw = getpwuid(getuid());
239                  if ((pw == NULL) || (pw->pw_name == NULL))                  if ((pw == NULL) || (pw->pw_name == NULL))
240                  {                  {
241                          STATUS("Could not determine user name.\n");                          error("could not determine username, use -u\n");
242                          return 1;                          return 1;
243                  }                  }
244    
245                  strncpy(username, pw->pw_name, sizeof(username));                  STRNCPY(username, pw->pw_name, sizeof(username));
246          }          }
247    
248          if (hostname[0] == 0)          if (hostname[0] == 0)
249          {          {
250                  if (gethostname(hostname, sizeof(hostname)) == -1)                  if (gethostname(fullhostname, sizeof(fullhostname)) == -1)
251                  {                  {
252                          STATUS("Could not determine host name.\n");                          error("could not determine local hostname, use -n\n");
253                          return 1;                          return 1;
254                  }                  }
255    
256                    p = strchr(fullhostname, '.');
257                    if (p != NULL)
258                            *p = 0;
259    
260                    STRNCPY(hostname, fullhostname, sizeof(hostname));
261            }
262    
263            if (prompt_password && read_password(password, sizeof(password)))
264                    flags |= RDP_LOGON_AUTO;
265    
266            if (title[0] == 0)
267            {
268                    strcpy(title, "rdesktop - ");
269                    strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
270          }          }
271    
272          if (!rdp_connect(server))          if (!ui_init())
273                  return 1;                  return 1;
274    
275          STATUS("Connection successful.\n");          if (!rdp_connect(server, flags, domain, password, shell, directory))
276                    return 1;
277    
278          strcpy(title, "rdesktop - ");          DEBUG(("Connection successful.\n"));
279          strncat(title, server, sizeof(title));          memset(password, 0, sizeof(password));
280    
281          if (ui_create_window(title))          if (ui_create_window())
282          {          {
283                  rdp_main_loop();                  rdp_main_loop();
284                  ui_destroy_window();                  ui_destroy_window();
285          }          }
286    
287            DEBUG(("Disconnecting...\n"));
288          rdp_disconnect();          rdp_disconnect();
289            ui_deinit();
290          return 0;          return 0;
291  }  }
292    
293  /* Generate a 32-byte random for the secure transport code. */  /* Generate a 32-byte random for the secure transport code. */
294  void generate_random(uint8 *random)  void
295    generate_random(uint8 * random)
296  {  {
297          struct stat st;          struct stat st;
298          uint32 *r = (uint32 *)random;          struct tms tmsbuf;
299            uint32 *r = (uint32 *) random;
300          int fd;          int fd;
301    
302          /* If we have a kernel random device, use it. */          /* If we have a kernel random device, use it. */
303          if ((fd = open("/dev/urandom", O_RDONLY)) != -1)          if (((fd = open("/dev/urandom", O_RDONLY)) != -1)
304                || ((fd = open("/dev/random", O_RDONLY)) != -1))
305          {          {
306                  read(fd, random, 32);                  read(fd, random, 32);
307                  close(fd);                  close(fd);
# Line 169  void generate_random(uint8 *random) Line 311  void generate_random(uint8 *random)
311          /* Otherwise use whatever entropy we can gather - ideas welcome. */          /* Otherwise use whatever entropy we can gather - ideas welcome. */
312          r[0] = (getpid()) | (getppid() << 16);          r[0] = (getpid()) | (getppid() << 16);
313          r[1] = (getuid()) | (getgid() << 16);          r[1] = (getuid()) | (getgid() << 16);
314          r[2] = times(NULL); /* system uptime (clocks) */          r[2] = times(&tmsbuf);  /* system uptime (clocks) */
315          gettimeofday((struct timeval *)&r[3], NULL); /* sec and usec */          gettimeofday((struct timeval *) &r[3], NULL);   /* sec and usec */
316          stat("/tmp", &st);          stat("/tmp", &st);
317          r[5] = st.st_atime;          r[5] = st.st_atime;
318          r[6] = st.st_mtime;          r[6] = st.st_mtime;
# Line 178  void generate_random(uint8 *random) Line 320  void generate_random(uint8 *random)
320  }  }
321    
322  /* malloc; exit if out of memory */  /* malloc; exit if out of memory */
323  void *xmalloc(int size)  void *
324    xmalloc(int size)
325  {  {
326          void *mem = malloc(size);          void *mem = malloc(size);
327          if (mem == NULL)          if (mem == NULL)
328          {          {
329                  ERROR("xmalloc %d\n", size);                  error("xmalloc %d\n", size);
330                  exit(1);                  exit(1);
331          }          }
332          return mem;          return mem;
333  }  }
334    
335  /* realloc; exit if out of memory */  /* realloc; exit if out of memory */
336  void *xrealloc(void *oldmem, int size)  void *
337    xrealloc(void *oldmem, int size)
338  {  {
339          void *mem = realloc(oldmem, size);          void *mem = realloc(oldmem, size);
340          if (mem == NULL)          if (mem == NULL)
341          {          {
342                  ERROR("xrealloc %d\n", size);                  error("xrealloc %d\n", size);
343                  exit(1);                  exit(1);
344          }          }
345          return mem;          return mem;
346  }  }
347    
348  /* free */  /* free */
349  void xfree(void *mem)  void
350    xfree(void *mem)
351  {  {
352          free(mem);          free(mem);
353  }  }
354    
355  /* Produce a hex dump */  /* report an error */
356  void hexdump(unsigned char *p, unsigned int len)  void
357    error(char *format, ...)
358    {
359            va_list ap;
360    
361            fprintf(stderr, "ERROR: ");
362    
363            va_start(ap, format);
364            vfprintf(stderr, format, ap);
365            va_end(ap);
366    }
367    
368    /* report an unimplemented protocol feature */
369    void
370    unimpl(char *format, ...)
371    {
372            va_list ap;
373    
374            fprintf(stderr, "NOT IMPLEMENTED: ");
375    
376            va_start(ap, format);
377            vfprintf(stderr, format, ap);
378            va_end(ap);
379    }
380    
381    /* produce a hex dump */
382    void
383    hexdump(unsigned char *p, unsigned int len)
384  {  {
385          unsigned char *line = p;          unsigned char *line = p;
386          unsigned int thisline, offset = 0;          unsigned int thisline, offset = 0;
# Line 216  void hexdump(unsigned char *p, unsigned Line 388  void hexdump(unsigned char *p, unsigned
388    
389          while (offset < len)          while (offset < len)
390          {          {
391                  STATUS("%04x ", offset);                  printf("%04x ", offset);
392                  thisline = len - offset;                  thisline = len - offset;
393                  if (thisline > 16)                  if (thisline > 16)
394                          thisline = 16;                          thisline = 16;
395    
396                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
397                          STATUS("%02x ", line[i])                          printf("%02x ", line[i]);
398    
399                  for (; i < 16; i++)                  for (; i < 16; i++)
400                          STATUS("   ");                          printf("   ");
401    
402                  for (i = 0; i < thisline; i++)                  for (i = 0; i < thisline; i++)
403                          STATUS("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');                          printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
404    
405                  STATUS("\n");                  printf("\n");
406                  offset += thisline;                  offset += thisline;
407                  line += thisline;                  line += thisline;
408          }          }
409  }  }
410    
411    #ifdef SAVE_LICENCE
412    int
413    load_licence(unsigned char **data)
414    {
415            char path[PATH_MAX];
416            char *home;
417            struct stat st;
418            int fd;
419    
420            home = getenv("HOME");
421            if (home == NULL)
422                    return -1;
423    
424            STRNCPY(path, home, sizeof(path));
425            strncat(path, "/.rdesktop/licence", sizeof(path) - strlen(path) - 1);
426    
427            fd = open(path, O_RDONLY);
428            if (fd == -1)
429                    return -1;
430    
431            if (fstat(fd, &st))
432                    return -1;
433    
434            *data = xmalloc(st.st_size);
435            return read(fd, *data, st.st_size);
436    }
437    
438    void
439    save_licence(unsigned char *data, int length)
440    {
441            char path[PATH_MAX];
442            char *home;
443            int fd;
444    
445            home = getenv("HOME");
446            if (home == NULL)
447                    return;
448    
449            STRNCPY(path, home, sizeof(path));
450            strncat(path, "/.rdesktop", sizeof(path) - strlen(path) - 1);
451            mkdir(path, 0700);
452    
453            strncat(path, "/licence", sizeof(path) - strlen(path) - 1);
454    
455            fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
456            if (fd == -1)
457            {
458                    perror("open");
459                    return;
460            }
461    
462            write(fd, data, length);
463            close(fd);
464    }
465    #endif

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

  ViewVC Help
Powered by ViewVC 1.1.26