SV*
mkfifo(path, ...)
    char *path
    //int mode

		PREINIT:
			int f;
      int mode=0666;	//Default if not provided

		PPCODE:
      if(items==2){
        mode=SvIV(ST(1));
      }
			f=mkfifo(path, mode);
			if(f<0){
				//RETVAL=&PL_sv_undef;
        XSRETURN_UNDEF;
			}
			else{
        if(!(mode & O_CLOEXEC) && (f>PL_maxsysfd)){
          fcntl(f, F_SETFD, FD_CLOEXEC);
        }
        XSRETURN_IV(f+1);
			}


#PIPE
######

SV*
pipe(read_end,write_end)
	SV* read_end
	SV* write_end

	ALIAS: syspipe=1


	INIT:
		int ret;
		int fds[2];

	CODE:
    if(SvREADONLY(read_end) || SvREADONLY(write_end)){
      Perl_croak(aTHX_ "%s", PL_no_modify);
    }
		ret=pipe(fds);

		if(ret<0){
			RETVAL=&PL_sv_undef;
		}
		else{
      if(fds[0]>PL_maxsysfd){
        fcntl(fds[0], F_SETFD, FD_CLOEXEC);
      }
      if(fds[1]>PL_maxsysfd){
        fcntl(fds[1], F_SETFD, FD_CLOEXEC);
      }
			//pipe returns 0 on success...
			RETVAL=newSViv(ret+1);
			if(SvOK(read_end)){
				sv_setiv(read_end, fds[0]);
			}
			else {
				read_end=newSViv(fds[0]);
			}

			if(SvOK(write_end)){
				sv_setiv(write_end,fds[1]);
			}
			else {
				write_end=newSViv(fds[1]);
			}
		}
	OUTPUT:
		RETVAL
		read_end
		write_end