This article is from the Apple II GNO FAQ, by Devin Reade with numerous contributions by others.
A#6.6: === See the CAVEAT in Q#6.1 ===
If you're using GNO v2.0.6, no modifications should be necessary
provided you've placed all the GNO header files into /usr/include
and /HFSinclude as appropriate. This applies to both ORCA/C v2.0.3
and ORCA/C v2.1.x.
There are various header files included with the GNO v2.0.1
distribution. These should all be copied into the /usr/include
directory hierarchy as discussed in Q#6.4. (Versions 2.0.2,
2.0.3, and 2.0.4 were incremental changes, not complete
distributions, and therefore did not include header files.)
If you are using the Multiuser package, then you should also
copy over the <time.h> and <utmp.h> files from that package.
The files in the following lists are used instead of their ORCA/C
counterparts, except where noted by "+++"; those so marked need
to be modified as described.
Note the last section in this question is a list of suggested
changes to the GNO v2.0.4 header files. These changes you should
make yourself.
GNO v2.0.4 with ORCA/C v2.0.3
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
errno.h This one has many GNO error codes added.
fcntl.h Differs in the prototypes of open(2), read(2),
write(2), and definition of OPEN_MAX.
signal.h Completely different for GNO.
stdio.h Differs in the prototypes of fread(3) and
fwrite(3). The FILE structure uses an
older name for one of its members, but it
doesn't matter. A prototype for fdopen(3)
and the fileno() macro was added.
+++ stdlib.h You should delete this one and copy the
ORCA/C v2.0.3 stdlib.h from
/lang/orca/libraries/orcacdefs to
/usr/include. See the "common" changes
below for more information on this file.
string.h Many new functions were added in the GNO one.
+++ types.h You should delete this one and copy the
ORCA/C v2.0.3 types.h from
/lang/orca/libraries/orcacdefs to
/usr/include. See the "common" changes
below for more information on this file.
GNO v2.0.4 with ORCA/C v2.1.x
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
errno.h This one has many GNO error codes added.
fcntl.h Differs in the prototypes of open(2), read(2),
write(2), and definition of OPEN_MAX.
signal.h Completely different for GNO.
+++ stdio.h You should delete this file, then copy the
one from your ORCA/C distribution into
the /usr/include directory. See the "common"
changes below for more information on this
file. Note that there was a critical change
to the FILE structure as of ORCA/C v2.1.1b2;
ensure your header file matches your OrcaLib.
+++ stdlib.h You should delete this one and copy the
ORCA/C v2.1.x stdlib.h from
/lang/orca/libraries/orcacdefs to
/usr/include. See the "common" changes
below for more information on this file.
+++ string.h You should rename this file to something
else (like "string.old"), then copy the
one from your ORCA/C distribution into
the /usr/include directory. Finally, you
should copy the prototypes for the following
functions from the old GNO file into the new
one copied from the ORCA/C distribution:
bcopy bzero
index rindex
strdup strupr
strlwr strset
strnset strrev
strpblnks strrpblnks
strpad strrpad
stricmp strncmp
+++ types.h You should delete this one and copy the
ORCA/C v2.1.x types.h from
/lang/orca/libraries/orcacdefs to
/usr/include. See the "common" changes
below for more information on this file.
GNO v2.0.4 common changes
^^^^^^^^^^^^^^^^^^^^^^^^^
The following is a list of suggested changes to the GNO v2.0.4
header files. You have to make these changes yourself; they are
not part of the distributed header files.
For any files below that don't appear in /usr/include, you should
copy the file from /lang/orca/libraries/orcacdefs into /usr/include,
then edit the copy in /usr/include. Do not modify files in
/lang/orca/libraries/orcacdefs.
dirent.h (possibly sys/dirent.h):
Ensure that in struct dirent, the d_namelen field
appears before the d_name field, as described in the
GNO v2.0.4 release notes.
gno/gno.h:
Rename send(2) to procsend(2) and receive(2) to procreceive(2).
stdio.h:
Add the following:
#define fileno(f) ((f)->_file)
#define P_tmpdir "/tmp"
FILE * fdopen(int, const char *);
char * tempnam(char *, char *);
char * mktemp(char *);
int mkstemp(char *);
FILE * popen(const char *, const char *);
int pclose(FILE *);
Add the following if you're using ORCA/C v2.1.x:
#define setbuffer(stream,buf,size) ((buf==NULL) ? \
(void)__setvbuf(stream,NULL,_IONBF,0L) : \
(void)__setvbuf(stream,buf,_IOFBF,\
(size_t)size))
#define setlinebuf(stream) (__setvbuf(stream,NULL,\
_IOLBF,0L))
int __fseek(FILE *, long, int);
int __setvbuf(FILE *, char *, int, size_t);
stdlib.h:
Add the following declarations:
int initenv(void);
void popenv(void);
int pushenv(void);
int putenv(const char *);
int setenv(const char *, const char *, int);
void unsetenv(const char *);
sys/ports.h:
Change the prototypes of pdelete(2) and preset(2) to:
int pdelete(int, int (*)(void));
int preset(int, int (*)(void));
sys/stat.h:
Add the following prototype:
int umask(int);
This header file contains the following guard macro:
#ifndef __BSD_TYPES__
#include <sys/types.h>
#endif
it should be changed to:
#ifndef __SYS_TYPES__
#include <sys/types.h>
#endif
sys/times.h:
The last line should be modified so that the text following
the #endif is in a comment, otherwise it is not legal C
source code:
#endif /* _SYS_TIMES_H_ */
sys/types.h:
Change the typedef of sig_t to:
typedef void (*sig_t)(void);
The typedef for use_t has an extraneous '_' character. Of
course, if you hit this and aren't compiling the kernel
you're doing something wrong since the _IN_KERNEL macro
should not normally be defined:
typedef unsigned char use_t;
sys/wait.h:
Add the following declaration:
int wait(union wait *);
time.h:
Add the following declarations:
void tzset(void);
#ifndef _SVR4
struct tz * timezone(void);
#endif
types.h:
Before the definition of TRUE, add in the following:
#undef TRUE
#undef true
#undef FALSE
#undef false
unistd.h:
As explained in the lenviron documentation, rename the
execve() system call to _execve() (if you have installed
/usr/lib/lenviron as described in Q#6.7 or Q#6.8). Insert
or uncomment prototypes for execl(), execlp(), execv(),
execve(), and execvp(). The execve() prototype should be:
int execve(const char *,char * const *,char * const *);
Insert the following prototypes. They are not yet defined
in any standard, however they are common routines and are
provided in libc for GNO v2.0.6:
char * dirname (const char *);
char * basename (const char *);
 
Continue to: