Back to index

courier  0.68.2
addcr.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 1998 - 2002 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 #if    HAVE_CONFIG_H
00007 #include      "config.h"
00008 #endif
00009 #include <sys/types.h>
00010 #include <sys/time.h>
00011 #include <errno.h>
00012 #if    HAVE_UNISTD_H
00013 #include      <unistd.h>
00014 #endif
00015 #include      <stdio.h>
00016 
00017 int main()
00018 {
00019 char   inbuf[BUFSIZ], outbuf[BUFSIZ*2];
00020 int    i,j,k;
00021 int    skip=0;
00022  fd_set fds;
00023 
00024        for (;;)
00025        {
00026               FD_ZERO(&fds);
00027               FD_SET(0, &fds);
00028 
00029               if (select(1, &fds, NULL, NULL, NULL) < 0)
00030               {
00031                      if (errno == EINTR)
00032                             continue;
00033                      perror("select");
00034                      break;
00035               }
00036 
00037               if (!FD_ISSET(0, &fds))
00038                      continue;
00039 
00040               if ((i=read(0, inbuf, sizeof(inbuf))) <= 0)
00041                      break;
00042 
00043               for (j=k=0; j<i; j++)
00044               {
00045                      if (inbuf[j] == '\n' && !skip)
00046                             outbuf[k++]='\r';
00047                      skip=(outbuf[k++]=inbuf[j]) == '\r';
00048               }
00049               for (i=0; i<k; )
00050               {
00051                      FD_ZERO(&fds);
00052                      FD_SET(1, &fds);
00053 
00054                      if (select(2, NULL, &fds, NULL, NULL) < 0)
00055                      {
00056                             if (errno == EINTR)
00057                                    continue;
00058                             perror("select");
00059                             break;
00060                      }
00061                      
00062                      if (!FD_ISSET(1, &fds))
00063                             continue;
00064 
00065                      j=write(1, outbuf+i, k-i);
00066                      if (j <= 0)
00067                             return (-1);
00068                      i += j;
00069               }
00070        }
00071        return (0);
00072 }
00073