Question

Ne devrait pas être difficile, non? Droit?

Je suis en train de parcourir la base de code OpenAFS pour trouver la définition d'en-tête de pioctl. J'ai jeté tout ce que j'ai sur le problème: ctags vérifiés, récupéré le code source de pioctl, etc. Le plus proche d'un lead est le fait qu'il existe un fichier pioctl_nt.h qui contient la définition, sauf que c'est pas vraiment ce que je veux car aucun code de l’espace utilisateur ne l’inclut directement, et il est spécifique à Windows.

Maintenant, je ne m'attends pas à ce que vous alliez télécharger la base de code OpenAFS et rechercher le fichier d'en-tête pour moi. Je suis toutefois curieux: quelles sont vos techniques pour trouver le fichier d’en-tête dont vous avez besoin lorsque tout le reste échoue? Quels sont les pires scénarios qui pourraient empêcher un grep de pioctl dans la base de code de créer quoi que ce soit qui ressemble à une définition de fonction?

Je dois également noter que j’ai accès à deux programmes d’espace utilisateur indépendants qui l’ont correctement exécuté. En théorie, je pourrais donc effectuer une recherche O (n) de la fonction. Mais aucun des fichiers d’en-tête ne m’arrive, et n est volumineux ...

Modifier: Le problème immédiat a été résolu: pioctl () est défini implicitement, comme indiqué par ceci:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
Était-ce utile?

La solution

Si grep -r et ctags échouent, cela est probablement dû à une ou plusieurs macros méchantes. Vous pouvez essayer de créer le fichier le plus simple possible qui appelle pioctl () et le compile avec succès, puis le prétraitement pour voir ce qui se passe:

gcc -E test.c -o test.i
grep pioctl -C10 test.i

Autres conseils

Il existe des options de compilation pour afficher la sortie du préprocesseur. Essayez ceux-là? Dans un pincement horrible où ma tête était complètement vide de toute définition possible, l'option -E (dans la plupart des c compilateurs) ne fait que cracher le code prétraité.

Selon les informations demandées : normalement, je viens de capturer une compilation du fichier en question au fur et à mesure de sa sortie à l'écran. Effectuez un copier-coller rapide et placez le -E juste après l'invocation du compilateur. Le résultat affichera la sortie du préprocesseur à l'écran, alors redirigez-le vers un fichier. Parcourez ce fichier car toutes les macros et les bêtises sont déjà prises en charge.

Les scénarios les plus défavorables:

  • Prototypes de style K & R
  • Les macros cachent la définition
  • Déclaration implicite (selon votre réponse)

Avez-vous envisagé d’utiliser cscope (disponible à partir de SourceForge )?

Je l'utilise avec des ensembles de codes assez importants (plus de 25 000 fichiers, allant jusqu'à environ 20 000 lignes dans un fichier) avec succès. La liste des fichiers (5 à 10 minutes) prend plus de temps (20 à 30 minutes) à établir la référence croisée sur un ancien Sun E450, mais je trouve les résultats utiles.

Sur un Mac presque aussi ancien (deux processeurs PPC 32 bits à 1 GHz), cscope s’exécutant sur le code source OpenAFS (1.5.59) fournit de nombreux emplacements où la fonction est déclarée, parfois en ligne, parfois dans les en-têtes. L'analyse des 4949 fichiers a pris quelques minutes, générant ainsi un fichier cscope.out de 58 Mo.

  • openafs-1.5.59 / src / sys / sys_prototypes.h
  • openafs-1.5.59 / src / aklog / aklog_main.c (avec le commentaire "Pourquoi AFS ne fournit-il pas ces prototypes?")
  • openafs-1.5.59 / src / sys / pioctl_nt.h
  • openafs-1.5.59 / src / auth / ktc.c inclut une définition pour PIOCTL
  • openafs-1.5.59 / src / sys / pioctl_nt.c en fournit une implémentation
  • openafs-1.5.59 / src / sys / rmtsysc.c en fournit une implémentation (et parfois afs_pioctl () à la place)

Le reste des 184 instances trouvées semblent être des utilisations de la fonction ou des références de documentation, ou des notes de publication, des journaux de modifications, etc.

La théorie de travail actuelle sur laquelle nous avons décidé, après avoir examiné le préprocesseur sans rien trouver non plus, est qu'OpenAFS laisse le compilateur déduire le prototype de la fonction, car il renvoie un entier et prend un pointeur, un entier, pointeur, entier comme paramètre. Je traiterai de cela simplement en le définissant moi-même.

Modifier : Excellent! J'ai trouvé le pistolet fumant:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’

Bien que l'on ait répondu à la question générale d'origine, si quelqu'un se présente sur cette page en se demandant où trouver un fichier d'en-tête définissant pioctl:

Dans les versions actuelles d’OpenAFS (1.6.7), un prototype pour pioctl est défini dans sys_prototypes.h. Mais à l'époque où cette question avait été posée à l'origine, ce fichier n'existait pas et il n'existait aucun prototype de pioctl visible de l'extérieur de l'arbre de code OpenAFS.

Cependant, la plupart des utilisateurs de pioctl souhaitent probablement utiliser lpioctl ("pioctl local"), ou sont au moins en mesure de l’utiliser, qui émet toujours un appel système sur la machine locale. Il existe un prototype dans afssyscalls.h (et ces jours-ci aussi sys_prototypes.h).

L’option la plus simple de nos jours consiste toutefois à utiliser libkopenafs. Pour cela, incluez kopenafs.h, utilisez la fonction k_pioctl, et link contre -lkopenafs. Cela a tendance à être une interface beaucoup plus pratique que d’essayer de créer un lien avec OpenAFS libsys et d’autres choses.

Ne dit-on pas habituellement dans le synopsis de la page de manuel?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top