*Markus: (C) Implizite Deklaration der Funktion »strdup«

Beitrag lesen

In diesem Zusammenhang habe ich noch ein Rätsel. Gebe ich mir zusätzlich die Fileinformationen aus, so funktioniert dies nur im aktuellen Verzeichnis. Übergebe ich als Parameter z.B ".." oder "/home/markus/", dann stimmen die Fileattribute wie Inode-Nummer etc nur von ".". Alle anderen Eigenschaft sind gleich. Ich habe "struct stat s;" sogar global definiert oder innerhalb der while-Schleife, aber dennoch bleibt die Information fälschlicherweise immer gleich. Meiner Meinung nach müsste die Übergabe durch dne Adressoperatur &s die Informationen bei jedem neuen File aktualisieren, aber das ist definitiv nicht so. Was ist da los? Ironischerweise stimmt aber der Inhalt von files[i]. Der Dateiname wird nämlich immer richtig ausgegeben. So gesehen liefert stat doch falsche Informationen zu dem übergebenen Dateinamen? Da das Ganze mit dme aktuellen Verzeichnis funktioniert, kann am Programm und an der Übergabe nichts falsch sein. Aber anscheinend macht mir die stat-Funktion einen Strich durch die Rechnung.

  
    while ((dp = readdir (dir)) != NULL) {  
        files[i] = (char *)strdup(dp->d_name);  
        if (files[i] == NULL) {  
            /* memory allocation failure; free what's been allocated  
             * so far and return NULL.  
             */  
            while (i > 0) {  
                free (files[--i]);  
            }  
            free (files);  
            return NULL;  
        }  
        printf("\n-----------------------------------------------------\n");  
        printf ("%d: %s\n", i, files[i]);  
//Hier wird stat aufgerufen, um Infos aus den Files zu bekommen//  
        stat(files[i], &s);  
    	  printf("%-40s : %d\n", "Dateilaenge", s.st_size);  
    	  printf("%-40s : %ud\n", "Dateiattribute", s.st_mode);  
    	  printf("%-40s : %d\n", "Eigentümer", s.st_uid);  
    	  printf("%-40s : %d\n", "Gruppe", s.st_gid);  
    	  printf("%-40s : %d\n", "Inode-Nummer", s.st_ino);  
    	  printf("%-40s : %s", "Datum der letzten Modifikation", ctime(&s.st_mtime));  
    	  printf("%-40s : %s", "Datum der letzten Statusaenderung", ctime(&s.st_ctime));  
    	  printf("%-40s : %s", "Datum des letzten Lesezugriffs", ctime(&s.st_atime));  
  
        i++;  
    }  
  
    closedir (dir);  
    return files;  

Markus