17.2 ioctl Function
This function affects an open file referenced by the fd argument.
int ioctl(int fd, int request, ... /* void *arg */ );
Returns:0 if OK, -1 on error
The third argument is always a pointer, but the type of pointer depends on the request.
4.4BSD defines the second argument to be an unsigned long instead of an int, but that is not a problem since header files define the constants that are used for this argument. As long as the prototype is in scope (i.e., the program using ioctl has included <unistd.h>), the correct type for the system will be used.
Some implementations specify the third argument as a void * pointer instead of the ANSI C ellipsis notation.
There is no standard for the header to include to define the function prototype for ioctl since it is not standardized by POSIX. Many systems define it in <unistd.h>, as we show, but traditional BSD systems define it in <sys/ioctl.h>.
We can divide the requests related to networking into six categories:
Recall from Figure 7.20 that not only do some of the ioctl operations overlap some of the fcntl operations (e.g., setting a socket to nonblocking), but there are also some operations that can be specified more than one way using ioctl (e.g., setting the process group ownership of a socket).
Figure 17.1 lists the requests, along with the datatype of what the arg address must point to. The following sections describe these requests in more detail.
Figure 17.1. Summary of networking ioctl requests.