XFS nerozlišuje medzi súbormi a adresármi v dirent

26.10.2013 | 12:20 | Mirecove dristy | Miroslav Bendík

Dnes som sa pár hodín pokúšal rozbehať nastavenie časovej zóny pomocou connman. Po rozobratí zdrojového kódu connman som zistil prečo detekcia časovej zóny nefunguje. XFS pri použití volania readdir vôbec nerozlišuje medzi adresármi a súbormi.

Súborový systém xfs vracia pri volaní readdir položku d_type vždy DT_UNKNOWN. V takýchto prípadoch sa musí pre zistenie typu súboru hrabnúť priamo na inode cez fstat, čo ale connman nerobí.

Na ukážku správania xfs prikladám zdroják malého testovacieho program:

#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
	DIR *dir = opendir(argv[1]);
	struct dirent *d;
	while ((d = readdir(dir))) {
		printf("%s ", d->d_name);
		switch (d->d_type) {
			case DT_UNKNOWN: printf("UNKNOWN"); break;
			case DT_FIFO: printf("FIFO"); break;
			case DT_CHR: printf("CHR"); break;
			case DT_DIR: printf("DIR"); break;
			case DT_BLK: printf("BLK"); break;
			case DT_REG: printf("REG"); break;
			case DT_LNK: printf("LNK"); break;
			case DT_SOCK: printf("SOCK"); break;
			case DT_WHT: printf("WHT"); break;
		}
		printf("\n");
	}
	return 0;
}

Spustiť sa dá cez ./program /cesta/k/adresáru.

Pre môj testovací adresár:

ls -lh
celkom 0
drwxr-xr-x 2 mirec mirec 6 okt 26 09:48 adresar
prw-r--r-- 1 mirec mirec 0 okt 26 09:48 fifo
-rw-r--r-- 1 mirec mirec 0 okt 26 09:48 subor

Vyzerá výpis nasledovne:

./a.out /home/mirec/test 
. DIR
.. DIR
adresar UNKNOWN
subor UNKNOWN
fifo UNKNOWN

Takže v prípade, že by ste niekedy na nejakom embedded zariadení používali connman odporúčam veľkým oblúkom sa vyhnúť xfs.

    • RE: XFS nerozlišuje medzi súbormi a adresármi v dirent 26.10.2013 | 18:44
      Avatar bedňa antiX, Devuan, LegacyIce  Administrátor

      A je to korektné správanie?

      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
      • RE: XFS nerozlišuje medzi súbormi a adresármi v dirent 26.10.2013 | 19:28
        Avatar Miroslav Bendík Gentoo  Administrátor

        Ako sa to tak vezme. Ak jednoducho atribút nie je v inode adresára tak je to správanie OK (je síce potrebné ručne hrabnúť na súbor cez fstat, ale to by musel inak robiť aj sám FS). Je to síce nepríjemné, rozbíja to softvér, ale je to skôr chyba v softvéri (v tomto prípade connman).

        • RE: XFS nerozlišuje medzi súbormi a adresármi v dirent 27.10.2013 | 01:10
          Avatar bedňa antiX, Devuan, LegacyIce  Administrátor

          Podľa toho čo som pozeral, tak sa takto správa kvôli výkonnosti systému, je zaujímavé že ostatné FS vracajú korektné informácie. Ešte by bolo zaujímavé zistiť či Btrfs nemá rovnaký problém, pretože mi prídu v určitých parametroch príbuzné.

          Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org