( egmont | 2004. 10. 12., k – 21:08 )

Ha az mkdir() függvényhívás, vagy shell szkriptből mkdir parancs (-p opció nélkül!) sikeres volt, akkor tiéd a pálya és jó vagy, de mi van, ha nem volt sikeres, mert az adott könyvtár már létezik? Akkor mással kell próbálkoznod. Mindezt lehetőleg véletlenszerű, kiszámíthatatlan módon a DoS támadások elkerülése végett. A legtöbb program számára elvárás, hogy egyszerre több felhasználó, illetve egy felhasználó több példányban is futtatni tudja, anélkül, hogy bekavarnának egymásnak.

Mindezt szerencsére nem kell neked leprogramoznod, mert létezik már okosan megírt mkstemp() és mkdtemp() függvény, valamint mktemp parancssori progi shell szkriptből történő használatra. Lásd man 3 mkstemp, man 3 mkdtemp, man 1 mktemp, és mellesleg a man 3 mktemp végén a hatalmas figyelmeztetést hogy az viszont miért elavult.

A fenti megoldás a 600/700 jogot is okosan beállítja, ugye sokan bután állítják be, fájl vagy könyvtár létrehozása és _utána_ chmod, amikor is van egy kis időablak, amíg másvalaki beléphet a könyvtárba vagy megnyithatja a fájlt és utána korlátlanul olvashatja, a chmod ezen már nem segít. Szóval a létrehozás pillanatában kell a megfelelő jogokat adni a fájlra.

Szóval tanulság: először ismerni kell a problémát, utána pedig ismerni kell a megoldására már létező eszközöket, saját változatok hegesztése helyett.

Megjegyzendő továbbá, hogy sok esetben érdemes megfontolni /tmp helyett valami más könyvtár használatát, ahova csak az adott felhasználó írhat. Például ha egy többfelhasználós rendszeren írok egy szkriptet root-ként, amiről tudom, hogy csak a root fogja futtatni, és egyszerre csak egy példányban, akkor ahelyett, hogy az mktemp-et nekiállnék okosan használni, simán rakhatom mondjuk /root vagy /var/lib/progineve vagy akármi ilyesmi alá is az ideiglenes fájlt.