La chose la plus importante à faire est de communiquer. Demandez aux personnes sur ports@openbsd.org si elles travaillent déjà sur ce port. Parlez en à l'auteur du logiciel, en évoquant aussi les problèmes que vous pourriez rencontrer. Si l'information sur la licence utilisée apparait comme incorrecte, informez le en. Si vous avez du jongler pour faire la construction du port, dites lui ce qu'il pourrait corriger. S'ils développent exclusivement sur Linux et ignorent le reste du monde Unix, essayez de les faire changer de point de vue.
La COMMUNICATION fait la différence entre un port réussi et un port qui sera abandonné progressivement par tout le monde.
Premièrement, regardez les informations de portage sur cette page. Ensuite, consultez les documents référencés, notamment la liste de contrôle de portage OpenBSD.
Testez, et re-testez, et enfin testez encore !
Désormais, OpenBSD supporte complètement les mises à jour. Ceci signifie qu'un certain nombre de problèmes doivent être pris en compte.
Soumettez le port. Créez un tarball gzippé du répertoire du port. Vous pouvez soit le déposer sur un serveur FTP ou HTTP publique, soit l'envoyer à ports@openbsd.org, soit envoyer le port avec un encodage mime à la même adresse. Choisissez la méthode qui vous convient le plus.
Porter un nouveau programme prend du temps. Le maintenir sur le long terme est encore plus dur. Cela ne pose pas de problème de porter un logiciel et laisser d'autres personnes le maintenir par la suite. Il n'y a aucun problème non plus à aider à maintenir d'autres ports tant que vous communiquez afin d'éviter de dupliquer les efforts.
Dans la culture OpenBSD, le MAINTAINERship (i.e. la
maintenance) n'est pas un statut mais une responsabilité. Nous avons
CVS et les commentaires pour créditer qui de droit. Un
mainteneur est autre chose : une personne qui assume la
responsabilité de la bonne marche du port et qui peut se permettre de
passer du temps afin de s'assurer qu'il fonctionne aussi bien que
possible.
/usr/local/etc/rc.d./usr/local est parfois partagé entre plusieurs
machines grâce à NFS. Pour cette raison, les fichiers de
configuration spécifiques à une machine ne peuvent être stockés
dans /usr/local, /etc est le dépôt
central pour les fichiers de configuration propres à une machine.
De plus, la politique d'OpenBSD est de ne jamais mettre à jour
les fichiers dans /etc automatiquement. Les ports
qui nécessitent des réglages de "boot" spécifiques devraient
informer l'administrateur de ce qu'il faut faire plutôt que
d'installer aveuglément les fichiers.
-lcrypt.libc standard.
/usr/ports/infrastructure/db/user.list pour les
détails.
$OpenBSD$ dans le Makefile. Si vous importez
le port d'un autre système, assurez vous d'enlever également les
"tags" précédents dans le Makefile.
strcat/strcpy/strcmp/sprintf. En général,
sprintf devrait être remplacé par
snprintf.
/tmp avec des
liens symboliques vers des fichiers plus stratégiques, comme
/etc/master.passwd.
fopen ainsi que freopen
créent un nouveau fichier ou en ouvrent un
existant en écriture. Un attaquant pourrait créer un
lien symbolique depuis /etc/master.passwd vers
/tmp/addrpool_dump. Au moment ou vous l'ouvrez, le
fichier de mots de passe est modifié. Oui, même avec un
unlink juste avant. Vous ne faites que rétressir le
champ des possibilités. Utilisez plutôt open avec
O_CREAT|O_EXCL et fdopen.
mktemp Ne négligez pas les avertissements de
l'éditeur de liens bsd sur son utilisation. Ces derniers
doivent être corrigés. Ce n'est pas aussi simple que
s/mktemp/mkstemp/g. mktemp(3) pour plus d'informations.
Le code correct utilisant mkstemp
inclus les sources de ed et mail. Un
des rares cas d'utilisation correcte de mktemp est
le port de rsync.
startx. En tant que programme
setuid, vous pouviez lancer startx avec tout script. Si le
fichier n'était pas un script shell valide, un message d'erreur
suivait, affichant la première ligne du fichier en question, sans
aucune vérification supplémentaire. Il était ainsi très facile
d'afficher la première ligne du fichier de mots de passe shadow,
celle-ci étant souvent l'entrée root. N'ouvrez pas votre fichier,
et faites ensuite un fstat sur le descripteur ouvert
pour vérifier si vous auriez été en mesure de l'ouvrir (ou
l'attaquant jouera avec /dev/rst0 et réembobinera votre bande) --
ouvrez le avec des informations uid/gid/grouplist correctes.
popen et system. Utilisez
fork, pipe et execve à la
place.
/dev/fd/0.
inetd,
vous n'avez qu'a ajouter les entrées correspondantes dans
inetd.conf. Vous devez connaitre la magie appropriée
pour écrire des démons réussis. On peut dire que vous n'avez pas
d'intérêt à écrire des programmes setuid si vous ne savez pas
comment le faire.
xkobo pour un exemple d'un tel changement.
"PATH"
(n'utilisez jamais system avec un nom sans chemin
indiqué, évitez execvp), mais aussi des éléments
plus subtiles comme votre locale, votre fuseau horaire, votre
"termcap" et ainsi de suite. Rendez vous compte de la relativité
: même si vous prenez des précautions importantes, les programmes
que vous appelez directement ne le sont pas nécessairement.
Ne jamais utiliser system dans des
programmes privilégiés, construisez votre ligne de commande, un
environnement contrôlé, et appelez execve
directement. La page de manuel perlsec est un bon
guide sur les problèmes de ce genre.
issetugid d'OpenBSD règle ce problème du
point de vue de l'auteur de la bibliothèque. N'essayez pas de porter
des bibliothèques si vous ne comprenez pas ces problèmes. __OpenBSD__ devrait être utilisé avec parcimonie.
Les constructions qui ressemblent à
#if defined(__NetBSD__) || defined(__FreeBSD__)
sont souvent inappropriées. N'y ajoutez pas aveuglément
__OpenBSD__ . Essayez plutôt de comprendre ce qui se
passe, et quelles sont les fonctionnalités actuellement
nécessaires. Les pages de manuel sont souvent utiles, car elles
contiennent des commentaires historiques, et traitent du moment
ou une fonctionnalité particulière fut intégrée dans BSD. La
vérification de la valeur numérique de BSD plutôt
que les revisions connues est souvent le bon moyen. Consultez
le guide pkgsrc de NetBSD pour plus d'informations.
BSD est une mauvaise idée. Essayez
d'inclure sys/param.h. Cela ne définit pas seulement
BSD, mais lui donne aussi une valeur propre. Le bon
fragment de code devrait ressembler à : #if
(defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h> #endif
tcgetattr plutôt que de le faire seulement sous BSD
4.3 ou plus récent, ou SystemVR4. Les tests de ce genre ne font
que confondre le problème. Le moyen d'obtenir des résultats est,
par exemple, de tester pour un système particulier, configurer un
groupe de définitions HAVE_TCGETATTR, et passez au
système suivant. Cette technique sépare les fonctionnalités de
tests des spécificités des OS. Dans la précipitatation, un autre
porteur peut juste ajouter le jeu de définitions -
DHAVE_XXX complet au Makefile. L'un d'entre eux peut aussi
écrire ou ajouter à un script "configure" la vérification de
cette fonctionnalité et son ajout automatique. Pour un exemple
qu'il ne faut pas suivre, consultez les sources de nethack 3.2.2
: elles contiennent des chargements basés sur le type du système.
La plupart de ces prétentions sont obsolètes et ne reflettent
plus la réalité : les fonctions POSIX sont plus utiles que les
plus anciennes différences entre BSD et SystemV, au point que
certaines fonctions bsd traditionnelles sont à présent seulement
supportées dans les bibliothèques de compatibilité.
#define
POSIX_C_SOURCE dans le code de tout le projet, et pas
seulement quand vous en aurez besoin.
unistd.h, fcntl.h ou
termios.h. La page de manuel traite fréquemment du
lieu ou le prototype peut être trouvé. Vous devriez avoir besoin
d'un autre groupe de macros HAVE_XXX pour vous
procurez le bon fichier. Ne soyez pas inquiet sur le fait
d'inclure un même fichier deux fois, les fichiers "d'includes"
ont des gardes qui préviennent de désagréments liés à ceci.entier long non signé plutôt que
size_t), ou obtenir des états const
incorrects. Aussi, des compilateurs, comme le gcc d'OpenBSD, sont
capables de produire un meilleur travail avec des fonctions très
fréquentes comme strlen si vous incluez le bon
fichier d'entête.
déclaration implicite de la fonction foo()
indique que cette fonction a un prototype manquant.
Cela signifie que la compilateur retournera le type comme étant
un entier.
La ou la fonction retourne actuellement un pointeur, sur une
plate-forme 64-bit il sera tronqué, causant habituellement une
erreur de segmentation.
/* 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 positionnent
les chemins des installeurs. Spécifiquement, ils positionnent
/usr/bin et /bin pour être parcourus
avant /usr/local/bin et /usr/X11R6/bin.
${NO_SHARED_LIBS} est positionné à oui (prenez
garde, cela peut être définit seulement après l'inclusion de
bsd.port.mk). Si votre port a un "configure" GNU,
ajoutez simplement CONFIGURE_ARGS +=
${CONFIGURE_SHARED} au Makefile.
bsd.port.mk est OK, car les gens sont supposés
mettre à jour leurs arbres de ports complets, incluant
bsd.port.mk. NEED_VERSION est à présent obsolète.
update-plist pour générer
et mettre à jour les listes de paquetage plutôt que de faire les
choses manuellement. Vous pouvez commenter les lignes inutiles.
update-plist peut détecter la plupart des mtypes et
copier la plupart des annotations additionnelles correctement.
USE_SYSTRACE=Yes dans
/etc/mk.conf afin de détecter les scripts qui se
comportent bizarrement, les makefiles etc.
curses.h/libcurses/libtermlib sont les
``nouvelles curses''. Changement :ncurses.h ==>
curses.h_USE_OLD_CURSES_ avant l'inclusion de
curses.h (généralement dans un Makefile) et édition
de liens avec -locurses.
sgtty BSD vers la nouvelle famille POSIX
tcgetattr. Evitez l'ancien style dans le nouveau
code. Certains codes pourraient définir tcgetattr
comme étant un synonyme de l'ancienne sgtty, mais
ceci est au mieux un espace de stop sur OpenBSD. Le code source
de xterm est un très bon exemple de ce qu'il ne faut
pas faire. Essayez de rendre les fonctionnalités de votre système
correctes : vous voulez un type qui se souvient de l'état de
votre terminal (typedef possible), vous voulez une fonction qui
extrait l'état courant, et une fonction qui applique le nouvel
état. Les fonctions qui modifient cet état sont plus compliquées,
car elles tendent à varier selon le système. Aussi, n'oubliez pas
que vous pourriez être amené à des cas ou vous n'êtes pas
connecté à un terminal, et ou vous devriez gérer les signaux, pas
seulement ceux de terminaison, mais aussi d'arrière plan
(SIGTSTP). Vous devriez toujours laisser un terminal
avec un état correct. Faites vos tests sur un shell plus ancien,
comme sh, qui ne réinitialise pas le terminal lors de la
terminaison du programme.
TERMCAP et avoir un fonctionnement correct.
sigaction pour être sur d'une
sémantique, ainsi qu'avec les autres appels système référencés
dans les pages de manuel correspondantes.