Linux x86_64Sistema de arquivos#316
renameat2
Como renameat, mas com flags para renomear sem sobrescrever (RENAME_NOREPLACE), trocar dois caminhos atomicamente (RENAME_EXCHANGE), ou deixar um whiteout (RENAME_WHITEOUT).
Descrição
RENAME_EXCHANGE é particularmente útil para trocar dois arquivos/diretórios atomicamente (útil em atualizações A/B); RENAME_NOREPLACE resolve a corrida entre checar se o destino existe e renomear por cima dele.
man 2Desde o kernel 3.15
Assinatura
int renameat2(
int olddirfd,
const char * oldpath,
int newdirfd,
const char * newpath,
unsigned int flags
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| olddirfd | int | Descritor do diretório base da origem, ou AT_FDCWD. |
| oldpath | const char * | Caminho de origem. |
| newdirfd | int | Descritor do diretório base do destino, ou AT_FDCWD. |
| newpath | const char * | Caminho de destino. |
| flags | unsigned int | RENAME_NOREPLACE, RENAME_EXCHANGE, RENAME_WHITEOUT. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | olddirfdint |
| rsi | argumento 2 | oldpathconst char * |
| rdx | argumento 3 | newdirfdint |
| r10 | argumento 4 | newpathconst char * |
| r8 | argumento 5 | flagsunsigned int |
Valor de retorno
0 em sucesso; -1 em erro, com errno definido.
Códigos de erro (errno)
- EEXIST(17)
- Arquivo já existe.
- EINVAL(22)
- Argumento inválido.
- ENOTDIR(20)
- Não é um diretório.
- EXDEV(18)
- Link cruzando dispositivos/sistemas de arquivos diferentes.