2005-04-17 02:20:36 +04:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 1997 , 1999 , 2000 , 2001 Ralf Baechle
* Copyright ( C ) 2000 , 2001 Silicon Graphics , Inc .
*/
# ifndef _ASM_SOCKET_H
# define _ASM_SOCKET_H
2012-10-09 12:47:14 +04:00
# include <uapi/asm/socket.h>
2005-04-17 02:20:36 +04:00
/** sock_type - Socket types
*
* Please notice that for binary compat reasons MIPS has to
* override the enum sock_type in include / linux / net . h , so
* we define ARCH_HAS_SOCKET_TYPES here .
*
* @ SOCK_DGRAM - datagram ( conn . less ) socket
* @ SOCK_STREAM - stream ( connection ) socket
* @ SOCK_RAW - raw socket
* @ SOCK_RDM - reliably - delivered message
2005-09-04 02:56:17 +04:00
* @ SOCK_SEQPACKET - sequential packet socket
2005-04-17 02:20:36 +04:00
* @ SOCK_PACKET - linux specific way of getting packets at the dev level .
* For writing rarp and other similar things on the user level .
*/
enum sock_type {
SOCK_DGRAM = 1 ,
SOCK_STREAM = 2 ,
SOCK_RAW = 3 ,
SOCK_RDM = 4 ,
SOCK_SEQPACKET = 5 ,
2005-09-20 17:43:51 +04:00
SOCK_DCCP = 6 ,
2005-04-17 02:20:36 +04:00
SOCK_PACKET = 10 ,
} ;
# define SOCK_MAX (SOCK_PACKET + 1)
flag parameters: socket and socketpair
This patch adds support for flag values which are ORed to the type passwd
to socket and socketpair. The additional code is minimal. The flag
values in this implementation can and must match the O_* flags. This
avoids overhead in the conversion.
The internal functions sock_alloc_fd and sock_map_fd get a new parameters
and all callers are changed.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 57392
/* For Linux these must be the same. */
#define SOCK_CLOEXEC O_CLOEXEC
int
main (void)
{
int fd;
fd = socket (PF_INET, SOCK_STREAM, 0);
if (fd == -1)
{
puts ("socket(0) failed");
return 1;
}
int coe = fcntl (fd, F_GETFD);
if (coe == -1)
{
puts ("fcntl failed");
return 1;
}
if (coe & FD_CLOEXEC)
{
puts ("socket(0) set close-on-exec flag");
return 1;
}
close (fd);
fd = socket (PF_INET, SOCK_STREAM|SOCK_CLOEXEC, 0);
if (fd == -1)
{
puts ("socket(SOCK_CLOEXEC) failed");
return 1;
}
coe = fcntl (fd, F_GETFD);
if (coe == -1)
{
puts ("fcntl failed");
return 1;
}
if ((coe & FD_CLOEXEC) == 0)
{
puts ("socket(SOCK_CLOEXEC) does not set close-on-exec flag");
return 1;
}
close (fd);
int fds[2];
if (socketpair (PF_UNIX, SOCK_STREAM, 0, fds) == -1)
{
puts ("socketpair(0) failed");
return 1;
}
for (int i = 0; i < 2; ++i)
{
coe = fcntl (fds[i], F_GETFD);
if (coe == -1)
{
puts ("fcntl failed");
return 1;
}
if (coe & FD_CLOEXEC)
{
printf ("socketpair(0) set close-on-exec flag for fds[%d]\n", i);
return 1;
}
close (fds[i]);
}
if (socketpair (PF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0, fds) == -1)
{
puts ("socketpair(SOCK_CLOEXEC) failed");
return 1;
}
for (int i = 0; i < 2; ++i)
{
coe = fcntl (fds[i], F_GETFD);
if (coe == -1)
{
puts ("fcntl failed");
return 1;
}
if ((coe & FD_CLOEXEC) == 0)
{
printf ("socketpair(SOCK_CLOEXEC) does not set close-on-exec flag for fds[%d]\n", i);
return 1;
}
close (fds[i]);
}
puts ("OK");
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Signed-off-by: Ulrich Drepper <drepper@redhat.com>
Acked-by: Davide Libenzi <davidel@xmailserver.org>
Cc: Michael Kerrisk <mtk.manpages@googlemail.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-07-24 08:29:17 +04:00
/* Mask which covers at least up to SOCK_MASK-1. The
* * remaining bits are used as flags . */
# define SOCK_TYPE_MASK 0xf
/* Flags for socket, socketpair, paccept */
# define SOCK_CLOEXEC O_CLOEXEC
# define SOCK_NONBLOCK O_NONBLOCK
2005-04-17 02:20:36 +04:00
# define ARCH_HAS_SOCKET_TYPES 1
# endif /* _ASM_SOCKET_H */