# Appel système stat

**URL:** <https://www.debian-fr.org/t/appel-systeme-stat/28875>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875 "2016-02-20T23:37:33Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/1 "2016-02-20T23:37:33Z")

</div>

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) :

```auto

```

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.

---

<div class="post-metadata">

**Author:** ![debianhadic](https://www.debian-fr.org/user_avatar/www.debian-fr.org/debianhadic/32/3870_2.png) [@debianhadic](https://www.debian-fr.org/u/debianhadic)\
**Post date:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/2 "2016-02-20T23:37:35Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/3 "2016-02-20T23:37:38Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![o\_b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/o/8dc957/32.png) [@o\_b](https://www.debian-fr.org/u/o_b)\
**Post date:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/4 "2016-02-20T23:37:44Z")

</div>

à 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 ^^

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/5 "2016-02-20T23:37:48Z")

</div>

Bonjour,

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

> [@struct stat](#):
>
> ```
> mode_t st_mode; /* File mode (see mknod(2)) */
> ino_t st_ino; /* Inode number */
> dev_t st_dev; /* ID of device containing */
> /* a directory entry for this file */
> dev_t st_rdev; /* ID of device */
> /* This entry is defined only for */
> /* char special or block special files */
> nlink_t st_nlink; /* Number of links */
> uid_t st_uid; /* User ID of the file's owner */
> gid_t st_gid; /* Group ID of the file's group */
> [b]off_t st_size; /* File size in bytes */[/b]
> time_t st_atime; /* Time of last access */
> time_t st_mtime; /* Time of last data modification */
> time_t st_ctime; /* Time of last file status change */
> /* Times measured in seconds since */
> /* 00:00:00 UTC, Jan. 1, 1970 */
> long st_blksize; /* Preferred I/O block size */
> blkcnt_t st_blocks; /* Number of 512 byte blocks allocated*/
> 
> ```

Je dirais que la taille gérée dépend de la définition de «&nbsp;off\_t&nbsp;».  
cette définition se trouve dans le header sys/types.h.  
ne pas oublier : attention au 32 ou 64 bits …

---

<div class="post-metadata">

**Author:** ![debianhadic](https://www.debian-fr.org/user_avatar/www.debian-fr.org/debianhadic/32/3870_2.png) [@debianhadic](https://www.debian-fr.org/u/debianhadic)\
**Post date:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/6 "2016-02-20T23:37:49Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/7 "2016-02-20T23:37:53Z")

</div>

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).

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 11:37 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/8 "2016-02-20T23:37:55Z")

</div>

Je suis dégouté : [linuxfr.org/2010/09/29/27426.html](http://linuxfr.org/2010/09/29/27426.html) 😮  
Tampis pour vcp, je contribuerais à gcp.

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

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 20, 2016, 11:38 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/9 "2016-02-20T23:38:17Z")

</div>

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

```auto

```

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

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 11:38 UTC](https://www.debian-fr.org/t/appel-systeme-stat/28875/10 "2016-02-20T23:38:17Z")

</div>

Notement la possibilité de faire :

```auto

```

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).
