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

# dirname(3)

extract the directory part of a pathname

## NAME

**dirname** – extract the directory part of a pathname

## SYNOPSIS

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

*char* *\**\

**dirname**(*char \*path*);

## DESCRIPTION

The **dirname**() function is the converse of [basename(3)](/basename/3.md); it returns a pointer to the parent directory of the pathname pointed to by *path*. Any trailing ‘/’ characters are not counted as part of the directory name.

## IMPLEMENTATION NOTES

This implementation of **dirname**() uses the buffer provided by the caller to store the resulting parent directory. Other vendor implementations may return a pointer to internal storage space instead. The advantage of the former approach is that it ensures thread-safety, while also placing no upper limit on the supported length of the pathname.

## RETURN VALUES

If *path* is a null pointer, the empty string, or contains no ‘/’ characters, **dirname**() returns a pointer to the string ".", signifying the current directory. Otherwise, it returns a pointer to the parent directory of *path*.

## SEE ALSO

[basename(1)](/basename/1.md), [dirname(1)](/dirname/1.md), [basename(3)](/basename/3.md)

## STANDARDS

The **dirname**() function conforms to X/Open Portability Guide Issue 4, Version 2 (“XPG4.2”).

## HISTORY

The **dirname**() function first appeared in OpenBSD 2.2 and FreeBSD 4.2.

In FreeBSD 12.0, this function was reimplemented to store its result in the provided input buffer.

## AUTHORS

Nuxi, the Netherlands
