Domanda

Non dovrebbe essere difficile, vero? Giusto?

Attualmente sto cercando la base di codice OpenAFS per trovare la definizione dell'intestazione di pioctl. Ho gettato tutto quello che ho: check ctags, grepped il codice sorgente per pioctl, ecc. Il più vicino che ho in testa è il fatto che c'è un file pioctl_nt.h che contiene la definizione, tranne che è non in realtà quello che voglio perché nessuno del codice di userspace lo include direttamente ed è specifico di Windows.

Ora, non mi aspetto che tu vada e scarichi la base di codice OpenAFS e trovi il file header per me. Sono curioso, però: quali sono le tue tecniche per trovare il file header che ti serve quando tutto il resto fallisce? Quali sono gli scenari peggiori che potrebbero far sì che un grep per pioctl nella base di codice non riesca a trovare qualcosa che assomigli a una definizione di funzione?

Dovrei anche notare che ho accesso a due programmi indipendenti di spazio utente che l'hanno fatto correttamente, quindi in teoria potrei fare una ricerca O (n) per la funzione. Ma nessuno dei file di intestazione mi appare, e n è grande ...

Modifica: Il problema immediato è stato risolto: pioctl () è definito implicitamente, come mostrato da questo:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
È stato utile?

Soluzione

Se grep -r e ctags stanno fallendo, è probabile che sia definito come il risultato di alcune macro cattive. Puoi provare a creare il file più semplice possibile che chiama pioctl () e si compila correttamente, quindi preelaborarlo per vedere cosa succede:

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

Altri suggerimenti

Esistono opzioni del compilatore per mostrare l'output del preprocessore. Prova quelli? In un orribile pizzico in cui la mia testa era completamente vuota di ogni possibile definizione l'opzione -E (nella maggior parte dei compilatori c) non fa altro che vomitare il codice preelaborato.

Per informazioni richieste : normalmente acquisisco solo una compilazione del file in questione poiché viene emessa sullo schermo, eseguo una copia e incolla rapida e inserisco -E subito dopo l'invocazione del compilatore. Il risultato emetterà l'output del preprocessore sullo schermo, quindi reindirizzarlo su un file. Dai un'occhiata a quel file poiché tutte le macro e le cose stupide sono già curate.

Scenari peggiori:

  • K & amp; R style prototypes
  • Le macro nascondono la definizione
  • Dichiarazione implicita (per risposta)

Hai preso in considerazione l'utilizzo di cscope (disponibile da SourceForge )?

Lo uso su alcuni insiemi di codici abbastanza significativi (oltre 25.000 file, che vanno fino a circa 20.000 righe in un file) con buon successo. Ci vuole un po 'di tempo per ricavare l'elenco dei file (5-10 minuti) e più a lungo (20-30 minuti) per costruire il riferimento incrociato su un antico Sun E450, ma trovo utili i risultati.


Su un Mac quasi ugualmente antico (doppi processori PPC a 32 bit a 1 GHz), cscope eseguito sul codice sorgente OpenAFS (1.5.59) presenta un sacco di punti in cui viene dichiarata la funzione, a volte in linea nel codice, a volte nelle intestazioni. Ci sono voluti alcuni minuti per scansionare i file 4949, generando un file cscope.out da 58 MB.

  • openafs-1.5.59 / src / sys / sys_prototypes.h
  • openafs-1.5.59 / src / aklog / aklog_main.c (insieme al commento " Perché AFS non fornisce questi prototipi? ")
  • openafs-1.5.59 / src / sys / pioctl_nt.h
  • openafs-1.5.59 / src / auth / ktc.c include una definizione per PIOCTL
  • openafs-1.5.59 / src / sys / pioctl_nt.c ne fornisce un'implementazione
  • openafs-1.5.59 / src / sys / rmtsysc.c ne fornisce un'implementazione (e talvolta afs_pioctl () invece)

Il resto delle 184 istanze trovate sembrano essere usi della funzione, o riferimenti alla documentazione, o note di rilascio, registri delle modifiche e simili.

L'attuale teoria di lavoro che abbiamo deciso, dopo aver dato un'occhiata al preprocessore e non aver trovato nulla, è che OpenAFS sta lasciando che il compilatore deduca il prototipo della funzione, poiché restituisce un numero intero e accetta pointer, integer, puntatore, intero come i suoi parametri. Mi occuperò di questo semplicemente definendolo da solo.

Modifica : eccellente! Ho trovato la pistola fumante:

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

Mentre alla domanda generale originale è stata data una risposta, se qualcuno arriva a questa pagina chiedendosi dove trovare un file di intestazione che definisce pioctl:

Nelle versioni correnti di OpenAFS (1.6.7), un protoipo per pioctl è definito in sys_prototypes.h. Ma quella volta che questa domanda era stata originariamente posta, quel file non esisteva e non c'era nessun prototipo di pioctl visibile dall'esterno dell'albero del codice OpenAFS.

Tuttavia, la maggior parte degli utenti di pioctl probabilmente desidera, o almeno è d'accordo con l'uso, lpioctl ("quot" locale "pioctl), che emette sempre un syscall sul computer locale. C'è un prototipo per questo in afssyscalls.h (e in questi giorni, anche sys_prototypes.h).

L'opzione più semplice in questi giorni, tuttavia, è solo usare libkopenafs. Per questo, includi kopenafs.h, usa la funzione k_pioctl e collega contro -lkopenafs. Quella tende ad essere un'interfaccia molto più conveniente rispetto al tentativo di collegarsi con libsys OpenAFS e altre cose.

Di solito non dice nella sinossi della pagina man?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top