|
Packit Service |
51e54d |
# pipeline-socketpair.m4 serial 1
|
|
Packit Service |
51e54d |
dnl
|
|
Packit Service |
51e54d |
dnl Check if the socketpair(2) system call can be used
|
|
Packit Service |
51e54d |
dnl and should be used as a fast replacement for pipe(2)
|
|
Packit Service |
51e54d |
dnl
|
|
Packit Service |
51e54d |
dnl Author: Werner Fink <werner@suse.de>, 2009
|
|
Packit Service |
51e54d |
|
|
Packit Service |
51e54d |
AC_DEFUN([PIPELINE_SOCKETPAIR_PIPE],
|
|
Packit Service |
51e54d |
[ AC_MSG_CHECKING([if socketpair(2) can be used as fast replacement for pipe(2)])
|
|
Packit Service |
51e54d |
AC_CACHE_VAL(pipeline_cv_socketpair_pipe, [
|
|
Packit Service |
51e54d |
AC_TRY_RUN([
|
|
Packit Service |
51e54d |
#include <netdb.h>
|
|
Packit Service |
51e54d |
#include <netinet/in.h>
|
|
Packit Service |
51e54d |
#include <signal.h>
|
|
Packit Service |
51e54d |
#include <sys/socket.h>
|
|
Packit Service |
51e54d |
#include <sys/types.h>
|
|
Packit Service |
51e54d |
#include <sys/wait.h>
|
|
Packit Service |
51e54d |
#include <unistd.h>
|
|
Packit Service |
51e54d |
#ifndef SHUT_RD
|
|
Packit Service |
51e54d |
# define SHUT_RD 0
|
|
Packit Service |
51e54d |
#endif
|
|
Packit Service |
51e54d |
#ifndef SHUT_WR
|
|
Packit Service |
51e54d |
# define SHUT_WR 1
|
|
Packit Service |
51e54d |
#endif
|
|
Packit Service |
51e54d |
|
|
Packit Service |
51e54d |
static void sigpipe(int sig)
|
|
Packit Service |
51e54d |
{
|
|
Packit Service |
51e54d |
_exit(0);
|
|
Packit Service |
51e54d |
}
|
|
Packit Service |
51e54d |
|
|
Packit Service |
51e54d |
int main()
|
|
Packit Service |
51e54d |
{
|
|
Packit Service |
51e54d |
const char test[] = "May use socketpair(2) instead of pipe(2)\n";
|
|
Packit Service |
51e54d |
char buf[256];
|
|
Packit Service |
51e54d |
int sfd[2], s;
|
|
Packit Service |
51e54d |
pid_t pid;
|
|
Packit Service |
51e54d |
if (socketpair(AF_UNIX,SOCK_STREAM,0,sfd) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if (shutdown(sfd[1],SHUT_RD) < 0 || shutdown(sfd[0],SHUT_WR) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if ((pid = fork()) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if (pid) {
|
|
Packit Service |
51e54d |
close(sfd[1]);
|
|
Packit Service |
51e54d |
waitpid(-1,&s,0);
|
|
Packit Service |
51e54d |
if (read(sfd[0],buf,sizeof(buf)) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
} else {
|
|
Packit Service |
51e54d |
close(sfd[0]);
|
|
Packit Service |
51e54d |
write(sfd[1],test,sizeof(test) - 1);
|
|
Packit Service |
51e54d |
return 0;
|
|
Packit Service |
51e54d |
}
|
|
Packit Service |
51e54d |
close(sfd[0]);
|
|
Packit Service |
51e54d |
signal(SIGPIPE, sigpipe);
|
|
Packit Service |
51e54d |
if (socketpair(AF_UNIX,SOCK_STREAM,0,sfd) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if (shutdown(sfd[1],SHUT_RD) < 0 || shutdown(sfd[0],SHUT_WR) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
close(sfd[0]);
|
|
Packit Service |
51e54d |
write(sfd[1],test,sizeof(test) - 1);
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
}], [pipeline_cv_socketpair_pipe=yes], [pipeline_cv_socketpair_pipe=no], [pipeline_cv_socketpair_pipe=no])
|
|
Packit Service |
51e54d |
])
|
|
Packit Service |
51e54d |
AC_MSG_RESULT([$pipeline_cv_socketpair_pipe])
|
|
Packit Service |
51e54d |
if test "$pipeline_cv_socketpair_pipe" = yes; then
|
|
Packit Service |
51e54d |
AC_DEFINE(USE_SOCKETPAIR_PIPE, 1, [Define if socketpair(2) can be used as a fast replacement for pipe(2).])
|
|
Packit Service |
51e54d |
fi
|
|
Packit Service |
51e54d |
])
|
|
Packit Service |
51e54d |
|
|
Packit Service |
51e54d |
dnl
|
|
Packit Service |
51e54d |
dnl Check if shutdown(2) does not set mode for the socket descriptor
|
|
Packit Service |
51e54d |
dnl compare with ls -lL /proc/<pid>/fd/
|
|
Packit Service |
51e54d |
dnl
|
|
Packit Service |
51e54d |
AC_DEFUN([PIPELINE_SOCKETPAIR_MODE],
|
|
Packit Service |
51e54d |
[ AC_MSG_CHECKING([if shutdown(2) does not set mode for the socket descriptor])
|
|
Packit Service |
51e54d |
AC_CACHE_VAL(pipeline_cv_socketpair_mode, [
|
|
Packit Service |
51e54d |
AC_TRY_RUN([
|
|
Packit Service |
51e54d |
#include <netdb.h>
|
|
Packit Service |
51e54d |
#include <netinet/in.h>
|
|
Packit Service |
51e54d |
#include <sys/stat.h>
|
|
Packit Service |
51e54d |
#include <sys/socket.h>
|
|
Packit Service |
51e54d |
#include <sys/types.h>
|
|
Packit Service |
51e54d |
#include <unistd.h>
|
|
Packit Service |
51e54d |
#ifndef SHUT_RD
|
|
Packit Service |
51e54d |
# define SHUT_RD 0
|
|
Packit Service |
51e54d |
#endif
|
|
Packit Service |
51e54d |
#ifndef SHUT_WR
|
|
Packit Service |
51e54d |
# define SHUT_WR 1
|
|
Packit Service |
51e54d |
#endif
|
|
Packit Service |
51e54d |
|
|
Packit Service |
51e54d |
int main()
|
|
Packit Service |
51e54d |
{
|
|
Packit Service |
51e54d |
int sfd[2];
|
|
Packit Service |
51e54d |
struct stat st[2];
|
|
Packit Service |
51e54d |
if (socketpair(AF_UNIX,SOCK_STREAM,0,sfd) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if (shutdown(sfd[1],SHUT_RD) < 0 || shutdown(sfd[0],SHUT_WR) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if (fstat(sfd[0], &(st[0])) < 0 || fstat(sfd[1], &(st[1])) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if ((st[0].st_mode & (S_IRUSR|S_IWUSR)) == S_IRUSR && (st[1].st_mode & (S_IRUSR|S_IWUSR)) == S_IWUSR)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if (fchmod(sfd[0], S_IRUSR) < 0 || fchmod(sfd[1], S_IWUSR) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if (fstat(sfd[0], &(st[0])) < 0 || fstat(sfd[1], &(st[1])) < 0)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
if ((st[0].st_mode & (S_IRUSR|S_IWUSR)) != S_IRUSR && (st[1].st_mode & (S_IRUSR|S_IWUSR)) != S_IWUSR)
|
|
Packit Service |
51e54d |
return 1;
|
|
Packit Service |
51e54d |
return 0;
|
|
Packit Service |
51e54d |
}], [pipeline_cv_socketpair_mode=yes], [pipeline_cv_socketpair_mode=no], [pipeline_cv_socketpair_mode=no])
|
|
Packit Service |
51e54d |
])
|
|
Packit Service |
51e54d |
AC_MSG_RESULT([$pipeline_cv_socketpair_mode])
|
|
Packit Service |
51e54d |
if test "$pipeline_cv_socketpair_mode" = yes; then
|
|
Packit Service |
51e54d |
AC_DEFINE(CORRECT_SOCKETPAIR_MODE, 1, [Define if shutdown(2) does not set modes for socket descriptor.])
|
|
Packit Service |
51e54d |
fi
|
|
Packit Service |
51e54d |
])
|