1 /* ISC license. */
2 
3 #include <skalibs/sysdeps.h>
4 
5 #ifdef SKALIBS_HASSPLICE
6 
7 #include <sys/stat.h>
8 #include <fcntl.h>
9 
10 #include <skalibs/djbunix.h>
11 #include <skalibs/iobuffer.h>
12 
iobufferk_init_0(iobufferk * k)13 static int iobufferk_init_0 (iobufferk *k)
14 {
15   int fd = openc_write("/dev/null") ;
16   if (fd < 0) return 0 ;
17   k->p[0] = -1 ;
18   k->p[1] = fd ;
19   return 1 ;
20 }
21 
iobufferk_nofd(iobufferk * k)22 static int iobufferk_nofd (iobufferk *k)
23 {
24   k->p[0] = k->p[1] = -1 ;
25   return 1 ;
26 }
27 
iobufferk_init_3(iobufferk * k)28 static int iobufferk_init_3 (iobufferk *k)
29 {
30   return (pipecoe(k->p) >= 0) ;
31 }
32 
33 static iobufferk_output_func_t_ref iobufferk_init_f[4] =
34 {
35   &iobufferk_init_0, &iobufferk_nofd, &iobufferk_nofd, &iobufferk_init_3
36 } ;
37 
iobufferk_init(iobufferk * k,int fdin,int fdout)38 int iobufferk_init (iobufferk *k, int fdin, int fdout)
39 {
40   iobufferk tmp ;
41   struct stat st ;
42   int r ;
43   if (fstat(fdin, &st) < 0) return 0 ;
44   r = fcntl(fdin, F_GETFL) ;
45   if (r < 0) return 0 ;
46   tmp.type = !S_ISFIFO(st.st_mode) ;
47   tmp.nb = !!(r & O_NONBLOCK) ;
48   if (fstat(fdout, &st) < 0) return 0 ;
49   r = fcntl(fdout, F_GETFL) ;
50   if (r < 0) return 0 ;
51   tmp.type |= (!S_ISFIFO(st.st_mode) << 1) ;
52   tmp.nb |= (r & O_NONBLOCK) ? 2 : 0 ;
53   tmp.fd[0] = fdin ;
54   tmp.fd[1] = fdout ;
55   tmp.n = 0 ;
56   if (!(*iobufferk_init_f[tmp.type])(&tmp)) return 0 ;
57   *k = tmp ;
58   return 1 ;
59 }
60 
61 #else
62 
63 #include <errno.h>
64 #include <skalibs/iobuffer.h>
65 
iobufferk_init(iobufferk * k,int fdin,int fdout)66 int iobufferk_init (iobufferk *k, int fdin, int fdout)
67 {
68   (void)k ;
69   (void)fdin ;
70   (void)fdout ;
71   return (errno = ENOSYS, 0) ;
72 }
73 
74 #endif
75