rename, renameat, renameat2 - verander de naam of plaats van een
bestand
Standard C bibliotheek (libc, -lc)
#include <stdio.h>
int rename(const char *oudpad, const char *nieuwpad);
#include <fcntl.h> /* Definitie van AT_* constanten */
#include <stdio.h>
int renameat(int oud_bes_ind, const char *oudpad,
int nieuw_bes_ind, const char *nieuwpad);
int renameat2(int oud_bes_ind, const char *oudpad,
int nieuw_bes_ind, const char *nieuwpad, unsigned int vlaggen);
renameat():
Vanaf glibc 2.10:
_POSIX_C_SOURCE >= 200809L
Voor glibc 2.10:
_ATFILE_SOURCE
renameat2():
_GNU_SOURCE
rename() hernoemt een bestand, het naar andere mappen
verplaatsend als nodig. Elke andere harde koppeling naar het bestand
(gemaakt met link(2)) blijft onaangetast. Open bestandsindicatoren
voor oudpad blijven ook onaangetast.
Diverse beperkingen bepalen of de rename operatie wel of niet
succesvol is: zie FOUTEN hieronder.
Als nieuwpad al bestaat wordt het atomair vervangen zodat
er geen enkel moment is waarop een ander proces dat toegang tot
nieuwpad probeert te krijgen het zal missen. Hoewel er mogelijk een
venster kan zijn waarin beiden oudpad en nieuwpad naar het
bestand wijzen dat hernoemd wordt.
Als oudpad en nieuwpad bestaande harde verwijzingen
naar hetzelfde bestand zijn, dan doet rename() niks en geeft een
succes status terug.
Als nieuwpad bestaat maar de handeling faalt om een of
andere reden, dan garandeert rename(), nieuwpad op zijn plaats
te laten.
oudpad kan een map specificeren. In dit geval moet of
nieuwpad niet bestaan of een lege map specificeren.
Als oudpad naar een symbolische link wijst, wordt de
koppeling hernoemd; als nieuwpad naar een symbolische link wijst
wordt de koppeling overschreven.
De renameat() systeem aanroep werkt op exact dezelfde
manier a;ls rename(), behalve voor de hier beschreven
verschillen.
Als de padnaam gegeven in oudpad relatief is, dan wordt
deze geïnterpreteerd als relatief ten opzichte van de map aangewezen
door de bestandsindicator oud_bes_ind (in plaats van relatief aan de
werkmap van het aanroepende proces, zoals gedaan door rename() voor
een relatieve padnaam).
Als oudpad relatief is en oud_bes_ind de speciale
waarde AT_FDCWD heeft, dan wordt oudpad geïnterpreteerd
als relatief aan de werkmap van het aanroepende proces (zoals
rename()).
Als oudpad absoluut is, dan wordt oudpadbi
genegeerd.
De interpretatie van nieuwpad is zoals voor oudpad
behalve dat een relatieve padnaam wordt geïnterpreteerd als relatief
aan de map aangewezen door de bestandsindicator nieuwmapbi.
Zie openat(2) voor een uitleg over de noodzaak van
renameat().
renameat2() heeft een additioneel vlaggen argument.
Een renameat2() aanroep met een nul vlaggen argument is
equivalent met renameat().
Het vlaggen argument is een bit masker bestaande uit nul of
meer van de volgende vlaggen:
- RENAME_EXCHANGE
- Verwissel oudpad en nieuwpad atomair. Beide padnamen moeten
bestaan maar mogen van verschillende typen zijn (b.v. een zou een
niet-lege map kunnen zijn en de andere een symbolische verwijzing).
- RENAME_NOREPLACE
- Overschrijf nieuwpad niet bij het hernoemen. Geef een fout terug
als nieuwpad al bestaat.
- RENAME_NOREPLACE kan niet gebruikt worden samen met
RENAME_EXCHANGE.
- RENAME_NOREPLACE vereist ondersteuning door het onderliggende
bestandssysteem. Ondersteuning door verschillende bestandssystemen wordt
als volgt toegevoegd:
- •
- ext4 (Linux 3.15);
- •
- btrfs, tmpfs, en cifs (Linux 3.17);
- •
- xfs (Linux 4.0);
- •
- Ondersteuning voor veel andere bestandssystemen werd toegevoegd in Linux
4.9, inclusief ext2, minix, reiserfs, jfs, vfat en bpf.
- RENAME_WHITEOUT
(sinds Linux 3.18)
- Deze operatie is alleen logisch voor overlappende/eenheid bestandssysteem
implementaties.
- Opgeven van RENAME_WHITEOUT creëert een "whiteout"
object aan het begin van het hernoemen op hetzelfde tijdstip als het
uitvoeren van het hernoemen. De hele operatie is atomair, zodat als het
hernoemen succesvol is de "whiteout" ook zal zijn
aangemaakt.
- Een "whiteout" is een object met een speciale betekenis in
eenheid/overlap bestandssysteem constructies. In deze constructies,
bestaan meerdere lagen en alleen de bovenste zal ooit worden gewijzigd.
Een "whiteout" op een bovenste laag zal een overeenkomend
bestand effectief verstoppen in een lagere laag, er voor zorgende dat het
bestand verschijnt alsof het niet bestaat.
- Wanneer een bestaand bestand op de lagere laag werd hernoemd, dan wordt
deze allereerst omhoog gekopieerd (als hij al niet bestond op de hogere
laag) en vervolgens gehernoemd op de hogere, lees-schrijf laag.
Tegelijkertijd moet het bron bestand ge-"whiteout" zijn (zodat
de versie van het bron bestand in de lagere laag onzichtbaar is). De
gehele operatie dient atomair uitgevoerd te worden.
- Indien geen onderdeel van een eenheid/overlap, dan verschijnt de
"whiteout" als een teken apparaat met (0,0) als apparaat nummer.
(Merk op dan andere eenheid/overlap implementaties andere methodes kunnen
gebruiken om "whiteout" eenheden op te slaan; zo gebruikt de BSD
eenheid koppeling het speciale inode type DT_WHT die, hoewel
ondersteund door een aantal bestandssystemen beschikbaar in Linux, zoals
CODA en XFS, wordt genegeerd door de ondersteunende code in de kernel,
vanaf Linux 4.19.)
- RENAME_WHITEOUT vereist dezelfde rechten als voor het aanmaken van
een apparaat node (m.a.w, de CAP_MKNOD capaciteit).
- RENAME_NOREPLACE kan niet gebruikt worden samen met
RENAME_EXCHANGE.
- RENAME_NOREPLACE vereist ondersteuning door het onderliggende
bestandssysteem. Onder de bestandssystemen die het ondersteunen zijn tmpfs
(vanaf Linux 3.18), ext4 (vanaf Linux 3.18), XFS (vanaf Linux 4.1), f2fs
(vanaf Linux 4.2), btrfs (vanaf Linux 4.7), en ubifs (vanaf Linux
4.9).
Bij succes wordt nul teruggegeven. Bij falen wordt -1 teruggegeven
en wordt errno overeenkomstig gezet.
- EACCES
- Schrijf toegang is niet toegestaan in de map die oudpad of
nieuwpad bevat, of, zoeken is niet toegestaan voor een van de
mappen in het pad voorvoegsel van oudpad of nieuwpad, of
oudpad is een map en staat niet schrijftoestemming niet toe (die
nodig is om de .. ingang te updaten). (Zie ook
path_resolution(7).)
- EBUSY
- Het hernoemen faalde omdat oudpad of nieuwpad een map is die
in gebruik is door een of ander proces (misschien als huidige werkmap, of
als systeembeheerder map, of omdat het voor schrijven open was) of het is
in gebruik door het systeem (bijvoorbeeld als aankoppel punt), en het
systeem beschouwd dit als een fout. (Merk op dat er geen vereiste is om
EBUSY terug te geven is in deze gevallen —er is niets mis
met het hoe-dan-ook doen van de hernoeming— maar het wordt
toegestaan om EBUSY terug te geven als het systeem dergelijke
situaties niet anders kan afhandelen.)
- EDQUOT
- De gebruiker quota van schijf blokken op het bestandssysteem zijn
uitgeput.
- EFAULT
- oudpad of nieuwpad wijzen buiten door u toegankelijke adres
ruimte.
- EINVAL
- De nieuwe padnaam bevat een voorvoegsel van de oude, of, algemener, een
poging werd gedaan om een map een ondermap van zichzelf te maken.
- EISDIR
- nieuwpad is een bestaande map, maar oudpad is geen map.
- ELOOP
- Teveel symbolische koppelingen werden tegengekomen bij het vaststellen van
oudpad of nieuwpad.
- EMLINK
- oudpad heeft al het maximum aantal koppelingen naar zich toe, of
het was een dir en de map die nieuwpad bevat heeft al het maximum
aantal koppelingen.
- ENAMETOOLONG
- oudpad of nieuwpad was te lang.
- ENOENT
- De verwijzing aangeduid door oudpad bestaat niet of een map
component in nieuwpad bestaat niet, of oudpad of
nieuwpad zijn lege tekenreeksen.
- ENOMEM
- Onvoldoende kernelgeheugen voorhanden.
- ENOSPC
- Het apparaat waar het bestand op zit heeft geen ruimte voor een nieuwe
map.
- ENOTDIR
- Een deel gebruikt als een map in oudpad of nieuwpad is in
feite geen map. Of, oudpad is een map, en nieuwpad bestaat
maar is geen map.
- ENOTEMPTY of
EEXIST
- nieuwpad is een niet-lege map, het bevat andere ingangen dan
"." en "..".
- EPERM of
EACCES
- De map die oudpad bevat heeft het plak-bit (S_ISVTX) gezet
enhet effectieve gebruiker ID is noch het gebruiker ID van het bestand dat
gewist moet worden noch dat van de map die het bevat, en het proces is
niet gerechtigd (Linux: heeft de CAP_FOWNER capaciteit); of
nieuwpad is een bestaand bestand en de map die het bevat heeft het
plak-bit gezet en het effectieve gebruiker ID van het proces is noch het
gebruiker ID van het bestand dat moet worden vervangen noch dat van de map
die het bevat, en het proces is niet gerechtigd (Linux: heeft de
CAP_FOWNER capaciteit niet); of het bestandssysteem dat
oudpad bevat ondersteund het hernoemen van het dit type niet.
- EROFS
- Het bestand staat op een alleen-lezen bestandssysteem.
- EXDEV
- oudpad en nieuwpad zitten niet op hetzelfde aangekoppelde
bestandssysteem. (Linux staat toe dat bestandssystemen worden aangekoppeld
op meerdere punten, maar rename() werkt niet over verschillende
aankoppel punten, zelfs als hetzelfde bestandssysteem is gekoppeld op
beiden.)
De volgende extra fouten kunnen optreden voor renameat() en
renameat2():
- EBADF
- oudemapbi (nieuwpad) is relatief maar oudemapbi
(nieuwmapbi) is geen geldige bestandsindicator.
- ENOTDIR
- oudpad is relatief en oudmapbi is een bestandsindicator die
naar een bestand anders dan een map wijst; of vergelijkbaar voor
nieuwpad en nieuwmapbi
De volgende extra fouten kunnen optreden voor
renameat2():
- EEXIST
- vlaggen bevat RENAME_NOREPLACE en nieuwpad bestaat
al.
- EINVAL
- Een ongeldig vlag werd in vlaggen opgegeven.
- EINVAL
- Zowel RENAME_NOREPLACE als RENAME_EXCHANGE werden opgegeven
in vlaggen.
- EINVAL
- Zowel RENAME_NOREPLACE als RENAME_EXCHANGE werden opgegeven
in vlaggen.
- EINVAL
- Het bestandssysteem ondersteund een van de vlaggen in vlaggen
niet.
- ENOENT
- flags bevat RENAME_EXCHANGE en nieuwpad bestaat
niet.
- EPERM
- RENAME_WHITEOUT werd opgegeven in vlaggen, maar de aanroeper
heeft deCAP_MKNOD capaciteit niet.
renameat() werd toegevoegd aan Linux 2.6.16; bibliotheek
ondersteuning werd toegevoegd aan glibc 2.4.
renameat2() werd toegevoegd aan Linux 3.15; bibliotheek
ondersteuning werd toegevoegd aan glibc 2.28.
rename(): 4.3BSD, C99, POSIX.1-2001, POSIX.1-2008.
renameat(): POSIX.1-2008.
renameat2() is Linux-eigen.
Op oudere kernels waar renameat() niet beschikbaar is, valt
de glibc omwikkelfunctie terug op het gebruik van rename(). Als
oudpad and nieuwpad relative padnamen zijn, dan zal glibc
padnamen construeren gebaseerd op de symbolische koppelingen in
/proc/self/fd die overeenkomen met de oudmapbi en
nieuwmapbi argumenten.
Op NFS bestandsystemen kun je niet aannemen dat als een handeling
mislukte, het bestand niet hernoemd werd. Als de server de hernoem-handeling
doet en gecrasht dan zal de herverstuurde RPC die afgehandeld zal worden als
de server het weer doet, een fout veroorzaken. Van toepassing wordt verwacht
hiermee om te gaan. Zie link(2) voor gelijksoortige problemen.
De Nederlandse vertaling van deze handleiding is geschreven door
Jos Boersema <joshb@xs4all.nl>, Mario Blättermann
<mario.blaettermann@gmail.com> en Luc Castermans
<luc.castermans@gmail.com>
Deze vertaling is vrije documentatie; lees de
GNU General
Public License Version 3 of later over de Copyright-voorwaarden. Er is
geen AANSPRAKELIJKHEID.
Indien U fouten in de vertaling van deze handleiding zou vinden,
stuur een e-mail naar
debian-l10n-dutch@lists.debian.org.