.Ch "Known Porting Problems With C News" .Ix problems porting .SH Intro .PP C News in general is pretty portable. People have got it to run on a very wide range of systems with little trouble. Difficulties are usually problems in the system, not C News. Some of them, however, are widespread enough to be worth comment, for the guidance of people having problems. If you run into a novel problem, we are always interested in hearing about such things. .SH Unix Dependencies .PP The biggest portability glitch in C News is that it depends a lot on Unix utilities. The extensive use of complex shell files, \fIsed\fR and \fIawk\fR programs, and a wide range of lesser Unix utilities would make it quite difficult to move C News to a system that is seriously non-Unix-like. The actual C programs seldom depend on Unix in major ways. (An exception is the use of \fIread\fR system calls in \fIexpire\fR, to avoid difficulties with stdio end-of-file behavior; we now know how to avoid this but haven't implemented the fixes yet.) .PP .Ix Unix Minix .Ix Unix utilities .Ix sed .Ix awk We know that \fIawk\fR and the colon (:) operator of \fIexpr\fR are problem areas under Minix. .SH Shell Problems .PP C News seriously stress-tests shells. The current Minix shell is not robust enough in the face of complex inputs, botches some constructs entirely, and can run out of memory on the complex shell files. Any shell that is too old to implement comments begun by ``#'' is big trouble, since we use such comments everywhere. .PP Any system/shell combination that thinks that a shell script starting with ``#!\ /bin/sh'' should be run by the C Shell (because it starts with `#') is also big trouble: you will have to change that line to ``:\ use\ /bin/sh'' everywhere. We know that at least some releases of Xenix have this problem. It is not necessary that your kernel understand the ``#!'' feature\(emwe believe that nothing in C News relies on it\(embut it is essential that it not cause invocation of the C Shell. .PP We know that some Hewlett-Packard Unixes have broken shells, probably the result of mistakes in HP's efforts to make the shell 8-bit-clean; the symptom is that something like: .DS .ft B x=y if test " $x" != " y" then echo oops fi .ft .DE prints ``oops''. This is, again, big trouble, because we do that a lot. .PP .Ix machines 3b1 .Ix 3b1 Many people using 3B1s, aka UNIX PCs, run the Korn shell as their \fI/bin/sh\fR. .Ix shell Korn .Ix ksh Some other folks may do this too. Beware that \fIksh\fR was not fully \fIsh\fR-compatible for a long time, with some subtle differences in the ill-documented behavior of backquotes and backslashes. Some of the C News shell scripts, notably \fIinews\fR, are known to hit these bugs. We are \fItold\fR that current \fIksh\fRs have fixed them. .PP .Ix Unix SunOS 4.0 It is reliably reported that SunOS 4.0.\fIx\fR shells will dump core in some ill-defined circumstances, when the user environment (sum of all environment variables) is exactly the wrong size. Perhaps this has been fixed in 4.1. .PP .Ix Unix "Ultrix 3.1" It is reliably reported that the VAX 3.1 Ultrix shell is somewhat broken and gives various kinds of trouble. Switching to \fI/bin/sh5\fR (note that this requires fixing the first line of a zillion shell files) is reported to banish the problems. .PP .Ix wait .Ix breakage wait .Ix inews .Ix NNTP It is reliably reported that recent SunOS shells give the wrong exit status from the \fIwait\fR command: they give a 0 for a successful wait, rather than giving the exit status of the process waited for. This makes \fIinews \-W\fR appear to always succeed even if backgrounded parts of it failed, which can be troublesome in NNTP environments where correct exit status is important. .SH Make Problems .PP .Ix make .Ix machines 3b2 .Ix 3b2 .Ix SVID .Ix Unix A/UX There is a persistent problem on 3B2s with implementations of \fImake\fR that violate the SVID in a subtle way. They attempt to execute makefile commands directly, rather than via the shell, if the commands do not contain metacharacters. This means that if\(emas on many 3B2s\(em\fItest\fR is a shell builtin \fIand there is no /bin/test program\fR, the makefile line ``test\ \-s\ file'' will cause \fImake\fR to complain about an unknown command. (The SVID says that makefile commands must be executed as if by the shell, and the shell will execute this line correctly.) We've added `;' on the ends of such lines, which suffices to convince \fImake\fR to run a shell on the systems we've encountered, but AT&T is good at finding ways to break such workarounds. This problem is also known to occur in A/UX. .PP .Ix Unix Ultrix Another obscure problem, a bug in either \fImake\fR or the shell, appears in at least some releases of Ultrix: a construct like .DS .ft B ln ... || cp ... .ft .DE in a shell file is seen as an error\(emand \fImake\fR aborts\(emwhen the \fIln\fR fails, even though the \fIcp\fR would work. .SH Offsetof .Ix offsetof .Ix "ANSI C" .PP ANSI C requires C compilers to supply a macro \fIoffsetof\fR, which can be used to find the offset of a structure member within the structure. \fIRelaynews\fR's header-parsing code uses it, defining it if the system has not supplied it. Unfortunately, it is really hard to write a portable version of this. The implementation we currently use is: .DS .ft B #define offsetof(type, mem) ((char *)&((type *)NULL)\->mem \- (char *)NULL) .ft .DE The table in \fIrelay/hdrdefs.c\fR .Ix initializers .Ix hdrdefs.c puts invocations of \fIoffsetof\fR in initializers. This turns out to be a severe stress test for C compilers. A compilation error in \fIhdrdefs.c\fR is almost certain to be problems with this macro. Some compilers, notably the one in Microport System V for the 286, .Ix Unix "Microport System V for the 286" reject it. We have heard a report that System V Release 2 on the VAX silently miscompiles it! .Ix Unix "System V Release 2 on the VAX" If you have trouble with \fIoffsetof\fR, you might try this version instead: .DS .ft B #define offsetof(type, mem) ((int)&((type *)NULL)\->mem) .ft .DE .SH Fast Stdio Routines .Ix stdio "faster internals" .Ix problems stdio .PP We supply a set of fast standard-I/O routines that are compatible with most AT&T-derived implementations of \fIstdio\fR. They speed up C News quite a bit. However, they don't work on all Unixes. The tester program we supply, which the library-build procedure runs, is thought to diagnose such problems 100% of the time. It has been reported in the past that A/UX and Microport 386 stdios .Ix Unix A/UX .Ix Unix "Microport 386" flunk the test. SunOS 4.0 used to pass the test falsely, but improvements in both the test and the routines seem to have cured the problems: 4.0.3 passes the test and as far as we can tell, the routines run correctly under it. .PP In any case, if you are feeling nervous or are having mysterious problems, telling \fIbuild\fR that you don't want to use the fast-stdio stuff is always safe. This is also the best response if you have trouble compiling those routines. .SH void .Ix void .Ix "old compilers" .PP Old compilers that don't understand the \fIvoid\fR type will choke on much of our code. .Ix news.h There is a commented-out ``#define\ void\ int'' in \fInews.h\fR that cures most cases of this if you uncomment it. (We have a report that you might need to add ``\-Dvoid=int'' to the Makefile in \fIlibv7\fR if you're using that library.) C News does not rely on the ANSI C ``void\ *'' type as far as we know. .SH Modes in fopen .Ix fopen .Ix Unix Minix .PP Unix V7 documented only ``r'', ``w'', and ``a'' as suitable mode arguments to \fIfopen\fR. It actually implemented the read/write modes, ``r+'', ``w+'', and ``a+'', as well, and C News relies on them. Unix reimplementations based on old documentation may have trouble here; we know that at least the older versions of Minix really don't implement these modes. .PP A related complication in Minix is that \fIftell\fR reportedly doesn't give the right answer in ``a'' mode. This makes \fIdbz\fR flunk its regression test. .Ix dbz .SH MAXLONG .Ix MAXLONG .Ix Unix Unisys .PP The \fIrelay/cpu.h\fR file formerly defined a constant \fIMAXLONG\fR which is the biggest positive value of a \fIlong\fR. The definition was clever but failed on some odd systems (Unisys?). Current versions of C News generate the value dynamically in a less fallible way, and check the value for plausibility. (This is encountered when \fIrelaynews\fR is asked to process a single article, not a batch. This happens primarily when an article is posted locally, with \fIinews\fR.) .Ix inews It is still barely possible that the plausibility check will fail on some bizarre system. .SH df Output Format .Ix df .PP .Ix spacefor The \fIspacefor\fR utility needs to understand the output format of \fIdf\fR, unless you're lucky enough to have a system that has one of the semi-standard system calls to report disk space. There are numerous variations on \fIdf\fR. \fIBuild\fR and the relevant makefiles know about the more common ones, but customization may be necessary. \fISpacefor\fR is commented well enough that it should be possible to figure out the necessary changes; usually the initializations of \fInr\fR and \fInf\fR are all that need changing. If there are colons (:) in your \fIdf\fR's output format, you should probably start from the ``sysv'' \fIspacefor\fR, which attempts to preprocess the output to get rid of System V garbage; .Ix Unix "System V" .Ix "System V" breakage otherwise the ``bsd'' one is a reasonable starting point. .PP One constant nuisance is \fIdf\fRs that are too stupid to take a directory name as an argument. The long-term solution to this is to edit a suitable variant of \fIspacefor\fR to know about the proper arguments. A short-term solution is to use the ``null'' variant, sacrificing space checking for the sake of getting something working. .PP .Ix Unix HP-UX We're told that HP-UX 7.0 users are best advised to choose the ``bsd'' variant of spacefor, and edit it to call \fIbdf\fR instead of \fIdf\fR. Similar approaches may be useful on other hybrid SysV/BSD systems. .SH Floating Point .Ix "floating point" .Ix expire .Ix awk .PP The only places in our code where floating point is used, as far as we know, are in the calculation of expiry dates in \fIexpire\fR and the calculation of space in some of the variants of \fIspacefor\fR. These are not performance bottlenecks, so slow floating-point arithmetic is not a problem. Complete absence of floating point would require only minor modifications. Note, however, that we use \fIawk\fR a lot, and the typical \fIawk\fR implementation uses floating point extensively. .SH 386 Optimizer vs. dbz .Ix machines 386 .Ix dbz .Ix problems "broken 386 optimiser" .Ix Unix "System V" .Ix "System V" breakage .Ix Unix "SCO Xenix/386 2.3" .PP We have a reliable report that the System V 386 optimizer (invoked when \fIcc\fR is given the \fB\-O\fR option) miscompiles the \fIdbz\fR package badly enough to cripple it, without producing any error messages. The only fix is to compile \fIdbz\fR without \fB\-O\fR. .PP SCO Xenix/386 2.3 has the same problem. .SH nnafree and nnfree .Ix nnafree .Ix nnfree .Ix machines HP .PP We have a reliable report that the HP Spectrum C compiler has an optimiser bug that makes it throw up (with a ``cc: Internal error 3279: Please contact your local HP representative'' message) on the \fInnafree\fR macro (and \fInnfree\fR, a historical synonym) in \fIh/news.h\fR. .Ix news.h The following revised version of the macro reportedly avoids the problem. .DS .ft B #define nnafree(mempp) do { if (*(mempp) != 0) { free((char *)*(mempp)); \e *(mempp) = 0; }} while (0) .ft .DE .PP .Ix Unix Microport It is also reliably reported that the Microport compiler objects to these macros in large model. Whether the above fix would suffice is not known. Manual expansion [barf!] is known to work, although it would be less painful to define a function containing the right code and change the macro to call the function. Code for a suitable function can, in fact, be found in \fIh/news.h\fR, inside `#ifdef\ lint'. .SH ANSI C .Ix "ANSI C" .PP Although we made an effort to be ANSI-C compatible, lack of access to a real ANSI C compiler limits our ability to do this. A secondary problem is that it's really very difficult to get code that is 100% acceptable to both ANSI C compilers and older compilers. Some issues inevitably got resolved in favor of current compilers, and may cause complaints from ANSI C compilers. .PP Work is in progress on moving us closer to ANSI compatibility. Beware that if \fB__STDC__\fR is defined .Ix __STDC__ by your compiler but it is \fInot\fR ANSI compatible, you are on your own as far as we're concerned, even if the value is specified as 0. (We can't just use ``#if\ __STDC__'' because some preprocessors choke on the appearance of an unknown identifier in #if.) .SH GNU C .Ix "GNU C" .PP If compiling with the GNU compiler, you may need the \fB\-traditional\fR flag. Beware, also, that if you are using your system's \fIdbm\fR library, it contains functions that return structure values, and the GNU conventions for handling such values are incompatible with the ones in many AT&T-derived compilers. The \fB\-fpcc-struct-return\fR option cures this. .SH Awk Problems .Ix awk .PP A number of problems can arise if your \fIawk\fR has bugs, since the shell files rely on \fIawk\fR fairly extensively. For example, \fIawk\fR is a prime suspect if \fIspacefor\fR doesn't work. We've fixed the worst trouble spots, but would appreciate detailed information on any more. .PP .Ix awk "line length limits" One known problem that is hard to avoid is line-length limits in \fIawk\fR. In particular, for several purposes in control-message handling C News wants to build a ``canonical'' representation of the \fIsys\fR file, with backslashed newlines removed. This is done by NEWSBIN\fI/relay/canonsys.awk\fR. .Ix canonsys.awk Most \fIawk\fRs have limits on line length, and some of the limits are too low to cope with long multiply-continued \fIsys\fR lines. 512-byte limits, found in a number of old \fIawk\fRs, are particularly troublesome. A quick look indicates that this will interfere, to some uncertain extent, with \fIcheckgroups\fR and \fIsendsys\fR. .Ix checkgroups .Ix "control messages" checkgroups .Ix sendsys .Ix "control messages" sendsys Big deal. :-) The complaint may also appear from \fInewgroup\fR, .Ix newgroup .Ix "control messages" newgroup but there it should be harmless. .PP .Ix Unix HP-UX Bart Muyzer and Martijn Roos Lindgreen report that HP-UX 8.0 \fIawk\fR is badly broken, such that (for example) the regular expression ``/[\et ]/'' will match backslashes and t's as well as tabs and spaces. Installing the HP-UX 7.0 \fInawk\fR as \fIawk\fR is reportedly a workable fix. .SH Systems Without Hard Links .Ix links .PP .Ix Unix unoid Some vaguely Unixoid systems have trouble implementing real (``hard'') links. Examples are VMS in general and Eunice in particular. .Ix VMS .Ix Eunice There are some hooks for dealing with this, but it's not trivial. .PP .Ix relaynews \fIRelaynews\fR will try to make symbolic links if real ones fail. There is one exception: if \fIrelaynews\fR cannot buffer up enough of the article in memory to find the `Newsgroups:' line, it will drop the article into a temporary file and will rely on being able to move that to the first of the `real' locations by manipulating links. This should essentially never happen except on 16-bit machines, and should be rare even on them. .PP .Ix expire \fIExpire\fR has a \fB\-l\fR option which tells it to consider the first filename of an article its `leader', not expiring the article under that name until it has expired under all others. This has not been tested much recently. .PP .Ix lock The locking system (both C routines and the \fInewslock\fR program) will need revision in some system-dependent way to avoid use of links. .PP There is one minor use of links in installation (\fIinews\fR is found in two places, and the Makefile attempts a link before doing a copy), and substantially more in the regression tests. .SH 16-bit Machines .Ix machines small .Ix machines PDP-11 .PP C News has been tested on 16-bit machines\(emindeed, a good bit of the early development work was done on one\(emand does run on them. Nothing relies on ints being 32 bits. Nothing relies on pointers and ints being the same size, as far as we know. Nothing relies on large address spaces, although one or two modules come in separate small-space and large-space versions, and the small-space versions are slower. .PP However, there are some fundamental limits to consider. Both \fIrelaynews\fR and \fIexpire\fR\(emthe usual trouble spots for space shortages\(emwant to keep lots of stuff in core. There isn't any easy way around this one. .SH Number of File Descriptors .Ix "file descriptors" .PP There is a constant, NOPENBFS, in \fIrelay/trbatch.c\fR, .Ix relay/trbatch.c .Ix relaynews that defines how many batch files are kept open simultaneously. If you are feeding much news to more systems than this, \fIrelaynews\fR performance will suffer. .PP .Ix NOPENBFS The major limit on NOPENBFS is available file descriptors (although on a 16-bit machine there might also be a shortage of memory for \fIstdio\fR buffers). Other parts of \fIrelaynews\fR want perhaps 10 file descriptors for other purposes, so with the usual total supply of 20, a NOPENBFS value of 10 is the right default. If you feed many people, and your kernel provides a process with more than 20 file descriptors, you probably want to boost NOPENBFS (this can be done with -DNOPENBFS=xxx in the makefile). Remember to leave about 10 descriptors worth of headroom. .SH Shell Processing Order .Ix shell .Ix problems shell .PP Normally, shell variable expansion should take place before scanning for syntax elements such as ``0<&1''. At least one reimplementation of the shell (specifically, Bash 1.04) does things in the wrong order. This is known to affect, at least, \fIrelay/sh/anne.jones\fR, .Ix anne.jones which can be fixed by changing (circa line 44) .DS .ft B "") USER="`who am i <&$fd | .ft .DE to .DS .ft B "") USER="`eval \e"who am i <&$fd\e" | .ft .DE or so we are told. .SH Binary-Mode Fopen .Ix fopen .Ix "ANSI C" .Ix dbz .PP In several places, the new \fIdbz\fR uses ANSI C ``binary mode'' fopen codes, e.g. `fopen(...,\ "r+b")'. The text/binary distinction involved is meaningless under Unix, and most Unix implementations just ignore trailing nonsense in the second argument of \fIfopen\fR, so it all works out nicely. .PP .Ix Unix Ultrix Unfortunately... at least one version of DEC's Ultrix objects to the `b's, we are told. Sigh. DEC will have to fix this to make their systems ANSI compatible, but heaven only knows how long that will take. .PP Meanwhile, the fix is to delete the `b's in the second arguments of the \fIfopen\fRs in three places in \fIdbminit()\fR in \fIdbz/dbz.c\fR, if your system has this particular bit of brain damage. .SH size_t .Ix problems size_t .Ix size_t .Ix Unix Microport .PP Some systems, notably from Microport, do not define the \fIsize_t\fR type in the \fI\fR header. Worse, the \fIsize_t\fR in that header doesn't necessarily bear any relationship to the ANSI C \fIsize_t\fR. This causes trouble in the \fIdbz\fR library in particular. The proper type for \fIsize_t\fR is whatever the C \fIsizeof\fR operator returns, nominally an unsigned type which is large enough to contain the size of any memory object. We think nothing relies too heavily on it being unsigned. Note that \fIsize_t\fR must also be suitable for use in the two middle arguments of \fIfread\fR and \fIfwrite\fR, the last argument of \fImemcpy\fR, \fImemchr\fR, and \fImemcmp\fR, and the argument of \fImalloc\fR. .SH Background Processes vs. csh .Ix shell C .Ix csh .Ix problems csh .Ix inews .PP \fIInews\fR runs much of its processing in the background. We are told that this can hit problems, in some circumstances, with \fIcsh\fR's manipulations of signals, terminal modes, etc etc. We prefer a standard shell, and have made no attempt to understand the C shell's weirdnesses. We're aware that well-written programs can fail under the C shell due to bizarre problems with weird signals, etc., but we class this as the fault of the C shell and its co-conspirators and decline to contort our programs to compensate for its failings. We do sympathize with people victimized by it, but can be of no practical help. .SH Compress Behavior .Ix compress .Ix problems compress .Ix batcher .PP Extremely old (pre-1985) versions of \fIcompress\fR run off at the mouth with a status message on \fIstderr\fR even when nothing goes wrong in the compression. This upsets the batcher, which thinks any \fIstderr\fR output means trouble. .SH ulimit .Ix ulimit .Ix problems ulimit .Ix Unix "System V" .Ix "System V" breakage .PP Most versions of System V have the concept of \fIulimit\fR, a per-process limit on how big an individual file can be. This limit can be lowered by anyone but raised only by the super-user; normally \fIinit\fR or \fIlogin\fR initializes it to some suitable value. Unfortunately, many System Vs set it far too low, at 1 megabyte. This causes trouble with many things, but in particular, .Ix relaynews .Ix expire \fIrelaynews\fR, \fIexpire\fR, etc. need to be able to work with the \fIhistory\fR file, .Ix history which can easily be several megabytes. It's necessary to deal with this on all paths by which any of these programs might be invoked: from \fIuucp\fR or other transport software bringing in news, from \fIcron\fR, .Ix cron and by users via \fIinews\fR for local postings. .Ix inews It is difficult to do this in a portable way when super-user privileges are needed. .SH Restricted Shells .Ix shell restricted .Ix problems "restricted shells" .Ix Unix "System V" .Ix "System V" breakage .PP There is an unfortunate interaction between the `#!' feature in shell files and the ``restricted shell'' feature found in some Unixes (notably System V): the restricted shell typically is just a different way of invoking \fI/bin/sh\fR, and in some versions, careless code just checks the first letter of the name the shell was invoked under to see if it was `r'. Unfortunately, if the system has the `#!' feature and there is a shell file named, say, .Ix rnews \fIrnews\fR whose first line is `#!\ /bin/sh', this shell file will end up invoking the restricted shell! .PP Simply deleting the `#!' line might fix this; on systems which have the Korn shell, .Ix shell Korn .Ix /bin/ksh changing `#!\ /bin/sh' to `#!\ /bin/ksh' might work. Otherwise you will have .Ix cunbatch to arrange to have your neighbors invoke \fIcunbatch\fR instead of \fIrnews\fR, or else write a simple \fIrnews\fR that invokes the real one under another name. It would be wise to check for other shell files whose names begin with `r', also, as \fIrnews\fR definitely isn't the only one. .SH Remote Invocation vs. Nonstandard Shells .Ix shell non-standard .Ix problems "non-standard shells" .Ix rsh .\" thanks to Paul Eggert for most of this .PP When \fInewsrun\fR is invoked on a host that is not the news server, it uses \fIrsh\fP to propagate news batches to the server. It runs \fI/bin/sh\fR explicitly to avoid major difficulties with non-standard shells, but it has to rely on the invoker's login shell to run that one command. This means \fInewsrun\fR will emit spurious output if its invoker's login shell is the C shell and its invoker's \fI.cshrc\fR contains commands that generate output. A similar problem occurs with \fIbash\fP and \fI.bashrc\fP. .Ix bash .Ix shell bash .Ix csh .Ix shell C .PP The simplest solution is to use \fI/bin/sh\fP as the login shell for \fInewsrun\fP's invoker. Otherwise, if you have a networked news server, check that the login shell is standard enough to invoke \fI/bin/sh\fP by executing the following command as \fInewsrun\fP's invoker. .DS .ft B rsh \fInewsserver\fP exec /bin/sh \-c true .ft .DE This command should output nothing. .PP .Ix Unix "System V" .Ix "System V" breakage A slightly related problem is that not everyone calls the run-remote-shell command \fIrsh\fR; on System V in particular, \fIrsh\fR means something different. For the moment we have opted to ignore this issue, as the possibilities for gratuitous differences boggle the mind. People facing this problem may wish to place an \fIrsh\fR shell file in the search path to invoke the right command in the right way, whatever that is. .SH Values of Logical Operators .Ix "broken compilers" .Ix problems "broken compilers" .Ix Unix Ultrix .PP There seem to be compilers, e.g. the Ultrix one on DEC's new RISC workstations, that go into convulsions when they see something like .DS .ft B *p++ = isascii(c) && isalnum(c); .ft .DE because they don't know how to generate a numeric value for `&&', or because they don't know how to turn that value into a `char'. One or two places in C News use constructs like this. If you run into this, you might want to try replacing the right-hand side with something like ``(...)\ ?\ 1\ :\ 0'' to get the troublesome operator back into a conditional context. .SH Empty Lines .Ix "empty lines" .Ix problems "empty lines" .Ix relaynews .PP Some backward operating systems (through which your C News distribution may have passed on its way to you), and perhaps some stupid text-handling software even on sane operating systems, do not recognize the notion of an empty line. They think all lines must have at least one character in them; the closest they can come to an empty line is a line consisting of a single blank. This matters because \fIrelaynews\fR will tolerate white space only in certain places in the \fIsys\fR file, and in particular, it tolerates empty lines but not lines consisting solely of white space. The result will be complaints (in \fIerrlog\fR) about white space in the \fIsys\fR line for a system named ``\ ''. .SH active-File Date .Ix problems "broken file systems" .Ix "broken file systems" .Ix Unix "Bull DPX/2 B.O.S. 1.0" .Ix relaynews .Ix active .Ix files active .\" thanks to Simon J. Gerraty for this weirdie .PP On some Bull systems, at least ones running DPX/2 B.O.S. 1.0, apparently \fIrelaynews\fR updates the contents of the \fIactive\fR file correctly, but the file's date remains unchanged! This appears to be a kernel bug. It reportedly upsets some news readers. A workaround, said to be effective, is to add the line .DS .ft B utime(ctlfile(actrelnm), (time_t *)NULL); .ft .DE after the call to \fInnafree\fR in \fIactfsync\fR in \fIlibbig/active.big.c\fR. .Ix active.big.c .SH enum Operators .Ix "broken compilers" .Ix problems "broken compilers" .Ix readnews .\" thanks to Scott Reynolds for this one .PP Some compilers have difficulty compiling the \fIreadnews\fR we supply, because they object to applying the `!' operator to an \fIenum\fR type. Changing the definition of \fIbooltype\fR in \fIrna/defs.h\fR to .DS .ft B typedef int bool; #define false 0 #define true 1 .ft .DE is reported to solve this. .SH Amiga Library Ordering .Ix Unix "Amiga System V Release 4" .Ix problems "amiga loading" .PP It is reliably reported that when compiling some of the programs under SVR4 on the Amiga, it is necessary to give ``\-lc \-lucb'' as library options\(emlinking of the C library \fImust\fR precede linking of the Berkeley-emulation library, or the code links but will not run. .SH AIX and Mach vs. fsync() .Ix fsync .Ix problems fsync .Ix Unix AIX .Ix Unix Mach .Ix relaynews .Ix /dev/null .Ix machines NeXT .PP The .I relaynews regression test fails under some (all?) AIXes, because the system refuses to do an .I fsync on a file descriptor open to .I /dev/null . It is possible that this does not affect production use, however. Mach (at least on the NeXT) is reported to have similar problems. .SH AIX/370 vs. Shell Files .Ix problems AIX/370 .Ix Unix AIX/370 .Ix shell AIX/370 .Ix newsrunning .PP AIX/370 has added at least one keyword (``on'') to the shell, and this is known to cause syntax complaints in at least one shell script (\fInewsrunning\fR). Unless this is also a keyword in the final version of POSIX 1003.2, we don't plan to fix this. .SH Struct Conditional Expressions .Ix "broken compilers" .Ix problems "broken compilers" .Ix Unix "SCO Xenix" .PP Some (all?) SCO Xenix compilers take offense to expressions like .DS .ft B value = (dbzint) ? dbzfetch(key) : fetch(key); .ft .DE where the functions return .I struct values. This occurs in three places in .I dbz/dbzmain.c , .Ix dbz and the workaround is to expand those conditionals to statements like: .DS .ft B if (dbzint) value = dbzfetch(key); else value = fetch(key); .ft .DE .SH staleness vs. Ultrix .Ix Unix Ultrix .Ix staleness .Ix problems Ultrix .PP Several Ultrix users have reported a problem with the ``staleness'' command. It seems Ultrix's \fIsed\fR is an antique and blows up on the complex regular expression in \fIstaleness\fR. .Ix sed A fix, at some small cost in performance, is to change the last four lines of \fIstaleness\fR to something like .DS .ft B exec awk '$1 == "/expired/" { print "-o", $3 }' $NEWSCTL/explist .ft .DE .SH SCO Xenix string functions .Ix "botched libraries" .Ix problems "botched libraries" .Ix Unix "SCO Xenix 2.3" .\" Sydney S. Weinstein discovered this horror .PP Under SCO Xenix 2.3, and perhaps other recently-released SCO systems, the string functions like \fIstrchr\fR exist but can be inordinately slow when dealing with long strings. This is not an academic issue: one symptom is that \fIrelaynews\fR .Ix relaynews takes a long time to start up, eating 10-15 seconds of CPU time before it starts processing articles. This apparently is a combination of badly-written code and strange internationalization support. Just using our string functions, by telling \fIbuild\fR that your system does not have them, works much better. Telling the compiler \fB\-nointl\fR may be helpful if you don't want to go that far. .SH Old SCO Xenix vs. \fIsetvbuf\fP .Ix "botched libraries" .Ix problems "botched libraries" .Ix Unix "SCO Xenix" .Ix dbz .Ix problems setvbuf .Ix setvbuf .\" Ronald Khoo reported this unbelievable botch .PP The \fIdbz\fR package makes some use of the \fIsetvbuf\fR routine. Incredible though it sounds, old versions of SCO Xenix reportedly had the order of \fIsetvbuf\fR's arguments wrong! If you have SCO Xenix version 2.2 or earlier, check the arguments to \fIsetvbuf\fR: if the second and third are a type and a buffer pointer respectively (they are supposed to be a buffer pointer and a type), you're in trouble and will have to tinker with the \fIdbz\fR sources. .SH SunOS 4.1.1 vs. write() .Ix write .Ix problems SunOS 4.1 .Ix Unix "SunOS 4.1.1" .Ix problems "broken kernel" .Ix "broken kernel" .PP In some circumstances, a SunOS 4.1.1 \fIwrite\fR system call to a disk file can be interrupted by a signal. No other Unix does this, and routines like \fIfwrite\fR are not prepared to cope with it. This can result in gratuitous failures of \fIdbz\fR in particular. .PP It is thought not to be a problem in C News, but some other packages using \fIdbz\fR suffer, .Ix dbz and we mention it just in case. Sun acknowledges it as a bug. The bug-id is 1052649. It is fixed in patch 100293-01. .SH uucp Variations .Ix uucp .Ix problems queuelen .Ix queuelen .PP There are innumerable variations on the details of \fIuucp\fR that may require appropriate modifications to \fIqueuelen\fR. For example, some versions of Honey DanBer (aka BNU) \fIuucp\fR cut all system names down to seven characters, and \fIqueuelen\fR will have to be altered to do likewise. .SH malloc Variations .Ix malloc .Ix Unix A/UX .PP On some systems, performance is noticeably better if the \fB\-lmalloc\fR library is used, rather than relying on the \fImalloc\fR in the standard C library. A/UX is reportedly an example. .SH Slow egrep .Ix egrep .Ix "System V" breakage .Ix Unix "System V" .Ix Unix A/UX .PP At least some System V suppliers (including, reportedly, Apple in some [now obsolete?] A/UX versions) have broken \fIegrep\fR in such a way that it is inordinately slow. It may be worth substituting \fIgrep\fR for \fIegrep\fR in some of the shell scripts, with appropriate caution since they do not accept quite the same pattern syntax.