Appel système stat

Bonjour,

J’ai un petit souci avec le logiciel vcp. Il possède une limite dans la taille des fichiers à transférer (à environ 2Gio). Comme celui-ci est libre et ne semble plus être maintenu, je vais essayer de le reprendre (mais ça risque de mettre du temps car je manque de temps à y consacrer).

Quoi qu’il en soit une première inspection du code m’a permis d’identifier un premier coupable : l’appel système stat. En effet il ne peut pas gérer des fichiers de plus de 2 Gios environs.

vcp est un logiciel pouvant fonctionner sous GNU/Linux comme sous les principales BSD (Free, Net et Open). J’espère garder cette portabilité.

Bref tout ça pour vous demander si les éventuels utilisateurs de GNU/Linux en 64bits et de BSD (voir de Solaris) pouvaient me dire si ces SE possèdent les même limites. Pour cela vous pouvez soit executer la commande man 2 stat et me rapporter s’il en est fait mention dans la section erreur.

Soit utiliser un petit logiciel et le tester sur plusieurs fichiers de quelques Gio chacun. Le programme se contente de dire la taille de chaque fichier que vous lui passez en paramètre. Le voici :

[code]#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char** argv){
int i, ret = 0;
struct stat s;

if(argc <= 1){
printf(“Vous devez donner un fichier en parametre.\n”);
ret = 2;
}

for(i = 1; i < argc; ++i){
if(stat(argv[i], &s) == -1){
printf(“Erreur dans le stat sur le fichier %s.\n”, argv[i]);
ret = 1;
}
else{
printf(“Le fichier %sa etait analyse correctement.\n”, argv[i]);
}
}

return ret;
}[/code]
Pour le compiler il suffit d’executer la commande (si vous l’avez enregistré dans le fichier stat.c) :

Je crois (espère) que ce code est portable sur tout POSIX.

Merci de m’aider. Pour ceux qui attendraient que je mette en place une forge c’est en cours mais je ne peux pour le moment pas uploader le code source avant ce week end.

2 Go pour la limite de taille de fichier ça me rappelle la limite PHP, il y a un rapport ?

Probable que PHP utilise l’appel système stat sur les fichiers transférés.
Après d’où viens la limite dans stat j’en ai aucune idée.

à priori, dans le man, je n’ai aucune mention de limitation taille/fichier.
j’aurais bien tester ton programme mais je n’ai pas de fichier supérieur a 2 gifas ^^

Bonjour,

stat s’appuie sur la structure stat définie comme ceci (sous sunOS 5.8 ) :

Je dirais que la taille gérée dépend de la définition de “off_t”.
cette définition se trouve dans le header sys/types.h.
ne pas oublier : attention au 32 ou 64 bits …

Est-ce que finalement le byte se traduit par octet donc 2⁸ ou comme il dépend de l’environnement 2³² ou 2⁶⁴ ?

J’ai un peu plus investigué. C’est en effet la taille de fichier qui n’entre pas dans la structure. Il y a un moyen ultra simple pour augmenter cette taille de 32 bits à 64bits. Il suffit d’utiliser la macro _FILE_OFFSET_BITS en la valuant à 64. Manque de bol vcp utilise fts qui n’aime pas du tout cette macro (blocage en dur dans le code source). En plus fts n’est pas POSIX mais BSD 4.4.

Donc je pense que je vais simplement virer cette bibliothèque du code (tout de moins dans la version linux).

Edition : A noter que même comme ça il y auras une limite dans la taille des fichiers si on utilise un système de fichier 128bits (comme zfs ou btrfs).

Je suis dégouté : linuxfr.org/2010/09/29/27426.html :open_mouth:
Tampis pour vcp, je contribuerais à gcp.

Au niveau fonctionnalités gcp semble plus évolué que vcp sur quelques points.

question :
pourquoi utilises-tu vcp/gcp ?
si c’est pour avoir une barre de progression sur la copie d’un fichier :

bon, par contre, les droits sont perdus mais ça ne doit pas être bien compliqué de les ré appliquer :wink:

Notement la possibilité de faire :

J’aime bien aussi avoir un fichier de configuration central (dans /etc) qui applique la configuration à tout les utilisateurs. Il me permet une configuration beaucoup plus fine que le cp originel. Bref ça se rapproche probablement d’un rsync, mais je ne m’y suis jamais mis (à rsync).