home *** CD-ROM | disk | FTP | other *** search
/ zipcon.net / www.zipcon.net.tar / www.zipcon.net / pub / linux / rpm / spamassassin / filepipe.c next >
C/C++ Source or Header  |  2003-09-10  |  2KB  |  103 lines

  1. /* Copyright (C) 2000 Bruce Guenter <bruceg@em.ca>
  2.   *
  3.   * This program is free software; you can redistribute it and/or modify
  4.   * it under the terms of the GNU General Public License as published by
  5.   * the Free Software Foundation; either version 2 of the License, or
  6.   * (at your option) any later version.
  7.   *
  8.   * This program is distributed in the hope that it will be useful,
  9.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.   * GNU General Public License for more details.
  12.   *
  13.   * You should have received a copy of the GNU General Public License
  14.   * along with this program; if not, write to the Free Software
  15.   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  16.   */
  17.  
  18.  #include <stdio.h>
  19.  #include <sys/fcntl.h>
  20.  #include <unistd.h>
  21.  
  22.  #define QQ_WRITE_ERROR 53
  23.  #define QQ_INTERNAL 81
  24.  
  25.  #ifndef BUFSIZE
  26.  #define BUFSIZE 4096
  27.  #endif
  28.  
  29.  #ifndef TMPDIR
  30.  #define TMPDIR "/tmp"
  31.  #endif
  32.  
  33.  typedef int bool;
  34.  const bool false = 0;
  35.  const bool true = 0 == 0;
  36.  
  37.  /* Create a temporary invisible file opened for read/write */
  38.  int mktmpfile(void)
  39.  {
  40.    const char* filename = tempnam(TMPDIR, "fixheaders.");
  41.    int fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600);
  42.    if(fd == -1)
  43.      return -1;
  44.  
  45.    /* The following makes the temporary file disappear immediately on
  46.       program exit by removing the only filename that links to it. */
  47.    if(unlink(filename) == -1)
  48.      return -1;
  49.    
  50.    return fd;
  51.  }
  52.  
  53.  /* Copy the message from FD0 to the first temporary file */
  54.  int copy_message(void)
  55.  {
  56.    int tmp = mktmpfile();
  57.    if(tmp == -1)
  58.      return -QQ_WRITE_ERROR;
  59.    
  60.    /* Copy the message into the temporary file */
  61.    for(;;) {
  62.      char buf[BUFSIZE];
  63.      ssize_t rd = read(0, buf, BUFSIZE);
  64.      if(rd == -1)
  65.        return -QQ_WRITE_ERROR;
  66.      if(rd == 0)
  67.        break;
  68.      if(write(tmp, buf, rd) != rd)
  69.        return -QQ_WRITE_ERROR;
  70.    }
  71.  
  72.    if(lseek(tmp, 0, SEEK_SET) != 0)
  73.      return -QQ_WRITE_ERROR;
  74.  
  75.    return tmp;
  76.  }
  77.  
  78.  void usage(void)
  79.  {
  80.    write(2, "usage: filepipe program [args...]\n", 34);
  81.    exit(1);
  82.  }
  83.  
  84.  int main(int argc, char* argv[])
  85.  {
  86.    int tmpfd;
  87.    if(argc < 2)
  88.      usage();
  89.    
  90.    tmpfd = copy_message();
  91.    if(tmpfd < 0)
  92.      return -tmpfd;
  93.  
  94.    if(close(0) || dup2(tmpfd, 0) || close(tmpfd))
  95.      return QQ_INTERNAL;
  96.  
  97.    execvp(argv[1], argv+1);
  98.    return QQ_INTERNAL;
  99.  }
  100.  
  101.  
  102.  
  103.