home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3297 / revnamei.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-07  |  1.5 KB  |  96 lines

  1. /* History:
  2. 5/1/91 DJB baseline public domain
  3. */
  4.  
  5. #include "revnamei.h"
  6.  
  7. /* XXX: closing? wait()? etc. */
  8.  
  9. static int fdfidread = -1;
  10. static int fdfidwrite = -1;
  11.  
  12. revnameiinit()
  13. {
  14.  int pio[2];
  15.  int pii[2];
  16.  
  17.  pipe(pio);
  18.  pipe(pii);
  19.  
  20. #ifdef NO_FINDINODE
  21.  switch(-1)
  22. #else
  23.  switch(fork())
  24. #endif
  25.   {
  26.    case -1: /*XXX*/
  27.      fdfidwrite = pii[1];
  28.      fdfidread = pio[0];
  29.      close(pii[0]);
  30.      close(pio[1]);
  31.      break;
  32.    case 0:
  33.      close(pii[1]);
  34.      close(pio[0]);
  35.      dup2(pii[0],0);
  36.      dup2(pio[1],1);
  37.      execlp("findinode","findinode","-A",(char *) 0);
  38.      exit(1);
  39.    default:
  40.      fdfidwrite = pii[1];
  41.      fdfidread = pio[0];
  42.      close(pii[0]);
  43.      close(pio[1]);
  44.      break;
  45.   }
  46. }
  47.  
  48. revnamei(ino,dev)
  49. unsigned long ino;
  50. unsigned long dev;
  51. {
  52.  if (fdfidwrite == -1)
  53.    revnameiinit();
  54.  if (fdfidwrite != -1)
  55.   {
  56.    char buf[50];
  57.    int r;
  58.    int out;
  59.    int i;
  60.    sprintf(buf,"%lu %lx\n",ino,dev);
  61.    write(fdfidwrite,buf,strlen(buf));
  62.      /* XXX: worry about blocking? not if findinode works */
  63.    out = 0;
  64.    while ((r = read(fdfidread,buf,30)) != -1)
  65.     {
  66.      if (!r)
  67.       {
  68.        /* EOF, child must have died or never started up */
  69.        close(fdfidwrite);
  70.        close(fdfidread);
  71.        fdfidread = fdfidwrite = -1;
  72.        break;
  73.       }
  74.      for (i = 0;i < r;++i)
  75.       {
  76.        if (buf[i] == '\n')
  77.      goto breakbreak;
  78.        if (out == 2)
  79.      putchar(buf[i]);
  80.        else
  81.     {
  82.      if (out == 1)
  83.        if (buf[i] == ' ')
  84.          out = 2;
  85.        else
  86.          out = 0;
  87.      if (!out)
  88.        if (buf[i] == ':')
  89.          out = 1;
  90.     }
  91.       }
  92.     }
  93.    breakbreak: ;
  94.   }
  95. }
  96.