home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / ExitCB.C < prev    next >
C/C++ Source or Header  |  1998-07-22  |  3KB  |  101 lines

  1. // $Id: ExitCB.C,v 1.17 1998/07/22 17:12:41 zeller Exp $
  2. // Exit Callbacks
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char ExitCB_rcsid[] = 
  30.     "$Id: ExitCB.C,v 1.17 1998/07/22 17:12:41 zeller Exp $";
  31.  
  32. #include <stdlib.h>
  33. #include <unistd.h>
  34. #include <stdio.h>        // perror()
  35. #include <Xm/Xm.h>
  36. #include <Xm/MessageB.h>
  37.  
  38. #include "findParent.h"
  39. #include "ExitCB.h"
  40. #include "verify.h"
  41.  
  42. extern char **environ;
  43.  
  44. // Callbacks
  45.  
  46. // Leave program
  47. void ExitCB(Widget, XtPointer client_data, XtPointer)
  48. {
  49.     exit((int)(long)client_data);
  50. }
  51.  
  52. static char **_saved_argv    = 0;
  53. static char **_saved_environ = 0;
  54.  
  55. // Return environment
  56. char **saved_argv()    { return _saved_argv; }
  57. char **saved_environ() { return _saved_environ; }
  58.  
  59. // Restart program
  60. void RestartCB(Widget, XtPointer, XtPointer)
  61. {
  62.     environ = saved_environ();
  63.     execvp(saved_argv()[0], saved_argv());
  64.  
  65.     // Could not restart - just exit
  66.     perror(saved_argv()[0]);
  67.     exit(EXIT_FAILURE);
  68. }
  69.  
  70. // Save argv
  71. void register_argv(char *argv[])
  72. {
  73.     int argc = 0;
  74.     while (argv[argc] != 0)
  75.     argc++;
  76.  
  77.     _saved_argv = new char *[argc + 1];
  78.     for (int i = 0; i < argc; i++)
  79.     {
  80.     _saved_argv[i] = new char[strlen(argv[i]) + 1];
  81.     strcpy(_saved_argv[i], argv[i]);
  82.     }
  83.     _saved_argv[argc] = 0;
  84. }
  85.  
  86. // Save environment
  87. void register_environ()
  88. {
  89.     int envc = 0;
  90.     while (environ[envc] != 0)
  91.     envc++;
  92.  
  93.     _saved_environ = new char *[envc + 1];
  94.     for (int i = 0; i < envc; i++)
  95.     {
  96.     _saved_environ[i] = new char[strlen(environ[i]) + 1];
  97.     strcpy(_saved_environ[i], environ[i]);
  98.     }
  99.     _saved_environ[envc] = 0;
  100. }
  101.