/[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

revision 886 by stargo, Sat Apr 16 11:42:34 2005 UTC revision 1391 by jsorg71, Sat Feb 10 05:29:59 2007 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-2007
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 30  Line 30 
30  #include <errno.h>  #include <errno.h>
31  #include "rdesktop.h"  #include "rdesktop.h"
32    
 #ifdef HAVE_ICONV  
33  #ifdef HAVE_LOCALE_H  #ifdef HAVE_LOCALE_H
34  #include <locale.h>  #include <locale.h>
35  #endif  #endif
36    #ifdef HAVE_ICONV
37  #ifdef HAVE_LANGINFO_H  #ifdef HAVE_LANGINFO_H
38  #include <langinfo.h>  #include <langinfo.h>
39  #endif  #endif
# 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[64];
52  char g_hostname[16];  char g_hostname[16];
53  char keymapname[16];  char g_keymapname[PATH_MAX] = "";
54  int g_keylayout = 0x409;        /* Defaults to US keyboard layout */  unsigned int g_keylayout = 0x409;       /* Defaults to US keyboard layout */
55    int g_keyboard_type = 0x4;      /* Defaults to US keyboard layout */
56    int g_keyboard_subtype = 0x0;   /* Defaults to US keyboard layout */
57    int g_keyboard_functionkeys = 0xc;      /* Defaults to US keyboard layout */
58    
59  int g_width = 800;              /* width is special: If 0, the  int g_width = 800;              /* width is special: If 0, the
60                                     geometry will be fetched from                                     geometry will be fetched from
# Line 66  int g_pos = 0;                 /* 0 position unspecifi Line 69  int g_pos = 0;                 /* 0 position unspecifi
69                                     2 xpos neg,                                     2 xpos neg,
70                                     4 ypos neg  */                                     4 ypos neg  */
71  extern int g_tcp_port_rdp;  extern int g_tcp_port_rdp;
72  int g_server_bpp = 8;  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 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_console_session = False;  RD_BOOL g_rdpclip = True;
88  BOOL g_numlock_sync = False;  RD_BOOL g_console_session = False;
89  BOOL g_owncolmap = False;  RD_BOOL g_numlock_sync = False;
90  BOOL g_ownbackstore = True;     /* We can't rely on external BackingStore */  RD_BOOL lspci_enabled = False;
91  BOOL g_rdp_compression = False;  RD_BOOL g_owncolmap = False;
92    RD_BOOL g_ownbackstore = True;  /* We can't rely on external BackingStore */
93    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 */
98    RD_BOOL g_redirect = False;
99    char g_redirect_server[64];
100    char g_redirect_domain[16];
101    char g_redirect_password[64];
102    char g_redirect_username[64];
103    char g_redirect_cookie[128];
104    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 114  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-2007 Matt 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 135  usage(char *program) Line 148  usage(char *program)
148  #ifdef HAVE_ICONV  #ifdef HAVE_ICONV
149          fprintf(stderr, "   -L: local codepage\n");          fprintf(stderr, "   -L: local codepage\n");
150  #endif  #endif
151            fprintf(stderr, "   -A: enable SeamlessRDP mode\n");
152          fprintf(stderr, "   -B: use BackingStore of X-server (if available)\n");          fprintf(stderr, "   -B: use BackingStore of X-server (if available)\n");
153          fprintf(stderr, "   -e: disable encryption (French TS)\n");          fprintf(stderr, "   -e: disable encryption (French TS)\n");
154          fprintf(stderr, "   -E: disable encryption from client to server\n");          fprintf(stderr, "   -E: disable encryption from client to server\n");
# Line 165  usage(char *program) Line 179  usage(char *program)
179          fprintf(stderr, "         '-r printer:mydeskjet': enable printer redirection\n");          fprintf(stderr, "         '-r printer:mydeskjet': enable printer redirection\n");
180          fprintf(stderr,          fprintf(stderr,
181                  "             or      mydeskjet=\"HP LaserJet IIIP\" to enter server driver as well\n");                  "             or      mydeskjet=\"HP LaserJet IIIP\" to enter server driver as well\n");
182          fprintf(stderr, "         '-r sound:[local|off|remote]': enable sound redirection\n");  #ifdef WITH_RDPSND
183            fprintf(stderr,
184                    "         '-r sound:[local[:driver[:device]]|off|remote]': enable sound redirection\n");
185          fprintf(stderr, "                     remote would leave sound on server\n");          fprintf(stderr, "                     remote would leave sound on server\n");
186            fprintf(stderr, "                     available drivers for 'local':\n");
187            rdpsnd_show_help();
188    #endif
189            fprintf(stderr,
190                    "         '-r clipboard:[off|PRIMARYCLIPBOARD|CLIPBOARD]': enable clipboard\n");
191            fprintf(stderr, "                      redirection.\n");
192            fprintf(stderr,
193                    "                      'PRIMARYCLIPBOARD' looks at both PRIMARY and CLIPBOARD\n");
194            fprintf(stderr, "                      when sending data to server.\n");
195            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");
214  }  }
215    
216  void  static void
217  print_disconnect_reason(uint16 reason)  print_disconnect_reason(uint16 reason)
218  {  {
219          char *text;          char *text;
# Line 272  print_disconnect_reason(uint16 reason) Line 313  print_disconnect_reason(uint16 reason)
313          fprintf(stderr, "disconnect: %s.\n", text);          fprintf(stderr, "disconnect: %s.\n", text);
314  }  }
315    
316  static BOOL  static void
317    rdesktop_reset_state(void)
318    {
319            rdp_reset_state();
320    }
321    
322    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 364  main(int argc, char *argv[]) Line 411  main(int argc, char *argv[])
411          char fullhostname[64];          char fullhostname[64];
412          char domain[16];          char domain[16];
413          char password[64];          char password[64];
414          char shell[128];          char shell[256];
415          char directory[32];          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;
422          int username_option = 0;          int username_option = 0;
423            RD_BOOL geometry_option = False;
424            int run_count = 0;      /* Session Directory support */
425            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
431            /* Set locale according to environment */
432            locale = setlocale(LC_ALL, "");
433            if (locale)
434            {
435                    locale = xstrdup(locale);
436            }
437    
438    #endif
439          flags = RDP_LOGON_NORMAL;          flags = RDP_LOGON_NORMAL;
440          prompt_password = False;          prompt_password = False;
441          domain[0] = password[0] = shell[0] = directory[0] = 0;          domain[0] = password[0] = shell[0] = directory[0] = 0;
         strcpy(keymapname, "en-us");  
442          g_embed_wnd = 0;          g_embed_wnd = 0;
443    
444          g_num_devices = 0;          g_num_devices = 0;
# Line 389  main(int argc, char *argv[]) Line 450  main(int argc, char *argv[])
450  #endif  #endif
451    
452          while ((c = getopt(argc, argv,          while ((c = getopt(argc, argv,
453                             VNCOPT "u:L:d:s:c:p:n:k:g:fbBeEmzCDKS:T:NX:a:x:Pr:045h?")) != -1)                             VNCOPT "Au:L:d:s:c:p:n:k:g:fbBeEmzCDKS:T:NX:a:x:Pr:045h?")) != -1)
454          {          {
455                  switch (c)                  switch (c)
456                  {                  {
# Line 407  main(int argc, char *argv[]) Line 468  main(int argc, char *argv[])
468                                  break;                                  break;
469  #endif  #endif
470    
471                            case 'A':
472                                    g_seamless_rdp = True;
473                                    break;
474    
475                          case 'u':                          case 'u':
476                                  STRNCPY(g_username, optarg, sizeof(g_username));                                  STRNCPY(g_username, optarg, sizeof(g_username));
477                                  username_option = 1;                                  username_option = 1;
# Line 453  main(int argc, char *argv[]) Line 518  main(int argc, char *argv[])
518                                  break;                                  break;
519    
520                          case 'k':                          case 'k':
521                                  STRNCPY(keymapname, optarg, sizeof(keymapname));                                  STRNCPY(g_keymapname, optarg, sizeof(g_keymapname));
522                                  break;                                  break;
523    
524                          case 'g':                          case 'g':
525                                    geometry_option = True;
526                                  g_fullscreen = False;                                  g_fullscreen = False;
527                                  if (!strcmp(optarg, "workarea"))                                  if (!strcmp(optarg, "workarea"))
528                                  {                                  {
# Line 564  main(int argc, char *argv[]) Line 630  main(int argc, char *argv[])
630                                  break;                                  break;
631    
632                          case 'a':                          case 'a':
633                                  g_server_bpp = strtol(optarg, NULL, 10);                                  g_server_depth = strtol(optarg, NULL, 10);
634                                  if (g_server_bpp != 8 && g_server_bpp != 16 && g_server_bpp != 15                                  if (g_server_depth != 8 &&
635                                      && g_server_bpp != 24)                                      g_server_depth != 16 &&
636                                        g_server_depth != 15 && g_server_depth != 24)
637                                  {                                  {
638                                          error("invalid server bpp\n");                                          error("Invalid server colour depth.\n");
639                                          return 1;                                          return 1;
640                                  }                                  }
641                                  break;                                  break;
642    
643                          case 'z':                          case 'z':
644                                  DEBUG(("rdp compression enabled\n"));                                  DEBUG(("rdp compression enabled\n"));
645                                  flags |= RDP_COMPRESSION;                                  flags |= (RDP_LOGON_COMPRESSION | RDP_LOGON_COMPRESSION2);
                                 g_rdp_compression = True;  
646                                  break;                                  break;
647    
648                          case 'x':                          case 'x':
649                                  if (strncmp("modem", optarg, 1) == 0)                                  if (str_startswith(optarg, "m"))        /* modem */
650                                  {                                  {
651                                          g_rdp5_performanceflags =                                          g_rdp5_performanceflags =
652                                                  RDP5_NO_WALLPAPER | RDP5_NO_FULLWINDOWDRAG |                                                  RDP5_NO_WALLPAPER | RDP5_NO_FULLWINDOWDRAG |
653                                                  RDP5_NO_MENUANIMATIONS | RDP5_NO_THEMING;                                                  RDP5_NO_MENUANIMATIONS | RDP5_NO_THEMING;
654                                  }                                  }
655                                  else if (strncmp("broadband", optarg, 1) == 0)                                  else if (str_startswith(optarg, "b"))   /* broadband */
656                                  {                                  {
657                                          g_rdp5_performanceflags = RDP5_NO_WALLPAPER;                                          g_rdp5_performanceflags = RDP5_NO_WALLPAPER;
658                                  }                                  }
659                                  else if (strncmp("lan", optarg, 1) == 0)                                  else if (str_startswith(optarg, "l"))   /* lan */
660                                  {                                  {
661                                          g_rdp5_performanceflags = RDP5_DISABLE_NOTHING;                                          g_rdp5_performanceflags = RDP5_DISABLE_NOTHING;
662                                  }                                  }
# Line 606  main(int argc, char *argv[]) Line 672  main(int argc, char *argv[])
672    
673                          case 'r':                          case 'r':
674    
675                                  if (strncmp("sound", optarg, 5) == 0)                                  if (str_startswith(optarg, "sound"))
676                                  {                                  {
677                                          optarg += 5;                                          optarg += 5;
678    
679                                          if (*optarg == ':')                                          if (*optarg == ':')
680                                          {                                          {
681                                                  *optarg++;                                                  optarg++;
682                                                  while ((p = next_arg(optarg, ',')))                                                  while ((p = next_arg(optarg, ',')))
683                                                  {                                                  {
684                                                          if (strncmp("remote", optarg, 6) == 0)                                                          if (str_startswith(optarg, "remote"))
685                                                                  flags |= RDP_LOGON_LEAVE_AUDIO;                                                                  flags |= RDP_LOGON_LEAVE_AUDIO;
686    
687                                                          if (strncmp("local", optarg, 5) == 0)                                                          if (str_startswith(optarg, "local"))
688  #ifdef WITH_RDPSND  #ifdef WITH_RDPSND
689                                                            {
690                                                                    rdpsnd_optarg =
691                                                                            next_arg(optarg, ':');
692                                                                  g_rdpsnd = True;                                                                  g_rdpsnd = True;
693                                                            }
694    
695  #else  #else
696                                                                  warning("Not compiled with sound support\n");                                                                  warning("Not compiled with sound support\n");
697  #endif  #endif
698    
699                                                          if (strncmp("off", optarg, 3) == 0)                                                          if (str_startswith(optarg, "off"))
700  #ifdef WITH_RDPSND  #ifdef WITH_RDPSND
701                                                                  g_rdpsnd = False;                                                                  g_rdpsnd = False;
702  #else  #else
# Line 644  main(int argc, char *argv[]) Line 715  main(int argc, char *argv[])
715  #endif  #endif
716                                          }                                          }
717                                  }                                  }
718                                  else if (strncmp("disk", optarg, 4) == 0)                                  else if (str_startswith(optarg, "disk"))
719                                  {                                  {
720                                          /* -r disk:h:=/mnt/floppy */                                          /* -r disk:h:=/mnt/floppy */
721                                          disk_enum_devices(&g_num_devices, optarg + 4);                                          disk_enum_devices(&g_num_devices, optarg + 4);
722                                  }                                  }
723                                  else if (strncmp("comport", optarg, 7) == 0)                                  else if (str_startswith(optarg, "comport"))
724                                  {                                  {
725                                          serial_enum_devices(&g_num_devices, optarg + 7);                                          serial_enum_devices(&g_num_devices, optarg + 7);
726                                  }                                  }
727                                  else if (strncmp("lptport", optarg, 7) == 0)                                  else if (str_startswith(optarg, "lspci"))
728                                    {
729                                            lspci_enabled = True;
730                                    }
731                                    else if (str_startswith(optarg, "lptport"))
732                                  {                                  {
733                                          parallel_enum_devices(&g_num_devices, optarg + 7);                                          parallel_enum_devices(&g_num_devices, optarg + 7);
734                                  }                                  }
735                                  else if (strncmp("printer", optarg, 7) == 0)                                  else if (str_startswith(optarg, "printer"))
736                                  {                                  {
737                                          printer_enum_devices(&g_num_devices, optarg + 7);                                          printer_enum_devices(&g_num_devices, optarg + 7);
738                                  }                                  }
739                                  else if (strncmp("clientname", optarg, 7) == 0)                                  else if (str_startswith(optarg, "clientname"))
740                                  {                                  {
741                                          g_rdpdr_clientname = xmalloc(strlen(optarg + 11) + 1);                                          g_rdpdr_clientname = xmalloc(strlen(optarg + 11) + 1);
742                                          strcpy(g_rdpdr_clientname, optarg + 11);                                          strcpy(g_rdpdr_clientname, optarg + 11);
743                                  }                                  }
744                                    else if (str_startswith(optarg, "clipboard"))
745                                    {
746                                            optarg += 9;
747    
748                                            if (*optarg == ':')
749                                            {
750                                                    optarg++;
751    
752                                                    if (str_startswith(optarg, "off"))
753                                                            g_rdpclip = False;
754                                                    else
755                                                            cliprdr_set_mode(optarg);
756                                            }
757                                            else
758                                                    g_rdpclip = True;
759                                    }
760                                    else if (strncmp("scard", optarg, 5) == 0)
761                                    {
762    #ifdef WITH_SCARD
763                                            scard_enum_devices(&g_num_devices, optarg + 5);
764    #else
765                                            warning("Not compiled with smartcard support\n");
766    #endif
767                                    }
768                                  else                                  else
769                                  {                                  {
770                                          warning("Unknown -r argument\n\n\tPossible arguments are: comport, disk, lptport, printer, sound\n");                                          warning("Unknown -r argument\n\n\tPossible arguments are: comport, disk, lptport, printer, sound, clipboard, scard\n");
771                                  }                                  }
772                                  break;                                  break;
773    
# Line 701  main(int argc, char *argv[]) Line 800  main(int argc, char *argv[])
800          STRNCPY(server, argv[optind], sizeof(server));          STRNCPY(server, argv[optind], sizeof(server));
801          parse_server_and_port(server);          parse_server_and_port(server);
802    
803            if (g_seamless_rdp)
804            {
805                    if (g_win_button_size)
806                    {
807                            error("You cannot use -S and -A at the same time\n");
808                            return 1;
809                    }
810                    g_rdp5_performanceflags &= ~RDP5_NO_FULLWINDOWDRAG;
811                    if (geometry_option)
812                    {
813                            error("You cannot use -g and -A at the same time\n");
814                            return 1;
815                    }
816                    if (g_fullscreen)
817                    {
818                            error("You cannot use -f and -A at the same time\n");
819                            return 1;
820                    }
821                    if (g_hide_decorations)
822                    {
823                            error("You cannot use -D and -A at the same time\n");
824                            return 1;
825                    }
826                    if (g_embed_wnd)
827                    {
828                            error("You cannot use -X and -A at the same time\n");
829                            return 1;
830                    }
831                    if (!g_use_rdp5)
832                    {
833                            error("You cannot use -4 and -A at the same time\n");
834                            return 1;
835                    }
836                    g_width = -100;
837                    g_grab_keyboard = False;
838            }
839    
840          if (!username_option)          if (!username_option)
841          {          {
842                  pw = getpwuid(getuid());                  pw = getpwuid(getuid());
# Line 742  main(int argc, char *argv[]) Line 878  main(int argc, char *argv[])
878                  STRNCPY(g_hostname, fullhostname, sizeof(g_hostname));                  STRNCPY(g_hostname, fullhostname, sizeof(g_hostname));
879          }          }
880    
881            if (g_keymapname[0] == 0)
882            {
883                    if (locale && xkeymap_from_locale(locale))
884                    {
885                            fprintf(stderr, "Autoselected keyboard map %s\n", g_keymapname);
886                    }
887                    else
888                    {
889                            STRNCPY(g_keymapname, "en-us", sizeof(g_keymapname));
890                    }
891            }
892            if (locale)
893                    xfree(locale);
894    
895    
896          if (prompt_password && read_password(password, sizeof(password)))          if (prompt_password && read_password(password, sizeof(password)))
897                  flags |= RDP_LOGON_AUTO;                  flags |= RDP_LOGON_AUTO;
898    
# Line 761  main(int argc, char *argv[]) Line 912  main(int argc, char *argv[])
912    
913  #ifdef WITH_RDPSND  #ifdef WITH_RDPSND
914          if (g_rdpsnd)          if (g_rdpsnd)
915                  rdpsnd_init();          {
916                    if (!rdpsnd_init(rdpsnd_optarg))
917                    {
918                            warning("Initializing sound-support failed!\n");
919                    }
920            }
921  #endif  #endif
922    
923            if (lspci_enabled)
924                    lspci_init();
925    
926          rdpdr_init();          rdpdr_init();
927    
928          if (!rdp_connect(server, flags, domain, password, shell, directory))          while (run_count < 2 && continue_connect)       /* add support for Session Directory; only reconnect once */
929                  return 1;          {
930                    if (run_count == 0)
931                    {
932                            if (!rdp_connect(server, flags, domain, password, shell, directory))
933                                    return 1;
934                    }
935                    else if (!rdp_reconnect
936                             (server, flags, domain, password, shell, directory, g_redirect_cookie))
937                            return 1;
938    
939          /* By setting encryption to False here, we have an encrypted login                  /* By setting encryption to False here, we have an encrypted login
940             packet but unencrypted transfer of other packets */                     packet but unencrypted transfer of other packets */
941          if (!packet_encryption)                  if (!packet_encryption)
942                  g_encryption = False;                          g_encryption = False;
943    
944    
945          DEBUG(("Connection successful.\n"));                  DEBUG(("Connection successful.\n"));
946          memset(password, 0, sizeof(password));                  memset(password, 0, sizeof(password));
947    
948          if (ui_create_window())                  if (run_count == 0)
949          {                          if (!ui_create_window())
950                  rdp_main_loop(&deactivated, &ext_disc_reason);                                  continue_connect = False;
951                  ui_destroy_window();  
952                    if (continue_connect)
953                            rdp_main_loop(&deactivated, &ext_disc_reason);
954    
955                    DEBUG(("Disconnecting...\n"));
956                    rdp_disconnect();
957    
958                    if ((g_redirect == True) && (run_count == 0))   /* Support for Session Directory */
959                    {
960                            /* reset state of major globals */
961                            rdesktop_reset_state();
962    
963                            STRNCPY(domain, g_redirect_domain, sizeof(domain));
964                            STRNCPY(g_username, g_redirect_username, sizeof(g_username));
965                            STRNCPY(password, g_redirect_password, sizeof(password));
966                            STRNCPY(server, g_redirect_server, sizeof(server));
967                            flags |= RDP_LOGON_AUTO;
968    
969                            g_redirect = False;
970                    }
971                    else
972                    {
973                            continue_connect = False;
974                            ui_destroy_window();
975                            break;
976                    }
977    
978                    run_count++;
979          }          }
980    
         DEBUG(("Disconnecting...\n"));  
         rdp_disconnect();  
981          cache_save_state();          cache_save_state();
982          ui_deinit();          ui_deinit();
983    
# Line 817  main(int argc, char *argv[]) Line 1010  main(int argc, char *argv[])
1010    
1011  #ifdef EGD_SOCKET  #ifdef EGD_SOCKET
1012  /* 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) */
1013  static BOOL  static RD_BOOL
1014  generate_random_egd(uint8 * buf)  generate_random_egd(uint8 * buf)
1015  {  {
1016          struct sockaddr_un addr;          struct sockaddr_un addr;
1017          BOOL ret = False;          RD_BOOL ret = False;
1018          int fd;          int fd;
1019    
1020          fd = socket(AF_UNIX, SOCK_STREAM, 0);          fd = socket(AF_UNIX, SOCK_STREAM, 0);
# Line 859  generate_random(uint8 * random) Line 1052  generate_random(uint8 * random)
1052  {  {
1053          struct stat st;          struct stat st;
1054          struct tms tmsbuf;          struct tms tmsbuf;
1055          MD5_CTX md5;          SSL_MD5 md5;
1056          uint32 *r;          uint32 *r;
1057          int fd, n;          int fd, n;
1058    
# Line 891  generate_random(uint8 * random) Line 1084  generate_random(uint8 * random)
1084          r[7] = st.st_ctime;          r[7] = st.st_ctime;
1085    
1086          /* Hash both halves with MD5 to obscure possible patterns */          /* Hash both halves with MD5 to obscure possible patterns */
1087          MD5_Init(&md5);          ssl_md5_init(&md5);
1088          MD5_Update(&md5, random, 16);          ssl_md5_update(&md5, random, 16);
1089          MD5_Final(random, &md5);          ssl_md5_final(&md5, random);
1090          MD5_Update(&md5, random + 16, 16);          ssl_md5_update(&md5, random + 16, 16);
1091          MD5_Final(random + 16, &md5);          ssl_md5_final(&md5, random + 16);
1092  }  }
1093    
1094  /* malloc; exit if out of memory */  /* malloc; exit if out of memory */
# Line 911  xmalloc(int size) Line 1104  xmalloc(int size)
1104          return mem;          return mem;
1105  }  }
1106    
1107    /* Exit on NULL pointer. Use to verify result from XGetImage etc */
1108    void
1109    exit_if_null(void *ptr)
1110    {
1111            if (ptr == NULL)
1112            {
1113                    error("unexpected null pointer. Out of memory?\n");
1114                    exit(1);
1115            }
1116    }
1117    
1118    /* strdup */
1119    char *
1120    xstrdup(const char *s)
1121    {
1122            char *mem = strdup(s);
1123            if (mem == NULL)
1124            {
1125                    perror("strdup");
1126                    exit(1);
1127            }
1128            return mem;
1129    }
1130    
1131  /* realloc; exit if out of memory */  /* realloc; exit if out of memory */
1132  void *  void *
1133  xrealloc(void *oldmem, int size)  xrealloc(void *oldmem, int size)
# Line 1046  next_arg(char *src, char needle) Line 1263  next_arg(char *src, char needle)
1263                          while (*(mvp + 1) != (char) 0x00)                          while (*(mvp + 1) != (char) 0x00)
1264                          {                          {
1265                                  *mvp = *(mvp + 1);                                  *mvp = *(mvp + 1);
1266                                  *mvp++;                                  mvp++;
1267                          }                          }
1268                          *mvp = (char) 0x00;                          *mvp = (char) 0x00;
1269                          p = nextval;                          p = nextval;
# Line 1084  toupper_str(char *p) Line 1301  toupper_str(char *p)
1301  }  }
1302    
1303    
1304    RD_BOOL
1305    str_startswith(const char *s, const char *prefix)
1306    {
1307            return (strncmp(s, prefix, strlen(prefix)) == 0);
1308    }
1309    
1310    
1311    /* Split input into lines, and call linehandler for each
1312       line. Incomplete lines are saved in the rest variable, which should
1313       initially point to NULL. When linehandler returns False, stop and
1314       return False. Otherwise, return True.  */
1315    RD_BOOL
1316    str_handle_lines(const char *input, char **rest, str_handle_lines_t linehandler, void *data)
1317    {
1318            char *buf, *p;
1319            char *oldrest;
1320            size_t inputlen;
1321            size_t buflen;
1322            size_t restlen = 0;
1323            RD_BOOL ret = True;
1324    
1325            /* Copy data to buffer */
1326            inputlen = strlen(input);
1327            if (*rest)
1328                    restlen = strlen(*rest);
1329            buflen = restlen + inputlen + 1;
1330            buf = (char *) xmalloc(buflen);
1331            buf[0] = '\0';
1332            if (*rest)
1333                    STRNCPY(buf, *rest, buflen);
1334            strncat(buf, input, inputlen);
1335            p = buf;
1336    
1337            while (1)
1338            {
1339                    char *newline = strchr(p, '\n');
1340                    if (newline)
1341                    {
1342                            *newline = '\0';
1343                            if (!linehandler(p, data))
1344                            {
1345                                    p = newline + 1;
1346                                    ret = False;
1347                                    break;
1348                            }
1349                            p = newline + 1;
1350                    }
1351                    else
1352                    {
1353                            break;
1354    
1355                    }
1356            }
1357    
1358            /* Save in rest */
1359            oldrest = *rest;
1360            restlen = buf + buflen - p;
1361            *rest = (char *) xmalloc(restlen);
1362            STRNCPY((*rest), p, restlen);
1363            xfree(oldrest);
1364    
1365            xfree(buf);
1366            return ret;
1367    }
1368    
1369    /* Execute the program specified by argv. For each line in
1370       stdout/stderr output, call linehandler. Returns false on failure. */
1371    RD_BOOL
1372    subprocess(char *const argv[], str_handle_lines_t linehandler, void *data)
1373    {
1374            pid_t child;
1375            int fd[2];
1376            int n = 1;
1377            char output[256];
1378            char *rest = NULL;
1379    
1380            if (pipe(fd) < 0)
1381            {
1382                    perror("pipe");
1383                    return False;
1384            }
1385    
1386            if ((child = fork()) < 0)
1387            {
1388                    perror("fork");
1389                    return False;
1390            }
1391    
1392            /* Child */
1393            if (child == 0)
1394            {
1395                    /* Close read end */
1396                    close(fd[0]);
1397    
1398                    /* Redirect stdout and stderr to pipe */
1399                    dup2(fd[1], 1);
1400                    dup2(fd[1], 2);
1401    
1402                    /* Execute */
1403                    execvp(argv[0], argv);
1404                    perror("Error executing child");
1405                    _exit(128);
1406            }
1407    
1408            /* Parent. Close write end. */
1409            close(fd[1]);
1410            while (n > 0)
1411            {
1412                    n = read(fd[0], output, 255);
1413                    output[n] = '\0';
1414                    str_handle_lines(output, &rest, linehandler, data);
1415            }
1416            xfree(rest);
1417    
1418            return True;
1419    }
1420    
1421    
1422  /* not all clibs got ltoa */  /* not all clibs got ltoa */
1423  #define LTOA_BUFSIZE (sizeof(long) * 8 + 1)  #define LTOA_BUFSIZE (sizeof(long) * 8 + 1)
1424    
# Line 1199  save_licence(unsigned char *data, int le Line 1534  save_licence(unsigned char *data, int le
1534  }  }
1535    
1536  /* Create the bitmap cache directory */  /* Create the bitmap cache directory */
1537  BOOL  RD_BOOL
1538  rd_pstcache_mkdir(void)  rd_pstcache_mkdir(void)
1539  {  {
1540          char *home;          char *home;
# Line 1276  rd_lseek_file(int fd, int offset) Line 1611  rd_lseek_file(int fd, int offset)
1611  }  }
1612    
1613  /* do a write lock on a file */  /* do a write lock on a file */
1614  BOOL  RD_BOOL
1615  rd_lock_file(int fd, int start, int len)  rd_lock_file(int fd, int start, int len)
1616  {  {
1617          struct flock lock;          struct flock lock;

Legend:
Removed from v.886  
changed lines
  Added in v.1391

  ViewVC Help
Powered by ViewVC 1.1.26