Pregunta

No debería ser difícil, ¿verdad? ¿Cierto?

Actualmente estoy rastreando la base de código de OpenAFS para encontrar la definición de encabezado de pioctl. He tirado todo lo que tengo: revisé ctags, grepped el código fuente para pioctl, etc. Lo más cercano que tengo a un prospecto es el hecho de que hay un archivo pioctl_nt.h que contiene la definición, excepto que es en realidad no es lo que quiero porque ninguno de los códigos de espacio de usuario lo incluye directamente, y es específico de Windows.

Ahora, no espero que vaya y descargue la base de código de OpenAFS y encuentre el archivo de encabezado para mí. Sin embargo, tengo curiosidad: ¿cuáles son sus técnicas para encontrar el archivo de encabezado que necesita cuando todo lo demás falla? ¿Cuáles son los peores escenarios que podrían causar que un grep para pioctl en el código base no produzca nada que se parezca a una definición de función?

También debo tener en cuenta que tengo acceso a dos programas de espacio de usuario independientes que lo han hecho correctamente, por lo que en teoría podría hacer una búsqueda O (n) de la función. Pero ninguno de los archivos de encabezado me aparece, yn es grande ...

Editar: El problema inmediato se resolvió: pioctl () se define implícitamente, como se muestra por esto:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
¿Fue útil?

Solución

Si grep -r y ctags están fallando, entonces probablemente se está definiendo como el resultado de algunas macro desagradables. Puede intentar crear el archivo más simple posible que llame a pioctl () y se compile correctamente, y luego preprocesarlo para ver qué sucede:

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

Otros consejos

Hay opciones de compilador para mostrar la salida del preprocesador. Probar esos? En una pizca horrible donde mi cabeza estaba completamente vacía de cualquier definición posible, la opción -E (en la mayoría de los compiladores de c) no hace más que arrojar el código preprocesado.

Por información solicitada : Normalmente solo capturo una compilación del archivo en cuestión, ya que se muestra en la pantalla, hago una copia y pego rápido y pongo el -E justo después de la invocación del compilador. El resultado arrojará la salida del preprocesador a la pantalla, así que rediríjalo a un archivo. Mire a través de ese archivo, ya que todas las macros y cosas tontas ya están cubiertas.

Peores escenarios:

  • Prototipos de estilo K & amp; R
  • Las macros ocultan la definición
  • Declaración implícita (según su respuesta)

¿Ha considerado usar cscope (disponible en SourceForge )?

Lo uso en algunos conjuntos de códigos bastante significativos (más de 25,000 archivos, con un alcance de aproximadamente 20,000 líneas en un archivo) con buen éxito. Se necesita un tiempo para derivar la lista de archivos (5-10 minutos) y más (20-30 minutos) para construir la referencia cruzada en un antiguo Sun E450, pero los resultados me parecen útiles.


En un Mac casi igual de antiguo (procesadores PPC de 32 bits de 1 GHz duales), cscope se ejecuta en el código fuente de OpenAFS (1.5.59) y aparece en muchos lugares donde se declara la función, a veces en línea en el código, a veces en encabezados. Tomó unos minutos escanear los archivos 4949, generando un archivo cscope.out de 58 MB.

  • openafs-1.5.59 / src / sys / sys_prototypes.h
  • openafs-1.5.59 / src / aklog / aklog_main.c (junto con el comentario " ¿Por qué AFS no proporciona estos prototipos? ")
  • openafs-1.5.59 / src / sys / pioctl_nt.h
  • openafs-1.5.59 / src / auth / ktc.c incluye un define para PIOCTL
  • openafs-1.5.59 / src / sys / pioctl_nt.c proporciona una implementación de la misma
  • openafs-1.5.59 / src / sys / rmtsysc.c proporciona una implementación de la misma (y a veces afs_pioctl () en su lugar)

El resto de las 184 instancias encontradas parecen ser usos de la función, referencias de documentación, notas de la versión, registros de cambios y similares.

La teoría de trabajo actual que hemos decidido, después de buscar en el preprocesador y no encontrar nada tampoco, es que OpenAFS está permitiendo que el compilador infiera el prototipo de la función, ya que devuelve un entero y toma el puntero, el entero, puntero, entero como sus parámetros. Me ocuparé de esto simplemente definiéndolo yo mismo.

Editar : ¡Excelente! He encontrado la pistola humeante:

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

Si bien la pregunta general original ha sido respondida, si alguien llega a esta página preguntándose dónde encontrar un archivo de encabezado que defina pioctl:

En las versiones actuales de OpenAFS (1.6.7), un protoype para pioctl se define en sys_prototypes.h. Pero en el momento en que se hizo originalmente esta pregunta, ese archivo no existía y no había un prototipo para pioctl visible desde fuera del árbol de código de OpenAFS.

Sin embargo, la mayoría de los usuarios de pioctl probablemente quieran, o al menos estén de acuerdo con usar, lpioctl (" local " pioctl), que siempre emite una llamada al sistema en la máquina local. Hay un prototipo para esto en afssyscalls.h (y en estos días, también sys_prototypes.h).

La opción más fácil en estos días, sin embargo, es simplemente usar libkopenafs. Para eso, incluye kopenafs.h, usa la función k_pioctl, y vincula contra -lkopenafs. Eso tiende a ser una interfaz mucho más conveniente que tratar de enlazar con OpenAFS libsys y otras cosas.

¿No suele decir en la sinopsis de la página man?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top