Beaucoup oublient que parfois un bout de code ecrit sur le NG n'est pas
le code reel mais qu'il n'est la que pour fixer les idées. Dans la vraie
vie les codes C sont beaucoup plus gros que les 10-15 lignes qu'on ne
peut décemment poster sur une newsgroup et il est normal voir obligé de
shunter des détails important pour l'appli complète (includes par
exemple) mais pas pour le pb spécifique qui coince.
De toute façon à voir les fils les plus long, donc les points les plus
typiquement discutés sur le NG j'aurais l'impression que faire du C
revient super souvent à lire des trucs via le flux standard en
environnement unix et effectuer quelques traitement sur les chaines de
caractères. Heureusement que la programmation (et ses bugs) est beaucoup
plus riche et intéressante que cela avec pleins d'api et de traitements
variés. Du reste, quand on prend du recul, le truc qui coince sur des
petits exemples est souvent à trouver dans la logique du prog (var pas
initialisée, break mal placé, etc) que de condition d'execution rares
telles que "fread() n'a pas tout lu",ou "malloc a echoué", il te manque
tel include en environnement XYZ, etc.
Beaucoup oublient que parfois un bout de code ecrit sur le NG n'est pas
le code reel mais qu'il n'est la que pour fixer les idées. Dans la vraie
vie les codes C sont beaucoup plus gros que les 10-15 lignes qu'on ne
peut décemment poster sur une newsgroup et il est normal voir obligé de
shunter des détails important pour l'appli complète (includes par
exemple) mais pas pour le pb spécifique qui coince.
De toute façon à voir les fils les plus long, donc les points les plus
typiquement discutés sur le NG j'aurais l'impression que faire du C
revient super souvent à lire des trucs via le flux standard en
environnement unix et effectuer quelques traitement sur les chaines de
caractères. Heureusement que la programmation (et ses bugs) est beaucoup
plus riche et intéressante que cela avec pleins d'api et de traitements
variés. Du reste, quand on prend du recul, le truc qui coince sur des
petits exemples est souvent à trouver dans la logique du prog (var pas
initialisée, break mal placé, etc) que de condition d'execution rares
telles que "fread() n'a pas tout lu",ou "malloc a echoué", il te manque
tel include en environnement XYZ, etc.
Beaucoup oublient que parfois un bout de code ecrit sur le NG n'est pas
le code reel mais qu'il n'est la que pour fixer les idées. Dans la vraie
vie les codes C sont beaucoup plus gros que les 10-15 lignes qu'on ne
peut décemment poster sur une newsgroup et il est normal voir obligé de
shunter des détails important pour l'appli complète (includes par
exemple) mais pas pour le pb spécifique qui coince.
De toute façon à voir les fils les plus long, donc les points les plus
typiquement discutés sur le NG j'aurais l'impression que faire du C
revient super souvent à lire des trucs via le flux standard en
environnement unix et effectuer quelques traitement sur les chaines de
caractères. Heureusement que la programmation (et ses bugs) est beaucoup
plus riche et intéressante que cela avec pleins d'api et de traitements
variés. Du reste, quand on prend du recul, le truc qui coince sur des
petits exemples est souvent à trouver dans la logique du prog (var pas
initialisée, break mal placé, etc) que de condition d'execution rares
telles que "fread() n'a pas tout lu",ou "malloc a echoué", il te manque
tel include en environnement XYZ, etc.
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Apres avoir zieute un oeil a libarchive, j'ai l'impression
qu'archive_read_data
n'est pas le "meilleur" niveau pour t'interfacer avec celle-ci.
En particulier, tu te bouffes des copies en trop, et tu n'as pas de
facon de connaitre la taille "naturelle" des blocs lus sur ton
archive.
Par contre, la doc est un peu pourrie
, et l'utilisation precise de archive_read_data_block() a l'air un peu
space, si on regarde par exemple archive_read_data() lui-meme (on peut
pas faire la meme chose dans du code utilisateur, vu qu'il y a plein de
trucs internes.
L'utilisation dans archive_read_data_into_fd est bien plus claire.
En resume, tu peux laisser libarchive gerer son propre tampon.
Il te suffit de declarer quelques variables:
const void *buff;
size_t size;
off_t offset;
et tu peux appeler en boucle:
archive_read_data_block(a, &buff, &size, &offset) == ARCHIVE_OK
ca te positionne buff, size, et offset correctement.
Plus precisement: ca te dit que buff[ 0... size-1] contient les octets
"suivants" dans ton archive, en commencant a la position offset
(offset peut etre plus grand que la derniere valeur connue,
typiquement si tu as des trous dans ton archive).
Note que tu n'as pas le droit de modifier le contenu de buff en place,
comme indique par le const.
Tu peux assez facilement t'en servir pour tenir a jour ta ligne
courante, en t'evitant une copie.
Les questions correspondantes:
- que dois-tu faire si tu rencontres un bloc de 0 ? est-ce que la
reponse "erreur" est acceptable, ou est-ce que tu veux faire plus
precis.
- as-tu une limite de taille de ligne, ou dois-tu t'arranger pour que
ca grossisse au vol ?
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Apres avoir zieute un oeil a libarchive, j'ai l'impression
qu'archive_read_data
n'est pas le "meilleur" niveau pour t'interfacer avec celle-ci.
En particulier, tu te bouffes des copies en trop, et tu n'as pas de
facon de connaitre la taille "naturelle" des blocs lus sur ton
archive.
Par contre, la doc est un peu pourrie
, et l'utilisation precise de archive_read_data_block() a l'air un peu
space, si on regarde par exemple archive_read_data() lui-meme (on peut
pas faire la meme chose dans du code utilisateur, vu qu'il y a plein de
trucs internes.
L'utilisation dans archive_read_data_into_fd est bien plus claire.
En resume, tu peux laisser libarchive gerer son propre tampon.
Il te suffit de declarer quelques variables:
const void *buff;
size_t size;
off_t offset;
et tu peux appeler en boucle:
archive_read_data_block(a, &buff, &size, &offset) == ARCHIVE_OK
ca te positionne buff, size, et offset correctement.
Plus precisement: ca te dit que buff[ 0... size-1] contient les octets
"suivants" dans ton archive, en commencant a la position offset
(offset peut etre plus grand que la derniere valeur connue,
typiquement si tu as des trous dans ton archive).
Note que tu n'as pas le droit de modifier le contenu de buff en place,
comme indique par le const.
Tu peux assez facilement t'en servir pour tenir a jour ta ligne
courante, en t'evitant une copie.
Les questions correspondantes:
- que dois-tu faire si tu rencontres un bloc de 0 ? est-ce que la
reponse "erreur" est acceptable, ou est-ce que tu veux faire plus
precis.
- as-tu une limite de taille de ligne, ou dois-tu t'arranger pour que
ca grossisse au vol ?
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Apres avoir zieute un oeil a libarchive, j'ai l'impression
qu'archive_read_data
n'est pas le "meilleur" niveau pour t'interfacer avec celle-ci.
En particulier, tu te bouffes des copies en trop, et tu n'as pas de
facon de connaitre la taille "naturelle" des blocs lus sur ton
archive.
Par contre, la doc est un peu pourrie
, et l'utilisation precise de archive_read_data_block() a l'air un peu
space, si on regarde par exemple archive_read_data() lui-meme (on peut
pas faire la meme chose dans du code utilisateur, vu qu'il y a plein de
trucs internes.
L'utilisation dans archive_read_data_into_fd est bien plus claire.
En resume, tu peux laisser libarchive gerer son propre tampon.
Il te suffit de declarer quelques variables:
const void *buff;
size_t size;
off_t offset;
et tu peux appeler en boucle:
archive_read_data_block(a, &buff, &size, &offset) == ARCHIVE_OK
ca te positionne buff, size, et offset correctement.
Plus precisement: ca te dit que buff[ 0... size-1] contient les octets
"suivants" dans ton archive, en commencant a la position offset
(offset peut etre plus grand que la derniere valeur connue,
typiquement si tu as des trous dans ton archive).
Note que tu n'as pas le droit de modifier le contenu de buff en place,
comme indique par le const.
Tu peux assez facilement t'en servir pour tenir a jour ta ligne
courante, en t'evitant une copie.
Les questions correspondantes:
- que dois-tu faire si tu rencontres un bloc de 0 ? est-ce que la
reponse "erreur" est acceptable, ou est-ce que tu veux faire plus
precis.
- as-tu une limite de taille de ligne, ou dois-tu t'arranger pour que
ca grossisse au vol ?
Bonjour,
le 31/07/2010 à 16:47, Marc Espie a écrit dans le message
<i31d1k$17hk$ :Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Apres avoir zieute un oeil a libarchive, j'ai l'impression
qu'archive_read_data
n'est pas le "meilleur" niveau pour t'interfacer avec celle-ci.
En particulier, tu te bouffes des copies en trop, et tu n'as pas de
facon de connaitre la taille "naturelle" des blocs lus sur ton
archive.
Par contre, la doc est un peu pourrie
Je ne te le fais pas dire. Je n'ai pas regardé les sources mais la
lecture de archive.h est pratiquement indispensable., et l'utilisation precise de archive_read_data_block() a l'air un peu
space, si on regarde par exemple archive_read_data() lui-meme (on peut
pas faire la meme chose dans du code utilisateur, vu qu'il y a plein de
trucs internes.
L'utilisation dans archive_read_data_into_fd est bien plus claire.
Pas pour moi. J'ai bidouillé un peu avec mais je vois pas ce que je
dois lui passer comme fd. J'ai essayé divers trucs avec dup() sans
résultat (chaque lecture se retrouve affichée sur mon term).
En resume, tu peux laisser libarchive gerer son propre tampon.
Il te suffit de declarer quelques variables:
const void *buff;
size_t size;
off_t offset;
et tu peux appeler en boucle:
archive_read_data_block(a, &buff, &size, &offset) == ARCHIVE_OK
ca te positionne buff, size, et offset correctement.
Plus precisement: ca te dit que buff[ 0... size-1] contient les octets
"suivants" dans ton archive, en commencant a la position offset
(offset peut etre plus grand que la derniere valeur connue,
typiquement si tu as des trous dans ton archive).
Donc dans mon cas, une archive de type tar.gz, lorsque le fichier
m'intéresse, je fais un
archive_read_data_block(a, &buff, &size, &offset)
et je me retrouve avec le contenu du fichier en mémoire entre
(buff+offset) et (buff+offset+size-1), c'est bien ça ?
Ici, j'ai parcouru tout le fichier ?
Dois-je libérer la mémoire ensuite ?
Bonjour,
le 31/07/2010 à 16:47, Marc Espie a écrit dans le message
<i31d1k$17hk$1@saria.nerim.net> :
Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Apres avoir zieute un oeil a libarchive, j'ai l'impression
qu'archive_read_data
n'est pas le "meilleur" niveau pour t'interfacer avec celle-ci.
En particulier, tu te bouffes des copies en trop, et tu n'as pas de
facon de connaitre la taille "naturelle" des blocs lus sur ton
archive.
Par contre, la doc est un peu pourrie
Je ne te le fais pas dire. Je n'ai pas regardé les sources mais la
lecture de archive.h est pratiquement indispensable.
, et l'utilisation precise de archive_read_data_block() a l'air un peu
space, si on regarde par exemple archive_read_data() lui-meme (on peut
pas faire la meme chose dans du code utilisateur, vu qu'il y a plein de
trucs internes.
L'utilisation dans archive_read_data_into_fd est bien plus claire.
Pas pour moi. J'ai bidouillé un peu avec mais je vois pas ce que je
dois lui passer comme fd. J'ai essayé divers trucs avec dup() sans
résultat (chaque lecture se retrouve affichée sur mon term).
En resume, tu peux laisser libarchive gerer son propre tampon.
Il te suffit de declarer quelques variables:
const void *buff;
size_t size;
off_t offset;
et tu peux appeler en boucle:
archive_read_data_block(a, &buff, &size, &offset) == ARCHIVE_OK
ca te positionne buff, size, et offset correctement.
Plus precisement: ca te dit que buff[ 0... size-1] contient les octets
"suivants" dans ton archive, en commencant a la position offset
(offset peut etre plus grand que la derniere valeur connue,
typiquement si tu as des trous dans ton archive).
Donc dans mon cas, une archive de type tar.gz, lorsque le fichier
m'intéresse, je fais un
archive_read_data_block(a, &buff, &size, &offset)
et je me retrouve avec le contenu du fichier en mémoire entre
(buff+offset) et (buff+offset+size-1), c'est bien ça ?
Ici, j'ai parcouru tout le fichier ?
Dois-je libérer la mémoire ensuite ?
Bonjour,
le 31/07/2010 à 16:47, Marc Espie a écrit dans le message
<i31d1k$17hk$ :Concernant la solution au programme qui utilise la libarchive, je l'ai
trouvée avant de poster ce message. Ce qui m'ennuie c'est que le code
ressemble à ça :
{
while (archive_read_next_header(a, &ae) == ARCHIVE_OK) {
[...]
j = 0;
while ((r = archive_read_data(a, buf, bs))) {
Apres avoir zieute un oeil a libarchive, j'ai l'impression
qu'archive_read_data
n'est pas le "meilleur" niveau pour t'interfacer avec celle-ci.
En particulier, tu te bouffes des copies en trop, et tu n'as pas de
facon de connaitre la taille "naturelle" des blocs lus sur ton
archive.
Par contre, la doc est un peu pourrie
Je ne te le fais pas dire. Je n'ai pas regardé les sources mais la
lecture de archive.h est pratiquement indispensable., et l'utilisation precise de archive_read_data_block() a l'air un peu
space, si on regarde par exemple archive_read_data() lui-meme (on peut
pas faire la meme chose dans du code utilisateur, vu qu'il y a plein de
trucs internes.
L'utilisation dans archive_read_data_into_fd est bien plus claire.
Pas pour moi. J'ai bidouillé un peu avec mais je vois pas ce que je
dois lui passer comme fd. J'ai essayé divers trucs avec dup() sans
résultat (chaque lecture se retrouve affichée sur mon term).
En resume, tu peux laisser libarchive gerer son propre tampon.
Il te suffit de declarer quelques variables:
const void *buff;
size_t size;
off_t offset;
et tu peux appeler en boucle:
archive_read_data_block(a, &buff, &size, &offset) == ARCHIVE_OK
ca te positionne buff, size, et offset correctement.
Plus precisement: ca te dit que buff[ 0... size-1] contient les octets
"suivants" dans ton archive, en commencant a la position offset
(offset peut etre plus grand que la derniere valeur connue,
typiquement si tu as des trous dans ton archive).
Donc dans mon cas, une archive de type tar.gz, lorsque le fichier
m'intéresse, je fais un
archive_read_data_block(a, &buff, &size, &offset)
et je me retrouve avec le contenu du fichier en mémoire entre
(buff+offset) et (buff+offset+size-1), c'est bien ça ?
Ici, j'ai parcouru tout le fichier ?
Dois-je libérer la mémoire ensuite ?
In article <4c542a31$0$24090$,
Samuel DEVULDER wrote:Beaucoup oublient que parfois un bout de code ecrit sur le NG n'est pas
le code reel mais qu'il n'est la que pour fixer les idées. Dans la vraie
vie les codes C sont beaucoup plus gros que les 10-15 lignes qu'on ne
peut décemment poster sur une newsgroup et il est normal voir obligé de
shunter des détails important pour l'appli complète (includes par
exemple) mais pas pour le pb spécifique qui coince.
Question de point de vue. Moi, en pratique, les problemes que je
rencontre dans du code C se focalisent tres souvent sur quelques erreurs
courantes. Typiquement quand je corrige du code soit-disant "portable"
pour le faire marcher.
A force de passer du temps sur des milliers de lignes pour toujours
(ou presque) converger sur les memes erreurs classiques, bizarrement, tu
n'as plus du tout envie de laisser passer ces erreurs classiques.
- tu as toi-meme tes marottes.
de static dans ce thread ?
probleme pose ? (m'etonne d'ailleurs que tu n'aies pas encore commente sur
la suggestion d'utiliser strtok...)
- il y a tellement peu de trafic sur les newsgroups francophones ces
temps-ci qu'il est parfaitement possible de suivre tous les messages,
digressions comprises. Et lire en diagonale quand ca n'interesse plus est
parfaitement possible.
In article <4c542a31$0$24090$426a74cc@news.free.fr>,
Samuel DEVULDER <samuel-dot-devulder@laposte-dot-com> wrote:
Beaucoup oublient que parfois un bout de code ecrit sur le NG n'est pas
le code reel mais qu'il n'est la que pour fixer les idées. Dans la vraie
vie les codes C sont beaucoup plus gros que les 10-15 lignes qu'on ne
peut décemment poster sur une newsgroup et il est normal voir obligé de
shunter des détails important pour l'appli complète (includes par
exemple) mais pas pour le pb spécifique qui coince.
Question de point de vue. Moi, en pratique, les problemes que je
rencontre dans du code C se focalisent tres souvent sur quelques erreurs
courantes. Typiquement quand je corrige du code soit-disant "portable"
pour le faire marcher.
A force de passer du temps sur des milliers de lignes pour toujours
(ou presque) converger sur les memes erreurs classiques, bizarrement, tu
n'as plus du tout envie de laisser passer ces erreurs classiques.
- tu as toi-meme tes marottes.
de static dans ce thread ?
probleme pose ? (m'etonne d'ailleurs que tu n'aies pas encore commente sur
la suggestion d'utiliser strtok...)
- il y a tellement peu de trafic sur les newsgroups francophones ces
temps-ci qu'il est parfaitement possible de suivre tous les messages,
digressions comprises. Et lire en diagonale quand ca n'interesse plus est
parfaitement possible.
In article <4c542a31$0$24090$,
Samuel DEVULDER wrote:Beaucoup oublient que parfois un bout de code ecrit sur le NG n'est pas
le code reel mais qu'il n'est la que pour fixer les idées. Dans la vraie
vie les codes C sont beaucoup plus gros que les 10-15 lignes qu'on ne
peut décemment poster sur une newsgroup et il est normal voir obligé de
shunter des détails important pour l'appli complète (includes par
exemple) mais pas pour le pb spécifique qui coince.
Question de point de vue. Moi, en pratique, les problemes que je
rencontre dans du code C se focalisent tres souvent sur quelques erreurs
courantes. Typiquement quand je corrige du code soit-disant "portable"
pour le faire marcher.
A force de passer du temps sur des milliers de lignes pour toujours
(ou presque) converger sur les memes erreurs classiques, bizarrement, tu
n'as plus du tout envie de laisser passer ces erreurs classiques.
- tu as toi-meme tes marottes.
de static dans ce thread ?
probleme pose ? (m'etonne d'ailleurs que tu n'aies pas encore commente sur
la suggestion d'utiliser strtok...)
- il y a tellement peu de trafic sur les newsgroups francophones ces
temps-ci qu'il est parfaitement possible de suivre tous les messages,
digressions comprises. Et lire en diagonale quand ca n'interesse plus est
parfaitement possible.
...n'est qu'une vulgaire blague pour n'importe qui a déjà mis les pieds
dans une bibliothèque graphique. Toutes celles que je connais ont la
convention d'ordre x,y
...n'est qu'une vulgaire blague pour n'importe qui a déjà mis les pieds
dans une bibliothèque graphique. Toutes celles que je connais ont la
convention d'ordre x,y
...n'est qu'une vulgaire blague pour n'importe qui a déjà mis les pieds
dans une bibliothèque graphique. Toutes celles que je connais ont la
convention d'ordre x,y
strtok maintient un buffer interne, c'est evidemment pas super. Autant
utiliser strtok_r ou re-écrire cette fonction soi-même (c'est pas
difficile) et utiliser une structure passée en argument pour y stocker
les choses persistantes.
Je pense que vu la tournure de l'informatique actuelle, il va falloir
apprendre à programmer thread-safe de plus en plus souvent (fini les
Ghz, bonjour les multi-coeurs).
strtok maintient un buffer interne, c'est evidemment pas super. Autant
utiliser strtok_r ou re-écrire cette fonction soi-même (c'est pas
difficile) et utiliser une structure passée en argument pour y stocker
les choses persistantes.
Je pense que vu la tournure de l'informatique actuelle, il va falloir
apprendre à programmer thread-safe de plus en plus souvent (fini les
Ghz, bonjour les multi-coeurs).
strtok maintient un buffer interne, c'est evidemment pas super. Autant
utiliser strtok_r ou re-écrire cette fonction soi-même (c'est pas
difficile) et utiliser une structure passée en argument pour y stocker
les choses persistantes.
Je pense que vu la tournure de l'informatique actuelle, il va falloir
apprendre à programmer thread-safe de plus en plus souvent (fini les
Ghz, bonjour les multi-coeurs).
Donc dans mon cas, une archive de type tar.gz, lorsque le fichier
m'intéresse, je fais un
archive_read_data_block(a, &buff, &size, &offset)
et je me retrouve avec le contenu du fichier en mémoire entre
(buff+offset) et (buff+offset+size-1), c'est bien ça ?
Non.
Tu te retrouves avec un bout de contenu de fichier entre
buff et buff+size-1 (inclus).
offset te dit ou ca demarre dans le fichier -> d'un appel a l'autre,
offset progresse naturellement de size, sauf si tu as une archive
"a trou", auquel cas il progressera de plus, parce qu'il y a un bloc
de zeros au milieu.
Ici, j'ai parcouru tout le fichier ?
Dois-je libérer la mémoire ensuite ?
De quelle memoire parles-tu ? si c'est ta ligne, c'est toi qui geres (et si
c'est un tampon local, pas de souci).
Si c'est buff, c'est clairement gere par libarchive elle-meme...
Donc dans mon cas, une archive de type tar.gz, lorsque le fichier
m'intéresse, je fais un
archive_read_data_block(a, &buff, &size, &offset)
et je me retrouve avec le contenu du fichier en mémoire entre
(buff+offset) et (buff+offset+size-1), c'est bien ça ?
Non.
Tu te retrouves avec un bout de contenu de fichier entre
buff et buff+size-1 (inclus).
offset te dit ou ca demarre dans le fichier -> d'un appel a l'autre,
offset progresse naturellement de size, sauf si tu as une archive
"a trou", auquel cas il progressera de plus, parce qu'il y a un bloc
de zeros au milieu.
Ici, j'ai parcouru tout le fichier ?
Dois-je libérer la mémoire ensuite ?
De quelle memoire parles-tu ? si c'est ta ligne, c'est toi qui geres (et si
c'est un tampon local, pas de souci).
Si c'est buff, c'est clairement gere par libarchive elle-meme...
Donc dans mon cas, une archive de type tar.gz, lorsque le fichier
m'intéresse, je fais un
archive_read_data_block(a, &buff, &size, &offset)
et je me retrouve avec le contenu du fichier en mémoire entre
(buff+offset) et (buff+offset+size-1), c'est bien ça ?
Non.
Tu te retrouves avec un bout de contenu de fichier entre
buff et buff+size-1 (inclus).
offset te dit ou ca demarre dans le fichier -> d'un appel a l'autre,
offset progresse naturellement de size, sauf si tu as une archive
"a trou", auquel cas il progressera de plus, parce qu'il y a un bloc
de zeros au milieu.
Ici, j'ai parcouru tout le fichier ?
Dois-je libérer la mémoire ensuite ?
De quelle memoire parles-tu ? si c'est ta ligne, c'est toi qui geres (et si
c'est un tampon local, pas de souci).
Si c'est buff, c'est clairement gere par libarchive elle-meme...
In article <4c53e956$0$10221$,
xtof pernod wrote:Je dirais que c'est au programmeur. L'appli, elle, est programmée pour en
avoir rien à foutre. Ce qu'elle fait avec le plus grand bonheur..mais a l'utilisateur. Un utilisateur
Euh.. Si tu peux parler à tes utilisateurs de perm. en octal ,
pas de doute, c'est de la balle^W^W^W. l'idéal.
Mais c'est plutôt rare dans le cas général...
J'ai pas besoin de lui en parler, c'est la partie "generale" du systeme
qui positionne les choses pour lui. Si un systeme Unix loggue tes
utilisateurs avec un umask 0 par defaut, il est completement buggue.
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !Bon.. On va peut-être pas trétrasectionner pour 022 euroctals, si ?
Ou alors au comptoir. fu2 pré-postionné, il y a plein de gens inspirés.
Je risque pas de te suivre la-bas, ca fait jamais qu'une 2e erreur, hein,
Les API dont on parle sont POSIX, donc *Unix* en general.
(snip)
On est dans un groupe technique, on y parle de choses techniques. Tu
ecris des trucs qui sont des erreurs graves de programmation systeme.
J'essaie de t'expliquer pourquoi gentiement, mais tu ne veux pas comprendre.
Je le redis donc avec plus de conviction:
ouvrir un fichier en ecriture dans
un programme Unix, ca se fait le plus souvent avec 0666. Utiliser autre
chose sans raison particuliere *liee au programme* est une erreur, provenant
le plus souvent d'une profonde incomprehension des regles et usages lies
a open(2) et umask(2).
In article <4c53e956$0$10221$ba4acef3@reader.news.orange.fr>,
xtof pernod <xtof.pernod@N0SPAM.free.fr> wrote:
Je dirais que c'est au programmeur. L'appli, elle, est programmée pour en
avoir rien à foutre. Ce qu'elle fait avec le plus grand bonheur..
mais a l'utilisateur. Un utilisateur
Euh.. Si tu peux parler à tes utilisateurs de perm. en octal ,
pas de doute, c'est de la balle^W^W^W. l'idéal.
Mais c'est plutôt rare dans le cas général...
J'ai pas besoin de lui en parler, c'est la partie "generale" du systeme
qui positionne les choses pour lui. Si un systeme Unix loggue tes
utilisateurs avec un umask 0 par defaut, il est completement buggue.
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !
Bon.. On va peut-être pas trétrasectionner pour 022 euroctals, si ?
Ou alors au comptoir. fu2 pré-postionné, il y a plein de gens inspirés.
Je risque pas de te suivre la-bas, ca fait jamais qu'une 2e erreur, hein,
Les API dont on parle sont POSIX, donc *Unix* en general.
(snip)
On est dans un groupe technique, on y parle de choses techniques. Tu
ecris des trucs qui sont des erreurs graves de programmation systeme.
J'essaie de t'expliquer pourquoi gentiement, mais tu ne veux pas comprendre.
Je le redis donc avec plus de conviction:
ouvrir un fichier en ecriture dans
un programme Unix, ca se fait le plus souvent avec 0666. Utiliser autre
chose sans raison particuliere *liee au programme* est une erreur, provenant
le plus souvent d'une profonde incomprehension des regles et usages lies
a open(2) et umask(2).
In article <4c53e956$0$10221$,
xtof pernod wrote:Je dirais que c'est au programmeur. L'appli, elle, est programmée pour en
avoir rien à foutre. Ce qu'elle fait avec le plus grand bonheur..mais a l'utilisateur. Un utilisateur
Euh.. Si tu peux parler à tes utilisateurs de perm. en octal ,
pas de doute, c'est de la balle^W^W^W. l'idéal.
Mais c'est plutôt rare dans le cas général...
J'ai pas besoin de lui en parler, c'est la partie "generale" du systeme
qui positionne les choses pour lui. Si un systeme Unix loggue tes
utilisateurs avec un umask 0 par defaut, il est completement buggue.
normal aura 022 comme umask. S'il a autre chose, c'est son probleme, et
c'est pas a ton programme de decider a sa place !Bon.. On va peut-être pas trétrasectionner pour 022 euroctals, si ?
Ou alors au comptoir. fu2 pré-postionné, il y a plein de gens inspirés.
Je risque pas de te suivre la-bas, ca fait jamais qu'une 2e erreur, hein,
Les API dont on parle sont POSIX, donc *Unix* en general.
(snip)
On est dans un groupe technique, on y parle de choses techniques. Tu
ecris des trucs qui sont des erreurs graves de programmation systeme.
J'essaie de t'expliquer pourquoi gentiement, mais tu ne veux pas comprendre.
Je le redis donc avec plus de conviction:
ouvrir un fichier en ecriture dans
un programme Unix, ca se fait le plus souvent avec 0666. Utiliser autre
chose sans raison particuliere *liee au programme* est une erreur, provenant
le plus souvent d'une profonde incomprehension des regles et usages lies
a open(2) et umask(2).
J'ai fait quelques tests et offset est différent de zéro lorsque le
buffer était trop petit pour contenir tout le fichier (peut-être qu'il
y a un trou au milieu, je ne sais pas le voir). Donc si il est
égal à 0 : début d'un fichier sinon toujours dans le même fichier.
Mais en fait, je n'ai pas à m'occuper d'offset puisque la fonction me
renvoie ARCHIVE_EOF à la fin du fichier.
J'ai fait quelques tests et offset est différent de zéro lorsque le
buffer était trop petit pour contenir tout le fichier (peut-être qu'il
y a un trou au milieu, je ne sais pas le voir). Donc si il est
égal à 0 : début d'un fichier sinon toujours dans le même fichier.
Mais en fait, je n'ai pas à m'occuper d'offset puisque la fonction me
renvoie ARCHIVE_EOF à la fin du fichier.
J'ai fait quelques tests et offset est différent de zéro lorsque le
buffer était trop petit pour contenir tout le fichier (peut-être qu'il
y a un trou au milieu, je ne sais pas le voir). Donc si il est
égal à 0 : début d'un fichier sinon toujours dans le même fichier.
Mais en fait, je n'ai pas à m'occuper d'offset puisque la fonction me
renvoie ARCHIVE_EOF à la fin du fichier.