Back to index

courier  0.68.2
preline.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 1998 - 2006 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 #if    HAVE_CONFIG_H
00007 #include      "config.h"
00008 #endif
00009 #include      <stdio.h>
00010 #include      <string.h>
00011 #include      <stdlib.h>
00012 #if HAVE_UNISTD_H
00013 #include      <unistd.h>
00014 #endif
00015 #include      <signal.h>
00016 #if HAVE_SYSEXITS_H
00017 #include      <sysexits.h>
00018 #else
00019 #define       EX_TEMPFAIL   75
00020 #endif
00021 
00022 #include      "waitlib/waitlib.h"
00023 
00024 static void usage()
00025 {
00026        fprintf(stderr, "Usage: preline [program] [arguments]\n");
00027        exit(1);
00028 }
00029 
00030 int main(int argc, char **argv)
00031 {
00032 int    pipefd[2];
00033 pid_t  p;
00034 char   *env;
00035 int    waitstat;
00036 char   **newargv;
00037 int    c;
00038 char *cmd;
00039 
00040        if (argc <= 1)
00041        {
00042               usage();
00043        }
00044 
00045        if (pipe(pipefd) < 0)
00046        {
00047               perror("pipe");
00048               exit(EX_TEMPFAIL);
00049        }
00050 
00051        signal(SIGCHLD, SIG_DFL);
00052        p=fork();
00053        if (p == -1)
00054        {
00055               perror("fork");
00056               exit(EX_TEMPFAIL);
00057        }
00058 
00059        if (p == 0)
00060        {
00061               p=fork();
00062               if (p == -1)
00063               {
00064                      perror("fork");
00065                      exit(EX_TEMPFAIL);
00066               }
00067               if (p)
00068                      exit(0);
00069               close(pipefd[0]);
00070               dup2(pipefd[1], 1);
00071               close(pipefd[1]);
00072               if ((env=getenv("UFLINE")) != 0)
00073                      printf("%s\n", env);
00074               if ((env=getenv("RPLINE")) != 0)
00075                      printf("%s\n", env);
00076               if ((env=getenv("DTLINE")) != 0)
00077                      printf("%s\n", env);
00078 
00079               while ((c=getchar()) != EOF)
00080                      putchar(c);
00081               fflush(stdout);
00082               exit(0);
00083        }
00084 
00085        close(pipefd[1]);
00086        dup2(pipefd[0], 0);
00087        close(pipefd[0]);
00088 
00089        while (wait(&waitstat) != p)
00090               ;
00091        if (!WIFEXITED(waitstat) || WEXITSTATUS(waitstat))
00092               exit(EX_TEMPFAIL);
00093 
00094        if ((newargv=(char **)malloc(sizeof(char *)*argc)) == 0)
00095        {
00096               perror("malloc");
00097               exit(EX_TEMPFAIL);
00098        }
00099        for (c=1; c<argc; c++)
00100               newargv[c-1]=argv[c];
00101        newargv[c-1]=0;
00102 
00103        cmd=newargv[0];
00104 
00105        if ((newargv[0]=strrchr(newargv[0], '/')) != 0)
00106               ++newargv[0];
00107        else
00108               newargv[0]=cmd;
00109 
00110        execvp(cmd, newargv);
00111        perror("exec");
00112        exit(EX_TEMPFAIL);
00113 }