Elem:
mkdir('/path/to/folder', 0775);
Daje folder sa permisijama 0755, a ne sa 0775 kao sto sam mu i rekao.
OK, postoji umask(). Defaultni umask() je 0022, sto je dobro.
Ako uradim sledece:
umask(0002);
mkdir('/path/to/folder', 0775);
Daje folder sa permisijama 0775, kao sto sam i zeleo prvi put :)
Logicno objasnjenje je da mkdir() ne uzima u obzir mod koji mu prosledjujem i koristi defaultni (defaultni, po dokumentaciji je 0777, a isti je defaultni i za bilo koji *nix sistem, ako sysadmin nije promenio - a nisam :P).
Koliko sam skontao, sa umaskom se radi na sledeci nacin: od prvobitne permisije se oduzima vrednost umaska.
U slucaju ako je mod 777, umask = 22: 777-22 = 755.
Mod 775, umask 22: 775-22 = 753.
Kako se jos moze izracunati? Bitovima (ovo sam nasao u PHP manualu, dole u komentarima http://www.php.net/manual/en/function.umask.php). umask se prebaci u bitove, invertuje i odradi AND funkcija nad pocetnim modom i invertovanim umaskom.
Mod: 777, 111111111
Umask: 22, 000010010
Invertovani umask: 111101101
Rezultat nakon AND: 111101101, tj. 755. Ovo je OK.
Mod: 777, 111111111
Umask: 2, 000000010
Invertovani umask: 111111101
Rezultat nakon AND: 111111101, tj. 775. Ovo je OK.
Mod: 775, 111111101
Umask: 22, 000010010
Invertovani umask: 111101101
Rezultat nakon AND: 111101101, tj. 755. WTF?! Ovo bi trebalo da bude 753, ako pogledamo da je 775-22 = 753
Moguce je da je ovo racunanje sa bitovima pogresno, da se ne racuna tako, ne znam. U svakom slucaju, nesto se zanimljivo desava, bar po meni :)
I da, testirano na dva posebna servera, koji imaju drugacije setupove i drugacije verzije OS-a i PHP-a, a opet, isto se ponasaju :)
Any ideas? :)