Lo más importante que debe hacer es comunicarlo. Pregunte en ports@openbsd.org por si alguien ya estuviera trabajando en lo mismo. Comuníqueselo al autor original del programa, e incluya los problemas que pueda encontrar. Si aparece algún error en la información sobre la licencia hágaselo saber. Si tuvo que evitar bucles para crear el porte, dígale qué es lo que debe solucionar. Si sólo están desarrollando para Linux y da la impresión de que les trae sin cuidado el resto del mundo Unix, intente hacer que cambien de opinión.
La COMUNICACIÓN es lo que marca la diferencia entre un porte con éxito y un porte que tarde o temprano será abandonado por todos.
Antes que nada eche un vistazo a la información sobre portes en esta página y luego lea los documentos a los que se hace referencia, especialmente a la lista de comprobación de portes de OpenBSD.
¡Haga pruebas una y otra vez! y, finalmente... ¡vuelva a repasarlas!
Envíe el porte. Haga un archivo comprimido con tar y gzip del directorio del porte. Lo puede poner en un servidor público de FTP o HTTP y enviar la dirección de éste a ports@openbsd.org, o enviarlo directamente a esta dirección con codificado MIME. Elija el método que más le convenga.
/usr/local es un sistema de archivo con
frecuencia compartido entre varias máquinas mediante NFS, OpenBSD
NO usa /usr/local/etc/rc.d. Por este motivo los ficheros
de configuración específicos de cada máquina no se
pueden guardar en /usr/local, y por tanto /etc
es el repositorio central para los ficheros de configuración
específicos de cada máquina. Más aún, la
política de OpenBSD es la de no actualizar nunca de forma
automática los ficheros en /etc. Los portes que
necesitan algún tipo de configuración de arranque deben
avisar al administrador del sistema de lo que éste debe hacer en
lugar de instalar ficheros a ciegas.
-lcrypt.libc típico.
/usr/ports/infrastructure/db/user.list para más
detalles.
$OpenBSD$ al fichero de Makefile. Si importa un
porte desde otro sistema, asegúrese de que también
conserva la marca en el archivo Makefile.
strcat/strcpy/strcmp/sprintf. Como regla general,
sprintf se debe substituir siempre con
snprintf.
/tmp con enlaces simbólicos a ficheros más
estratégicos, como /etc/master.passwd.
fopen como freopen generan un nuevo
fichero o abren ficheros ya existentes con permisos para
escritura. Un atacante puede crear un enlace simbólico desde
/etc/master.passwd a /tmp/addrpool_dump. En
cuanto Vd. lo abra, el fichero de su contraseña será
filtrado. Sí, incluso con un unlink antes, que tan
sólo minimizaría el riesgo. Use open con
O_CREATIO_EXCL y fdopen en lugar de lo
anterior.
mktemp. Haga caso a los avisos del enlazador de bsd sobre
su uso. Se deben solucionar. Esto no es tan sencillo
como s/mktemp/mkstemp/g. mktemp(3) en OpenBSD-current. Un ejemplo de código
correcto que use mkstemp puede ser el de los fuentes de
ed o mail. Se puede encontrar un tipo poco
usual de código que use correctamente mktemp en el
porte rsync.
startx.
Al ser un programa setuid, se podía ejecutar con cualquier
fichero como guión (script). Si el fichero no era un
guión válido del intérprete de órdenes
("shell"), le seguía un mensaje de error junto con la
primera línea de error del fichero, sin comprobar más
permisos. Considerando que los ficheros shadow passwd a menudo
comienzan con una entrada de root, obtener esta primera línea era
bastante útil para un atacante. No abra un fichero y a
continuación ejecute fstat en el descriptor abierto
para comprobar lo podría haber abierto (o el atacante
jugará con /dev/rst0 y rebobinará su cinta);
ábralo con el uid/gid/grouplist correcto.
popen y system. En su lugar use
fork, pipe y execve.
/dev/fd/0.
inetd y simplemente añadir las
entradas relevantes a inetd.conf. Debe conocer el
"magic" apropiado requerido para poder codificar
"dæmons". Se podría decir que no se tienen
programas setuid comerciales si no se sabe cómo hacerlo.
xkobo como un ejemplo de un
cambio de este tipo.
PATH (nunca use system con
un nombre no cualificado y evite execvp), pero tampoco de
entornos menos obvios como su locale,
timezone, termcap y otros.
Nunca use system en programas
privilegiados; en su lugar cree su propia orden de línea, un
entorno controlado, y una llamada directa a execve. La
página de manual de perlsec es una buena tutorial
sobre estos problemas.
ldconfig. Setgid no basta.
issetugid trata este problema desde el
punto de vista del escritor de bibliotecas. No intente portar
bibliotecas a menos que conozca este tema a la perfección.
__OpenBSD__ se debería usar con cuentagotas o
mejor no usarlo en absoluto. Construcciones como
#if defined(__NetBSD__) || defined(__FreeBSD__)
son a menudo inapropiadas. No añada __OpenBSD__ a
éstas a ciegas. En lugar de esto, intente imaginar qué es
lo que está ocurriendo y qué es lo que se necesita. Las
páginas de manual son de gran utilidad para estos casos, ya que
incluyen comentarios de tipo historial en los que se menciona
cuándo una característica particular se integró en
BSD. Contrastar el valor numérico de
BSD con el de las versiones conocidas es por lo general la
forma correcta de hacerlo. Véase
the NetBSD package guide para obtener más información
al respecto.
BSD no es una buena idea, al contrario.
Intente incluir sys/parm.h. Esto no sólo define
BSD, sino que también le da un valor apropiado. El
fragmento de código correcto debería ser así:
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
tcgetattr funciona que si está
funcionando en BSD 4.3 o posterior, o en SystemVR4. Este tipo de
pruebas sólo confunden. La manera de hacerlas es, por ejemplo,
comprobándolo para un sistema en particular, configurar los
ficheros define con HAVE_TCGETATTR, y a
continuación proceder con el sistema siguiente. Esta
técnica separa las comprobaciones de características de
los sistemas operativos específicos. De forma rápida,
otro portado puede así simplemente añadir todas las
definiciones -DHAVE_XXX en el fichero Makefile.
También es posible escribirlo o añadirlo a un guión
de configuración para comprobar esa característica y
añadirla de modo automático. Como un ejemplo de lo que no
se debe hacer, compruebe los fuentes de nethack 3.2.2: asume un
montón de cosas basadas en el tipo del sistema. La
mayoría de éstas están obsoletas y ya no reflejan la
realidad: las funciones POSIX son más útiles que las
viejas diferencias entre BSD y SystemV, hasta el punto que algunas
funciones bsd tradicionales sólo conservan el soporte mediante
bibliotecas de compatibilidad.
include también es una mala idea: los modos de
compilación deberían ser globales. Si quiere obtener un
comportamiento POSIX dígalo, y añada #define
POSIX_C_SOURCE en todo el proyecto, no sólo cuando lo crea
conveniente.
unistd.h, fcntl.h, o
termios.h entre otras. La página de manual suele
indicar dónde se puede encontrar el prototipo. Es posible que
necesite otras cuantas macros de HAVE_XXX para conseguir el
fichero correcto. No se preocupe por incluir el mismo fichero dos
veces, los ficheros include tienen métodos de
prevención contra esto.
unsigned
long en lugar de size_t), o resultarán en
estados incorrectos de const. Además, algunos
compiladores como el gcc propio de OpenBSD, pueden hacer un trabajo
mejor como algunas funciones muy frecuentes como strlen si
incluye el fichero de cabecera correcto.
/* prototype part */
#ifdef USE_OWN_GCVT
char *foo_gcvt(double number, size_t ndigit, char *buf);
#else
/* include correct file */
#include <stdlib.h>
/* use system function */
#define foo_gcvt gcvt
#endif
/* definition part */
#ifdef USE_OWN_GCVT
char *foo_gcvt(double number, size_t ndigit, char *buf)
{
/* proper definition */
}
/* typical use */
s = foo_gcvt(n, 15, b);
bsd.port.mk definen el
camino de los instaladores. En particular, definen que se busque en
/usr/bin y /bin antes que
/usr/local/bin y /usr/X11R6/bin.
${NO_SHARED_LIBS}
es igual a "YES" (cuidado, sólo se puede definir
después de incluir bsd.port.mk). Si su porte tiene
un GNU configure, añada la línea CONFIGURE_ARGS +=
${CONFIGURE_SHARED} al fichero Makefile.
bsd.port.mk es aceptable, ya que se supone que
los usuarios deben actualizar sus árboles de portes al completo,
incluido bsd.port.mk. Ahora NEED_VERSION está
obsoleto.
update-plist para generar y actualizar
las listas de empacamiento en vez de hacerlo manualmente.
Puede comentar las lineas que no desee.
update-plist puede detectar la mayoría de los tipos de archivos
y copiar la mayoría de las anotaciones adicionales correctamente.
curses.h/libcurses/libtermlib es el
«nuevo curses». Cambio:ncurses.h ==> curses.h_USE_OLD_CURSES_ antes de incluir curses.h
(por lo general en un fichero Makefile) y enlazándolo con
-locurses.
sgtty de BSD al nuevo tcgetattr de POSIX.
Evite el viejo estilo en código nuevo. Algo de código es
posible que defina tcgetattr como sinónimo del viejo
sgtty, pero esto es como mucho una medida temporal en
OpenBSD. El código fuente de xterm es un buen
ejemplo de lo que no hay que hacer. Intente obtener la funcionalidad de
su sistema correctamente: lo que quiere es un tipo que recuerde el
estado de su terminal (probablemente typedef), una función que
extraiga el estado actual, y una función que configure un nuevo
estado. Las funciones que modifican este estado son más
difíciles, ya que tienden a variar según el sistema.
Tampoco olvide que tendrá que manejar casos en los que no
esté conectado a un terminal, y en los que se necesita poder
manejar señales: no sólo de terminación, sino
también de fondo (SIGTSTP). Debería dejar
siempre el terminal en un buen estado. Lleve a cabo verificaciones en
intérpretes de órdenes ("shells") más
viejos como sh, que no reconfiguren el terminal de ningún modo al
terminar un programa.
TERMCAP y
hacer que funcione correctamente.
sigaction para asegurarse
semánticas específicas, junto con otras llmadas al sistema
cuya referencia puede encontrar en las páginas de manual.