[comp.os.minix] Named pipes

hbetel@watserv1.uwaterloo.ca (Richard Betel) (04/19/91)

	I suppose it is the dream of every aspiring minix guru to post lots of
neat patches. Well, I am firm beleiver in starting small. So here is that first
small step for me, and an even smaller step for minix:

	I recently found in the depths of include/minix/consts.h a reference to
named pipes. I checked FS, and they're implemented. It suprised me. I didn't 
know they were there, because the book never mentions them ( they weren't
implemented at the time the book was written). So I modified mknod to be able
to make the "file", in the same way as mknod on BSD systems. I also patched
ls to tell you about it when you do an ls -l. Here are those two patches:


*** ../mknod.c	Thu Feb 22 06:15:39 1990
--- mknod.c	Tue Apr 16 18:46:52 1991
***************
*** 4,31 ****
  int argc;
  char *argv[];
  {
! /* mknod name b/c major minor [size] makes a node. */
  
    int mode, major, minor, dev;
    unsigned int size;
  
!   if (argc < 5) badcomm();
!   if (*argv[2] != 'b' && *argv[2] != 'c') badcomm();
!   if (*argv[2] == 'c' && argc != 5) badchar();
!   if (*argv[2] == 'b' && argc != 6) badblock();
!   mode = (*argv[2] == 'b' ? 060666 : 020666);
!   major = atoi(argv[3]);
!   minor = atoi(argv[4]);
!   size = (*argv[2] == 'b' ? atoi(argv[5]) : 0);
!   if (major < 0 || minor < 0) badcomm();
!   dev =  (major << 8) | minor;
    if (mknod(argv[1], mode, dev, size) < 0) perror("mknod");
    exit(0);
  }
  
  badcomm()
  {
!   std_err("Usage: mknod name b/c major minor [size_in_blocks]\n");
    exit(1);
  }
  
--- 4,37 ----
  int argc;
  char *argv[];
  {
! /* mknod name p/b/c [major minor [size]] makes a node. */
  
    int mode, major, minor, dev;
    unsigned int size;
  
!   if (*argv[2] != 'b' && *argv[2] != 'c' && *argv[2] != 'p') badcomm();
!   if (*argv[2] == 'c' && argc != 5) badchar();
!   if (*argv[2] == 'b' && argc != 6) badblock();
!   if (*argv[2] == 'p' && argc != 3) badpipe();
!   if (*argv[2] != 'p') {
!      mode = (*argv[2] == 'b' ? 060666 : 020666);
!      major = atoi(argv[3]);
!      minor = atoi(argv[4]);
!      size = (*argv[2] == 'b' ? atoi(argv[5]) : 0);
!      if (major < 0 || minor < 0) badcomm();
!      dev =  (major << 8) | minor;
!   } else {
!      mode = 010666;
!      dev = 0;
!      size = 0;
!   }
    if (mknod(argv[1], mode, dev, size) < 0) perror("mknod");
    exit(0);
  }
  
  badcomm()
  {
!   std_err("Usage: mknod name p/b/c [major minor [size_in_blocks]]\n");
    exit(1);
  }
  
***************
*** 41,43 ****
--- 47,54 ----
    exit(1);
  }
  
+ badpipe()
+ {
+   std_err("Usage: mknod pipename p\n");
+   exit(1);
+ }


*** ls.c	Fri Apr 13 04:27:10 1990
--- ls.new.c	Tue Apr 16 19:05:16 1991
***************
*** 501,506 ****
--- 501,507 ----
  	    case S_IFDIR:	bits[0] = 'd';	break;
  	    case S_IFBLK:	bits[0] = 'b';	break;
  	    case S_IFCHR:	bits[0] = 'c';	break;
+             case S_IFIFO:      bits[0] = 'p';  break;
  	    default:	bits[0] = '-';	break;
  	}
  
That's all folks. Have fun. I expect to see talk and mtrek develloped 
within the month ;-)

Richard