Annotation of www/porting.html, Revision 1.56
1.20 rohee 1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
1.1 marc 2: <html>
3: <head>
4: <meta http-equiv="Content-Type"
1.15 espie 5: content="text/html; charset=iso-8859-1">
1.1 marc 6: <meta name="resource-type"
1.15 espie 7: content="document">
1.1 marc 8: <meta name="description"
1.15 espie 9: CONTENT="How to make an OpenBSD port">
1.1 marc 10: <meta name="keywords"
1.15 espie 11: content="openbsd,ports">
1.1 marc 12: <meta name="distribution"
1.15 espie 13: content="global">
1.1 marc 14: <meta name="copyright"
1.54 ray 15: content="This document copyright 1997-2006 by OpenBSD.">
1.1 marc 16: <title>Building an OpenBSD port</title>
17: <link rev="made" HREF="mailto:www@openbsd.org">
18: </head>
19: <body text="#000000" bgcolor="#FFFFFF" link="#23238E">
1.43 jsyn 20: <a href="index.html"><img alt="[OpenBSD]" height="30" width="141" src="images/smalltitle.gif" border="0"></a>
1.1 marc 21:
1.20 rohee 22: <h2><font color="#e00000">Building an OpenBSD port</font></h2>
1.1 marc 23:
24: So you've just compiled your favorite software package on your
25: OpenBSD machine and you want to share your effort by turning
26: it into a standard port. What to do?
27: <p>
1.55 jolan 28: The most important thing to do is to <strong>communicate</strong>.
1.25 espie 29: Ask people on <a href="mailto:ports@openbsd.org">ports@openbsd.org</a>
30: if they are working on the same port. <em>Tell the original software
31: author about it</em>, including problems you may find. If licensing
32: information appears incorrect tell him. If you had to jump through
33: loops to make the port build, tell him what he can fix. If they are
1.32 deraadt 34: only developing on Linux and feel like ignoring the rest of the Unix
1.25 espie 35: world, try to make them change their view.
36: <p>
37: <strong>COMMUNICATION</strong> makes the difference between a successful
1.34 jufi 38: port and a port that will slowly be abandoned by everyone.
1.25 espie 39: <p>
1.9 marc 40: First look at the porting information on this page. Then check
41: out the referenced documents, especially the OpenBSD porting
1.26 espie 42: <a href="checklist.html">checklist</a>.
1.1 marc 43: <p>
1.9 marc 44: Test, then re-test, and finally test again!
45: <p>
1.56 ! espie 46: OpenBSD now fully supports updates. This means that
! 47: <a href="porting/update.html">quite a few issues</a>
! 48: must be taken into account.
! 49: <p>
1.9 marc 50: Submit the port. Create a gzipped tarball of the port directory.
51: You can then either place it on a public FTP or HTTP server, sending
1.20 rohee 52: its address to <a href="mailto:ports@openbsd.org">ports@openbsd.org</a>
1.9 marc 53: or send the port mime encoded to the same address. Pick whichever
54: method works best for you.
1.35 naddy 55:
56: <h3><font color="#0000e0">Index of Porting Documentation</font></h3>
57: <ul>
58: <li><a href="#Avail">Available Porting Information</a></li>
59: <li><a href="#Policy">OpenBSD Porting Policy</a></li>
60: <li><a href="#Security">Security Recommendations</a></li>
61: <li><a href="#Generic">Generic Porting Hints</a></li>
62: <li><a href="#Other">Other Helpful Hints</a></li>
63: </ul>
64:
65: <h3><font color="#0000e0"><a name="Avail">Available Porting Information</a></font></h3>
1.1 marc 66: <ul>
1.38 espie 67: <li>OpenBSD porting <a href="checklist.html">checklist</a>.
1.56 ! espie 68: <li>OpenBSD ports <a href="porting/update.html">update guidelines</a>.
1.38 espie 69: <li>The man page
1.41 rohee 70: <a href="http://www.openbsd.org/cgi-bin/man.cgi?query=bsd.port.mk&sektion=5">bsd.port.mk(5)</a>.
1.38 espie 71: This documents the ports infrastructure makefile that is
72: included at the end of each individual port makefile.
73: There are still a few comments at the start of
1.39 horacio 74: the file itself, but most of the useful information is now
1.38 espie 75: documented.
76: <li>Some differences from other BSD port systems, mostly a summary
77: of <a href="porting/diffs.html">infrastructure differences</a>.
78: <li><a href="porting/libraries.html">Using shared libraries
79: in OpenBSD Ports</a>. The rules there are <strong>very
1.51 espie 80: important</strong> as soon as you use shared libraries.
81: <li><a href="porting/autoconf.html">GNU autoconf specificities</a>,
82: how to deal with it in the context of OpenBSD ports.
83: <li><a href="porting/config.html">Configuration files</a>,
84: one frequent stumbling block for new developers, and the unique
85: tools the OpenBSD ports tree has to deal with these.
1.38 espie 86: <li><a href="audio-port.html">Porting audio applications to OpenBSD</a>.
1.1 marc 87: <li>The
1.13 art 88: <a href="http://www.netbsd.org/Documentation/software/packages.html">
89: NetBSD Package System</a> documentation. This document describes
90: NetBSD's version of the FreeBSD ports system and is quite helpful.
1.33 naddy 91: <li>The
1.42 pvalchev 92: <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/index.html">FreeBSD
1.33 naddy 93: Porter's Handbook</a>. This is the FreeBSD porting bible.
1.1 marc 94: <li>The OpenBSD ports mailing list,
1.50 alek 95: <a href="mailto:ports@openbsd.org">ports@openbsd.org</a>.
1.1 marc 96: </ul>
1.35 naddy 97: <h3><font color="#0000e0"><a name="Policy">OpenBSD Porting Policy</a></font></h3>
1.1 marc 98: <ul>
1.24 rohee 99: <li>OpenBSD does NOT use <code>/usr/local/etc/rc.d</code>.<br>
1.7 espie 100: <code>/usr/local</code> is often shared between several machines
1.15 espie 101: thanks to NFS. For this reason, configuration files that are specific
102: to a given machine can't be stored under <code>/usr/local</code>,
103: <code>/etc</code> is the central repository for per machine
104: configuration files. Moreover, OpenBSD policy is to never update
105: files under <code>/etc</code> automatically. Ports that need some
106: specific boot setup should advise the administrator about what to do
107: instead of blindly installing files.
1.1 marc 108: <li>OpenBSD does NOT compress man pages.
109: <li>OpenBSD does NOT require <code>-lcrypt</code>.<br>
110: DES encryption is part of the standard <code>libc</code>.
1.46 sturm 111: <li>OpenBSD has a separate namespace for users and groups created by ports.
112: See <code>/usr/ports/infrastructure/db/user.list</code> for details.
1.10 espie 113: <li>OpenBSD is strongly security-oriented. You should read and understand
1.42 pvalchev 114: this page's <a href="#Security">security section</a>.
1.24 rohee 115: <li>Be sure to add the <code>$OpenBSD$</code> CVS tag to
1.10 espie 116: the Makefile. If importing a port from another system be sure to
1.48 xsa 117: leave their tag in the Makefile, too.
1.10 espie 118: <li>The goal is to get all ported applications to support OpenBSD. To
119: achieve this goal you <strong>must</strong> feed any OpenBSD patches
120: back to the application maintainer.
121: </ul>
1.35 naddy 122: <h3><font color="#0000e0"><a name="Security">Security Recommendations</a></font></h3>
1.10 espie 123: There are many security problems to worry about. If
1.2 marc 124: you are not absolutely sure of what you are doing please request
1.1 marc 125: help from the <a href="mailto:ports@openbsd.org">ports</a> mailing
126: list.
1.10 espie 127:
128: <ul>
1.20 rohee 129: <li>Do <em>not</em> use alpha or beta code when preparing a port. Use the
1.10 espie 130: latest regular or patch release.
131:
1.1 marc 132: <li>Any software to be installed as a server should be scanned
133: for buffer overflows, especially unsafe use of
134: <code>strcat/strcpy/strcmp/sprintf</code>. In general,
135: <code>sprintf</code> should be replaced with <code>snprintf</code>.
1.10 espie 136:
1.17 espie 137: <li>Never use filenames instead of true security. There are numerous race
1.10 espie 138: conditions where you don't have proper control. For instance, an attacker
139: who already has user privileges on your machines may replace files in
140: <code>/tmp</code> with symbolic links to more strategic files, such as
1.19 rohee 141: <code>/etc/master.passwd</code>.
1.16 espie 142:
143: <li>For instance, both <code>fopen</code> and <code>freopen</code>
144: <strong>create a new file or open an existing file</strong> for
145: writing. An attacker may create a symbolic link from
1.19 rohee 146: <code>/etc/master.passwd</code> to <code>/tmp/addrpool_dump</code>. The
1.16 espie 147: instant you open it, your password file is hosed. Yes, even with
148: an <code>unlink</code> right before. You only narrow the window
149: of opportunity. Use <code>open</code> with
1.22 rohee 150: <code>O_CREAT|O_EXCL</code> and <code>fdopen</code> instead.
1.15 espie 151:
1.16 espie 152: <li>Another very common problem is the <code>mktemp</code>
1.17 espie 153: function. Heed the warnings of the bsd linker about its uses.
1.15 espie 154: <strong>These must be fixed</strong>.
155: This is not quite as simple as <code>s/mktemp/mkstemp/g</code>. <br>
1.54 ray 156: Refer to
157: <a href="http://www.openbsd.org/cgi-bin/man.cgi?sektion=3&query=mktemp"
158: ><code>mktemp(3)</code></a> for more information.
1.15 espie 159: Correct code using <code>mkstemp</code> includes the source to
160: <code>ed</code> or <code>mail</code>.
161: A rare instance of code that uses <code>mktemp</code> correctly
162: can be found in the <code>rsync</code> port.
1.10 espie 163:
164: <li>Just because you can read it doesn't mean you should. A well-known hole
165: of this nature was the <code>startx</code> problem. As a setuid program,
166: you could launch startx with any file as a script. If the file was not
167: a valid shell script, a syntax error message would follow, along with the
168: first line of the offending file, without any further permission check.
169: Pretty handy to grab the first line of a shadow passwd file, considering
1.12 deraadt 170: these often start with root entry. Do not open your file, and then do
171: an <code>fstat</code> on the open descriptor to check if you should have
1.15 espie 172: been able to open it (or the attacker will play with /dev/rst0 and rewind
1.12 deraadt 173: your tape) -- open it with the correct uid/gid/grouplist set.
1.10 espie 174:
175: <li>Don't use anything that forks a shell in setuid programs before dropping
1.15 espie 176: your privileges. This includes <code>popen</code> and
177: <code>system</code>.
1.10 espie 178: Use <code>fork</code>, <code>pipe</code> and <code>execve</code> instead.
179:
1.15 espie 180: <li>Pass open descriptors instead of filenames to other programs to
181: avoid race conditions. Even if a program does not accept file
182: descriptors, you can still use <code>/dev/fd/0</code>.
1.10 espie 183:
1.15 espie 184: <li>Access rights are attached to file descriptors. If you need setuid rights
1.10 espie 185: to open a file, open that file, then drop your privileges. You can still
186: access the open descriptor, but you have less to worry about. This is
187: double-edged: even after dropping privileges, you should still watch out
188: for those descriptors.
189:
190: <li>Avoid root setuid as much as you can. Basically, root can do anything,
1.15 espie 191: but root rights are very rarely needed, except maybe to create
192: socket ports with a number under 1024. It is arguably better to
193: keep that under <code>inetd</code>
1.10 espie 194: control and just add the relevant entries to <code>inetd.conf</code>.
195: You must know the appropriate magic for writing daemons to achieve that.
1.15 espie 196: It could be argued that you have no business writing setuid programs
197: if you don't know how to do that.
1.10 espie 198:
1.15 espie 199: <li>Use setgid instead of setuid. Apart from those specific files needed
200: by setgid programs, most files are not group-writable. Hence, a
201: security problem in a setgid program won't compromise your system as
202: much: with only group rights, the worst an intruder will be able to
203: do is hack a games score table or some such.
1.10 espie 204: See the <code>xkobo</code> port for an instance of such a change.
205:
1.15 espie 206: <li>Don't trust group-writable files. Even though they are audited,
207: setgid programs are not perceived as important potential security
208: holes. Hence stuff they can tamper with shouldn't be considered
209: sensitive information.
210:
211: <li>Don't trust your environment ! This involves simple things such as
212: your <code>PATH</code> (never use <code>system</code> with an
213: unqualified name, avoid <code>execvp</code>), but also more subtle
214: items such as your locale, timezone, termcap, and so on.
215: Be aware of transitivity: even though you're taking full precautions,
216: programs you call directly won't necessarily. <strong>Never</strong>
217: use <code>system</code> in privileged programs, build your command
218: line, a controlled environment, and call <code>execve</code> directly.
219: The <code>perlsec</code> man page is a good tutorial on such problems.
220:
1.31 jufi 221: <li>Never use setuid shell-scripts. These are inherently insecure.
1.15 espie 222: Wrap them into some C code that ensures a proper environment.
223: On the other hand, OpenBSD features secure perl scripts.
224:
225: <li>Beware the dynamic loader. If you are running setuid, it will only
226: use trusted libraries that were scanned with ldconfig.
227: Setgid is not enough.
228:
229: <li>Dynamic libraries are tricky. C++ code sets a similar problem.
230: Basically, libraries may take some action based upon your environment
231: before your main program even gets to check its setuid status.
232: OpenBSD <code>issetugid</code> addresses this problem, from the
233: library writer point of view. Don't try to port libraries unless you
234: understand this issue thoroughly.
1.10 espie 235: </ul>
1.35 naddy 236: <h3><font color="#0000e0"><a name="Generic">Generic Porting Hints</a></font></h3>
1.10 espie 237: <ul>
238: <li><code>__OpenBSD__</code> should be used sparingly, if at all.
239: Constructs that look like
240: <pre>
241: #if defined(__NetBSD__) || defined(__FreeBSD__)
242: </pre>
243: are often inappropriate. Don't add blindly <code>__OpenBSD__</code>
244: to it. Instead, try to figure out what's going on, and what actual
245: feature is needed. Manual pages are often useful, as they include
246: historic comments, stating when a particular feature was incorporated
247: into BSD. Checking the numeric value of <code>BSD</code> against known
248: releases is often the right way. See
1.53 grunk 249: <a href="http://www.netbsd.org/Documentation/pkgsrc/">The NetBSD pkgsrc guide</a>
1.10 espie 250: for more information.
251: <li>Defining <code>BSD</code> is a bad idea. Try to include <code>sys/param.h</code>.
252: This not only defines <code>BSD</code>, it also gives it a proper value.
253: The right code fragment should look like:
254: <pre>
1.23 rohee 255: #if (defined(__unix__) || defined(unix)) && !defined(USG)
1.10 espie 256: #include <sys/param.h>
257: #endif
258: </pre>
259: <li>Test for features, not for specific OSes. In the long run, it is much
1.15 espie 260: better to test whether <code>tcgetattr</code> works than whether
261: you're running under BSD 4.3 or later, or SystemVR4. These kind of
262: tests just confuse the issue. The way to go about it is, for instance,
263: to test for one particular system, set up a slew of
264: <code>HAVE_TCGETATTR</code> defines, then proceed to the next system.
265: This technique separates features tests from specific OSes.
266: In a hurry, another porter can just add the whole set of
267: <code>-DHAVE_XXX</code> defines to the Makefile. One may also write
268: or add to a configure script to check for that feature and add it
269: automatically. As an example not to follow, check nethack 3.2.2
270: source: it assumes loads of things based on the system type. Most
271: of these assumptions are obsolete and no longer reflect reality:
272: POSIX functions are more useful than older BSD versus SystemV
273: differences, to the point that some traditional bsd functions are
1.10 espie 274: now only supported through compatibility libraries.
275:
276: <li>Avoid include files that include other includes that... First, because
1.15 espie 277: this is inefficient. Your project will end up including a file that
278: includes everything. Also, because it makes some problems difficult
279: to fix. It becomes harder to <em>not</em> include one particular file
280: at a given point.
1.10 espie 281:
282: <li>Avoid bizarre macro tricks. Undefining a macro that was defined by a
283: header file is a bad idea. Defining macros to get some specific behavior
1.15 espie 284: from an include file is also a bad idea: compilation modes should be
285: global. If you want POSIX behavior, say so, and
286: <code>#define POSIX_C_SOURCE</code>
1.10 espie 287: throughout the whole project, not when you feel like it.
288:
289: <li>Don't ever write system function prototypes. All modern systems,
290: OpenBSD included, have a standard location for these prototypes. Likely
1.15 espie 291: places include <code>unistd.h</code>, <code>fcntl.h</code> or
292: <code>termios.h</code>.
293: The man page frequently states where the prototype can be found.
294: You might need another slew of <code>HAVE_XXX</code> macros to
295: procure the right file. Don't worry about including the same file
296: twice, include files have guards that prevent all kinds of nastiness.<br>
1.10 espie 297: If some broken system needs you to write the prototype, don't impose
1.15 espie 298: on all other systems. Roll-your-own prototypes will break because they
299: may use types that are equivalent on your system, but are not portable
300: to other systems (<code>unsigned long</code> instead of
301: <code>size_t</code>), or get some <code>const</code> status wrong.
302: Also, some compilers, such as OpenBSD's own gcc,
1.10 espie 303: are able to do a better job with some very frequent functions such as
304: <code>strlen</code> if you include the right header file.
305:
306: <li>Don't use the name of a standard system function for anything else.
1.15 espie 307: If you want to write your own function, give it its own name, and
308: call that function everywhere. If you wish to revert to the
309: default system function, you just need to comment your code out,
310: and define your own name to the system function. Don't do it the
311: other way round. Code should look like this
1.10 espie 312: <pre>
313: /* prototype part */
314: #ifdef USE_OWN_GCVT
315: char *foo_gcvt(double number, size_t ndigit, char *buf);
316: #else
317: /* include correct file */
318: #include <stdlib.h>
319: /* use system function */
320: #define foo_gcvt gcvt
321: #endif
322:
323: /* definition part */
324: #ifdef USE_OWN_GCVT
325: char *foo_gcvt(double number, size_t ndigit, char *buf)
326: {
1.15 espie 327: /* proper definition */
328: }
1.10 espie 329:
330: /* typical use */
331: s = foo_gcvt(n, 15, b);
332: </pre>
1.1 marc 333: </ul>
1.35 naddy 334: <h3><font color="#0000e0"><a name="Other">Other Helpful Hints</a></font></h3>
1.1 marc 335: <ul>
1.15 espie 336: <li>Recent versions of <code>bsd.port.mk</code> set the installers
337: path. Specifically, they set <code>/usr/bin</code> and
338: <code>/bin</code> to be searched <em>before</em>
339: <code>/usr/local/bin</code> and <code>/usr/X11R6/bin</code>.
1.19 rohee 340: <li>Do <em>NOT</em> generate shared libraries if
1.49 espie 341: <code>${NO_SHARED_LIBS}</code> is set to yes (beware, it can be defined
1.21 rohee 342: only after inclusion of <code>bsd.port.mk</code>). If your port has
343: a GNU configure simply add the line
344: <code>CONFIGURE_ARGS += ${CONFIGURE_SHARED}</code> to the Makefile.
1.44 pvalchev 345: <li>It is OK to rely on a feature that appeared in a recent version of
346: <code>bsd.port.mk</code>, as people are supposed to update their
347: whole ports tree, including <code>bsd.port.mk</code>.
348: NEED_VERSION is now obsolete.
1.49 espie 349: <li>Prefer using <code>update-plist</code> to generate and update
350: packing-lists instead of doing things manually.
351: You can comment unwanted lines out.
352: <code>update-plist</code> can detect most file types and copy most
353: extra annotations correctly.
1.52 msf 354: <li>Add <code>USE_SYSTRACE=Yes</code> to <code>/etc/mk.conf</code> to
355: detect misbehaving scripts, makefiles, etc.
1.1 marc 356: <li>In OpenBSD <code>curses.h/libcurses/libtermlib</code> are the
357: ``new curses''. Change:<br>
1.15 espie 358: <code>ncurses.h ==> curses.h</code><br>
359: ``old (BSD) curses'' is available by defining
360: <code>_USE_OLD_CURSES_</code>
1.11 millert 361: before including <code>curses.h</code> (usually in a Makefile) and
1.15 espie 362: linking with <code>-locurses</code>.
1.11 millert 363: <li>In OpenBSD, terminal discipline has been upgraded from the older BSD
364: <code>sgtty</code> to the newer POSIX <code>tcgetattr</code> family.
1.15 espie 365: Avoid the older style in new code. Some code may define
366: <code>tcgetattr</code> to be a synonym for the older
367: <code>sgtty</code>, but this is at best a stopgap measure on OpenBSD.
368: The <code>xterm</code> source code is a very good example of
369: what not to do. Try to get your system functionality right: you
370: want a type that remembers the state of your terminal
371: (possible typedef), you want a function that extracts the current
372: state, and a function that sets the new state.
373: Functions that modify this state are more difficult, as they tend
374: to vary depending upon the system. Also, don't forget that you will
375: have to handle cases where you are not connected to a terminal,
376: and that you need to handle signals: not only termination, but
377: also background (<code>SIGTSTP</code>). You should always leave
378: the terminal in a sane state. Do your tests under an older shell,
379: such as sh, which does not reset the terminal in any way at
1.10 espie 380: program's termination.
1.15 espie 381: <li>The newer termcap/terminfo and curses, as included with OpenBSD,
382: include standard sequences for controlling color terminals. You
383: should use these if possible, reverting to standard ANSI color
384: sequences on other systems. However, some terminal descriptions
385: have not been updated yet, and you may need to be able to specify
386: these sequences manually. This is the way vim handles it. This is
387: not strictly necessary. Except for privileged programs, it is
388: generally possible to override a termcap definition through the
1.10 espie 389: <code>TERMCAP</code> variable and get it to work properly.
1.15 espie 390: <li>Signal semantics are tricky, and vary from one system to another.
391: Use <code>sigaction</code> to ensure a specific semantics, along
392: with other system calls referenced in the corresponding manpage.
1.1 marc 393: </ul>
394: <hr>
1.6 pauls 395: <a href="index.html"><img height=24 width=24 src=back.gif border=0 alt=OpenBSD></a>
1.20 rohee 396: <a href="mailto:www@openbsd.org">www@openbsd.org</a>
1.56 ! espie 397: <br><small>$OpenBSD: porting.html,v 1.55 2006/05/02 17:31:32 jolan Exp $</small>
1.1 marc 398: </body>
399: </html>