Saturday, October 1, 2011

struct sockaddr_un

Forming Local Addresses

This address format is used by sockets that are local to your host (your PC running Linux). For example, when you queue a file to be printed using the lpr(1) command, it uses a local socket to
communicate with the spooling service on your PC. While it is also possible to use TCP/IP for local communication, it turns out that this is less efficient. Traditionally, the local address family has been referred to as the AF_UNIX domain (for example, a
UNIX socket address). This is because these addresses use local UNIX filenames to act as the socket name. Linux kernels 2.2.0 and later support abstract socket names, which you'll learn about shortly.
The structure name for AF_LOCAL or AF_UNIX addresses is sockaddr_un. This structure is defined by including the following statement in your C program:
Listing 2.2: The sockaddr_un Address Structure
#include <sys/un.h>
struct sockaddr_un {
sa_family_t sun_family;   /* Address Family */
char sun_path[108];       /* Pathname */
};

The structure member sun_family must have the value AF_LOCAL or AF_UNIX assigned to it (these macros represent the same value, though usage of AF_LOCAL is now being encouraged). This value indicates the structure is formatted according to the structure sockaddr_un rules. The structure member sun_path[108] contains a valid UNIX pathname. There is no null byte required at the end of the character array, as you will find out.

CAUTION
Note that the total size for the sockaddr_un address is much larger than the 16 bytes of the generic address structure. Make sure you allocate sufficient storage to accommodate the AF_LOCAL/AF_UNIX address if you are working with multiple address families within your code. In the further coming  sections, you will learn how to initialize an AF_LOCAL address and define its length.

TIP
Information about local socket addresses can be found in the unix(4) man page.

Forming Traditional Local Addresses

The address name space for traditional local addresses are file system pathnames. A process might name its local socket by any valid pathname. To be valid, however, the process naming the socket must have access to all directory components of the pathname and  permissions to create the final socket object in the directory named. Figure 2.2 shows the physical layout of a socket /dev/printer, which you may have active on your system. The lpd printer daemon listens on this local socket address.
Figure 2.2:

Here is the AF_LOCAL/AF_UNIX Socket Address for /dev/printer.

Notice that the first two bytes indicate the address type of AF_LOCAL. The remaining bytes are the characters /dev/printer with no null byte present. Now you'll turn your attention to the C code to initialize such an address. Some programmers like to initialize the address structure completely to zero before filling it in. This is often done using the memset(3) function and is probably a good idea:

struct sockaddr_un uaddr;
memset(&uaddr,0,sizeof uaddr);

This function call will zero out all bytes of the address structure for you.

NOTE
Zeroing out the address structure is not required if you properly initialize the mandatory address elements. However, it does make debugging easier because it eliminates any leftover data that might otherwise remain. In this chapter, memset(3) is used to zero the address structures, as a demonstration of how it would be done.

1 comment: