Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!cs.utexas.edu!usc!samsung!munnari.oz.au!cluster!metro!natmlab.dap.csiro.au!ditsyda!evans From: evans@ditsyda.oz (Bruce Evans) Newsgroups: comp.os.minix Subject: Re: More compilation problems... Message-ID: <2439@ditsyda.oz> Date: 1 Feb 90 18:14:10 GMT References: <712@augean.OZ> Reply-To: evans@ditsyda.oz (Bruce Evans) Organization: CSIRO DIT Sydney, Australia Lines: 49 In article <712@augean.OZ> cagney@chook.ua.oz (Andrew Cagney - aka Noid) writes: >The prototype for getpwuid in vis > struct passwd *getpwuid(int __uid) >clashes with the actual code in getpwent.c > struct passwd *getpwuid(uid_t __uid) > ^^^^^ >uid_t is declared unsigned short in . Actually getpwent.c has struct passwd *getpwuid(__uid) uid_t __uid; /* NB old-style definition */ and ANSI-according-to-gcc says this is OK. The int in the prototype says that an int is passed and the uid_t in the definition says it is regarded as a uid_t. Only with the new-style definition must the types match exactly. Andrew must have this problem from using Turbo C, which apparently treats all definitions as new-style (non-ANSI or old-ANSI?). The prototype has to have an int because that is all old compilers know how to pass. It gets worse with 32 bit ints. Then a uid_t in the prototype would allow an ANSI compiler to pass a different number of bytes than an old compiler. Unsigned doesn't work, because 32-bit ANSI compilers promote a 16-bit unsigned short to an int. I think the correct fix for Turbo C is to declare the argument to getpwuid as an int. There are other functions in the library which mis-match their prototypes in the same way. E.g., chmod, creat and umask. (Un)fortunately, the problem is invisible because the file with the prototype is not included. >Finally a POSIX question, do programs that include also >need to include (Kermit doesn't)? Signal.h is required to be self-supporting by ANSI (I think :-)). It is slightly broken by requiring pid_t from sys/types.h for the prototype to kill(). However, kill() is a POSIX function and the prototype is only visible when _POSIX_SOURCE is defined. It is not clear to me whether defining _POSIX_SOURCE is allowed to break ANSI headers. (Kermit hasn't heard of POSIX but the makefile has been modified for Minix to supply the define.) I think Kermit *is* required to include sys/types.h and don't like it. Kermit is also broken by including pwd.h without sys/types.h. At least pwd.h is owned by POSIX. -- Bruce Evans evans@ditsyda.oz.au