Frage

Sollte nicht schwer sein, nicht wahr? Richtig?

Ich bin derzeit Schleppen der OpenAFS Code-Basis der Header Definition von pioctl zu finden. Ich habe geworfen alles, was ich an ihm habe ausgewählt ctags, grep den Quellcode für pioctl usw. Der nächstgelegene ich an der Leine haben, ist die Tatsache, dass es eine Datei pioctl_nt.h ist, die die Definition enthält, außer es ist nicht wirklich, was ich will, weil keiner der User-Space-Code direkt enthält, und es ist bestimmte Windows.

Nun, ich erwarte Dich, nicht zu gehen und die OpenAFS Codebase herunterladen und die Header-Datei für mich zu finden. Ich bin gespannt, aber: was sind Ihre Techniken zum Auffinden der Header-Datei benötigen Sie, wenn alles andere fehlschlägt? Was sind die Worst-Case-Szenarien, die eine grep für pioctl in der Code-Basis dazu führen könnten, tatsächlich mit etwas nicht kommen, die wie eine Funktionsdefinition aussieht?

Ich sollte auch beachten Sie, dass ich Zugang zu zwei unabhängige Userspace-Programme, die es richtig gemacht haben, so in der Theorie ich einen O tun könnte (n) für die Funktion zu suchen. Aber keiner der Header-Dateien herausspringen zu mir, und n groß ...

Edit: Das unmittelbare Problem wird behoben: pioctl () implizit definiert ist, wie folgt dargestellt:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
War es hilfreich?

Lösung

Wenn grep -r und ctags versagen, dann ist es wahrscheinlich als Folge von irgendwelchen fiesen Makro (s) definiert ist. Sie können machen eine möglichst einfache Datei versuchen, die pioctl() ruft und erfolgreich kompiliert und Vorverarbeitung es dann zu sehen, was passiert:

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

Andere Tipps

Es gibt Compiler-Optionen die Präprozessorausgabe zu zeigen. Versuchen Sie das? In einem schrecklichen Not, wo mein Kopf ganz leer von einer möglichen Definition war die -E-Option (in den meist C-Compiler) tut nichts, sondern aus dem vorverarbeiteten Code speist.

Per angeforderten Informationen : Normalerweise ich erfassen nur einen Kompilierung der Datei in Frage, wie sie auf dem Bildschirm ausgegeben wird tun, ein schnelles Kopieren und Einfügen und direkt nach dem Compiler Aufruf der -E setzen. Das Ergebnis wird speien Präprozessorausgabe auf dem Bildschirm so umleiten es in einer Datei. Schauen Sie durch diese Datei als alle Makros und dumme Dinge sind bereits gesorgt.

Worst-Case-Szenarien:

  • K & R-Stil Prototypen
  • Makros verstecken sich die Definition
  • Implizite Deklaration (pro Antwort)

Haben Sie darüber nachgedacht, mit cscope (erhältlich von Source )?

Ich benutze es auf einigen ziemlich bedeutenden Codesätzen (25.000 Dateien in einer Datei auf etwa 20.000 Zeilen von bis) mit gutem Erfolg. Es dauert eine Weile, um die Dateiliste (5-10 Minuten) und länger (20-30 Minuten) abzuleiten den Querverweis auf einem alten Sun E450 zu bauen, aber ich finde die Ergebnisse nützlich.


Auf einem fast ebenso alten Mac (Dual 1 GHz PPC 32-Bit-Prozessoren), cscope läuft auf dem OpenAFS (1.5.59) Quellcode kommt mit ziemlich vielen Orten, an denen die Funktion deklariert ist, manchmal inline in Code, manchmal in Header. Es dauerte ein paar Minuten, um die 4949-Dateien zu scannen, eine 58 MB cscope.out Datei zu erzeugen.

  • openafs-1.5.59 / src / sys / sys_prototypes.h
  • openafs-1.5.59 / src / aklog / aklog_main.c (zusammen mit Kommentar "Warum nicht AFS bietet diese Prototypen?")
  • openafs-1.5.59 / src / sys / pioctl_nt.h
  • openafs-1.5.59 / src / Auth / ktc.c enthält für PIOCTL ein definieren
  • openafs-1.5.59 / src / sys / pioctl_nt.c stellt eine Implementierung davon
  • openafs-1.5.59 / src / sys / rmtsysc.c stellt eine Implementierung davon (und manchmal afs_pioctl () statt)

Der Rest der 184 Fälle gefunden scheinen Verwendungen der Funktion oder Dokumentation Referenzen oder Release Notes, Änderungsprotokolle und dergleichen.

zu sein

Die aktuelle Arbeitstheorie, dass wir haben beschlossen, nachdem sie an der Präprozessor Stossen und auch nichts zu finden, ist, dass OpenAFS ist die Vermietung der Compiler den Prototyp der Funktion ableiten, da es eine ganze Zahl zurückgibt und Zeiger, integer, Zeiger, integer als Parameter. Ich werde nur mit dieser zu tun, indem es selbst zu definieren.

Bearbeiten : Excellent! Ich habe den smoking gun gefunden:

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

Während die ursprüngliche allgemeine Frage beantwortet wurde, wenn jemand kommt zu dieser Seite fragen, wo eine Header-Datei zu finden, die pioctl definiert:

In aktuellen Versionen von OpenAFS (1.6.7), ein Prototyp für pioctl in sys_prototypes.h definiert. Aber, dass die Zeit, dass diese Frage ursprünglich gebeten wurde, diese Datei nicht existiert, und es gab keinen Prototyp für pioctl sichtbar von außerhalb des OpenAFS Codebaum.

Die meisten Nutzer von pioctl wahrscheinlich wollen, oder sind zumindest in Ordnung mit der Verwendung, lpioctl ( „local“ pioctl), die immer eine syscall auf dem lokalen Rechner ausgibt. Es ist ein Prototyp für diese in afssyscalls.h (und in diesen Tagen, sys_prototypes.h auch).

Die einfachste Möglichkeit, diese Tage, aber ist nur libkopenafs zu verwenden. Dazu gehören kopenafs.h, verwenden Sie die Funktion k_pioctl und Link gegen -lkopenafs. Das neigt dazu, eine viel bequeme Schnittstelle zu sein als zu versuchen, mit OpenAFS libsys und anderen Sachen zu verbinden.

Ist es nicht in der Regel sagen, in der Manpage Synopse?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top