Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[NetBSD] Comportement étrange de fprintf()

13 réponses
Avatar
JKB
Bonjour à tous,

Je viens d'installer un NetBSD/amd64 dans une virtualbox pour tester
différentes choses (et ne pas bricoler mes machines de production).
J'ai recompilé un programme que j'utilise de longue date sur NetBSD
sans problème.

Le NetBSD en question n'est pas la dernière mouture : il s'agit d'un
5.1 avec noyau officiel.

Souci : le programme ne se lance pas.

Après bissection du code, je me suis rendu compte que le problème
était à l'intérieur d'un fprintf() :

if (fprintf(f_source, "MODE_INTERACTIF\n") < 0)
{
perror("fprintf");
return(EXIT_FAILURE);
}

Ce fprintf() me renvoit EINVAL (!). Naturellement, j'ai bien vérifié
les droits d'accès (de toute façon, même en root le problème est le
même). Le fichier en question est créé par :

if ((f_source = fopen(nom_fichier_temporaire, "w")) == NULL)
{
...
return(EXIT_FAILURE);
}

et la création du fichier se passe bien. La variable
nom_fichier_temporaire est une chaîne de caractères créée de toute
pièce en fonction d'une racine, du pid, du tid et d'un compteur.
Elle est correcte.

EINVAL semble provenir de l'appel write() sous-jacent à fprintf().
Dans la doc, je lis :

[EINVAL] The pointer associated with d was negative.
[EINVAL] The total length of the I/O is more than can be
expressed by the ssize_t return value.

Je ne vois pas trop comment je pourrais être dans l'un des deux cas.
Peut-être dans le premier, mais je ne vois pas comment je pourrais
influer sur le pointeur asocié au descripteur de fichiers...

Une idée ?

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr

3 réponses

1 2
Avatar
Tonton Th
On 10/17/2012 08:19 AM, JKB wrote:

Très honnêtement, je ne suis pas sûr que le problème vienne de
NetBSD lui-même et je crois qu'il ne me reste plus que la bissection
du code :-(



Déja, as-tu essayé de dumper ta structure FILE juste après
le fopen et juste avant le fprintf ?


--

Nous vivons dans un monde étrange/
http://foo.bar.quux.over-blog.com/
Avatar
JKB
Le Tue, 16 Oct 2012 08:39:36 +0000 (UTC),
JKB écrivait :
Bonjour à tous,

Je viens d'installer un NetBSD/amd64 dans une virtualbox pour tester
différentes choses (et ne pas bricoler mes machines de production).
J'ai recompilé un programme que j'utilise de longue date sur NetBSD
sans problème.

Le NetBSD en question n'est pas la dernière mouture : il s'agit d'un
5.1 avec noyau officiel.

Souci : le programme ne se lance pas.

Après bissection du code, je me suis rendu compte que le problème
était à l'intérieur d'un fprintf() :

if (fprintf(f_source, "MODE_INTERACTIFn") < 0)
{
perror("fprintf");
return(EXIT_FAILURE);
}



Le problème venait bien d'ici, mais était particulièrement vicieux.
fprintf() est en fait une macro qui effectue une translitération
dans l'encodage courant du système grâce à iconv(). Et l'encodage
source du système est donné par 'locale charmap' qui renvoie 646 (?)
sur ma machine de test et une valeur utilisable par iconv dès que
LANG est positionné.

Je suis rassuré, le problème était dans le code de l'application.
Enfin, à moitié rassuré, parce que je vieillis. J'aurais dû
rechercher tout de suite s'il n'y avait pas une macro tordue dans un
coin...

Merci à ceux qui se sont penchés sur le problème,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
xavier
JKB wrote:

Très honnêtement, je ne suis pas sûr que le problème vienne de
NetBSD lui-même et je crois qu'il ne me reste plus que la bissection
du code :-(



As-tu essayé avec un VMWare (licence 15 ou 30 jours d'essai) ?
Mais ça dépend de l'hôte, bien sûr. Si l'hôte est un NetBSD, ça dit quoi
dans XEN ?

--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)
1 2