---
name: "setlogin"
section: "2"
platform: "macos"
package: "xnu"
version: "12377.121.6"
release: "macOS 26.5"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/getlogin"
---

# setlogin(2)

get/set login name

Part of [getlogin(2)](/getlogin/2.md).

## NAME

**getlogin**, **setlogin** – get/set login name

## SYNOPSIS

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

*char* *\**\

**getlogin**(*void*);

*int*\

**setlogin**(*const char \*name*);

## DESCRIPTION

The **getlogin**() routine returns the login name of the user associated with the current session, as previously set by **setlogin**(). The name is normally associated with a login shell at the time a session is created, and is inherited by all processes descended from the login shell. (This is true even if some of those processes assume another user ID, for example when [su(1)](/su/1.md) is used.)

**setlogin**() sets the login name of the user associated with the current session to *name*. This call is restricted to the super-user, and is normally used only when a new session is being created on behalf of the named user (for example, at login time, or when a remote shell is invoked).

## RETURN VALUES

If a call to **getlogin**() succeeds, it returns a pointer to a null-terminated string in a static buffer. If the name has not been set, it returns NULL. If a call to **setlogin**() succeeds, a value of 0 is returned.  If **setlogin**() fails, a value of -1 is returned and an error code is placed in the global location *errno*.

## ERRORS

The following errors may be returned by these calls:

- \[EFAULT\]

  The *name* parameter gave an invalid address.

- \[EINVAL\]

  The *name* parameter pointed to a string that was too long. Login names are limited to MAXLOGNAME (from ⟨*sys/param.h*⟩) characters, currently 12.

- \[EPERM\]

  The caller tried to set the login name and was not the super-user.

## SEE ALSO

[setsid(2)](/setsid/2.md)

## BUGS

Login names are limited in length by **setlogin**(). However, lower limits are placed on login names elsewhere in the system (UT\_NAMESIZE in ⟨*utmp.h*⟩).

In earlier versions of the system, **getlogin**() failed unless the process was associated with a login terminal. The current implementation (using **setlogin**()) allows getlogin to succeed even when the process has no controlling terminal. In earlier versions of the system, the value returned by **getlogin**() could not be trusted without checking the user ID. Portable programs should probably still make this check.

## HISTORY

The **getlogin**() function first appeared in 4.4BSD.
