/[rdesktop]/jpeg/rdesktop/trunk/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 /jpeg/rdesktop/trunk/rdesktop.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

sourceforge.net/trunk/rdesktop/rdesktop.c revision 1255 by stargo, Sun Sep 17 11:04:50 2006 UTC jpeg/rdesktop/trunk/rdesktop.c revision 1507 by dpavlin, Mon Jul 20 16:45:11 2009 UTC
# Line 1  Line 1 
1  /* -*- c-basic-offset: 8 -*-  /* -*- c-basic-offset: 8 -*-
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-2005     Copyright (C) Matthew Chapman 1999-2008
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
# Line 45  Line 45 
45  #include <sys/un.h>             /* sockaddr_un */  #include <sys/un.h>             /* sockaddr_un */
46  #endif  #endif
47    
48  #include <openssl/md5.h>  #include "ssl.h"
49    
50  char g_title[64] = "";  char g_title[64] = "";
51  char g_username[64];  char *g_username;
52  char g_hostname[16];  char g_hostname[16];
53  char g_keymapname[PATH_MAX] = "";  char g_keymapname[PATH_MAX] = "";
54  unsigned int g_keylayout = 0x409;       /* Defaults to US keyboard layout */  unsigned int g_keylayout = 0x409;       /* Defaults to US keyboard layout */
# Line 71  int g_pos = 0;                 /* 0 position unspecifi Line 71  int g_pos = 0;                 /* 0 position unspecifi
71  extern int g_tcp_port_rdp;  extern int g_tcp_port_rdp;
72  int g_server_depth = -1;  int g_server_depth = -1;
73  int g_win_button_size = 0;      /* If zero, disable single app mode */  int g_win_button_size = 0;      /* If zero, disable single app mode */
74  BOOL g_bitmap_compression = True;  RD_BOOL g_bitmap_compression = True;
75  BOOL g_sendmotion = True;  RD_BOOL g_sendmotion = True;
76  BOOL g_bitmap_cache = True;  RD_BOOL g_bitmap_cache = True;
77  BOOL g_bitmap_cache_persist_enable = False;  RD_BOOL g_bitmap_cache_persist_enable = False;
78  BOOL g_bitmap_cache_precache = True;  RD_BOOL g_bitmap_cache_precache = True;
79  BOOL g_encryption = True;  RD_BOOL g_encryption = True;
80  BOOL packet_encryption = True;  RD_BOOL g_packet_encryption = True;
81  BOOL g_desktop_save = True;     /* desktop save order */  RD_BOOL g_desktop_save = True;  /* desktop save order */
82  BOOL g_polygon_ellipse_orders = True;   /* polygon / ellipse orders */  RD_BOOL g_polygon_ellipse_orders = True;        /* polygon / ellipse orders */
83  BOOL g_fullscreen = False;  RD_BOOL g_fullscreen = False;
84  BOOL g_grab_keyboard = True;  RD_BOOL g_grab_keyboard = True;
85  BOOL g_hide_decorations = False;  RD_BOOL g_hide_decorations = False;
86  BOOL g_use_rdp5 = True;  RD_BOOL g_use_rdp5 = True;
87  BOOL g_rdpclip = True;  RD_BOOL g_rdpclip = True;
88  BOOL g_console_session = False;  RD_BOOL g_console_session = False;
89  BOOL g_numlock_sync = False;  RD_BOOL g_numlock_sync = False;
90  BOOL lspci_enabled = False;  RD_BOOL g_lspci_enabled = False;
91  BOOL g_owncolmap = False;  RD_BOOL g_owncolmap = False;
92  BOOL g_ownbackstore = True;     /* We can't rely on external BackingStore */  RD_BOOL g_ownbackstore = True;  /* We can't rely on external BackingStore */
93  BOOL g_seamless_rdp = False;  RD_BOOL g_seamless_rdp = False;
94  uint32 g_embed_wnd;  uint32 g_embed_wnd;
95  uint32 g_rdp5_performanceflags =  uint32 g_rdp5_performanceflags =
96          RDP5_NO_WALLPAPER | RDP5_NO_FULLWINDOWDRAG | RDP5_NO_MENUANIMATIONS;          RDP5_NO_WALLPAPER | RDP5_NO_FULLWINDOWDRAG | RDP5_NO_MENUANIMATIONS;
97  /* Session Directory redirection */  /* Session Directory redirection */
98  BOOL g_redirect = False;  RD_BOOL g_redirect = False;
99  char g_redirect_server[64];  char g_redirect_server[64];
100  char g_redirect_domain[16];  char g_redirect_domain[16];
101  char g_redirect_password[64];  char g_redirect_password[64];
102  char g_redirect_username[64];  char *g_redirect_username;
103  char g_redirect_cookie[128];  char g_redirect_cookie[128];
104  uint32 g_redirect_flags = 0;  uint32 g_redirect_flags = 0;
105    
106  #ifdef WITH_RDPSND  #ifdef WITH_RDPSND
107  BOOL g_rdpsnd = False;  RD_BOOL g_rdpsnd = False;
108  #endif  #endif
109    
110  #ifdef HAVE_ICONV  #ifdef HAVE_ICONV
# Line 127  static void Line 127  static void
127  usage(char *program)  usage(char *program)
128  {  {
129          fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");          fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
130          fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2005 Matt Chapman.\n");          fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2008 Matthew Chapman.\n");
131          fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");          fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
132    
133          fprintf(stderr, "Usage: %s [options] server[:port]\n", program);          fprintf(stderr, "Usage: %s [options] server[:port]\n", program);
# Line 193  usage(char *program) Line 193  usage(char *program)
193                  "                      'PRIMARYCLIPBOARD' looks at both PRIMARY and CLIPBOARD\n");                  "                      'PRIMARYCLIPBOARD' looks at both PRIMARY and CLIPBOARD\n");
194          fprintf(stderr, "                      when sending data to server.\n");          fprintf(stderr, "                      when sending data to server.\n");
195          fprintf(stderr, "                      'CLIPBOARD' looks at only CLIPBOARD.\n");          fprintf(stderr, "                      'CLIPBOARD' looks at only CLIPBOARD.\n");
196    #ifdef WITH_SCARD
197            fprintf(stderr, "         '-r scard[:\"Scard Name\"=\"Alias Name[;Vendor Name]\"[,...]]\n");
198            fprintf(stderr, "          example: -r scard:\"eToken PRO 00 00\"=\"AKS ifdh 0\"\n");
199            fprintf(stderr,
200                    "                   \"eToken PRO 00 00\" -> Device in Linux/Unix enviroment\n");
201            fprintf(stderr,
202                    "                   \"AKS ifdh 0\"       -> Device shown in Windows enviroment \n");
203            fprintf(stderr, "          example: -r scard:\"eToken PRO 00 00\"=\"AKS ifdh 0;AKS\"\n");
204            fprintf(stderr,
205                    "                   \"eToken PRO 00 00\" -> Device in Linux/Unix enviroment\n");
206            fprintf(stderr,
207                    "                   \"AKS ifdh 0\"       -> Device shown in Windows enviroment \n");
208            fprintf(stderr,
209                    "                   \"AKS\"              -> Device vendor name                 \n");
210    #endif
211          fprintf(stderr, "   -0: attach to console\n");          fprintf(stderr, "   -0: attach to console\n");
212          fprintf(stderr, "   -4: use RDP version 4\n");          fprintf(stderr, "   -4: use RDP version 4\n");
213          fprintf(stderr, "   -5: use RDP version 5 (default)\n");          fprintf(stderr, "   -5: use RDP version 5 (default)\n");
# Line 304  rdesktop_reset_state(void) Line 319  rdesktop_reset_state(void)
319          rdp_reset_state();          rdp_reset_state();
320  }  }
321    
322  static BOOL  static RD_BOOL
323  read_password(char *password, int size)  read_password(char *password, int size)
324  {  {
325          struct termios tios;          struct termios tios;
326          BOOL ret = False;          RD_BOOL ret = False;
327          int istty = 0;          int istty = 0;
328          char *p;          char *p;
329    
# Line 398  main(int argc, char *argv[]) Line 413  main(int argc, char *argv[])
413          char password[64];          char password[64];
414          char shell[256];          char shell[256];
415          char directory[256];          char directory[256];
416          BOOL prompt_password, deactivated;          RD_BOOL prompt_password, deactivated;
417          struct passwd *pw;          struct passwd *pw;
418          uint32 flags, ext_disc_reason = 0;          uint32 flags, ext_disc_reason = 0;
419          char *p;          char *p;
420          int c;          int c;
421          char *locale = NULL;          char *locale = NULL;
422          int username_option = 0;          int username_option = 0;
423          BOOL geometry_option = False;          RD_BOOL geometry_option = False;
424          int run_count = 0;      /* Session Directory support */          int run_count = 0;      /* Session Directory support */
425          BOOL continue_connect = True;   /* Session Directory support */          RD_BOOL continue_connect = True;        /* Session Directory support */
426    #ifdef WITH_RDPSND
427            char *rdpsnd_optarg = NULL;
428    #endif
429    
430  #ifdef HAVE_LOCALE_H  #ifdef HAVE_LOCALE_H
431          /* Set locale according to environment */          /* Set locale according to environment */
# Line 455  main(int argc, char *argv[]) Line 473  main(int argc, char *argv[])
473                                  break;                                  break;
474    
475                          case 'u':                          case 'u':
476                                  STRNCPY(g_username, optarg, sizeof(g_username));                                  g_username = (char *) xmalloc(strlen(optarg) + 1);
477                                    STRNCPY(g_username, optarg, strlen(optarg) + 1);
478                                  username_option = 1;                                  username_option = 1;
479                                  break;                                  break;
480    
# Line 564  main(int argc, char *argv[]) Line 583  main(int argc, char *argv[])
583                                  g_encryption = False;                                  g_encryption = False;
584                                  break;                                  break;
585                          case 'E':                          case 'E':
586                                  packet_encryption = False;                                  g_packet_encryption = False;
587                                  break;                                  break;
588                          case 'm':                          case 'm':
589                                  g_sendmotion = False;                                  g_sendmotion = False;
# Line 615  main(int argc, char *argv[]) Line 634  main(int argc, char *argv[])
634                                  g_server_depth = strtol(optarg, NULL, 10);                                  g_server_depth = strtol(optarg, NULL, 10);
635                                  if (g_server_depth != 8 &&                                  if (g_server_depth != 8 &&
636                                      g_server_depth != 16 &&                                      g_server_depth != 16 &&
637                                      g_server_depth != 15 && g_server_depth != 24)                                      g_server_depth != 15 && g_server_depth != 24
638                                        && g_server_depth != 32)
639                                  {                                  {
640                                          error("Invalid server colour depth.\n");                                          error("Invalid server colour depth.\n");
641                                          return 1;                                          return 1;
# Line 669  main(int argc, char *argv[]) Line 689  main(int argc, char *argv[])
689                                                          if (str_startswith(optarg, "local"))                                                          if (str_startswith(optarg, "local"))
690  #ifdef WITH_RDPSND  #ifdef WITH_RDPSND
691                                                          {                                                          {
692                                                                  char *driver = NULL, *options =                                                                  rdpsnd_optarg =
693                                                                          NULL;                                                                          next_arg(optarg, ':');
   
                                                                 if ((driver =  
                                                                      next_arg(optarg, ':')))  
                                                                 {  
                                                                         if (!strlen(driver))  
                                                                         {  
                                                                                 driver = NULL;  
                                                                         }  
                                                                         else if ((options =  
                                                                                   next_arg(driver,  
                                                                                            ':')))  
                                                                         {  
                                                                                 if (!strlen  
                                                                                     (options))  
                                                                                         options =  
                                                                                                 NULL;  
                                                                         }  
                                                                 }  
   
694                                                                  g_rdpsnd = True;                                                                  g_rdpsnd = True;
                                                                 if (!rdpsnd_select_driver  
                                                                     (driver, options))  
                                                                 {  
                                                                         warning("Driver not available\n");  
                                                                 }  
695                                                          }                                                          }
696    
697  #else  #else
# Line 716  main(int argc, char *argv[]) Line 712  main(int argc, char *argv[])
712                                          {                                          {
713  #ifdef WITH_RDPSND  #ifdef WITH_RDPSND
714                                                  g_rdpsnd = True;                                                  g_rdpsnd = True;
                                                 if (!rdpsnd_select_driver(NULL, NULL))  
                                                 {  
                                                         warning("No sound-driver available\n");  
                                                 }  
715  #else  #else
716                                                  warning("Not compiled with sound support\n");                                                  warning("Not compiled with sound support\n");
717  #endif  #endif
# Line 736  main(int argc, char *argv[]) Line 728  main(int argc, char *argv[])
728                                  }                                  }
729                                  else if (str_startswith(optarg, "lspci"))                                  else if (str_startswith(optarg, "lspci"))
730                                  {                                  {
731                                          lspci_enabled = True;                                          g_lspci_enabled = True;
732                                  }                                  }
733                                  else if (str_startswith(optarg, "lptport"))                                  else if (str_startswith(optarg, "lptport"))
734                                  {                                  {
# Line 767  main(int argc, char *argv[]) Line 759  main(int argc, char *argv[])
759                                          else                                          else
760                                                  g_rdpclip = True;                                                  g_rdpclip = True;
761                                  }                                  }
762                                    else if (strncmp("scard", optarg, 5) == 0)
763                                    {
764    #ifdef WITH_SCARD
765                                            scard_enum_devices(&g_num_devices, optarg + 5);
766    #else
767                                            warning("Not compiled with smartcard support\n");
768    #endif
769                                    }
770                                  else                                  else
771                                  {                                  {
772                                          warning("Unknown -r argument\n\n\tPossible arguments are: comport, disk, lptport, printer, sound, clipboard\n");                                          warning("Unknown -r argument\n\n\tPossible arguments are: comport, disk, lptport, printer, sound, clipboard, scard\n");
773                                  }                                  }
774                                  break;                                  break;
775    
# Line 847  main(int argc, char *argv[]) Line 847  main(int argc, char *argv[])
847                          error("could not determine username, use -u\n");                          error("could not determine username, use -u\n");
848                          return 1;                          return 1;
849                  }                  }
850                    /* +1 for trailing \0 */
851                  STRNCPY(g_username, pw->pw_name, sizeof(g_username));                  int pwlen = strlen(pw->pw_name) + 1;
852                    g_username = (char *) xmalloc(pwlen);
853                    STRNCPY(g_username, pw->pw_name, pwlen);
854          }          }
855    
856  #ifdef HAVE_ICONV  #ifdef HAVE_ICONV
# Line 914  main(int argc, char *argv[]) Line 916  main(int argc, char *argv[])
916    
917  #ifdef WITH_RDPSND  #ifdef WITH_RDPSND
918          if (g_rdpsnd)          if (g_rdpsnd)
919                  rdpsnd_init();          {
920                    if (!rdpsnd_init(rdpsnd_optarg))
921                    {
922                            warning("Initializing sound-support failed!\n");
923                    }
924            }
925  #endif  #endif
926    
927          if (lspci_enabled)          if (g_lspci_enabled)
928                  lspci_init();                  lspci_init();
929    
930          rdpdr_init();          rdpdr_init();
# Line 935  main(int argc, char *argv[]) Line 942  main(int argc, char *argv[])
942    
943                  /* By setting encryption to False here, we have an encrypted login                  /* By setting encryption to False here, we have an encrypted login
944                     packet but unencrypted transfer of other packets */                     packet but unencrypted transfer of other packets */
945                  if (!packet_encryption)                  if (!g_packet_encryption)
946                          g_encryption = False;                          g_encryption = False;
947    
948    
# Line 958  main(int argc, char *argv[]) Line 965  main(int argc, char *argv[])
965                          rdesktop_reset_state();                          rdesktop_reset_state();
966    
967                          STRNCPY(domain, g_redirect_domain, sizeof(domain));                          STRNCPY(domain, g_redirect_domain, sizeof(domain));
968                            xfree(g_username);
969                            g_username = (char *) xmalloc(strlen(g_redirect_username) + 1);
970                          STRNCPY(g_username, g_redirect_username, sizeof(g_username));                          STRNCPY(g_username, g_redirect_username, sizeof(g_username));
971                          STRNCPY(password, g_redirect_password, sizeof(password));                          STRNCPY(password, g_redirect_password, sizeof(password));
972                          STRNCPY(server, g_redirect_server, sizeof(server));                          STRNCPY(server, g_redirect_server, sizeof(server));
# Line 1002  main(int argc, char *argv[]) Line 1011  main(int argc, char *argv[])
1011          }          }
1012    
1013  #endif  #endif
1014            if (g_redirect_username)
1015                    xfree(g_redirect_username);
1016    
1017            xfree(g_username);
1018  }  }
1019    
1020  #ifdef EGD_SOCKET  #ifdef EGD_SOCKET
1021  /* Read 32 random bytes from PRNGD or EGD socket (based on OpenSSL RAND_egd) */  /* Read 32 random bytes from PRNGD or EGD socket (based on OpenSSL RAND_egd) */
1022  static BOOL  static RD_BOOL
1023  generate_random_egd(uint8 * buf)  generate_random_egd(uint8 * buf)
1024  {  {
1025          struct sockaddr_un addr;          struct sockaddr_un addr;
1026          BOOL ret = False;          RD_BOOL ret = False;
1027          int fd;          int fd;
1028    
1029          fd = socket(AF_UNIX, SOCK_STREAM, 0);          fd = socket(AF_UNIX, SOCK_STREAM, 0);
# Line 1049  generate_random(uint8 * random) Line 1061  generate_random(uint8 * random)
1061  {  {
1062          struct stat st;          struct stat st;
1063          struct tms tmsbuf;          struct tms tmsbuf;
1064          MD5_CTX md5;          SSL_MD5 md5;
1065          uint32 *r;          uint32 *r;
1066          int fd, n;          int fd, n;
1067    
# Line 1081  generate_random(uint8 * random) Line 1093  generate_random(uint8 * random)
1093          r[7] = st.st_ctime;          r[7] = st.st_ctime;
1094    
1095          /* Hash both halves with MD5 to obscure possible patterns */          /* Hash both halves with MD5 to obscure possible patterns */
1096          MD5_Init(&md5);          ssl_md5_init(&md5);
1097          MD5_Update(&md5, random, 16);          ssl_md5_update(&md5, random, 16);
1098          MD5_Final(random, &md5);          ssl_md5_final(&md5, random);
1099          MD5_Update(&md5, random + 16, 16);          ssl_md5_update(&md5, random + 16, 16);
1100          MD5_Final(random + 16, &md5);          ssl_md5_final(&md5, random + 16);
1101  }  }
1102    
1103  /* malloc; exit if out of memory */  /* malloc; exit if out of memory */
# Line 1101  xmalloc(int size) Line 1113  xmalloc(int size)
1113          return mem;          return mem;
1114  }  }
1115    
1116    /* Exit on NULL pointer. Use to verify result from XGetImage etc */
1117    void
1118    exit_if_null(void *ptr)
1119    {
1120            if (ptr == NULL)
1121            {
1122                    error("unexpected null pointer. Out of memory?\n");
1123                    exit(1);
1124            }
1125    }
1126    
1127  /* strdup */  /* strdup */
1128  char *  char *
1129  xstrdup(const char *s)  xstrdup(const char *s)
# Line 1116  xstrdup(const char *s) Line 1139  xstrdup(const char *s)
1139    
1140  /* realloc; exit if out of memory */  /* realloc; exit if out of memory */
1141  void *  void *
1142  xrealloc(void *oldmem, int size)  xrealloc(void *oldmem, size_t size)
1143  {  {
1144          void *mem;          void *mem;
1145    
1146          if (size < 1)          if (size == 0)
1147                  size = 1;                  size = 1;
1148          mem = realloc(oldmem, size);          mem = realloc(oldmem, size);
1149          if (mem == NULL)          if (mem == NULL)
1150          {          {
1151                  error("xrealloc %d\n", size);                  error("xrealloc %ld\n", size);
1152                  exit(1);                  exit(1);
1153          }          }
1154          return mem;          return mem;
# Line 1287  toupper_str(char *p) Line 1310  toupper_str(char *p)
1310  }  }
1311    
1312    
1313  BOOL  RD_BOOL
1314  str_startswith(const char *s, const char *prefix)  str_startswith(const char *s, const char *prefix)
1315  {  {
1316          return (strncmp(s, prefix, strlen(prefix)) == 0);          return (strncmp(s, prefix, strlen(prefix)) == 0);
# Line 1298  str_startswith(const char *s, const char Line 1321  str_startswith(const char *s, const char
1321     line. Incomplete lines are saved in the rest variable, which should     line. Incomplete lines are saved in the rest variable, which should
1322     initially point to NULL. When linehandler returns False, stop and     initially point to NULL. When linehandler returns False, stop and
1323     return False. Otherwise, return True.  */     return False. Otherwise, return True.  */
1324  BOOL  RD_BOOL
1325  str_handle_lines(const char *input, char **rest, str_handle_lines_t linehandler, void *data)  str_handle_lines(const char *input, char **rest, str_handle_lines_t linehandler, void *data)
1326  {  {
1327          char *buf, *p;          char *buf, *p;
# Line 1306  str_handle_lines(const char *input, char Line 1329  str_handle_lines(const char *input, char
1329          size_t inputlen;          size_t inputlen;
1330          size_t buflen;          size_t buflen;
1331          size_t restlen = 0;          size_t restlen = 0;
1332          BOOL ret = True;          RD_BOOL ret = True;
1333    
1334          /* Copy data to buffer */          /* Copy data to buffer */
1335          inputlen = strlen(input);          inputlen = strlen(input);
# Line 1354  str_handle_lines(const char *input, char Line 1377  str_handle_lines(const char *input, char
1377    
1378  /* Execute the program specified by argv. For each line in  /* Execute the program specified by argv. For each line in
1379     stdout/stderr output, call linehandler. Returns false on failure. */     stdout/stderr output, call linehandler. Returns false on failure. */
1380  BOOL  RD_BOOL
1381  subprocess(char *const argv[], str_handle_lines_t linehandler, void *data)  subprocess(char *const argv[], str_handle_lines_t linehandler, void *data)
1382  {  {
1383          pid_t child;          pid_t child;
# Line 1520  save_licence(unsigned char *data, int le Line 1543  save_licence(unsigned char *data, int le
1543  }  }
1544    
1545  /* Create the bitmap cache directory */  /* Create the bitmap cache directory */
1546  BOOL  RD_BOOL
1547  rd_pstcache_mkdir(void)  rd_pstcache_mkdir(void)
1548  {  {
1549          char *home;          char *home;
# Line 1597  rd_lseek_file(int fd, int offset) Line 1620  rd_lseek_file(int fd, int offset)
1620  }  }
1621    
1622  /* do a write lock on a file */  /* do a write lock on a file */
1623  BOOL  RD_BOOL
1624  rd_lock_file(int fd, int start, int len)  rd_lock_file(int fd, int start, int len)
1625  {  {
1626          struct flock lock;          struct flock lock;

Legend:
Removed from v.1255  
changed lines
  Added in v.1507

  ViewVC Help
Powered by ViewVC 1.1.26