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 una hojeada 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/share/mk/bsd.port.mk es el makefile
del sistema de portes que se incluye al final del makefile de cada
porte individual. Lea los comentarios que encontrará al
principio del makefile. Describen muy bien las opciones para make.
/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.
$OpenBSD$ al fichero de Makefile. Si importa
un porte desde otro sistema, asegúrese de que también
conserva la marca en el fichero Makefile. En el caso de que el
porte se haga desde FreeBSD substituya la marca de FreeBSD
$Id$ por la marca
$FreeBSD$.
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. Vea
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} (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 no olvide
añadir una línea NEED_VERSION = x.yy en
el fichero Makefile.
curses.h/libcurses/libtermlib es el
«nuevo curses». Cambie lo siguiente:ncurses.h ==> curses.h-lncurses ==> -lcurses_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.