home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / XAP / XFM / XFM-1.3 / XFM-1 / xfm-1.3 / xfm / FmExec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-09  |  2.8 KB  |  134 lines

  1. /*---------------------------------------------------------------------------
  2.   Module FmExec
  3.  
  4.   (c) Simon Marlow 1990-92
  5.   (c) Albert Graef 1994
  6.  
  7.   Procedures for executing files
  8. ---------------------------------------------------------------------------*/
  9.  
  10.  
  11. #include <stdio.h>
  12. #include <memory.h>
  13. #include <string.h>
  14. #include <ctype.h>
  15.  
  16. #include <X11/Intrinsic.h>
  17.  
  18. #include "Am.h"
  19. #include "Fm.h"
  20.  
  21. ExecMapRec *exec_map = NULL;
  22. int n_exec_maps = 0;
  23.  
  24. /*---------------------------------------------------------------------------
  25.   PUBLIC FUNCTIONS
  26. ---------------------------------------------------------------------------*/
  27.  
  28. char **makeArgv(char *action)
  29. {
  30.   char **argv;
  31.  
  32.   argv = (char **) XtMalloc(4 * sizeof(char *));
  33.   argv[0] = XtNewString(user.shell);
  34.   argv[1] = XtNewString("-c");
  35.   argv[2] = XtNewString(action);
  36.   argv[3] = NULL;
  37.  
  38.   return argv;
  39. }
  40.  
  41. char **makeArgv2(char *action, char *fname)
  42. {
  43.   char **argv;
  44.  
  45.   argv = (char **) XtMalloc(5 * sizeof(char *));
  46.   argv[0] = XtNewString(user.shell);
  47.   argv[1] = XtNewString("-c");
  48.   argv[2] = XtNewString(action);
  49.   argv[3] = XtNewString(fname);
  50.   argv[4] = NULL;
  51.  
  52.   return argv;
  53. }
  54.  
  55. char **expandArgv(char **argv)
  56. {
  57.   int i, j;
  58.   FileList files = move_info.fw->files;
  59.  
  60.   for (i=0; argv[i]; i++);
  61.   i++;
  62.  
  63.   for (j=0; j<move_info.fw->n_files; j++) {
  64.     if (files[j]->selected) {
  65.       argv = (char**) XTREALLOC(argv, ++i * sizeof(char *));
  66.       argv[i-2] = XtNewString(files[j]->name);
  67.     }
  68.   }
  69.  
  70.   argv[i-1] = NULL;
  71.   return argv;
  72. }
  73.  
  74. /*---------------------------------------------------------------------------*/
  75.  
  76. void freeArgv(char **argv)
  77. {
  78.   int j;
  79.  
  80.   for (j=0; argv[j]; j++)
  81.     XTFREE(argv[j]);
  82.   XTFREE(argv);
  83. }
  84.  
  85. /*---------------------------------------------------------------------------*/
  86.  
  87. static void echoarg(char *arg)
  88. {
  89.   char *s;
  90.   for (s = arg; *s; s++)
  91.     if (isspace(*s)) {
  92.       fprintf(stderr, " '%s'", arg);
  93.       return;
  94.     }
  95.   fprintf(stderr, " %s", arg);
  96. }
  97.  
  98. /*---------------------------------------------------------------------------*/
  99.  
  100. void executeApplication(char *path, char *directory, char **argv)
  101. {
  102.   int pid;
  103.  
  104.   zzz();
  105.   XFlush(XtDisplay(aw.shell));
  106.   if (chdir(directory)) {
  107.     wakeUp();
  108.     sysError("Can't chdir:");
  109.   } else if ((pid = fork()) == -1) {
  110.     wakeUp();
  111.     sysError("Can't fork:");
  112.   } else {
  113.     if (!pid) {
  114.       if (resources.echo_actions) {
  115.     char **arg;
  116.     fprintf(stderr, "[%s] %s", directory, path);
  117.     for (arg = argv+1; *arg; arg++)
  118.       echoarg(*arg);
  119.     fprintf(stderr, "\n");
  120.       }
  121.       /* Make sure that child processes don't lock up xfm with keyboard
  122.      input. This is certainly a kludge and if you know of any better
  123.      way to do this, please let me know. -ag */
  124.       freopen("/dev/null", "r", stdin);
  125.       execvp(path, argv);
  126.       perror("Exec failed");
  127.       exit(1);
  128.     } else {
  129.       sleep(1);
  130.       wakeUp();
  131.     }
  132.   }    
  133. }
  134.