---
name: "connectat"
section: "2"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/connectat"
---

# connectat(2)

initiate a connection on a socket

## NAME

**connectat** – initiate a connection on a socket

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<sys/types.h\>**

**#include \<sys/socket.h\>**

**#include \<fcntl.h\>**

*int*\

**connectat**(*int fd*, *int s*, *const struct sockaddr \*name*, *socklen\_t namelen*);

## DESCRIPTION

The **connectat**() system call initiates a connection on the socket *s*. When passed the special value AT\_FDCWD in the *fd* parameter, the behavior is identical to a call to [connect(2)](/connect/2.md). Otherwise, **connectat**() works like the [connect(2)](/connect/2.md) system call with two exceptions:

1. It is limited to sockets in the PF\_LOCAL domain.

2. If the file path stored in the *sun\_path* field of the sockaddr\_un structure is a relative path, it is located relative to the directory associated with the file descriptor *fd*.

3. If the *sun\_path* field is empty, that is, *namelen* equals offsetof(struct sockaddr\_un, sun\_path), then *fd* does not resolve a path but instead names the peer socket directly.

   The descriptor may be the peer socket itself, or a descriptor for a file, such as an O\_PATH handle opened with [open(2)](/open/2.md). In the latter case, the O\_PATH file description may point either to a traditional socket file bound to the peer, or to a */dev/fd/N* node. The */dev/fd/N* node must name the socket descriptor itself; the named descriptor is resolved a single level and not chased further. With a standard fdescfs(5) mount this means a node naming a traditional socket file, or another */dev/fd/N* node, does not resolve to a peer.

   In all cases, *fd* must carry the CAP\_CONNECTAT capability right, and the target of a */dev/fd/N* node must also carry that right; see [unix(4)](/unix/4.md) for the details of this form.

## RETURN VALUES

The **connectat()** function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

## ERRORS

The **connectat**() system call may fail with the same errors as the [connect(2)](/connect/2.md) system call or with the following errors:

- \[EBADF\]

  The *sun\_path* field does not specify an absolute path and the *fd* argument is neither AT\_FDCWD nor a valid file descriptor.

- \[ENOTDIR\]

  The *sun\_path* field is not an absolute path and *fd* is neither AT\_FDCWD nor a file descriptor associated with a directory.

- \[EINVAL\]

  The *sun\_path* field is empty but *fd* is AT\_FDCWD, so no descriptor names the peer.

## SEE ALSO

[bindat(2)](/bindat/2.md), [connect(2)](/connect/2.md), [socket(2)](/socket/2.md), [unix(4)](/unix/4.md)

## AUTHORS

The **connectat** was developed by Pawel Jakub Dawidek ⟨*pawel@dawidek.net*⟩ under sponsorship from the FreeBSD Foundation.
