home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1996 May / PCOnline_05_1996.bin / linux / source / xap / xfm / xfm-1.000 / xfm-1 / xfm-1.3.2 / src / FmExec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-12  |  3.0 KB  |  142 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.   int i = 0;
  32.  
  33.   argv = (char **) XtMalloc( (user.arg0flag ? 5 : 4) * sizeof(char *));
  34.  
  35.   argv[i++] = XtNewString(user.shell);
  36.   argv[i++] = XtNewString("-c");
  37.   argv[i++] = XtNewString(action);
  38.   if (user.arg0flag)
  39.     argv[i++] = XtNewString(user.shell);
  40.   argv[i] = NULL;
  41.  
  42.   return argv;
  43. }
  44.  
  45. char **makeArgv2(char *action, char *fname)
  46. {
  47.   char **argv;
  48.   int i = 0;
  49.  
  50.   argv = (char **) XtMalloc( (user.arg0flag ? 6 : 5) * sizeof(char *));
  51.  
  52.   argv[i++] = XtNewString(user.shell);
  53.   argv[i++] = XtNewString("-c");
  54.   argv[i++] = XtNewString(action);
  55.   if (user.arg0flag)
  56.     argv[i++] = XtNewString(user.shell);
  57.   argv[i++] = XtNewString(fname);
  58.   argv[i] = NULL;
  59.  
  60.   return argv;
  61. }
  62.  
  63. char **expandArgv(char **argv)
  64. {
  65.   int i, j;
  66.   FileList files = move_info.fw->files;
  67.  
  68.   for (i=0; argv[i]; i++);
  69.   i++;
  70.  
  71.   for (j=0; j<move_info.fw->n_files; j++) {
  72.     if (files[j]->selected) {
  73.       argv = (char**) XTREALLOC(argv, ++i * sizeof(char *));
  74.       argv[i-2] = XtNewString(files[j]->name);
  75.     }
  76.   }
  77.  
  78.   argv[i-1] = NULL;
  79.   return argv;
  80. }
  81.  
  82. /*---------------------------------------------------------------------------*/
  83.  
  84. void freeArgv(char **argv)
  85. {
  86.   int j;
  87.  
  88.   for (j=0; argv[j]; j++)
  89.     XTFREE(argv[j]);
  90.   XTFREE(argv);
  91. }
  92.  
  93. /*---------------------------------------------------------------------------*/
  94.  
  95. static void echoarg(char *arg)
  96. {
  97.   char *s;
  98.   for (s = arg; *s; s++)
  99.     if (isspace(*s)) {
  100.       fprintf(stderr, " '%s'", arg);
  101.       return;
  102.     }
  103.   fprintf(stderr, " %s", arg);
  104. }
  105.  
  106. /*---------------------------------------------------------------------------*/
  107.  
  108. void executeApplication(char *path, char *directory, char **argv)
  109. {
  110.   int pid;
  111.  
  112.   zzz();
  113.   XFlush(XtDisplay(aw.shell));
  114.   if (chdir(directory)) {
  115.     wakeUp();
  116.     sysError("Can't chdir:");
  117.   } else if ((pid = fork()) == -1) {
  118.     wakeUp();
  119.     sysError("Can't fork:");
  120.   } else {
  121.     if (!pid) {
  122.       if (resources.echo_actions) {
  123.     char **arg;
  124.     fprintf(stderr, "[%s] %s", directory, path);
  125.     for (arg = argv+1; *arg; arg++)
  126.       echoarg(*arg);
  127.     fprintf(stderr, "\n");
  128.       }
  129.       /* Make sure that child processes don't lock up xfm with keyboard
  130.      input. This is certainly a kludge and if you know of any better
  131.      way to do this, please let me know. -ag */
  132.       freopen("/dev/null", "r", stdin);
  133.       execvp(path, argv);
  134.       perror("Exec failed");
  135.       exit(1);
  136.     } else {
  137.       sleep(1);
  138.       wakeUp();
  139.     }
  140.   }    
  141. }
  142.