diff options
| author | Bruce Evans <bde@FreeBSD.org> | 1997-07-03 03:28:27 +0000 | 
|---|---|---|
| committer | Bruce Evans <bde@FreeBSD.org> | 1997-07-03 03:28:27 +0000 | 
| commit | 5500fdcd4f4839f2185e704508b3f6c2a11ccba6 (patch) | |
| tree | 7fade921d74eec017d96d5a01c01a4cf0d376911 /lib/libc | |
| parent | 25e43cba725c919917fea240af20d74d1a50edd1 (diff) | |
Notes
Diffstat (limited to 'lib/libc')
52 files changed, 7051 insertions, 0 deletions
diff --git a/lib/libc/compat-43/setregid.2 b/lib/libc/compat-43/setregid.2 new file mode 100644 index 000000000000..bf2624da1f27 --- /dev/null +++ b/lib/libc/compat-43/setregid.2 @@ -0,0 +1,93 @@ +.\" Copyright (c) 1980, 1991, 1993, 1994 +.\"	The Regents of the University of California.  All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\"    notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\"    notice, this list of conditions and the following disclaimer in the +.\"    documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\"    must display the following acknowledgement: +.\"	This product includes software developed by the University of +.\"	California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\"    may be used to endorse or promote products derived from this software +.\"    without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\"     @(#)setregid.2	8.2 (Berkeley) 4/16/94 +.\" +.Dd April 16, 1994 +.Dt SETREGID 2 +.Os BSD 4.2 +.Sh NAME +.Nm setregid +.Nd set real and effective group ID +.Sh SYNOPSIS +.Fd #include <unistd.h> +.Ft int +.Fn setregid "gid_t rgid" "gid_t egid" +.Sh DESCRIPTION +The real and effective group ID's of the current process +are set to the arguments. +Unprivileged users may change the real group +ID to the effective group ID and vice-versa; only the super-user may +make other changes. +.Pp +Supplying a value of -1 for either the real or effective +group ID forces the system to substitute the current +ID in place of the -1 parameter. +.Pp +The +.Fn setregid +function was intended to allow swapping +the real and effective group IDs +in set-group-ID programs to temporarily relinquish the set-group-ID value. +This function did not work correctly, +and its purpose is now better served by the use of the +.Fn setegid +function (see +.Xr setuid 2 ) . +.Pp +When setting the real and effective group IDs to the same value, +the standard +.Fn setgid +function is preferred. +.Sh RETURN VALUES +Upon successful completion, a value of 0 is returned.  Otherwise, +a value of -1 is returned and +.Va errno +is set to indicate the error. +.Sh ERRORS +.Bl -tag -width [EPERM] +.It Bq Er EPERM +The current process is not the super-user and a change +other than changing the effective group-id to the real group-id +was specified. +.El +.Sh SEE ALSO +.Xr getgid 2 , +.Xr setegid 2 , +.Xr setgid 2 , +.Xr setuid 2 +.Sh HISTORY +The +.Nm +function call appeared in +.Bx 4.2 +and was dropped in +.Bx 4.4 . diff --git a/lib/libc/compat-43/setregid.c b/lib/libc/compat-43/setregid.c new file mode 100644 index 000000000000..f91418ba650e --- /dev/null +++ b/lib/libc/compat-43/setregid.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)setregid.c	8.1 (Berkeley) 6/2/93"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/types.h> +#include <errno.h> + +int +setregid(rgid, egid) +	gid_t rgid, egid; +{ +	static gid_t savedgid = -1; +	 +	if (savedgid == -1) +		savedgid = getegid(); +	/* +	 * we assume that the intent here is to be able to +	 * get back rgid priviledge. So we make sure that +	 * we will be able to do so, but do not actually +	 * set the rgid. +	 */ +	if (rgid != -1 && rgid != getgid() && rgid != savedgid) { +		errno = EPERM; +		return (-1); +	} +	if (egid != -1 && setegid(egid) < 0) +		return (-1); +	return (0); +} diff --git a/lib/libc/compat-43/setreuid.2 b/lib/libc/compat-43/setreuid.2 new file mode 100644 index 000000000000..980da123db31 --- /dev/null +++ b/lib/libc/compat-43/setreuid.2 @@ -0,0 +1,91 @@ +.\" Copyright (c) 1980, 1991, 1993, 1994 +.\"	The Regents of the University of California.  All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\"    notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\"    notice, this list of conditions and the following disclaimer in the +.\"    documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\"    must display the following acknowledgement: +.\"	This product includes software developed by the University of +.\"	California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\"    may be used to endorse or promote products derived from this software +.\"    without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\"     @(#)setreuid.2	8.2 (Berkeley) 4/16/94 +.\" +.Dd April 16, 1994 +.Dt SETREUID 2 +.Os BSD 4 +.Sh NAME +.Nm setreuid +.Nd set real and effective user ID's +.Sh SYNOPSIS +.Fd #include <unistd.h> +.Ft int +.Fn setreuid "uid_t ruid" "uid_t euid" +.Sh DESCRIPTION +The real and effective user IDs of the +current process are set according to the arguments. +If +.Fa ruid +or  +.Fa euid +is -1, the current uid is filled in by the system. +Unprivileged users may change the real user +ID to the effective user ID and vice-versa; only the super-user may +make other changes. +.Pp +The +.Fn setreuid +function has been used to swap the real and effective user IDs +in set-user-ID programs to temporarily relinquish the set-user-ID value. +This purpose is now better served by the use of the +.Fn seteuid +function (see +.Xr setuid 2 ) . +.Pp +When setting the real and effective user IDs to the same value, +the standard +.Fn setuid +function is preferred. +.Sh RETURN VALUES +Upon successful completion, a value of 0 is returned.  Otherwise, +a value of -1 is returned and +.Va errno +is set to indicate the error. +.Sh ERRORS +.Bl -tag -width [EPERM] +.It Bq Er EPERM +The current process is not the super-user and a change +other than changing the effective user-id to the real user-id +was specified. +.El +.Sh SEE ALSO +.Xr getuid 2 , +.Xr seteuid 2 , +.Xr setuid 2 +.Sh HISTORY +The +.Nm +function call appeared in +.Bx 4.2 +and was dropped in +.Bx 4.4 . diff --git a/lib/libc/compat-43/setreuid.c b/lib/libc/compat-43/setreuid.c new file mode 100644 index 000000000000..40316815814e --- /dev/null +++ b/lib/libc/compat-43/setreuid.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1992, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)setreuid.c	8.1 (Berkeley) 6/2/93"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/types.h> +#include <errno.h> + +int +setreuid(ruid, euid) +	uid_t ruid, euid; +{ +	static uid_t saveduid = -1; +	 +	if (saveduid == -1) +		saveduid = geteuid(); +	/* +	 * we assume that the intent here is to be able to +	 * get back ruid priviledge. So we make sure that +	 * we will be able to do so, but do not actually +	 * set the ruid. +	 */ +	if (ruid != -1 && ruid != getuid() && ruid != saveduid) { +		errno = EPERM; +		return (-1); +	} +	if (euid != -1 && seteuid(euid) < 0) +		return (-1); +	return (0); +} diff --git a/lib/libc/gen/ctime.3 b/lib/libc/gen/ctime.3 new file mode 100644 index 000000000000..ff6a8efd5967 --- /dev/null +++ b/lib/libc/gen/ctime.3 @@ -0,0 +1,258 @@ +.\" Copyright (c) 1989, 1991, 1993 +.\"	The Regents of the University of California.  All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Arthur Olson. +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\"    notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\"    notice, this list of conditions and the following disclaimer in the +.\"    documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\"    must display the following acknowledgement: +.\"	This product includes software developed by the University of +.\"	California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\"    may be used to endorse or promote products derived from this software +.\"    without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\"     @(#)ctime.3	8.1 (Berkeley) 6/4/93 +.\" +.Dd June 4, 1993 +.Dt CTIME 3 +.Os BSD 4.3 +.Sh NAME +.Nm asctime , +.Nm ctime , +.Nm difftime , +.Nm gmtime , +.Nm localtime , +.Nm mktime +.Nd transform binary date and time value to +.Tn ASCII +.Sh SYNOPSIS +.Fd #include <sys/types.h> +.Fd #include <time.h> +.Vt extern char *tzname[2]; +.Ft char * +.Fn ctime "const time_t *clock" +.Ft double +.Fn difftime "time_t time1" "time_t time0" +.Ft char * +.Fn asctime "const struct tm *tm" +.Ft struct tm * +.Fn localtime "const time_t *clock" +.Ft struct tm * +.Fn gmtime "const time_t *clock" +.Ft time_t +.Fn mktime "struct tm *tm" +.Sh DESCRIPTION +The functions +.Fn ctime , +.Fn gmtime +and +.Fn localtime +all take as an argument a time value representing the time in seconds since +the Epoch (00:00:00 +.Tn UTC , +January 1, 1970; see +.Xr time 3 ) . +.Pp +The function +.Fn localtime +converts the time value pointed at by +.Fa clock , +and returns a pointer to a +.Dq Fa struct tm +(described below) which contains +the broken-out time information for the value after adjusting for the current +time zone (and any other factors such as Daylight Saving Time). +Time zone adjustments are performed as specified by the +.Ev TZ +environmental variable (see +.Xr tzset 3 ) . +The function +.Fn localtime +uses +.Xr tzset +to initialize time conversion information if +.Xr tzset +has not already been called by the process. +.Pp +After filling in the tm structure, +.Fn localtime +sets the +.Fa tm_isdst Ns 'th +element of +.Fa tzname +to a pointer to an +.Tn ASCII +string that's the time zone abbreviation to be +used with +.Fn localtime Ns 's +return value. +.Pp +The function +.Fn gmtime +similarly converts the time value, but without any time zone adjustment, +and returns a pointer to a tm structure (described below). +.Pp +The +.Fn ctime +function +adjusts the time value for the current time zone in the same manner as +.Fn localtime , +and returns a pointer to a 26-character string of the form: +.Bd -literal -offset indent +Thu Nov 24 18:22:48 1986\en\e0 +.Ed +.Pp +All the fields have constant width. +.Pp +The +.Fn asctime +function +converts the broken down time in the structure +.Fa tm +pointed at by +.Fa *tm +to the form +shown in the example above. +.Pp +The function +.Fn mktime +converts the broken-down time, expressed as local time, in the structure +pointed to by tm into a time value with the same encoding as that of the +values returned by the +.Xr time 3 +function, that is, seconds from the Epoch, +.Tn UTC . +.Pp +The original values of the +.Fa tm_wday +and +.Fa tm_yday +components of the structure are ignored, and the original values of the +other components are not restricted to their normal ranges. +(A positive or zero value for +.Fa tm_isdst +causes +.Fn mktime +to presume initially that summer time (for example, Daylight Saving Time) +is or is not in effect for the specified time, respectively. +A negative value for +.Fa tm_isdst +causes the +.Fn mktime +function to attempt to divine whether summer time is in effect for the +specified time.) +.Pp +On successful completion, the values of the +.Fa tm_wday +and +.Fa tm_yday +components of the structure are set appropriately, and the other components +are set to represent the specified calendar time, but with their values +forced to their normal ranges; the final value of +.Fa tm_mday +is not set until +.Fa tm_mon +and +.Fa tm_year +are determined. +.Fn Mktime +returns the specified calendar time; if the calendar time cannot be +represented, it returns \-1; +.Pp +The +.Fn difftime +function +returns the difference between two calendar times, +.Pf ( Fa time1 +- +.Fa time0 ) , +expressed in seconds. +.Pp +External declarations as well as the tm structure definition are in the  +.Aq Pa time.h +include file. +The tm structure includes at least the following fields: +.Bd -literal -offset indent +int tm_sec;	/\(** seconds (0 - 60) \(**/ +int tm_min;	/\(** minutes (0 - 59) \(**/ +int tm_hour;	/\(** hours (0 - 23) \(**/ +int tm_mday;	/\(** day of month (1 - 31) \(**/ +int tm_mon;	/\(** month of year (0 - 11) \(**/ +int tm_year;	/\(** year \- 1900 \(**/ +int tm_wday;	/\(** day of week (Sunday = 0) \(**/ +int tm_yday;	/\(** day of year (0 - 365) \(**/ +int tm_isdst;	/\(** is summer time in effect? \(**/ +char \(**tm_zone;	/\(** abbreviation of timezone name \(**/ +long tm_gmtoff;	/\(** offset from UTC in seconds \(**/ +.Ed +.Pp +The +field +.Fa tm_isdst +is non-zero if summer time is in effect. +.Pp +The field +.Fa tm_gmtoff +is the offset (in seconds) of the time represented from +.Tn UTC , +with positive +values indicating east of the Prime Meridian. +.Sh SEE ALSO +.Xr date 1 , +.Xr gettimeofday 2 , +.Xr getenv 3 , +.Xr time 3 , +.Xr tzset 3 , +.Xr tzfile 5 +.Sh HISTORY +This manual page is derived from +the time package contributed to Berkeley by +Arthur Olsen and which appeared in +.Bx 4.3 . +.Sh BUGS +Except for  +.Fn difftime +and +.Fn mktime , +these functions leaves their result in an internal static object and return +a pointer to that object. Subsequent calls to these +function will modify the same object. +.Pp +The +.Fa tm_zone +field of a returned tm structure points to a static array of characters, +which will also be overwritten by any subsequent calls (as well as by +subsequent calls to +.Xr tzset 3 +and +.Xr tzsetwall 3 ) . +.Pp +Use of the external variable +.Fa tzname +is discouraged; the +.Fa tm_zone +entry in the tm structure is preferred. +.Pp +Avoid using out-of-range values with +.Fn mktime +when setting up lunch with promptness sticklers in Riyadh. diff --git a/lib/libc/gen/ctime.c b/lib/libc/gen/ctime.c new file mode 100644 index 000000000000..b11e39b77c68 --- /dev/null +++ b/lib/libc/gen/ctime.c @@ -0,0 +1,1381 @@ +/* + * Copyright (c) 1987, 1989, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Arthur David Olson of the National Cancer Institute. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)ctime.c	8.2 (Berkeley) 3/20/94"; +#endif /* LIBC_SCCS and not lint */ + +/* +** Leap second handling from Bradley White (bww@k.gp.cs.cmu.edu). +** POSIX-style TZ environment variable handling from Guy Harris +** (guy@auspex.com). +*/ + +/*LINTLIBRARY*/ + +#include <sys/param.h> +#include <fcntl.h> +#include <time.h> +#include <tzfile.h> +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <unistd.h> + +#ifdef __STDC__ +#include <stdlib.h> + +#define P(s)		s +#define alloc_size_t	size_t +#define qsort_size_t	size_t +#define fread_size_t	size_t +#define fwrite_size_t	size_t + +#else /* !defined __STDC__ */ + +#define P(s)		() + +typedef char *		genericptr_t; +typedef unsigned	alloc_size_t; +typedef int		qsort_size_t; +typedef int		fread_size_t; +typedef int		fwrite_size_t; + +extern char *	calloc(); +extern char *	malloc(); +extern char *	realloc(); +extern char *	getenv(); + +#endif /* !defined __STDC__ */ + +extern time_t	time(); + +#define ACCESS_MODE	O_RDONLY +#define OPEN_MODE	O_RDONLY + +#ifndef WILDABBR +/* +** Someone might make incorrect use of a time zone abbreviation: +**	1.	They might reference tzname[0] before calling tzset (explicitly +**	 	or implicitly). +**	2.	They might reference tzname[1] before calling tzset (explicitly +**	 	or implicitly). +**	3.	They might reference tzname[1] after setting to a time zone +**		in which Daylight Saving Time is never observed. +**	4.	They might reference tzname[0] after setting to a time zone +**		in which Standard Time is never observed. +**	5.	They might reference tm.TM_ZONE after calling offtime. +** What's best to do in the above cases is open to debate; +** for now, we just set things up so that in any of the five cases +** WILDABBR is used.  Another possibility:  initialize tzname[0] to the +** string "tzname[0] used before set", and similarly for the other cases. +** And another:  initialize tzname[0] to "ERA", with an explanation in the +** manual page of what this "time zone abbreviation" means (doing this so +** that tzname[0] has the "normal" length of three characters). +*/ +#define WILDABBR	"   " +#endif /* !defined WILDABBR */ + +#ifndef TRUE +#define TRUE		1 +#define FALSE		0 +#endif /* !defined TRUE */ + +static const char GMT[] = "GMT"; + +struct ttinfo {				/* time type information */ +	long		tt_gmtoff;	/* GMT offset in seconds */ +	int		tt_isdst;	/* used to set tm_isdst */ +	int		tt_abbrind;	/* abbreviation list index */ +	int		tt_ttisstd;	/* TRUE if transition is std time */ +}; + +struct lsinfo {				/* leap second information */ +	time_t		ls_trans;	/* transition time */ +	long		ls_corr;	/* correction to apply */ +}; + +struct state { +	int		leapcnt; +	int		timecnt; +	int		typecnt; +	int		charcnt; +	time_t		ats[TZ_MAX_TIMES]; +	unsigned char	types[TZ_MAX_TIMES]; +	struct ttinfo	ttis[TZ_MAX_TYPES]; +	char		chars[(TZ_MAX_CHARS + 1 > sizeof GMT) ? +				TZ_MAX_CHARS + 1 : sizeof GMT]; +	struct lsinfo	lsis[TZ_MAX_LEAPS]; +}; + +struct rule { +	int		r_type;		/* type of rule--see below */ +	int		r_day;		/* day number of rule */ +	int		r_week;		/* week number of rule */ +	int		r_mon;		/* month number of rule */ +	long		r_time;		/* transition time of rule */ +}; + +#define	JULIAN_DAY		0	/* Jn - Julian day */ +#define	DAY_OF_YEAR		1	/* n - day of year */ +#define	MONTH_NTH_DAY_OF_WEEK	2	/* Mm.n.d - month, week, day of week */ + +/* +** Prototypes for static functions. +*/ + +static long		detzcode P((const char * codep)); +static const char *	getzname P((const char * strp)); +static const char *	getnum P((const char * strp, int * nump, int min, +				int max)); +static const char *	getsecs P((const char * strp, long * secsp)); +static const char *	getoffset P((const char * strp, long * offsetp)); +static const char *	getrule P((const char * strp, struct rule * rulep)); +static void		gmtload P((struct state * sp)); +static void		gmtsub P((const time_t * timep, long offset, +				struct tm * tmp)); +static void		localsub P((const time_t * timep, long offset, +				struct tm * tmp)); +static void		normalize P((int * tensptr, int * unitsptr, int base)); +static void		settzname P((void)); +static time_t		time1 P((struct tm * tmp, void (* funcp)(), +				long offset)); +static time_t		time2 P((struct tm *tmp, void (* funcp)(), +				long offset, int * okayp)); +static void		timesub P((const time_t * timep, long offset, +				const struct state * sp, struct tm * tmp)); +static int		tmcomp P((const struct tm * atmp, +				const struct tm * btmp)); +static time_t		transtime P((time_t janfirst, int year, +				const struct rule * rulep, long offset)); +static int		tzload P((const char * name, struct state * sp)); +static int		tzparse P((const char * name, struct state * sp, +				int lastditch)); + +#ifdef ALL_STATE +static struct state *	lclptr; +static struct state *	gmtptr; +#endif /* defined ALL_STATE */ + +#ifndef ALL_STATE +static struct state	lclmem; +static struct state	gmtmem; +#define lclptr		(&lclmem) +#define gmtptr		(&gmtmem) +#endif /* State Farm */ + +static int		lcl_is_set; +static int		gmt_is_set; + +char *			tzname[2] = { +	WILDABBR, +	WILDABBR +}; + +#ifdef USG_COMPAT +time_t			timezone = 0; +int			daylight = 0; +#endif /* defined USG_COMPAT */ + +#ifdef ALTZONE +time_t			altzone = 0; +#endif /* defined ALTZONE */ + +static long +detzcode(codep) +const char * const	codep; +{ +	register long	result; +	register int	i; + +	result = 0; +	for (i = 0; i < 4; ++i) +		result = (result << 8) | (codep[i] & 0xff); +	return result; +} + +static void +settzname() +{ +	register const struct state * const	sp = lclptr; +	register int				i; + +	tzname[0] = WILDABBR; +	tzname[1] = WILDABBR; +#ifdef USG_COMPAT +	daylight = 0; +	timezone = 0; +#endif /* defined USG_COMPAT */ +#ifdef ALTZONE +	altzone = 0; +#endif /* defined ALTZONE */ +#ifdef ALL_STATE +	if (sp == NULL) { +		tzname[0] = tzname[1] = GMT; +		return; +	} +#endif /* defined ALL_STATE */ +	for (i = 0; i < sp->typecnt; ++i) { +		register const struct ttinfo * const	ttisp = &sp->ttis[i]; + +		tzname[ttisp->tt_isdst] = +			(char *) &sp->chars[ttisp->tt_abbrind]; +#ifdef USG_COMPAT +		if (ttisp->tt_isdst) +			daylight = 1; +		if (i == 0 || !ttisp->tt_isdst) +			timezone = -(ttisp->tt_gmtoff); +#endif /* defined USG_COMPAT */ +#ifdef ALTZONE +		if (i == 0 || ttisp->tt_isdst) +			altzone = -(ttisp->tt_gmtoff); +#endif /* defined ALTZONE */ +	} +	/* +	** And to get the latest zone names into tzname. . . +	*/ +	for (i = 0; i < sp->timecnt; ++i) { +		register const struct ttinfo * const	ttisp = +							&sp->ttis[sp->types[i]]; + +		tzname[ttisp->tt_isdst] = +			(char *) &sp->chars[ttisp->tt_abbrind]; +	} +} + +static int +tzload(name, sp) +register const char *		name; +register struct state * const	sp; +{ +	register const char *	p; +	register int		i; +	register int		fid; + +	if (name == NULL && (name = TZDEFAULT) == NULL) +		return -1; +	{ +		char		fullname[FILENAME_MAX + 1]; + +		if (name[0] == ':') +			++name; +		if (name[0] != '/') { +			if ((p = TZDIR) == NULL) +				return -1; +			if ((strlen(p) + strlen(name) + 1) >= sizeof fullname) +				return -1; +			(void) strcpy(fullname, p); +			(void) strcat(fullname, "/"); +			(void) strcat(fullname, name); +			name = fullname; +		} +		if ((fid = open(name, OPEN_MODE)) == -1) +			return -1; +	} +	{ +		register const struct tzhead *	tzhp; +		char				buf[sizeof *sp + sizeof *tzhp]; +		int				ttisstdcnt; + +		i = read(fid, buf, sizeof buf); +		if (close(fid) != 0 || i < sizeof *tzhp) +			return -1; +		tzhp = (struct tzhead *) buf; +		ttisstdcnt = (int) detzcode(tzhp->tzh_ttisstdcnt); +		sp->leapcnt = (int) detzcode(tzhp->tzh_leapcnt); +		sp->timecnt = (int) detzcode(tzhp->tzh_timecnt); +		sp->typecnt = (int) detzcode(tzhp->tzh_typecnt); +		sp->charcnt = (int) detzcode(tzhp->tzh_charcnt); +		if (sp->leapcnt < 0 || sp->leapcnt > TZ_MAX_LEAPS || +			sp->typecnt <= 0 || sp->typecnt > TZ_MAX_TYPES || +			sp->timecnt < 0 || sp->timecnt > TZ_MAX_TIMES || +			sp->charcnt < 0 || sp->charcnt > TZ_MAX_CHARS || +			(ttisstdcnt != sp->typecnt && ttisstdcnt != 0)) +				return -1; +		if (i < sizeof *tzhp + +			sp->timecnt * (4 + sizeof (char)) + +			sp->typecnt * (4 + 2 * sizeof (char)) + +			sp->charcnt * sizeof (char) + +			sp->leapcnt * 2 * 4 + +			ttisstdcnt * sizeof (char)) +				return -1; +		p = buf + sizeof *tzhp; +		for (i = 0; i < sp->timecnt; ++i) { +			sp->ats[i] = detzcode(p); +			p += 4; +		} +		for (i = 0; i < sp->timecnt; ++i) { +			sp->types[i] = (unsigned char) *p++; +			if (sp->types[i] >= sp->typecnt) +				return -1; +		} +		for (i = 0; i < sp->typecnt; ++i) { +			register struct ttinfo *	ttisp; + +			ttisp = &sp->ttis[i]; +			ttisp->tt_gmtoff = detzcode(p); +			p += 4; +			ttisp->tt_isdst = (unsigned char) *p++; +			if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1) +				return -1; +			ttisp->tt_abbrind = (unsigned char) *p++; +			if (ttisp->tt_abbrind < 0 || +				ttisp->tt_abbrind > sp->charcnt) +					return -1; +		} +		for (i = 0; i < sp->charcnt; ++i) +			sp->chars[i] = *p++; +		sp->chars[i] = '\0';	/* ensure '\0' at end */ +		for (i = 0; i < sp->leapcnt; ++i) { +			register struct lsinfo *	lsisp; + +			lsisp = &sp->lsis[i]; +			lsisp->ls_trans = detzcode(p); +			p += 4; +			lsisp->ls_corr = detzcode(p); +			p += 4; +		} +		for (i = 0; i < sp->typecnt; ++i) { +			register struct ttinfo *	ttisp; + +			ttisp = &sp->ttis[i]; +			if (ttisstdcnt == 0) +				ttisp->tt_ttisstd = FALSE; +			else { +				ttisp->tt_ttisstd = *p++; +				if (ttisp->tt_ttisstd != TRUE && +					ttisp->tt_ttisstd != FALSE) +						return -1; +			} +		} +	} +	return 0; +} + +static const int	mon_lengths[2][MONSPERYEAR] = { +	31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, +	31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 +}; + +static const int	year_lengths[2] = { +	DAYSPERNYEAR, DAYSPERLYEAR +}; + +/* +** Given a pointer into a time zone string, scan until a character that is not +** a valid character in a zone name is found.  Return a pointer to that +** character. +*/ + +static const char * +getzname(strp) +register const char *	strp; +{ +	register char	c; + +	while ((c = *strp) != '\0' && !isdigit(c) && c != ',' && c != '-' && +		c != '+') +			++strp; +	return strp; +} + +/* +** Given a pointer into a time zone string, extract a number from that string. +** Check that the number is within a specified range; if it is not, return +** NULL. +** Otherwise, return a pointer to the first character not part of the number. +*/ + +static const char * +getnum(strp, nump, min, max) +register const char *	strp; +int * const		nump; +const int		min; +const int		max; +{ +	register char	c; +	register int	num; + +	if (strp == NULL || !isdigit(*strp)) +		return NULL; +	num = 0; +	while ((c = *strp) != '\0' && isdigit(c)) { +		num = num * 10 + (c - '0'); +		if (num > max) +			return NULL;	/* illegal value */ +		++strp; +	} +	if (num < min) +		return NULL;		/* illegal value */ +	*nump = num; +	return strp; +} + +/* +** Given a pointer into a time zone string, extract a number of seconds, +** in hh[:mm[:ss]] form, from the string. +** If any error occurs, return NULL. +** Otherwise, return a pointer to the first character not part of the number +** of seconds. +*/ + +static const char * +getsecs(strp, secsp) +register const char *	strp; +long * const		secsp; +{ +	int	num; + +	strp = getnum(strp, &num, 0, HOURSPERDAY); +	if (strp == NULL) +		return NULL; +	*secsp = num * SECSPERHOUR; +	if (*strp == ':') { +		++strp; +		strp = getnum(strp, &num, 0, MINSPERHOUR - 1); +		if (strp == NULL) +			return NULL; +		*secsp += num * SECSPERMIN; +		if (*strp == ':') { +			++strp; +			strp = getnum(strp, &num, 0, SECSPERMIN - 1); +			if (strp == NULL) +				return NULL; +			*secsp += num; +		} +	} +	return strp; +} + +/* +** Given a pointer into a time zone string, extract an offset, in +** [+-]hh[:mm[:ss]] form, from the string. +** If any error occurs, return NULL. +** Otherwise, return a pointer to the first character not part of the time. +*/ + +static const char * +getoffset(strp, offsetp) +register const char *	strp; +long * const		offsetp; +{ +	register int	neg; + +	if (*strp == '-') { +		neg = 1; +		++strp; +	} else if (isdigit(*strp) || *strp++ == '+') +		neg = 0; +	else	return NULL;		/* illegal offset */ +	strp = getsecs(strp, offsetp); +	if (strp == NULL) +		return NULL;		/* illegal time */ +	if (neg) +		*offsetp = -*offsetp; +	return strp; +} + +/* +** Given a pointer into a time zone string, extract a rule in the form +** date[/time].  See POSIX section 8 for the format of "date" and "time". +** If a valid rule is not found, return NULL. +** Otherwise, return a pointer to the first character not part of the rule. +*/ + +static const char * +getrule(strp, rulep) +const char *			strp; +register struct rule * const	rulep; +{ +	if (*strp == 'J') { +		/* +		** Julian day. +		*/ +		rulep->r_type = JULIAN_DAY; +		++strp; +		strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR); +	} else if (*strp == 'M') { +		/* +		** Month, week, day. +		*/ +		rulep->r_type = MONTH_NTH_DAY_OF_WEEK; +		++strp; +		strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR); +		if (strp == NULL) +			return NULL; +		if (*strp++ != '.') +			return NULL; +		strp = getnum(strp, &rulep->r_week, 1, 5); +		if (strp == NULL) +			return NULL; +		if (*strp++ != '.') +			return NULL; +		strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1); +	} else if (isdigit(*strp)) { +		/* +		** Day of year. +		*/ +		rulep->r_type = DAY_OF_YEAR; +		strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1); +	} else	return NULL;		/* invalid format */ +	if (strp == NULL) +		return NULL; +	if (*strp == '/') { +		/* +		** Time specified. +		*/ +		++strp; +		strp = getsecs(strp, &rulep->r_time); +	} else	rulep->r_time = 2 * SECSPERHOUR;	/* default = 2:00:00 */ +	return strp; +} + +/* +** Given the Epoch-relative time of January 1, 00:00:00 GMT, in a year, the +** year, a rule, and the offset from GMT at the time that rule takes effect, +** calculate the Epoch-relative time that rule takes effect. +*/ + +static time_t +transtime(janfirst, year, rulep, offset) +const time_t				janfirst; +const int				year; +register const struct rule * const	rulep; +const long				offset; +{ +	register int	leapyear; +	register time_t	value; +	register int	i; +	int		d, m1, yy0, yy1, yy2, dow; + +	leapyear = isleap(year); +	switch (rulep->r_type) { + +	case JULIAN_DAY: +		/* +		** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap +		** years. +		** In non-leap years, or if the day number is 59 or less, just +		** add SECSPERDAY times the day number-1 to the time of +		** January 1, midnight, to get the day. +		*/ +		value = janfirst + (rulep->r_day - 1) * SECSPERDAY; +		if (leapyear && rulep->r_day >= 60) +			value += SECSPERDAY; +		break; + +	case DAY_OF_YEAR: +		/* +		** n - day of year. +		** Just add SECSPERDAY times the day number to the time of +		** January 1, midnight, to get the day. +		*/ +		value = janfirst + rulep->r_day * SECSPERDAY; +		break; + +	case MONTH_NTH_DAY_OF_WEEK: +		/* +		** Mm.n.d - nth "dth day" of month m. +		*/ +		value = janfirst; +		for (i = 0; i < rulep->r_mon - 1; ++i) +			value += mon_lengths[leapyear][i] * SECSPERDAY; + +		/* +		** Use Zeller's Congruence to get day-of-week of first day of +		** month. +		*/ +		m1 = (rulep->r_mon + 9) % 12 + 1; +		yy0 = (rulep->r_mon <= 2) ? (year - 1) : year; +		yy1 = yy0 / 100; +		yy2 = yy0 % 100; +		dow = ((26 * m1 - 2) / 10 + +			1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7; +		if (dow < 0) +			dow += DAYSPERWEEK; + +		/* +		** "dow" is the day-of-week of the first day of the month.  Get +		** the day-of-month (zero-origin) of the first "dow" day of the +		** month. +		*/ +		d = rulep->r_day - dow; +		if (d < 0) +			d += DAYSPERWEEK; +		for (i = 1; i < rulep->r_week; ++i) { +			if (d + DAYSPERWEEK >= +				mon_lengths[leapyear][rulep->r_mon - 1]) +					break; +			d += DAYSPERWEEK; +		} + +		/* +		** "d" is the day-of-month (zero-origin) of the day we want. +		*/ +		value += d * SECSPERDAY; +		break; +	} + +	/* +	** "value" is the Epoch-relative time of 00:00:00 GMT on the day in +	** question.  To get the Epoch-relative time of the specified local +	** time on that day, add the transition time and the current offset +	** from GMT. +	*/ +	return value + rulep->r_time + offset; +} + +/* +** Given a POSIX section 8-style TZ string, fill in the rule tables as +** appropriate. +*/ + +static int +tzparse(name, sp, lastditch) +const char *			name; +register struct state * const	sp; +const int			lastditch; +{ +	const char *			stdname; +	const char *			dstname; +	int				stdlen; +	int				dstlen; +	long				stdoffset; +	long				dstoffset; +	register time_t *		atp; +	register unsigned char *	typep; +	register char *			cp; +	register int			load_result; + +	stdname = name; +	if (lastditch) { +		stdlen = strlen(name);	/* length of standard zone name */ +		name += stdlen; +		if (stdlen >= sizeof sp->chars) +			stdlen = (sizeof sp->chars) - 1; +	} else { +		name = getzname(name); +		stdlen = name - stdname; +		if (stdlen < 3) +			return -1; +	} +	if (*name == '\0') +		return -1; +	else { +		name = getoffset(name, &stdoffset); +		if (name == NULL) +			return -1; +	} +	load_result = tzload(TZDEFRULES, sp); +	if (load_result != 0) +		sp->leapcnt = 0;		/* so, we're off a little */ +	if (*name != '\0') { +		dstname = name; +		name = getzname(name); +		dstlen = name - dstname;	/* length of DST zone name */ +		if (dstlen < 3) +			return -1; +		if (*name != '\0' && *name != ',' && *name != ';') { +			name = getoffset(name, &dstoffset); +			if (name == NULL) +				return -1; +		} else	dstoffset = stdoffset - SECSPERHOUR; +		if (*name == ',' || *name == ';') { +			struct rule	start; +			struct rule	end; +			register int	year; +			register time_t	janfirst; +			time_t		starttime; +			time_t		endtime; + +			++name; +			if ((name = getrule(name, &start)) == NULL) +				return -1; +			if (*name++ != ',') +				return -1; +			if ((name = getrule(name, &end)) == NULL) +				return -1; +			if (*name != '\0') +				return -1; +			sp->typecnt = 2;	/* standard time and DST */ +			/* +			** Two transitions per year, from EPOCH_YEAR to 2037. +			*/ +			sp->timecnt = 2 * (2037 - EPOCH_YEAR + 1); +			if (sp->timecnt > TZ_MAX_TIMES) +				return -1; +			sp->ttis[0].tt_gmtoff = -dstoffset; +			sp->ttis[0].tt_isdst = 1; +			sp->ttis[0].tt_abbrind = stdlen + 1; +			sp->ttis[1].tt_gmtoff = -stdoffset; +			sp->ttis[1].tt_isdst = 0; +			sp->ttis[1].tt_abbrind = 0; +			atp = sp->ats; +			typep = sp->types; +			janfirst = 0; +			for (year = EPOCH_YEAR; year <= 2037; ++year) { +				starttime = transtime(janfirst, year, &start, +					stdoffset); +				endtime = transtime(janfirst, year, &end, +					dstoffset); +				if (starttime > endtime) { +					*atp++ = endtime; +					*typep++ = 1;	/* DST ends */ +					*atp++ = starttime; +					*typep++ = 0;	/* DST begins */ +				} else { +					*atp++ = starttime; +					*typep++ = 0;	/* DST begins */ +					*atp++ = endtime; +					*typep++ = 1;	/* DST ends */ +				} +				janfirst += +					year_lengths[isleap(year)] * SECSPERDAY; +			} +		} else { +			int		sawstd; +			int		sawdst; +			long		stdfix; +			long		dstfix; +			long		oldfix; +			int		isdst; +			register int	i; + +			if (*name != '\0') +				return -1; +			if (load_result != 0) +				return -1; +			/* +			** Compute the difference between the real and +			** prototype standard and summer time offsets +			** from GMT, and put the real standard and summer +			** time offsets into the rules in place of the +			** prototype offsets. +			*/ +			sawstd = FALSE; +			sawdst = FALSE; +			stdfix = 0; +			dstfix = 0; +			for (i = 0; i < sp->typecnt; ++i) { +				if (sp->ttis[i].tt_isdst) { +					oldfix = dstfix; +					dstfix = +					    sp->ttis[i].tt_gmtoff + dstoffset; +					if (sawdst && (oldfix != dstfix)) +						return -1; +					sp->ttis[i].tt_gmtoff = -dstoffset; +					sp->ttis[i].tt_abbrind = stdlen + 1; +					sawdst = TRUE; +				} else { +					oldfix = stdfix; +					stdfix = +					    sp->ttis[i].tt_gmtoff + stdoffset; +					if (sawstd && (oldfix != stdfix)) +						return -1; +					sp->ttis[i].tt_gmtoff = -stdoffset; +					sp->ttis[i].tt_abbrind = 0; +					sawstd = TRUE; +				} +			} +			/* +			** Make sure we have both standard and summer time. +			*/ +			if (!sawdst || !sawstd) +				return -1; +			/* +			** Now correct the transition times by shifting +			** them by the difference between the real and +			** prototype offsets.  Note that this difference +			** can be different in standard and summer time; +			** the prototype probably has a 1-hour difference +			** between standard and summer time, but a different +			** difference can be specified in TZ. +			*/ +			isdst = FALSE;	/* we start in standard time */ +			for (i = 0; i < sp->timecnt; ++i) { +				register const struct ttinfo *	ttisp; + +				/* +				** If summer time is in effect, and the +				** transition time was not specified as +				** standard time, add the summer time +				** offset to the transition time; +				** otherwise, add the standard time offset +				** to the transition time. +				*/ +				ttisp = &sp->ttis[sp->types[i]]; +				sp->ats[i] += +					(isdst && !ttisp->tt_ttisstd) ? +						dstfix : stdfix; +				isdst = ttisp->tt_isdst; +			} +		} +	} else { +		dstlen = 0; +		sp->typecnt = 1;		/* only standard time */ +		sp->timecnt = 0; +		sp->ttis[0].tt_gmtoff = -stdoffset; +		sp->ttis[0].tt_isdst = 0; +		sp->ttis[0].tt_abbrind = 0; +	} +	sp->charcnt = stdlen + 1; +	if (dstlen != 0) +		sp->charcnt += dstlen + 1; +	if (sp->charcnt > sizeof sp->chars) +		return -1; +	cp = sp->chars; +	(void) strncpy(cp, stdname, stdlen); +	cp += stdlen; +	*cp++ = '\0'; +	if (dstlen != 0) { +		(void) strncpy(cp, dstname, dstlen); +		*(cp + dstlen) = '\0'; +	} +	return 0; +} + +static void +gmtload(sp) +struct state * const	sp; +{ +	if (tzload(GMT, sp) != 0) +		(void) tzparse(GMT, sp, TRUE); +} + +void +tzset() +{ +	register const char *	name; +	void tzsetwall(); + +	name = getenv("TZ"); +	if (name == NULL) { +		tzsetwall(); +		return; +	} +	lcl_is_set = TRUE; +#ifdef ALL_STATE +	if (lclptr == NULL) { +		lclptr = (struct state *) malloc(sizeof *lclptr); +		if (lclptr == NULL) { +			settzname();	/* all we can do */ +			return; +		} +	} +#endif /* defined ALL_STATE */ +	if (*name == '\0') { +		/* +		** User wants it fast rather than right. +		*/ +		lclptr->leapcnt = 0;		/* so, we're off a little */ +		lclptr->timecnt = 0; +		lclptr->ttis[0].tt_gmtoff = 0; +		lclptr->ttis[0].tt_abbrind = 0; +		(void) strcpy(lclptr->chars, GMT); +	} else if (tzload(name, lclptr) != 0) +		if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0) +			(void) gmtload(lclptr); +	settzname(); +} + +void +tzsetwall() +{ +	lcl_is_set = TRUE; +#ifdef ALL_STATE +	if (lclptr == NULL) { +		lclptr = (struct state *) malloc(sizeof *lclptr); +		if (lclptr == NULL) { +			settzname();	/* all we can do */ +			return; +		} +	} +#endif /* defined ALL_STATE */ +	if (tzload((char *) NULL, lclptr) != 0) +		gmtload(lclptr); +	settzname(); +} + +/* +** The easy way to behave "as if no library function calls" localtime +** is to not call it--so we drop its guts into "localsub", which can be +** freely called.  (And no, the PANS doesn't require the above behavior-- +** but it *is* desirable.) +** +** The unused offset argument is for the benefit of mktime variants. +*/ + +/*ARGSUSED*/ +static void +localsub(timep, offset, tmp) +const time_t * const	timep; +const long		offset; +struct tm * const	tmp; +{ +	register struct state *	sp; +	register const struct ttinfo *	ttisp; +	register int			i; +	const time_t			t = *timep; + +	if (!lcl_is_set) +		tzset(); +	sp = lclptr; +#ifdef ALL_STATE +	if (sp == NULL) { +		gmtsub(timep, offset, tmp); +		return; +	} +#endif /* defined ALL_STATE */ +	if (sp->timecnt == 0 || t < sp->ats[0]) { +		i = 0; +		while (sp->ttis[i].tt_isdst) +			if (++i >= sp->typecnt) { +				i = 0; +				break; +			} +	} else { +		for (i = 1; i < sp->timecnt; ++i) +			if (t < sp->ats[i]) +				break; +		i = sp->types[i - 1]; +	} +	ttisp = &sp->ttis[i]; +	/* +	** To get (wrong) behavior that's compatible with System V Release 2.0 +	** you'd replace the statement below with +	**	t += ttisp->tt_gmtoff; +	**	timesub(&t, 0L, sp, tmp); +	*/ +	timesub(&t, ttisp->tt_gmtoff, sp, tmp); +	tmp->tm_isdst = ttisp->tt_isdst; +	tzname[tmp->tm_isdst] = (char *) &sp->chars[ttisp->tt_abbrind]; +	tmp->tm_zone = &sp->chars[ttisp->tt_abbrind]; +} + +struct tm * +localtime(timep) +const time_t * const	timep; +{ +	static struct tm	tm; + +	localsub(timep, 0L, &tm); +	return &tm; +} + +/* +** gmtsub is to gmtime as localsub is to localtime. +*/ + +static void +gmtsub(timep, offset, tmp) +const time_t * const	timep; +const long		offset; +struct tm * const	tmp; +{ +	if (!gmt_is_set) { +		gmt_is_set = TRUE; +#ifdef ALL_STATE +		gmtptr = (struct state *) malloc(sizeof *gmtptr); +		if (gmtptr != NULL) +#endif /* defined ALL_STATE */ +			gmtload(gmtptr); +	} +	timesub(timep, offset, gmtptr, tmp); +	/* +	** Could get fancy here and deliver something such as +	** "GMT+xxxx" or "GMT-xxxx" if offset is non-zero, +	** but this is no time for a treasure hunt. +	*/ +	if (offset != 0) +		tmp->tm_zone = WILDABBR; +	else { +#ifdef ALL_STATE +		if (gmtptr == NULL) +			tmp->TM_ZONE = GMT; +		else	tmp->TM_ZONE = gmtptr->chars; +#endif /* defined ALL_STATE */ +#ifndef ALL_STATE +		tmp->tm_zone = gmtptr->chars; +#endif /* State Farm */ +	} +} + +struct tm * +gmtime(timep) +const time_t * const	timep; +{ +	static struct tm	tm; + +	gmtsub(timep, 0L, &tm); +	return &tm; +} + +static void +timesub(timep, offset, sp, tmp) +const time_t * const			timep; +const long				offset; +register const struct state * const	sp; +register struct tm * const		tmp; +{ +	register const struct lsinfo *	lp; +	register long			days; +	register long			rem; +	register int			y; +	register int			yleap; +	register const int *		ip; +	register long			corr; +	register int			hit; +	register int			i; + +	corr = 0; +	hit = FALSE; +#ifdef ALL_STATE +	i = (sp == NULL) ? 0 : sp->leapcnt; +#endif /* defined ALL_STATE */ +#ifndef ALL_STATE +	i = sp->leapcnt; +#endif /* State Farm */ +	while (--i >= 0) { +		lp = &sp->lsis[i]; +		if (*timep >= lp->ls_trans) { +			if (*timep == lp->ls_trans) +				hit = ((i == 0 && lp->ls_corr > 0) || +					lp->ls_corr > sp->lsis[i - 1].ls_corr); +			corr = lp->ls_corr; +			break; +		} +	} +	days = *timep / SECSPERDAY; +	rem = *timep % SECSPERDAY; +#ifdef mc68k +	if (*timep == 0x80000000) { +		/* +		** A 3B1 muffs the division on the most negative number. +		*/ +		days = -24855; +		rem = -11648; +	} +#endif /* mc68k */ +	rem += (offset - corr); +	while (rem < 0) { +		rem += SECSPERDAY; +		--days; +	} +	while (rem >= SECSPERDAY) { +		rem -= SECSPERDAY; +		++days; +	} +	tmp->tm_hour = (int) (rem / SECSPERHOUR); +	rem = rem % SECSPERHOUR; +	tmp->tm_min = (int) (rem / SECSPERMIN); +	tmp->tm_sec = (int) (rem % SECSPERMIN); +	if (hit) +		/* +		** A positive leap second requires a special +		** representation.  This uses "... ??:59:60". +		*/ +		++(tmp->tm_sec); +	tmp->tm_wday = (int) ((EPOCH_WDAY + days) % DAYSPERWEEK); +	if (tmp->tm_wday < 0) +		tmp->tm_wday += DAYSPERWEEK; +	y = EPOCH_YEAR; +	if (days >= 0) +		for ( ; ; ) { +			yleap = isleap(y); +			if (days < (long) year_lengths[yleap]) +				break; +			++y; +			days = days - (long) year_lengths[yleap]; +		} +	else do { +		--y; +		yleap = isleap(y); +		days = days + (long) year_lengths[yleap]; +	} while (days < 0); +	tmp->tm_year = y - TM_YEAR_BASE; +	tmp->tm_yday = (int) days; +	ip = mon_lengths[yleap]; +	for (tmp->tm_mon = 0; days >= (long) ip[tmp->tm_mon]; ++(tmp->tm_mon)) +		days = days - (long) ip[tmp->tm_mon]; +	tmp->tm_mday = (int) (days + 1); +	tmp->tm_isdst = 0; +	tmp->tm_gmtoff = offset; +} + +/* +** A la X3J11 +*/ + +char * +asctime(timeptr) +register const struct tm *	timeptr; +{ +	static const char	wday_name[DAYSPERWEEK][3] = { +		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +	}; +	static const char	mon_name[MONSPERYEAR][3] = { +		"Jan", "Feb", "Mar", "Apr", "May", "Jun", +		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +	}; +	static char	result[26]; + +	(void) sprintf(result, "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %d\n", +		wday_name[timeptr->tm_wday], +		mon_name[timeptr->tm_mon], +		timeptr->tm_mday, timeptr->tm_hour, +		timeptr->tm_min, timeptr->tm_sec, +		TM_YEAR_BASE + timeptr->tm_year); +	return result; +} + +char * +ctime(timep) +const time_t * const	timep; +{ +	return asctime(localtime(timep)); +} + +/* +** Adapted from code provided by Robert Elz, who writes: +**	The "best" way to do mktime I think is based on an idea of Bob +**	Kridle's (so its said...) from a long time ago. (mtxinu!kridle now). +**	It does a binary search of the time_t space.  Since time_t's are +**	just 32 bits, its a max of 32 iterations (even at 64 bits it +**	would still be very reasonable). +*/ + +#ifndef WRONG +#define WRONG	(-1) +#endif /* !defined WRONG */ + +static void +normalize(tensptr, unitsptr, base) +int * const	tensptr; +int * const	unitsptr; +const int	base; +{ +	if (*unitsptr >= base) { +		*tensptr += *unitsptr / base; +		*unitsptr %= base; +	} else if (*unitsptr < 0) { +		*tensptr -= 1 + (-(*unitsptr + 1)) / base; +		*unitsptr = base - 1 - (-(*unitsptr + 1)) % base; +	} +} + +static int +tmcomp(atmp, btmp) +register const struct tm * const atmp; +register const struct tm * const btmp; +{ +	register int	result; + +	if ((result = (atmp->tm_year - btmp->tm_year)) == 0 && +		(result = (atmp->tm_mon - btmp->tm_mon)) == 0 && +		(result = (atmp->tm_mday - btmp->tm_mday)) == 0 && +		(result = (atmp->tm_hour - btmp->tm_hour)) == 0 && +		(result = (atmp->tm_min - btmp->tm_min)) == 0) +			result = atmp->tm_sec - btmp->tm_sec; +	return result; +} + +static time_t +time2(tmp, funcp, offset, okayp) +struct tm * const	tmp; +void (* const		funcp)(); +const long		offset; +int * const		okayp; +{ +	register const struct state *	sp; +	register int			dir; +	register int			bits; +	register int			i, j ; +	register int			saved_seconds; +	time_t				newt; +	time_t				t; +	struct tm			yourtm, mytm; + +	*okayp = FALSE; +	yourtm = *tmp; +	if (yourtm.tm_sec >= SECSPERMIN + 2 || yourtm.tm_sec < 0) +		normalize(&yourtm.tm_min, &yourtm.tm_sec, SECSPERMIN); +	normalize(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR); +	normalize(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY); +	normalize(&yourtm.tm_year, &yourtm.tm_mon, MONSPERYEAR); +	while (yourtm.tm_mday <= 0) { +		--yourtm.tm_year; +		yourtm.tm_mday += +			year_lengths[isleap(yourtm.tm_year + TM_YEAR_BASE)]; +	} +	while (yourtm.tm_mday > DAYSPERLYEAR) { +		yourtm.tm_mday -= +		    year_lengths[isleap(yourtm.tm_year + TM_YEAR_BASE)]; +		++yourtm.tm_year; +	} +	for ( ; ; ) { +		i = mon_lengths[isleap(yourtm.tm_year + +			TM_YEAR_BASE)][yourtm.tm_mon]; +		if (yourtm.tm_mday <= i) +			break; +		yourtm.tm_mday -= i; +		if (++yourtm.tm_mon >= MONSPERYEAR) { +			yourtm.tm_mon = 0; +			++yourtm.tm_year; +		} +	} +	saved_seconds = yourtm.tm_sec; +	yourtm.tm_sec = 0; +	/* +	** Calculate the number of magnitude bits in a time_t +	** (this works regardless of whether time_t is +	** signed or unsigned, though lint complains if unsigned). +	*/ +	for (bits = 0, t = 1; t > 0; ++bits, t <<= 1) +		; +	/* +	** If time_t is signed, then 0 is the median value, +	** if time_t is unsigned, then 1 << bits is median. +	*/ +	t = (t < 0) ? 0 : ((time_t) 1 << bits); +	for ( ; ; ) { +		(*funcp)(&t, offset, &mytm); +		dir = tmcomp(&mytm, &yourtm); +		if (dir != 0) { +			if (bits-- < 0) +				return WRONG; +			if (bits < 0) +				--t; +			else if (dir > 0) +				t -= (time_t) 1 << bits; +			else	t += (time_t) 1 << bits; +			continue; +		} +		if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst) +			break; +		/* +		** Right time, wrong type. +		** Hunt for right time, right type. +		** It's okay to guess wrong since the guess +		** gets checked. +		*/ +		sp = (const struct state *) +			((funcp == localsub) ? lclptr : gmtptr); +#ifdef ALL_STATE +		if (sp == NULL) +			return WRONG; +#endif /* defined ALL_STATE */ +		for (i = 0; i < sp->typecnt; ++i) { +			if (sp->ttis[i].tt_isdst != yourtm.tm_isdst) +				continue; +			for (j = 0; j < sp->typecnt; ++j) { +				if (sp->ttis[j].tt_isdst == yourtm.tm_isdst) +					continue; +				newt = t + sp->ttis[j].tt_gmtoff - +					sp->ttis[i].tt_gmtoff; +				(*funcp)(&newt, offset, &mytm); +				if (tmcomp(&mytm, &yourtm) != 0) +					continue; +				if (mytm.tm_isdst != yourtm.tm_isdst) +					continue; +				/* +				** We have a match. +				*/ +				t = newt; +				goto label; +			} +		} +		return WRONG; +	} +label: +	t += saved_seconds; +	(*funcp)(&t, offset, tmp); +	*okayp = TRUE; +	return t; +} + +static time_t +time1(tmp, funcp, offset) +struct tm * const	tmp; +void (* const		funcp)(); +const long		offset; +{ +	register time_t			t; +	register const struct state *	sp; +	register int			samei, otheri; +	int				okay; + +	if (tmp->tm_isdst > 1) +		tmp->tm_isdst = 1; +	t = time2(tmp, funcp, offset, &okay); +	if (okay || tmp->tm_isdst < 0) +		return t; +	/* +	** We're supposed to assume that somebody took a time of one type +	** and did some math on it that yielded a "struct tm" that's bad. +	** We try to divine the type they started from and adjust to the +	** type they need. +	*/ +	sp = (const struct state *) ((funcp == localsub) ? lclptr : gmtptr); +#ifdef ALL_STATE +	if (sp == NULL) +		return WRONG; +#endif /* defined ALL_STATE */ +	for (samei = 0; samei < sp->typecnt; ++samei) { +		if (sp->ttis[samei].tt_isdst != tmp->tm_isdst) +			continue; +		for (otheri = 0; otheri < sp->typecnt; ++otheri) { +			if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst) +				continue; +			tmp->tm_sec += sp->ttis[otheri].tt_gmtoff - +					sp->ttis[samei].tt_gmtoff; +			tmp->tm_isdst = !tmp->tm_isdst; +			t = time2(tmp, funcp, offset, &okay); +			if (okay) +				return t; +			tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff - +					sp->ttis[samei].tt_gmtoff; +			tmp->tm_isdst = !tmp->tm_isdst; +		} +	} +	return WRONG; +} + +time_t +mktime(tmp) +struct tm * const	tmp; +{ +	return time1(tmp, localsub, 0L); +} diff --git a/lib/libc/gen/difftime.c b/lib/libc/gen/difftime.c new file mode 100644 index 000000000000..394133087203 --- /dev/null +++ b/lib/libc/gen/difftime.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 1989, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)difftime.c	8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/types.h> + +double +difftime(time1, time0) +	time_t time1, time0; +{ +	return(time1 - time0); +} diff --git a/lib/libc/i386/gen/_setjmp.s b/lib/libc/i386/gen/_setjmp.s new file mode 100644 index 000000000000..47e319a4abda --- /dev/null +++ b/lib/libc/i386/gen/_setjmp.s @@ -0,0 +1,78 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)_setjmp.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* + * C library -- _setjmp, _longjmp + * + *	_longjmp(a,v) + * will generate a "return(v)" from the last call to + *	_setjmp(a) + * by restoring registers from the stack. + * The previous signal state is NOT restored. + */ + +#include "DEFS.h" + +ENTRY(_setjmp) +	movl	4(%esp),%eax +	movl	0(%esp),%edx +	movl	%edx, 0(%eax)		/* rta */ +	movl	%ebx, 4(%eax) +	movl	%esp, 8(%eax) +	movl	%ebp,12(%eax) +	movl	%esi,16(%eax) +	movl	%edi,20(%eax) +	movl	$0,%eax +	ret + +ENTRY(_longjmp) +	movl	4(%esp),%edx +	movl	8(%esp),%eax +	movl	0(%edx),%ecx +	movl	4(%edx),%ebx +	movl	8(%edx),%esp +	movl	12(%edx),%ebp +	movl	16(%edx),%esi +	movl	20(%edx),%edi +	cmpl	$0,%eax +	jne	1f +	movl	$1,%eax +1:	movl	%ecx,0(%esp) +	ret diff --git a/lib/libc/i386/gen/alloca.s b/lib/libc/i386/gen/alloca.s new file mode 100644 index 000000000000..a2d6a41f3af9 --- /dev/null +++ b/lib/libc/i386/gen/alloca.s @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)alloca.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* like alloc, but automatic automatic free in return */ + +#include "DEFS.h" + +ENTRY(alloca) +	popl	%edx		/*  pop return addr */ +	popl	%eax		/*  pop amount to allocate */ +	movl	%esp,%ecx +	addl	$3,%eax		/*  round up to next word */ +	andl	$0xfffffffc,%eax +	subl	%eax,%esp +	movl	%esp,%eax	/* base of newly allocated space */ +	pushl	8(%ecx)		/* copy possible saved registers */ +	pushl	4(%ecx) +	pushl	0(%ecx) +	pushl	%eax		/* dummy to pop at callsite */ +	jmp	%edx		/* "return" */ diff --git a/lib/libc/i386/gen/divsi3.s b/lib/libc/i386/gen/divsi3.s new file mode 100644 index 000000000000..946a4a16c472 --- /dev/null +++ b/lib/libc/i386/gen/divsi3.s @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)divsi3.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +	.globl ___divsi3 +___divsi3: +	movl 4(%esp),%eax +	cltd +	idivl 8(%esp) +	ret diff --git a/lib/libc/i386/gen/fabs.s b/lib/libc/i386/gen/fabs.s new file mode 100644 index 000000000000..40e72c80ef74 --- /dev/null +++ b/lib/libc/i386/gen/fabs.s @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)fabs.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +#include "DEFS.h" + +ENTRY(fabs) +	fldl	4(%esp) +	fabs +	ret diff --git a/lib/libc/i386/gen/fixdfsi.s b/lib/libc/i386/gen/fixdfsi.s new file mode 100644 index 000000000000..138d0788018e --- /dev/null +++ b/lib/libc/i386/gen/fixdfsi.s @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 1991, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)fixdfsi.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +	.globl ___fixdfsi +___fixdfsi: +	fldl	4(%esp) +	fistpl	4(%esp) +	movl	4(%esp),%eax +	ret diff --git a/lib/libc/i386/gen/fixunsdfsi.s b/lib/libc/i386/gen/fixunsdfsi.s new file mode 100644 index 000000000000..7025bb6bd9cf --- /dev/null +++ b/lib/libc/i386/gen/fixunsdfsi.s @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)fixunsdfsi.s	8.1	6/4/93" +#endif /* LIBC_SCCS and not lint */ + +	.globl ___fixunsdfsi +___fixunsdfsi: +	fldl	4(%esp)		/* argument double to accum stack */ +	frndint			/* create integer */ +	fcoml	fbiggestsigned	/* bigger than biggest signed? */ +	fstsw	%ax +	sahf +	jnb	1f +	 +	fistpl	4(%esp) +	movl	4(%esp),%eax +	ret + +1:	fsubl	fbiggestsigned	/* reduce for proper conversion */ +	fistpl	4(%esp)		/* convert */ +	movl	4(%esp),%eax +	orl	$0x80000000,%eax	/* restore bias */ +	ret + +fbiggestsigned:	.double	0r2147483648.0 diff --git a/lib/libc/i386/gen/modf.s b/lib/libc/i386/gen/modf.s new file mode 100644 index 000000000000..2551237df3e6 --- /dev/null +++ b/lib/libc/i386/gen/modf.s @@ -0,0 +1,75 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Sean Eric Fagan. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)modf.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* + * modf(value, iptr): return fractional part of value, and stores the + * integral part into iptr (a pointer to double). + * + * Written by Sean Eric Fagan (sef@kithrup.COM) + * Sun Mar 11 20:27:30 PST 1990 + */ + +/* With CHOP mode on, frndint behaves as TRUNC does.  Useful. */ +.text +.globl _modf +_modf: +	pushl %ebp +	movl %esp,%ebp +	subl $16,%esp +	fnstcw -12(%ebp) +	movw -12(%ebp),%dx +	orw $3072,%dx +	movw %dx,-16(%ebp) +	fldcw -16(%ebp) +	fldl 8(%ebp) +	frndint +	fstpl -8(%ebp) +	fldcw -12(%ebp) +	movl 16(%ebp),%eax +	movl -8(%ebp),%edx +	movl -4(%ebp),%ecx +	movl %edx,(%eax) +	movl %ecx,4(%eax) +	fldl 8(%ebp) +	fsubl -8(%ebp) +	jmp L1 +L1: +	leave +	ret diff --git a/lib/libc/i386/gen/setjmp.s b/lib/libc/i386/gen/setjmp.s new file mode 100644 index 000000000000..b24da115efe2 --- /dev/null +++ b/lib/libc/i386/gen/setjmp.s @@ -0,0 +1,86 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)setjmp.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* + * C library -- _setjmp, _longjmp + * + *	longjmp(a,v) + * will generate a "return(v)" from the last call to + *	setjmp(a) + * by restoring registers from the stack. + * The previous signal state is restored. + */ + +#include "DEFS.h" + +ENTRY(setjmp) +	pushl	$0 +	call	_sigblock +	popl	%edx +	movl	4(%esp),%ecx  +	movl	0(%esp),%edx +	movl	%edx, 0(%ecx) +	movl	%ebx, 4(%ecx) +	movl	%esp, 8(%ecx) +	movl	%ebp,12(%ecx) +	movl	%esi,16(%ecx) +	movl	%edi,20(%ecx) +	movl	%eax,24(%ecx) +	movl	$0,%eax +	ret + +ENTRY(longjmp) +	movl	4(%esp),%edx +	pushl	24(%edx) +	call	_sigsetmask +	popl	%eax +	movl	4(%esp),%edx +	movl	8(%esp),%eax +	movl	0(%edx),%ecx +	movl	4(%edx),%ebx +	movl	8(%edx),%esp +	movl	12(%edx),%ebp +	movl	16(%edx),%esi +	movl	20(%edx),%edi +	cmpl	$0,%eax +	jne	1f +	movl	$1,%eax +1:	movl	%ecx,0(%esp) +	ret diff --git a/lib/libc/i386/gen/udivsi3.s b/lib/libc/i386/gen/udivsi3.s new file mode 100644 index 000000000000..791e5264e336 --- /dev/null +++ b/lib/libc/i386/gen/udivsi3.s @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)udivsi3.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +	.globl ___udivsi3 +___udivsi3: +	movl 4(%esp),%eax +	xorl %edx,%edx +	divl 8(%esp) +	ret diff --git a/lib/libc/i386/net/htonl.s b/lib/libc/i386/net/htonl.s new file mode 100644 index 000000000000..01d93c840fbe --- /dev/null +++ b/lib/libc/i386/net/htonl.s @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)htonl.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* netorder = htonl(hostorder) */ + +#include "DEFS.h" + +ENTRY(htonl) +	movl	4(%esp),%eax +	xchgb	%al,%ah +	roll	$16,%eax +	xchgb	%al,%ah +	ret diff --git a/lib/libc/i386/net/htons.s b/lib/libc/i386/net/htons.s new file mode 100644 index 000000000000..74a76abd3b5e --- /dev/null +++ b/lib/libc/i386/net/htons.s @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)htons.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* netorder = htons(hostorder) */ + +#include "DEFS.h" + +ENTRY(htons) +	movzwl	4(%esp),%eax +	xchgb	%al,%ah +	ret diff --git a/lib/libc/i386/net/ntohl.s b/lib/libc/i386/net/ntohl.s new file mode 100644 index 000000000000..29802facea31 --- /dev/null +++ b/lib/libc/i386/net/ntohl.s @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)ntohl.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* hostorder = ntohl(netorder) */ + +#include "DEFS.h" + +ENTRY(ntohl) +	movl	4(%esp),%eax +	xchgb	%al,%ah +	roll	$16,%eax +	xchgb	%al,%ah +	ret diff --git a/lib/libc/i386/net/ntohs.s b/lib/libc/i386/net/ntohs.s new file mode 100644 index 000000000000..4b521dad3023 --- /dev/null +++ b/lib/libc/i386/net/ntohs.s @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)ntohs.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* hostorder = ntohs(netorder) */ + +#include "DEFS.h" + +ENTRY(ntohs) +	movzwl	4(%esp),%eax +	xchgb	%al,%ah +	ret diff --git a/lib/libc/i386/stdlib/abs.s b/lib/libc/i386/stdlib/abs.s new file mode 100644 index 000000000000..755ea5693ae0 --- /dev/null +++ b/lib/libc/i386/stdlib/abs.s @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)abs.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +#include "DEFS.h" + +ENTRY(abs) +	movl	4(%esp),%eax +	cmpl	$0,%eax +	jge	1f +	negl	%eax +1:	ret diff --git a/lib/libc/i386/string/bzero.s b/lib/libc/i386/string/bzero.s new file mode 100644 index 000000000000..79a5a694f93c --- /dev/null +++ b/lib/libc/i386/string/bzero.s @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)bzero.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* bzero (base,cnt) */ + +	.globl _bzero +_bzero: +	pushl	%edi +	movl	8(%esp),%edi +	movl	12(%esp),%ecx +	movb	$0x00,%al +	cld +	rep +	stosb +	popl	%edi +	ret diff --git a/lib/libc/i386/sys/Ovfork.s b/lib/libc/i386/sys/Ovfork.s new file mode 100644 index 000000000000..c7e6b8a9e7b0 --- /dev/null +++ b/lib/libc/i386/sys/Ovfork.s @@ -0,0 +1,70 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)Ovfork.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +/* + * pid = vfork(); + * + * %edx == 0 in parent process, %edx == 1 in child process. + * %eax == pid of child in parent, %eax == pid of parent in child. + * + */ +	.set	vfork,66 +.globl	_vfork + +_vfork: +	popl	%ecx		/* my rta into ecx */ +	movl	$vfork, %eax +	LCALL(7,0) +	jb	verror +vforkok: +	cmpl	$0,%edx		/* child process? */ +	jne	child		/* yes */ +	jmp 	parent  +.globl	_errno +verror: +	movl	%eax,_errno +	movl	$-1,%eax +	jmp	%ecx +child: +	movl	$0,%eax +parent: +	jmp	%ecx diff --git a/lib/libc/i386/sys/brk.s b/lib/libc/i386/sys/brk.s new file mode 100644 index 000000000000..f85186cf265d --- /dev/null +++ b/lib/libc/i386/sys/brk.s @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)brk.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +#define	SYS_brk		17 + +	.globl	curbrk +	.globl	minbrk +ENTRY(_brk) +	jmp	ok + +ENTRY(brk) +	movl	4(%esp),%eax +	cmpl	%eax,minbrk +	jl	ok +	movl	minbrk,%eax +	movl	%eax,4(%esp) +ok: +	lea	SYS_brk,%eax +	LCALL(7,0) +	jb	err +	movl	4(%esp),%eax +	movl	%eax,curbrk +	movl	$0,%eax +	ret +err: +	jmp	cerror diff --git a/lib/libc/i386/sys/cerror.s b/lib/libc/i386/sys/cerror.s new file mode 100644 index 000000000000..cc2d82fc7717 --- /dev/null +++ b/lib/libc/i386/sys/cerror.s @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)cerror.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +	.globl	_errno +cerror: +	movl	%eax,_errno +	movl	$-1,%eax +	ret diff --git a/lib/libc/i386/sys/exect.s b/lib/libc/i386/sys/exect.s new file mode 100644 index 000000000000..6b42cf84e500 --- /dev/null +++ b/lib/libc/i386/sys/exect.s @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)exect.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" +#include <machine/psl.h> + +ENTRY(exect) +	lea	SYS_execve,%eax +	pushf +	popl	%edx +	orl	$ PSL_T,%edx +	pushl	%edx +	popf +	LCALL(7,0) +	jmp	cerror		/* exect(file, argv, env); */ diff --git a/lib/libc/i386/sys/fork.s b/lib/libc/i386/sys/fork.s new file mode 100644 index 000000000000..ff4d94879417 --- /dev/null +++ b/lib/libc/i386/sys/fork.s @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)fork.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +SYSCALL(fork) +	cmpl	$0,%edx	/* parent, since %edx == 0 in parent, 1 in child */ +	je	1f +	movl	$0,%eax +1: +	ret		/* pid = fork(); */ diff --git a/lib/libc/i386/sys/mount.s b/lib/libc/i386/sys/mount.s new file mode 100644 index 000000000000..ac418f756f58 --- /dev/null +++ b/lib/libc/i386/sys/mount.s @@ -0,0 +1,45 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)mount.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +SYSCALL(mount) +	movl	$0,%eax +	ret diff --git a/lib/libc/i386/sys/pipe.s b/lib/libc/i386/sys/pipe.s new file mode 100644 index 000000000000..6469397053d6 --- /dev/null +++ b/lib/libc/i386/sys/pipe.s @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)pipe.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +SYSCALL(pipe) +	movl	4(%esp),%ecx +	movl	%eax,(%ecx) +	movl	%edx,4(%ecx) +	movl	$0,%eax +	ret diff --git a/lib/libc/i386/sys/ptrace.s b/lib/libc/i386/sys/ptrace.s new file mode 100644 index 000000000000..98994eabdef9 --- /dev/null +++ b/lib/libc/i386/sys/ptrace.s @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)ptrace.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +ENTRY(ptrace) +	xorl	%eax,%eax +	movl	%eax,_errno +	lea	SYS_ptrace,%eax +	LCALL(7,0) +	jb	err +	ret +err: +	jmp	cerror diff --git a/lib/libc/i386/sys/reboot.s b/lib/libc/i386/sys/reboot.s new file mode 100644 index 000000000000..020bea067b52 --- /dev/null +++ b/lib/libc/i386/sys/reboot.s @@ -0,0 +1,44 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)reboot.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +SYSCALL(reboot) +	iret diff --git a/lib/libc/i386/sys/sbrk.s b/lib/libc/i386/sys/sbrk.s new file mode 100644 index 000000000000..7fecd93535a8 --- /dev/null +++ b/lib/libc/i386/sys/sbrk.s @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)sbrk.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +#define	SYS_brk		17 + +	.globl	_end +	.globl	minbrk +	.globl	curbrk + +	.data +minbrk:	.long	_end +curbrk:	.long	_end +	.text + +ENTRY(sbrk) +	movl	4(%esp),%ecx +	movl	curbrk,%eax +	addl	%eax,4(%esp) +	lea	SYS_brk,%eax +	LCALL(7,0) +	jb	err +	movl	curbrk,%eax +	addl	%ecx,curbrk +	ret +err: +	jmp	cerror diff --git a/lib/libc/i386/sys/setlogin.s b/lib/libc/i386/sys/setlogin.s new file mode 100644 index 000000000000..43d31d7b919c --- /dev/null +++ b/lib/libc/i386/sys/setlogin.s @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 1991, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +	.asciz "@(#)setlogin.s	8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +#include "SYS.h" + +.globl	__logname_valid		/* in getlogin() */ + +SYSCALL(setlogin) +	movl	$0,__logname_valid +	ret				/* setlogin(name) */ diff --git a/lib/libc/i386/sys/sigpending.s b/lib/libc/i386/sys/sigpending.s new file mode 100644 index 000000000000..63b06a2d935a --- /dev/null +++ b/lib/libc/i386/sys/sigpending.s @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)sigpending.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +SYSCALL(sigpending) +	movl	4(%esp),%ecx		# fetch pointer to... +	movl	%eax,(%ecx)		# store old mask +	xorl	%eax,%eax +	ret diff --git a/lib/libc/i386/sys/sigprocmask.s b/lib/libc/i386/sys/sigprocmask.s new file mode 100644 index 000000000000..ef91e80611ad --- /dev/null +++ b/lib/libc/i386/sys/sigprocmask.s @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)sigprocmask.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +err: +	jmp	cerror + +ENTRY(sigprocmask) +	movl	8(%esp),%ecx		# fetch new sigset pointer +	cmpl	$0,%ecx			# check new sigset pointer +	jne	1f			# if not null, indirect +/*	movl	$0,8(%esp)		# null mask pointer: block empty set */ +	movl	$1,4(%esp)		# SIG_BLOCK +	jmp	2f +1:	movl	(%ecx),%ecx		# fetch indirect  ... +	movl	%ecx,8(%esp)		# to new mask arg +2:	movl	$ SYS_sigprocmask , %eax +	LCALL(0x7,0) +	jb	err +	movl	12(%esp),%ecx		# fetch old mask requested +	cmpl	$0,%ecx			# test if old mask requested +	je	out +	movl	%eax,(%ecx)		# store old mask +out: +	xorl	%eax,%eax +	ret diff --git a/lib/libc/i386/sys/sigreturn.s b/lib/libc/i386/sys/sigreturn.s new file mode 100644 index 000000000000..1bd6a3b876c6 --- /dev/null +++ b/lib/libc/i386/sys/sigreturn.s @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)sigreturn.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +/* + * We must preserve the state of the registers as the user has set them up. + */ +#ifdef PROF +#undef ENTRY +#define	ENTRY(x) \ +	.globl _/**/x; .align 2; _/**/x:  pusha ; \ +	.data; 1:; .long 0; .text; movl $1b,%eax; call mcount; popa ; nop +#endif /* PROF */ + +SYSCALL(sigreturn) +	ret diff --git a/lib/libc/i386/sys/sigsuspend.s b/lib/libc/i386/sys/sigsuspend.s new file mode 100644 index 000000000000..afbc1ba96a9d --- /dev/null +++ b/lib/libc/i386/sys/sigsuspend.s @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)sigsuspend.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +err: +	jmp	cerror + +ENTRY(sigsuspend) +	movl	4(%esp),%eax		# fetch mask arg +	movl	(%eax),%eax		# indirect to mask arg +	movl	%eax,4(%esp) +	movl	$ SYS_sigsuspend ,%eax +	LCALL(0x7,0) +	jb	err +	xorl	%eax,%eax		# shouldn t happen +	ret diff --git a/lib/libc/i386/sys/syscall.s b/lib/libc/i386/sys/syscall.s new file mode 100644 index 000000000000..189f4dd7b641 --- /dev/null +++ b/lib/libc/i386/sys/syscall.s @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(SYSLIBC_SCCS) && !defined(lint) +	.asciz "@(#)syscall.s	8.1 (Berkeley) 6/4/93" +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +ENTRY(syscall) +	pop	%ecx	/* rta */ +	pop	%eax	/* syscall number */ +	push	%ecx +	LCALL(7,0) +	jb	1f +	ret +1: +	jmp	cerror diff --git a/lib/libc/net/getnetbyname.c b/lib/libc/net/getnetbyname.c new file mode 100644 index 000000000000..5082a7abbfb5 --- /dev/null +++ b/lib/libc/net/getnetbyname.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1983, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)getnetbyname.c	8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include <netdb.h> +#include <string.h> + +extern int _net_stayopen; + +struct netent * +getnetbyname(name) +	register const char *name; +{ +	register struct netent *p; +	register char **cp; + +	setnetent(_net_stayopen); +	while (p = getnetent()) { +		if (strcmp(p->n_name, name) == 0) +			break; +		for (cp = p->n_aliases; *cp != 0; cp++) +			if (strcmp(*cp, name) == 0) +				goto found; +	} +found: +	if (!_net_stayopen) +		endnetent(); +	return (p); +} diff --git a/lib/libc/net/getnetent.c b/lib/libc/net/getnetent.c new file mode 100644 index 000000000000..49ec9b745abc --- /dev/null +++ b/lib/libc/net/getnetent.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 1983, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)getnetent.c	8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <stdio.h> +#include <string.h> + +#define	MAXALIASES	35 + +static FILE *netf; +static char line[BUFSIZ+1]; +static struct netent net; +static char *net_aliases[MAXALIASES]; +int _net_stayopen; + +void +setnetent(f) +	int f; +{ +	if (netf == NULL) +		netf = fopen(_PATH_NETWORKS, "r" ); +	else +		rewind(netf); +	_net_stayopen |= f; +} + +void +endnetent() +{ +	if (netf) { +		fclose(netf); +		netf = NULL; +	} +	_net_stayopen = 0; +} + +struct netent * +getnetent() +{ +	char *p; +	register char *cp, **q; + +	if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL) +		return (NULL); +again: +	p = fgets(line, BUFSIZ, netf); +	if (p == NULL) +		return (NULL); +	if (*p == '#') +		goto again; +	cp = strpbrk(p, "#\n"); +	if (cp == NULL) +		goto again; +	*cp = '\0'; +	net.n_name = p; +	cp = strpbrk(p, " \t"); +	if (cp == NULL) +		goto again; +	*cp++ = '\0'; +	while (*cp == ' ' || *cp == '\t') +		cp++; +	p = strpbrk(cp, " \t"); +	if (p != NULL) +		*p++ = '\0'; +	net.n_net = inet_network(cp); +	net.n_addrtype = AF_INET; +	q = net.n_aliases = net_aliases; +	if (p != NULL)  +		cp = p; +	while (cp && *cp) { +		if (*cp == ' ' || *cp == '\t') { +			cp++; +			continue; +		} +		if (q < &net_aliases[MAXALIASES - 1]) +			*q++ = cp; +		cp = strpbrk(cp, " \t"); +		if (cp != NULL) +			*cp++ = '\0'; +	} +	*q = NULL; +	return (&net); +} diff --git a/lib/libc/net/getservent.3 b/lib/libc/net/getservent.3 new file mode 100644 index 000000000000..f90571ebb97b --- /dev/null +++ b/lib/libc/net/getservent.3 @@ -0,0 +1,155 @@ +.\" Copyright (c) 1983, 1991, 1993 +.\"	The Regents of the University of California.  All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\"    notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\"    notice, this list of conditions and the following disclaimer in the +.\"    documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\"    must display the following acknowledgement: +.\"	This product includes software developed by the University of +.\"	California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\"    may be used to endorse or promote products derived from this software +.\"    without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\"     @(#)getservent.3	8.4 (Berkeley) 5/25/95 +.\" +.Dd May 25, 1995 +.Dt GETSERVENT 3 +.Os BSD 4.2 +.Sh NAME +.Nm getservent , +.Nm getservbyport , +.Nm getservbyname , +.Nm setservent , +.Nm endservent +.Nd get service entry +.Sh SYNOPSIS +.Fd #include <netdb.h> +.Ft struct servent * +.Fn getservent  +.Ft struct servent * +.Fn getservbyname "char *name" "char *proto" +.Ft struct servent * +.Fn getservbyport "int port" proto +.Ft void +.Fn setservent "int stayopen" +.Ft void +.Fn endservent void +.Sh DESCRIPTION +The +.Fn getservent , +.Fn getservbyname , +and +.Fn getservbyport +functions +each return a pointer to an object with the +following structure +containing the broken-out +fields of a line in the network services data base, +.Pa /etc/services . +.Bd -literal -offset indent +struct	servent { +	char	*s_name;	/* official name of service */ +	char	**s_aliases;	/* alias list */ +	int	s_port;		/* port service resides at */ +	char	*s_proto;	/* protocol to use */ +}; +.Ed +.Pp +The members of this structure are: +.Bl -tag -width s_aliases +.It Fa s_name +The official name of the service. +.It Fa s_aliases +A NULL-terminated list of alternate names for the service. +.It Fa s_port +The port number at which the service resides. +Port numbers are returned in network byte order. +.It Fa s_proto +The name of the protocol to use when contacting the +service. +.El +.Pp +The +.Fn getservent +function +reads the next line of the file, opening the file if necessary. +.Pp +The +.Fn setservent +function +opens and rewinds the file.  If the +.Fa stayopen +flag is non-zero, +the net data base will not be closed after each call to  +.Fn getservbyname +or +.Fn getservbyport . +.Pp +The +.Fn endservent +function +closes the file. +.Pp +The +.Fn getservbyname +and +.Fn getservbyport +functions +sequentially search from the beginning +of the file until a matching +protocol name or +port number is found, +or until +.Dv EOF +is encountered. +If a protocol name is also supplied (non-\c +.Dv NULL ) ,  +searches must also match the protocol. +.ne 1i +.Sh FILES +.Bl -tag -width /etc/services -compact +.It Pa /etc/services +.El +.Sh DIAGNOSTICS +Null pointer +(0) returned on +.Dv EOF +or error. +.Sh SEE ALSO +.Xr getprotoent 3 , +.Xr services 5 +.Sh HISTORY +The +.Fn getservent , +.Fn getservbyport , +.Fn getservbyname , +.Fn setservent , +and +.Fn endservent +functions appeared in  +.Bx 4.2 . +.Sh BUGS +These functions use static data storage; +if the data is needed for future use, it should be +copied before any subsequent calls overwrite it. +Expecting port numbers to fit in a 32 bit +quantity is probably naive. diff --git a/lib/libc/net/res_comp.c b/lib/libc/net/res_comp.c new file mode 100644 index 000000000000..66f37ba261cb --- /dev/null +++ b/lib/libc/net/res_comp.c @@ -0,0 +1,355 @@ +/*- + * Copyright (c) 1985, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + *  + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + *  + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)res_comp.c	8.1 (Berkeley) 6/4/93"; +static char rcsid[] = "$Id: res_comp.c,v 4.9.1.1 1993/05/02 22:43:03 vixie Rel $"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/param.h> +#include <arpa/nameser.h> +#include <netinet/in.h> +#include <resolv.h> +#include <stdio.h> + +static int dn_find(); + +/* + * Expand compressed domain name 'comp_dn' to full domain name. + * 'msg' is a pointer to the begining of the message, + * 'eomorig' points to the first location after the message, + * 'exp_dn' is a pointer to a buffer of size 'length' for the result. + * Return size of compressed name or -1 if there was an error. + */ +dn_expand(msg, eomorig, comp_dn, exp_dn, length) +	const u_char *msg, *eomorig, *comp_dn; +	u_char *exp_dn; +	int length; +{ +	register u_char *cp, *dn; +	register int n, c; +	u_char *eom; +	int len = -1, checked = 0; + +	dn = exp_dn; +	cp = (u_char *)comp_dn; +	eom = exp_dn + length; +	/* +	 * fetch next label in domain name +	 */ +	while (n = *cp++) { +		/* +		 * Check for indirection +		 */ +		switch (n & INDIR_MASK) { +		case 0: +			if (dn != exp_dn) { +				if (dn >= eom) +					return (-1); +				*dn++ = '.'; +			} +			if (dn+n >= eom) +				return (-1); +			checked += n + 1; +			while (--n >= 0) { +				if ((c = *cp++) == '.') { +					if (dn + n + 2 >= eom) +						return (-1); +					*dn++ = '\\'; +				} +				*dn++ = c; +				if (cp >= eomorig)	/* out of range */ +					return(-1); +			} +			break; + +		case INDIR_MASK: +			if (len < 0) +				len = cp - comp_dn + 1; +			cp = (u_char *)msg + (((n & 0x3f) << 8) | (*cp & 0xff)); +			if (cp < msg || cp >= eomorig)	/* out of range */ +				return(-1); +			checked += 2; +			/* +			 * Check for loops in the compressed name; +			 * if we've looked at the whole message, +			 * there must be a loop. +			 */ +			if (checked >= eomorig - msg) +				return (-1); +			break; + +		default: +			return (-1);			/* flag error */ +		} +	} +	*dn = '\0'; +	if (len < 0) +		len = cp - comp_dn; +	return (len); +} + +/* + * Compress domain name 'exp_dn' into 'comp_dn'. + * Return the size of the compressed name or -1. + * 'length' is the size of the array pointed to by 'comp_dn'. + * 'dnptrs' is a list of pointers to previous compressed names. dnptrs[0] + * is a pointer to the beginning of the message. The list ends with NULL. + * 'lastdnptr' is a pointer to the end of the arrary pointed to + * by 'dnptrs'. Side effect is to update the list of pointers for + * labels inserted into the message as we compress the name. + * If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr' + * is NULL, we don't update the list. + */ +dn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr) +	const u_char *exp_dn; +	u_char *comp_dn, **dnptrs, **lastdnptr; +	int length; +{ +	register u_char *cp, *dn; +	register int c, l; +	u_char **cpp, **lpp, *sp, *eob; +	u_char *msg; + +	dn = (u_char *)exp_dn; +	cp = comp_dn; +	eob = cp + length; +	if (dnptrs != NULL) { +		if ((msg = *dnptrs++) != NULL) { +			for (cpp = dnptrs; *cpp != NULL; cpp++) +				; +			lpp = cpp;	/* end of list to search */ +		} +	} else +		msg = NULL; +	for (c = *dn++; c != '\0'; ) { +		/* look to see if we can use pointers */ +		if (msg != NULL) { +			if ((l = dn_find(dn-1, msg, dnptrs, lpp)) >= 0) { +				if (cp+1 >= eob) +					return (-1); +				*cp++ = (l >> 8) | INDIR_MASK; +				*cp++ = l % 256; +				return (cp - comp_dn); +			} +			/* not found, save it */ +			if (lastdnptr != NULL && cpp < lastdnptr-1) { +				*cpp++ = cp; +				*cpp = NULL; +			} +		} +		sp = cp++;	/* save ptr to length byte */ +		do { +			if (c == '.') { +				c = *dn++; +				break; +			} +			if (c == '\\') { +				if ((c = *dn++) == '\0') +					break; +			} +			if (cp >= eob) { +				if (msg != NULL) +					*lpp = NULL; +				return (-1); +			} +			*cp++ = c; +		} while ((c = *dn++) != '\0'); +		/* catch trailing '.'s but not '..' */ +		if ((l = cp - sp - 1) == 0 && c == '\0') { +			cp--; +			break; +		} +		if (l <= 0 || l > MAXLABEL) { +			if (msg != NULL) +				*lpp = NULL; +			return (-1); +		} +		*sp = l; +	} +	if (cp >= eob) { +		if (msg != NULL) +			*lpp = NULL; +		return (-1); +	} +	*cp++ = '\0'; +	return (cp - comp_dn); +} + +/* + * Skip over a compressed domain name. Return the size or -1. + */ +__dn_skipname(comp_dn, eom) +	const u_char *comp_dn, *eom; +{ +	register u_char *cp; +	register int n; + +	cp = (u_char *)comp_dn; +	while (cp < eom && (n = *cp++)) { +		/* +		 * check for indirection +		 */ +		switch (n & INDIR_MASK) { +		case 0:		/* normal case, n == len */ +			cp += n; +			continue; +		default:	/* illegal type */ +			return (-1); +		case INDIR_MASK:	/* indirection */ +			cp++; +		} +		break; +	} +	return (cp - comp_dn); +} + +/* + * Search for expanded name from a list of previously compressed names. + * Return the offset from msg if found or -1. + * dnptrs is the pointer to the first name on the list, + * not the pointer to the start of the message. + */ +static int +dn_find(exp_dn, msg, dnptrs, lastdnptr) +	u_char *exp_dn, *msg; +	u_char **dnptrs, **lastdnptr; +{ +	register u_char *dn, *cp, **cpp; +	register int n; +	u_char *sp; + +	for (cpp = dnptrs; cpp < lastdnptr; cpp++) { +		dn = exp_dn; +		sp = cp = *cpp; +		while (n = *cp++) { +			/* +			 * check for indirection +			 */ +			switch (n & INDIR_MASK) { +			case 0:		/* normal case, n == len */ +				while (--n >= 0) { +					if (*dn == '.') +						goto next; +					if (*dn == '\\') +						dn++; +					if (*dn++ != *cp++) +						goto next; +				} +				if ((n = *dn++) == '\0' && *cp == '\0') +					return (sp - msg); +				if (n == '.') +					continue; +				goto next; + +			default:	/* illegal type */ +				return (-1); + +			case INDIR_MASK:	/* indirection */ +				cp = msg + (((n & 0x3f) << 8) | *cp); +			} +		} +		if (*dn == '\0') +			return (sp - msg); +	next:	; +	} +	return (-1); +} + +/* + * Routines to insert/extract short/long's. Must account for byte + * order and non-alignment problems. This code at least has the + * advantage of being portable. + * + * used by sendmail. + */ + +u_short +_getshort(msgp) +	register u_char *msgp; +{ +	register u_int16_t u; + +	GETSHORT(u, msgp); +	return (u); +} + +u_int32_t +_getlong(msgp) +	register u_char *msgp; +{ +	register u_int32_t u; + +	GETLONG(u, msgp); +	return (u); +} + +void +#if defined(__STDC__) || defined(__cplusplus) +__putshort(register u_short s, register u_char *msgp) +#else +__putshort(s, msgp) +	register u_int16_t s; +	register u_char *msgp; +#endif +{ +	PUTSHORT(s, msgp); +} + +void +__putlong(l, msgp) +	register u_int32_t l; +	register u_char *msgp; +{ +	PUTLONG(l, msgp); +} diff --git a/lib/libc/net/res_debug.c b/lib/libc/net/res_debug.c new file mode 100644 index 000000000000..0bd882ad2d91 --- /dev/null +++ b/lib/libc/net/res_debug.c @@ -0,0 +1,739 @@ +/*- + * Copyright (c) 1985, 1990, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + *  + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + *  + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)res_debug.c	8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/param.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <arpa/nameser.h> +#include <resolv.h> +#include <stdio.h> +#include <string.h> + +void __fp_query(); +char *__p_class(), *__p_time(), *__p_type(); +char *p_cdname(), *p_fqname(), *p_rr(); +static char *p_option __P((u_int32_t)); + +char *_res_opcodes[] = { +	"QUERY", +	"IQUERY", +	"CQUERYM", +	"CQUERYU", +	"4", +	"5", +	"6", +	"7", +	"8", +	"UPDATEA", +	"UPDATED", +	"UPDATEDA", +	"UPDATEM", +	"UPDATEMA", +	"ZONEINIT", +	"ZONEREF", +}; + +char *_res_resultcodes[] = { +	"NOERROR", +	"FORMERR", +	"SERVFAIL", +	"NXDOMAIN", +	"NOTIMP", +	"REFUSED", +	"6", +	"7", +	"8", +	"9", +	"10", +	"11", +	"12", +	"13", +	"14", +	"NOCHANGE", +}; + +static char retbuf[16]; + +static char * +dewks(wks) +	int wks; +{ +	switch (wks) { +	case 5: return("rje"); +	case 7: return("echo"); +	case 9: return("discard"); +	case 11: return("systat"); +	case 13: return("daytime"); +	case 15: return("netstat"); +	case 17: return("qotd"); +	case 19: return("chargen"); +	case 20: return("ftp-data"); +	case 21: return("ftp"); +	case 23: return("telnet"); +	case 25: return("smtp"); +	case 37: return("time"); +	case 39: return("rlp"); +	case 42: return("name"); +	case 43: return("whois"); +	case 53: return("domain"); +	case 57: return("apts"); +	case 59: return("apfs"); +	case 67: return("bootps"); +	case 68: return("bootpc"); +	case 69: return("tftp"); +	case 77: return("rje"); +	case 79: return("finger"); +	case 87: return("link"); +	case 95: return("supdup"); +	case 100: return("newacct"); +	case 101: return("hostnames"); +	case 102: return("iso-tsap"); +	case 103: return("x400"); +	case 104: return("x400-snd"); +	case 105: return("csnet-ns"); +	case 109: return("pop-2"); +	case 111: return("sunrpc"); +	case 113: return("auth"); +	case 115: return("sftp"); +	case 117: return("uucp-path"); +	case 119: return("nntp"); +	case 121: return("erpc"); +	case 123: return("ntp"); +	case 133: return("statsrv"); +	case 136: return("profile"); +	case 144: return("NeWS"); +	case 161: return("snmp"); +	case 162: return("snmp-trap"); +	case 170: return("print-srv"); +	default: (void) sprintf(retbuf, "%d", wks); return(retbuf); +	} +} + +static char * +deproto(protonum) +	int protonum; +{ +	switch (protonum) { +	case 1: return("icmp"); +	case 2: return("igmp"); +	case 3: return("ggp"); +	case 5: return("st"); +	case 6: return("tcp"); +	case 7: return("ucl"); +	case 8: return("egp"); +	case 9: return("igp"); +	case 11: return("nvp-II"); +	case 12: return("pup"); +	case 16: return("chaos"); +	case 17: return("udp"); +	default: (void) sprintf(retbuf, "%d", protonum); return(retbuf); +	} +} + +static char * +do_rrset(msg, cp, cnt, pflag, file, hs) +	int cnt, pflag; +	char *cp,*msg, *hs; +	FILE *file; +{ +	int n; +	int sflag; +	/* +	 * Print  answer records +	 */ +	sflag = (_res.pfcode & pflag); +	if (n = ntohs(cnt)) { +		if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) +			fprintf(file, hs); +		while (--n >= 0) { +			cp = p_rr(cp, msg, file); +			if ((cp-msg) > PACKETSZ) +				return (NULL); +		} +		if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) +			putc('\n', file); +	} +	return(cp); +} + +__p_query(msg) +	char *msg; +{ +	__fp_query(msg, stdout); +} + +/* + * Print the current options. + * This is intended to be primarily a debugging routine. + */ +void +__fp_resstat(statp, file) +	struct __res_state *statp; +	FILE *file; +{ +	int bit; + +	fprintf(file, ";; res options:"); +	if (!statp) +		statp = &_res; +	for (bit = 0;  bit < 32;  bit++) {	/* XXX 32 - bad assumption! */ +		if (statp->options & (1<<bit)) +			fprintf(file, " %s", p_option(1<<bit)); +	} +	putc('\n', file); +} + +/* + * Print the contents of a query. + * This is intended to be primarily a debugging routine. + */ +void +__fp_query(msg,file) +	char *msg; +	FILE *file; +{ +	register char *cp; +	register HEADER *hp; +	register int n; + +	/* +	 * Print header fields. +	 */ +	hp = (HEADER *)msg; +	cp = msg + sizeof(HEADER); +	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX) || hp->rcode) { +		fprintf(file,";; ->>HEADER<<- opcode: %s, status: %s, id: %d", +			_res_opcodes[hp->opcode], +			_res_resultcodes[hp->rcode], +			ntohs(hp->id)); +		putc('\n', file); +	} +	putc(';', file); +	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD2)) { +		fprintf(file,"; flags:"); +		if (hp->qr) +			fprintf(file," qr"); +		if (hp->aa) +			fprintf(file," aa"); +		if (hp->tc) +			fprintf(file," tc"); +		if (hp->rd) +			fprintf(file," rd"); +		if (hp->ra) +			fprintf(file," ra"); +		if (hp->pr) +			fprintf(file," pr"); +	} +	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD1)) { +		fprintf(file,"; Ques: %d", ntohs(hp->qdcount)); +		fprintf(file,", Ans: %d", ntohs(hp->ancount)); +		fprintf(file,", Auth: %d", ntohs(hp->nscount)); +		fprintf(file,", Addit: %d\n", ntohs(hp->arcount)); +	} +#if 0 +	if (_res.pfcode & (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1)) { +		putc('\n',file); +	} +#endif +	/* +	 * Print question records. +	 */ +	if (n = ntohs(hp->qdcount)) { +		if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) +			fprintf(file,";; QUESTIONS:\n"); +		while (--n >= 0) { +			fprintf(file,";;\t"); +			cp = p_cdname(cp, msg, file); +			if (cp == NULL) +				return; +			if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) +				fprintf(file, ", type = %s", +					__p_type(_getshort(cp))); +			cp += sizeof(u_int16_t); +			if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) +				fprintf(file, ", class = %s\n\n", +					__p_class(_getshort(cp))); +			cp += sizeof(u_int16_t); +		} +	} +	/* +	 * Print authoritative answer records +	 */ +	cp = do_rrset(msg, cp, hp->ancount, RES_PRF_ANS, file, +		      ";; ANSWERS:\n"); +	if (cp == NULL) +		return; + +	/* +	 * print name server records +	 */ +	cp = do_rrset(msg, cp, hp->nscount, RES_PRF_AUTH, file, +		      ";; AUTHORITY RECORDS:\n"); +	if (!cp) +		return; + +	/* +	 * print additional records +	 */ +	cp = do_rrset(msg, cp, hp->arcount, RES_PRF_ADD, file, +		      ";; ADDITIONAL RECORDS:\n"); +	if (!cp) +		return; +} + +char * +p_cdname(cp, msg, file) +	char *cp, *msg; +	FILE *file; +{ +	char name[MAXDNAME]; +	int n; + +	if ((n = dn_expand((u_char *)msg, (u_char *)msg + MAXCDNAME, +	    (u_char *)cp, (u_char *)name, sizeof(name))) < 0) +		return (NULL); +	if (name[0] == '\0') +		putc('.', file); +	else +		fputs(name, file); +	return (cp + n); +} + +char * +p_fqname(cp, msg, file) +	char *cp, *msg; +	FILE *file; +{ +	char name[MAXDNAME]; +	int n, len; + +	if ((n = dn_expand((u_char *)msg, (u_char *)msg + MAXCDNAME, +	    (u_char *)cp, (u_char *)name, sizeof(name))) < 0) +		return (NULL); +	if (name[0] == '\0') { +		putc('.', file); +	} else { +		fputs(name, file); +		if (name[strlen(name) - 1] != '.') +			putc('.', file); +	} +	return (cp + n); +} + +/* + * Print resource record fields in human readable form. + */ +char * +p_rr(cp, msg, file) +	char *cp, *msg; +	FILE *file; +{ +	int type, class, dlen, n, c; +	struct in_addr inaddr; +	char *cp1, *cp2; +	u_int32_t tmpttl, t; +	int lcnt; + +	if ((cp = p_fqname(cp, msg, file)) == NULL) +		return (NULL);			/* compression error */ +	type = _getshort(cp); +	cp += sizeof(u_int16_t); +	class = _getshort(cp); +	cp += sizeof(u_int16_t); +	tmpttl = _getlong(cp); +	cp += sizeof(u_int32_t); +	dlen = _getshort(cp); +	cp += sizeof(u_int16_t); +	cp1 = cp; +	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_TTLID)) +		fprintf(file, "\t%lu", tmpttl); +	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_CLASS)) +		fprintf(file, "\t%s", __p_class(class)); +	fprintf(file, "\t%s", __p_type(type)); +	/* +	 * Print type specific data, if appropriate +	 */ +	switch (type) { +	case T_A: +		switch (class) { +		case C_IN: +		case C_HS: +			bcopy(cp, (char *)&inaddr, sizeof(inaddr)); +			if (dlen == 4) { +				fprintf(file,"\t%s", inet_ntoa(inaddr)); +				cp += dlen; +			} else if (dlen == 7) { +				char *address; +				u_char protocol; +				u_short port; + +				address = inet_ntoa(inaddr); +				cp += sizeof(inaddr); +				protocol = *(u_char*)cp; +				cp += sizeof(u_char); +				port = _getshort(cp); +				cp += sizeof(u_int16_t); +				fprintf(file, "\t%s\t; proto %d, port %d", +					address, protocol, port); +			} +			break; +		default: +			cp += dlen; +		} +		break; +	case T_CNAME: +	case T_MB: +	case T_MG: +	case T_MR: +	case T_NS: +	case T_PTR: +		putc('\t', file); +		cp = p_fqname(cp, msg, file); +		break; + +	case T_HINFO: +		if (n = *cp++) { +			fprintf(file,"\t%.*s", n, cp); +			cp += n; +		} +		if (n = *cp++) { +			fprintf(file,"\t%.*s", n, cp); +			cp += n; +		} +		break; + +	case T_SOA: +		putc('\t', file); +		cp = p_fqname(cp, msg, file);	/* origin */ +		putc(' ', file); +		cp = p_fqname(cp, msg, file);	/* mail addr */ +		fputs(" (\n", file); +		t = _getlong(cp);  cp += sizeof(u_int32_t); +		fprintf(file,"\t\t\t%lu\t; serial\n", t); +		t = _getlong(cp);  cp += sizeof(u_int32_t); +		fprintf(file,"\t\t\t%lu\t; refresh (%s)\n", t, __p_time(t)); +		t = _getlong(cp);  cp += sizeof(u_int32_t); +		fprintf(file,"\t\t\t%lu\t; retry (%s)\n", t, __p_time(t)); +		t = _getlong(cp);  cp += sizeof(u_int32_t); +		fprintf(file,"\t\t\t%lu\t; expire (%s)\n", t, __p_time(t)); +		t = _getlong(cp);  cp += sizeof(u_int32_t); +		fprintf(file,"\t\t\t%lu )\t; minimum (%s)", t, __p_time(t)); +		break; + +	case T_MX: +		fprintf(file,"\t%d ", _getshort(cp)); +		cp += sizeof(u_int16_t); +		cp = p_fqname(cp, msg, file); +		break; + +  	case T_TXT: +		(void) fputs("\t\"", file); +		cp2 = cp1 + dlen; +		while (cp < cp2) { +			if (n = (unsigned char) *cp++) { +				for (c = n; c > 0 && cp < cp2; c--) +					if (*cp == '\n') { +					    (void) putc('\\', file); +					    (void) putc(*cp++, file); +					} else +					    (void) putc(*cp++, file); +			} +		} +		putc('"', file); +  		break; + +	case T_MINFO: +	case T_RP: +		putc('\t', file); +		cp = p_fqname(cp, msg, file); +		putc(' ', file); +		cp = p_fqname(cp, msg, file); +		break; + +	case T_UINFO: +		putc('\t', file); +		fputs(cp, file); +		cp += dlen; +		break; + +	case T_UID: +	case T_GID: +		if (dlen == 4) { +			fprintf(file,"\t%u", _getlong(cp)); +			cp += sizeof(int32_t); +		} +		break; + +	case T_WKS: +		if (dlen < sizeof(u_int32_t) + 1) +			break; +		bcopy(cp, (char *)&inaddr, sizeof(inaddr)); +		cp += sizeof(u_int32_t); +		fprintf(file, "\t%s %s ( ", +			inet_ntoa(inaddr), +			deproto((int) *cp)); +		cp += sizeof(u_char); +		n = 0; +		lcnt = 0; +		while (cp < cp1 + dlen) { +			c = *cp++; +			do { + 				if (c & 0200) { +					if (lcnt == 0) { +						fputs("\n\t\t\t", file); +						lcnt = 5; +					} +					fputs(dewks(n), file); +					putc(' ', file); +					lcnt--; +				} + 				c <<= 1; +			} while (++n & 07); +		} +		putc(')', file); +		break; + +#ifdef ALLOW_T_UNSPEC +	case T_UNSPEC: +		{ +			int NumBytes = 8; +			char *DataPtr; +			int i; + +			if (dlen < NumBytes) NumBytes = dlen; +			fprintf(file, "\tFirst %d bytes of hex data:", +				NumBytes); +			for (i = 0, DataPtr = cp; i < NumBytes; i++, DataPtr++) +				fprintf(file, " %x", *DataPtr); +			cp += dlen; +		} +		break; +#endif /* ALLOW_T_UNSPEC */ + +	default: +		fprintf(file,"\t?%d?", type); +		cp += dlen; +	} +#if 0 +	fprintf(file, "\t; dlen=%d, ttl %s\n", dlen, __p_time(tmpttl)); +#else +	putc('\n', file); +#endif +	if (cp - cp1 != dlen) { +		fprintf(file,";; packet size error (found %d, dlen was %d)\n", +			cp - cp1, dlen); +		cp = NULL; +	} +	return (cp); +} + +static	char nbuf[40]; + +/* + * Return a string for the type + */ +char * +__p_type(type) +	int type; +{ +	switch (type) { +	case T_A: +		return("A"); +	case T_NS:		/* authoritative server */ +		return("NS"); +	case T_CNAME:		/* canonical name */ +		return("CNAME"); +	case T_SOA:		/* start of authority zone */ +		return("SOA"); +	case T_MB:		/* mailbox domain name */ +		return("MB"); +	case T_MG:		/* mail group member */ +		return("MG"); +	case T_MR:		/* mail rename name */ +		return("MR"); +	case T_NULL:		/* null resource record */ +		return("NULL"); +	case T_WKS:		/* well known service */ +		return("WKS"); +	case T_PTR:		/* domain name pointer */ +		return("PTR"); +	case T_HINFO:		/* host information */ +		return("HINFO"); +	case T_MINFO:		/* mailbox information */ +		return("MINFO"); +	case T_MX:		/* mail routing info */ +		return("MX"); +	case T_TXT:		/* text */ +		return("TXT"); +	case T_RP:		/* responsible person */ +		return("RP"); +	case T_AXFR:		/* zone transfer */ +		return("AXFR"); +	case T_MAILB:		/* mail box */ +		return("MAILB"); +	case T_MAILA:		/* mail address */ +		return("MAILA"); +	case T_ANY:		/* matches any type */ +		return("ANY"); +	case T_UINFO: +		return("UINFO"); +	case T_UID: +		return("UID"); +	case T_GID: +		return("GID"); +#ifdef ALLOW_T_UNSPEC +	case T_UNSPEC: +		return("UNSPEC"); +#endif /* ALLOW_T_UNSPEC */ +	default: +		(void)sprintf(nbuf, "%d", type); +		return(nbuf); +	} +} + +/* + * Return a mnemonic for class + */ +char * +__p_class(class) +	int class; +{ + +	switch (class) { +	case C_IN:		/* internet class */ +		return("IN"); +	case C_HS:		/* hesiod class */ +		return("HS"); +	case C_ANY:		/* matches any class */ +		return("ANY"); +	default: +		(void)sprintf(nbuf, "%d", class); +		return(nbuf); +	} +} + +/* + * Return a mnemonic for an option + */ +static char * +p_option(option) +	u_int32_t option; +{ +	switch (option) { +	case RES_INIT:		return "init"; +	case RES_DEBUG:		return "debug"; +	case RES_AAONLY:	return "aaonly"; +	case RES_USEVC:		return "usevc"; +	case RES_PRIMARY:	return "primry"; +	case RES_IGNTC:		return "igntc"; +	case RES_RECURSE:	return "recurs"; +	case RES_DEFNAMES:	return "defnam"; +	case RES_STAYOPEN:	return "styopn"; +	case RES_DNSRCH:	return "dnsrch"; +	default:		sprintf(nbuf, "?0x%x?", option); return nbuf; +	} +} + +/* + * Return a mnemonic for a time to live + */ +char * +__p_time(value) +	u_int32_t value; +{ +	int secs, mins, hours, days; +	register char *p; + +	if (value == 0) { +		strcpy(nbuf, "0 secs"); +		return(nbuf); +	} + +	secs = value % 60; +	value /= 60; +	mins = value % 60; +	value /= 60; +	hours = value % 24; +	value /= 24; +	days = value; +	value = 0; + +#define	PLURALIZE(x)	x, (x == 1) ? "" : "s" +	p = nbuf; +	if (days) { +		(void)sprintf(p, "%d day%s", PLURALIZE(days)); +		while (*++p); +	} +	if (hours) { +		if (days) +			*p++ = ' '; +		(void)sprintf(p, "%d hour%s", PLURALIZE(hours)); +		while (*++p); +	} +	if (mins) { +		if (days || hours) +			*p++ = ' '; +		(void)sprintf(p, "%d min%s", PLURALIZE(mins)); +		while (*++p); +	} +	if (secs || ! (days || hours || mins)) { +		if (days || hours || mins) +			*p++ = ' '; +		(void)sprintf(p, "%d sec%s", PLURALIZE(secs)); +	} +	return(nbuf); +} diff --git a/lib/libc/net/res_init.c b/lib/libc/net/res_init.c new file mode 100644 index 000000000000..1e0fd05f68ea --- /dev/null +++ b/lib/libc/net/res_init.c @@ -0,0 +1,223 @@ +/*- + * Copyright (c) 1985, 1989, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + *  + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + *  + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)res_init.c	8.1 (Berkeley) 6/7/93"; +static char rcsid[] = "$Id: res_init.c,v 4.9.1.1 1993/05/02 22:43:03 vixie Rel $"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/param.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <arpa/nameser.h> +#include <resolv.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* + * Resolver state default settings + */ + +struct __res_state _res = { +	RES_TIMEOUT,               	/* retransmition time interval */ +	4,                         	/* number of times to retransmit */ +	RES_DEFAULT,			/* options flags */ +	1,                         	/* number of name servers */ +}; + +/* + * Set up default settings.  If the configuration file exist, the values + * there will have precedence.  Otherwise, the server address is set to + * INADDR_ANY and the default domain name comes from the gethostname(). + * + * The configuration file should only be used if you want to redefine your + * domain or run without a server on your machine. + * + * Return 0 if completes successfully, -1 on error + */ +res_init() +{ +	register FILE *fp; +	register char *cp, **pp; +	register int n; +	char buf[BUFSIZ]; +	int nserv = 0;    /* number of nameserver records read from file */ +	int haveenv = 0; +	int havesearch = 0; + +#ifdef USELOOPBACK +	_res.nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1); +#else +	_res.nsaddr.sin_addr.s_addr = INADDR_ANY; +#endif +	_res.nsaddr.sin_family = AF_INET; +	_res.nsaddr.sin_port = htons(NAMESERVER_PORT); +	_res.nscount = 1; +	_res.pfcode = 0; + +	/* Allow user to override the local domain definition */ +	if ((cp = getenv("LOCALDOMAIN")) != NULL) { +		(void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); +		if ((cp = strpbrk(_res.defdname, " \t\n")) != NULL) +			*cp = '\0'; +		haveenv++; +	} + +	if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) { +	    /* read the config file */ +	    while (fgets(buf, sizeof(buf), fp) != NULL) { +		/* skip comments */ +		if ((*buf == ';') || (*buf == '#')) +			continue; +		/* read default domain name */ +		if (!strncmp(buf, "domain", sizeof("domain") - 1)) { +		    if (haveenv)	/* skip if have from environ */ +			    continue; +		    cp = buf + sizeof("domain") - 1; +		    while (*cp == ' ' || *cp == '\t') +			    cp++; +		    if ((*cp == '\0') || (*cp == '\n')) +			    continue; +		    (void)strncpy(_res.defdname, cp, +				  sizeof(_res.defdname) - 1); +		    if ((cp = strpbrk(_res.defdname, " \t\n")) != NULL) +			    *cp = '\0'; +		    havesearch = 0; +		    continue; +		} +		/* set search list */ +		if (!strncmp(buf, "search", sizeof("search") - 1)) { +		    if (haveenv)	/* skip if have from environ */ +			    continue; +		    cp = buf + sizeof("search") - 1; +		    while (*cp == ' ' || *cp == '\t') +			    cp++; +		    if ((*cp == '\0') || (*cp == '\n')) +			    continue; +		    (void)strncpy(_res.defdname, cp, +				  sizeof(_res.defdname) - 1); +		    if ((cp = strchr(_res.defdname, '\n')) != NULL) +			    *cp = '\0'; +		    /* +		     * Set search list to be blank-separated strings +		     * on rest of line. +		     */ +		    cp = _res.defdname; +		    pp = _res.dnsrch; +		    *pp++ = cp; +		    for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) { +			    if (*cp == ' ' || *cp == '\t') { +				    *cp = 0; +				    n = 1; +			    } else if (n) { +				    *pp++ = cp; +				    n = 0; +			    } +		    } +		    /* null terminate last domain if there are excess */ +		    while (*cp != '\0' && *cp != ' ' && *cp != '\t') +			    cp++; +		    *cp = '\0'; +		    *pp++ = 0; +		    havesearch = 1; +		    continue; +		} +		/* read nameservers to query */ +		if (!strncmp(buf, "nameserver", sizeof("nameserver") - 1) && +		   nserv < MAXNS) { +		   struct in_addr a; + +		    cp = buf + sizeof("nameserver") - 1; +		    while (*cp == ' ' || *cp == '\t') +			cp++; +		    if ((*cp != '\0') && (*cp != '\n') && inet_aton(cp, &a)) { +			_res.nsaddr_list[nserv].sin_addr = a; +			_res.nsaddr_list[nserv].sin_family = AF_INET; +			_res.nsaddr_list[nserv].sin_port = +				htons(NAMESERVER_PORT); +			nserv++; +		    } +		    continue; +		} +	    } +	    if (nserv > 1)  +		_res.nscount = nserv; +	    (void) fclose(fp); +	} +	if (_res.defdname[0] == 0) { +		if (gethostname(buf, sizeof(_res.defdname)) == 0 && +		   (cp = strchr(buf, '.'))) +			(void)strcpy(_res.defdname, cp + 1); +	} + +	/* find components of local domain that might be searched */ +	if (havesearch == 0) { +		pp = _res.dnsrch; +		*pp++ = _res.defdname; +		for (cp = _res.defdname, n = 0; *cp; cp++) +			if (*cp == '.') +				n++; +		cp = _res.defdname; +		for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDFLSRCH; +		    n--) { +			cp = strchr(cp, '.'); +			*pp++ = ++cp; +		} +		*pp++ = 0; +	} +	_res.options |= RES_INIT; +	return (0); +} diff --git a/lib/libc/net/res_mkquery.c b/lib/libc/net/res_mkquery.c new file mode 100644 index 000000000000..a284562837f9 --- /dev/null +++ b/lib/libc/net/res_mkquery.c @@ -0,0 +1,230 @@ +/*- + * Copyright (c) 1985, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + *  + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + *  + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)res_mkquery.c	8.1 (Berkeley) 6/4/93"; +static char rcsid[] = "$Id: res_mkquery.c,v 4.9.1.2 1993/05/17 10:00:01 vixie Exp $"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/param.h> +#include <netinet/in.h> +#include <arpa/nameser.h> +#include <resolv.h> +#include <stdio.h> +#include <string.h> + +/* + * Form all types of queries. + * Returns the size of the result or -1. + */ +res_mkquery(op, dname, class, type, data, datalen, newrr_in, buf, buflen) +	int op;			/* opcode of query */ +	const char *dname;		/* domain name */ +	int class, type;	/* class and type of query */ +	const char *data;		/* resource record data */ +	int datalen;		/* length of data */ +	const char *newrr_in;	/* new rr for modify or append */ +	char *buf;		/* buffer to put query */ +	int buflen;		/* size of buffer */ +{ +	register HEADER *hp; +	register char *cp; +	register int n; +	struct rrec *newrr = (struct rrec *) newrr_in; +	char *dnptrs[10], **dpp, **lastdnptr; + +#ifdef DEBUG +	if (_res.options & RES_DEBUG) +		printf(";; res_mkquery(%d, %s, %d, %d)\n", +		       op, dname, class, type); +#endif +	/* +	 * Initialize header fields. +	 */ +	if ((buf == NULL) || (buflen < sizeof(HEADER))) +		return(-1); +	bzero(buf, sizeof(HEADER)); +	hp = (HEADER *) buf; +	hp->id = htons(++_res.id); +	hp->opcode = op; +	hp->pr = (_res.options & RES_PRIMARY) != 0; +	hp->rd = (_res.options & RES_RECURSE) != 0; +	hp->rcode = NOERROR; +	cp = buf + sizeof(HEADER); +	buflen -= sizeof(HEADER); +	dpp = dnptrs; +	*dpp++ = buf; +	*dpp++ = NULL; +	lastdnptr = dnptrs + sizeof(dnptrs)/sizeof(dnptrs[0]); +	/* +	 * perform opcode specific processing +	 */ +	switch (op) { +	case QUERY: +		if ((buflen -= QFIXEDSZ) < 0) +			return(-1); +		if ((n = dn_comp((u_char *)dname, (u_char *)cp, buflen, +		    (u_char **)dnptrs, (u_char **)lastdnptr)) < 0) +			return (-1); +		cp += n; +		buflen -= n; +		__putshort(type, (u_char *)cp); +		cp += sizeof(u_int16_t); +		__putshort(class, (u_char *)cp); +		cp += sizeof(u_int16_t); +		hp->qdcount = htons(1); +		if (op == QUERY || data == NULL) +			break; +		/* +		 * Make an additional record for completion domain. +		 */ +		buflen -= RRFIXEDSZ; +		if ((n = dn_comp((u_char *)data, (u_char *)cp, buflen, +		    (u_char **)dnptrs, (u_char **)lastdnptr)) < 0) +			return (-1); +		cp += n; +		buflen -= n; +		__putshort(T_NULL, (u_char *)cp); +		cp += sizeof(u_int16_t); +		__putshort(class, (u_char *)cp); +		cp += sizeof(u_int16_t); +		__putlong(0, (u_char *)cp); +		cp += sizeof(u_int32_t); +		__putshort(0, (u_char *)cp); +		cp += sizeof(u_int16_t); +		hp->arcount = htons(1); +		break; + +	case IQUERY: +		/* +		 * Initialize answer section +		 */ +		if (buflen < 1 + RRFIXEDSZ + datalen) +			return (-1); +		*cp++ = '\0';	/* no domain name */ +		__putshort(type, (u_char *)cp); +		cp += sizeof(u_int16_t); +		__putshort(class, (u_char *)cp); +		cp += sizeof(u_int16_t); +		__putlong(0, (u_char *)cp); +		cp += sizeof(u_int32_t); +		__putshort(datalen, (u_char *)cp); +		cp += sizeof(u_int16_t); +		if (datalen) { +			bcopy(data, cp, datalen); +			cp += datalen; +		} +		hp->ancount = htons(1); +		break; + +#ifdef ALLOW_UPDATES +	/* +	 * For UPDATEM/UPDATEMA, do UPDATED/UPDATEDA followed by UPDATEA +	 * (Record to be modified is followed by its replacement in msg.) +	 */ +	case UPDATEM: +	case UPDATEMA: + +	case UPDATED: +		/* +		 * The res code for UPDATED and UPDATEDA is the same; user +		 * calls them differently: specifies data for UPDATED; server +		 * ignores data if specified for UPDATEDA. +		 */ +	case UPDATEDA: +		buflen -= RRFIXEDSZ + datalen; +		if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) +			return (-1); +		cp += n; +		__putshort(type, cp); +                cp += sizeof(u_int16_t); +                __putshort(class, cp); +                cp += sizeof(u_int16_t); +		__putlong(0, cp); +		cp += sizeof(u_int32_t); +		__putshort(datalen, cp); +                cp += sizeof(u_int16_t); +		if (datalen) { +			bcopy(data, cp, datalen); +			cp += datalen; +		} +		if ( (op == UPDATED) || (op == UPDATEDA) ) { +			hp->ancount = htons(0); +			break; +		} +		/* Else UPDATEM/UPDATEMA, so drop into code for UPDATEA */ + +	case UPDATEA:	/* Add new resource record */ +		buflen -= RRFIXEDSZ + datalen; +		if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) +			return (-1); +		cp += n; +		__putshort(newrr->r_type, cp); +                cp += sizeof(u_int16_t); +                __putshort(newrr->r_class, cp); +                cp += sizeof(u_int16_t); +		__putlong(0, cp); +		cp += sizeof(u_int32_t); +		__putshort(newrr->r_size, cp); +                cp += sizeof(u_int16_t); +		if (newrr->r_size) { +			bcopy(newrr->r_data, cp, newrr->r_size); +			cp += newrr->r_size; +		} +		hp->ancount = htons(0); +		break; + +#endif /* ALLOW_UPDATES */ +	} +	return (cp - buf); +} diff --git a/lib/libc/net/res_query.c b/lib/libc/net/res_query.c new file mode 100644 index 000000000000..4980af17b9d8 --- /dev/null +++ b/lib/libc/net/res_query.c @@ -0,0 +1,303 @@ +/*- + * Copyright (c) 1988, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + *  + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + *  + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)res_query.c	8.1 (Berkeley) 6/4/93"; +static char rcsid[] = "$Id: res_query.c,v 1.1 1993/06/01 09:42:14 vixie Exp vixie $"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/param.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <arpa/nameser.h> +#include <netdb.h> +#include <resolv.h> +#include <stdio.h> +#include <ctype.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> + +#if PACKETSZ > 1024 +#define MAXPACKET	PACKETSZ +#else +#define MAXPACKET	1024 +#endif + +int h_errno; + +/* + * Formulate a normal query, send, and await answer. + * Returned answer is placed in supplied buffer "answer". + * Perform preliminary check of answer, returning success only + * if no error is indicated and the answer count is nonzero. + * Return the size of the response on success, -1 on error. + * Error number is left in h_errno. + * Caller must parse answer and determine whether it answers the question. + */ +res_query(name, class, type, answer, anslen) +	char *name;		/* domain name */ +	int class, type;	/* class and type of query */ +	u_char *answer;		/* buffer to put answer */ +	int anslen;		/* size of answer buffer */ +{ +	char buf[MAXPACKET]; +	HEADER *hp; +	int n; + +	if ((_res.options & RES_INIT) == 0 && res_init() == -1) +		return (-1); +#ifdef DEBUG +	if (_res.options & RES_DEBUG) +		printf(";; res_query(%s, %d, %d)\n", name, class, type); +#endif +	n = res_mkquery(QUERY, name, class, type, (char *)NULL, 0, NULL, +	    buf, sizeof(buf)); + +	if (n <= 0) { +#ifdef DEBUG +		if (_res.options & RES_DEBUG) +			printf(";; res_query: mkquery failed\n"); +#endif +		h_errno = NO_RECOVERY; +		return (n); +	} +	n = res_send(buf, n, (char *)answer, anslen); +	if (n < 0) { +#ifdef DEBUG +		if (_res.options & RES_DEBUG) +			printf(";; res_query: send error\n"); +#endif +		h_errno = TRY_AGAIN; +		return(n); +	} + +	hp = (HEADER *) answer; +	if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) { +#ifdef DEBUG +		if (_res.options & RES_DEBUG) +			printf(";; rcode = %d, ancount=%d\n", hp->rcode, +			    ntohs(hp->ancount)); +#endif +		switch (hp->rcode) { +			case NXDOMAIN: +				h_errno = HOST_NOT_FOUND; +				break; +			case SERVFAIL: +				h_errno = TRY_AGAIN; +				break; +			case NOERROR: +				h_errno = NO_DATA; +				break; +			case FORMERR: +			case NOTIMP: +			case REFUSED: +			default: +				h_errno = NO_RECOVERY; +				break; +		} +		return (-1); +	} +	return(n); +} + +/* + * Formulate a normal query, send, and retrieve answer in supplied buffer. + * Return the size of the response on success, -1 on error. + * If enabled, implement search rules until answer or unrecoverable failure + * is detected.  Error number is left in h_errno. + * Only useful for queries in the same name hierarchy as the local host + * (not, for example, for host address-to-name lookups in domain in-addr.arpa). + */ +int +res_search(name, class, type, answer, anslen) +	char *name;		/* domain name */ +	int class, type;	/* class and type of query */ +	u_char *answer;		/* buffer to put answer */ +	int anslen;		/* size of answer */ +{ +	register char *cp, **domain; +	int n, ret, got_nodata = 0; +	char *__hostalias(); + +	if ((_res.options & RES_INIT) == 0 && res_init() == -1) +		return (-1); + +	errno = 0; +	h_errno = HOST_NOT_FOUND;	/* default, if we never query */ +	for (cp = name, n = 0; *cp; cp++) +		if (*cp == '.') +			n++; +	if (n == 0 && (cp = __hostalias(name))) +		return (res_query(cp, class, type, answer, anslen)); + +	/* +	 * We do at least one level of search if +	 *	- there is no dot and RES_DEFNAME is set, or +	 *	- there is at least one dot, there is no trailing dot, +	 *	  and RES_DNSRCH is set. +	 */ +	if ((n == 0 && _res.options & RES_DEFNAMES) || +	   (n != 0 && *--cp != '.' && _res.options & RES_DNSRCH)) +	     for (domain = _res.dnsrch; *domain; domain++) { +		ret = res_querydomain(name, *domain, class, type, +		    answer, anslen); +		if (ret > 0) +			return (ret); +		/* +		 * If no server present, give up. +		 * If name isn't found in this domain, +		 * keep trying higher domains in the search list +		 * (if that's enabled). +		 * On a NO_DATA error, keep trying, otherwise +		 * a wildcard entry of another type could keep us +		 * from finding this entry higher in the domain. +		 * If we get some other error (negative answer or +		 * server failure), then stop searching up, +		 * but try the input name below in case it's fully-qualified. +		 */ +		if (errno == ECONNREFUSED) { +			h_errno = TRY_AGAIN; +			return (-1); +		} +		if (h_errno == NO_DATA) +			got_nodata++; +		if ((h_errno != HOST_NOT_FOUND && h_errno != NO_DATA) || +		    (_res.options & RES_DNSRCH) == 0) +			break; +	} +	/* +	 * If the search/default failed, try the name as fully-qualified, +	 * but only if it contained at least one dot (even trailing). +	 * This is purely a heuristic; we assume that any reasonable query +	 * about a top-level domain (for servers, SOA, etc) will not use +	 * res_search. +	 */ +	if (n && (ret = res_querydomain(name, (char *)NULL, class, type, +	    answer, anslen)) > 0) +		return (ret); +	if (got_nodata) +		h_errno = NO_DATA; +	return (-1); +} + +/* + * Perform a call on res_query on the concatenation of name and domain, + * removing a trailing dot from name if domain is NULL. + */ +res_querydomain(name, domain, class, type, answer, anslen) +	char *name, *domain; +	int class, type;	/* class and type of query */ +	u_char *answer;		/* buffer to put answer */ +	int anslen;		/* size of answer */ +{ +	char nbuf[2*MAXDNAME+2]; +	char *longname = nbuf; +	int n; + +#ifdef DEBUG +	if (_res.options & RES_DEBUG) +		printf(";; res_querydomain(%s, %s, %d, %d)\n", +		    name, domain, class, type); +#endif +	if (domain == NULL) { +		/* +		 * Check for trailing '.'; +		 * copy without '.' if present. +		 */ +		n = strlen(name) - 1; +		if (name[n] == '.' && n < sizeof(nbuf) - 1) { +			bcopy(name, nbuf, n); +			nbuf[n] = '\0'; +		} else +			longname = name; +	} else +		(void)sprintf(nbuf, "%.*s.%.*s", +		    MAXDNAME, name, MAXDNAME, domain); + +	return (res_query(longname, class, type, answer, anslen)); +} + +char * +__hostalias(name) +	register const char *name; +{ +	register char *C1, *C2; +	FILE *fp; +	char *file, *getenv(), *strcpy(), *strncpy(); +	char buf[BUFSIZ]; +	static char abuf[MAXDNAME]; + +	file = getenv("HOSTALIASES"); +	if (file == NULL || (fp = fopen(file, "r")) == NULL) +		return (NULL); +	buf[sizeof(buf) - 1] = '\0'; +	while (fgets(buf, sizeof(buf), fp)) { +		for (C1 = buf; *C1 && !isspace(*C1); ++C1); +		if (!*C1) +			break; +		*C1 = '\0'; +		if (!strcasecmp(buf, name)) { +			while (isspace(*++C1)); +			if (!*C1) +				break; +			for (C2 = C1 + 1; *C2 && !isspace(*C2); ++C2); +			abuf[sizeof(abuf) - 1] = *C2 = '\0'; +			(void)strncpy(abuf, C1, sizeof(abuf) - 1); +			fclose(fp); +			return (abuf); +		} +	} +	fclose(fp); +	return (NULL); +} diff --git a/lib/libc/net/res_send.c b/lib/libc/net/res_send.c new file mode 100644 index 000000000000..5c80cf4d6869 --- /dev/null +++ b/lib/libc/net/res_send.c @@ -0,0 +1,468 @@ +/*- + * Copyright (c) 1985, 1989, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + *  + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + *  + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)res_send.c	8.1 (Berkeley) 6/4/93"; +static char rcsid[] = "$Id: res_send.c,v 4.9.1.1 1993/05/02 22:43:03 vixie Rel $"; +#endif /* LIBC_SCCS and not lint */ + +/* + * Send query to name server and wait for reply. + */ + +#include <sys/param.h> +#include <sys/time.h> +#include <sys/socket.h> +#include <sys/uio.h> +#include <netinet/in.h> +#include <arpa/nameser.h> +#include <arpa/inet.h> +#include <stdio.h> +#include <errno.h> +#include <resolv.h> +#include <unistd.h> +#include <string.h> + +static int s = -1;	/* socket used for communications */ +static struct sockaddr no_addr; + +#ifndef FD_SET +#define	NFDBITS		32 +#define	FD_SETSIZE	32 +#define	FD_SET(n, p)	((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) +#define	FD_CLR(n, p)	((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) +#define	FD_ISSET(n, p)	((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) +#define FD_ZERO(p)	bzero((char *)(p), sizeof(*(p))) +#endif + +res_send(buf, buflen, answer, anslen) +	const char *buf; +	int buflen; +	char *answer; +	int anslen; +{ +	register int n; +	int try, v_circuit, resplen, ns; +	int gotsomewhere = 0, connected = 0; +	int connreset = 0; +	u_short id, len; +	char *cp; +	fd_set dsmask; +	struct timeval timeout; +	HEADER *hp = (HEADER *) buf; +	HEADER *anhp = (HEADER *) answer; +	u_int badns;		/* XXX NSMAX can't exceed #/bits per this */ +	struct iovec iov[2]; +	int terrno = ETIMEDOUT; +	char junk[512]; + +#ifdef DEBUG +	if ((_res.options & RES_DEBUG) || (_res.pfcode & RES_PRF_QUERY)) { +		printf(";; res_send()\n"); +		__p_query(buf); +	} +#endif +	if (!(_res.options & RES_INIT)) +		if (res_init() == -1) { +			return(-1); +		} +	v_circuit = (_res.options & RES_USEVC) || buflen > PACKETSZ; +	id = hp->id; +	badns = 0; +	/* +	 * Send request, RETRY times, or until successful +	 */ +	for (try = 0; try < _res.retry; try++) { +	    for (ns = 0; ns < _res.nscount; ns++) { +		if (badns & (1<<ns)) +			continue; +#ifdef DEBUG +		if (_res.options & RES_DEBUG) +			printf(";; Querying server (# %d) address = %s\n", +			       ns+1, +			       inet_ntoa(_res.nsaddr_list[ns].sin_addr)); +#endif +	usevc: +		if (v_circuit) { +			int truncated = 0; + +			/* +			 * Use virtual circuit; +			 * at most one attempt per server. +			 */ +			try = _res.retry; +			if (s < 0) { +				s = socket(AF_INET, SOCK_STREAM, 0); +				if (s < 0) { +					terrno = errno; +#ifdef DEBUG +					if (_res.options & RES_DEBUG) +					    perror("socket (vc) failed"); +#endif +					continue; +				} +				if (connect(s, +				    (struct sockaddr *)&(_res.nsaddr_list[ns]), +				    sizeof(struct sockaddr)) < 0) { +					terrno = errno; +#ifdef DEBUG +					if (_res.options & RES_DEBUG) +					    perror("connect failed"); +#endif +					(void) close(s); +					s = -1; +					continue; +				} +			} +			/* +			 * Send length & message +			 */ +			len = htons((u_short)buflen); +			iov[0].iov_base = (caddr_t)&len; +			iov[0].iov_len = sizeof(len); +			iov[1].iov_base = (char *)buf; +			iov[1].iov_len = buflen; +			if (writev(s, iov, 2) != sizeof(len) + buflen) { +				terrno = errno; +#ifdef DEBUG +				if (_res.options & RES_DEBUG) +					perror("write failed"); +#endif +				(void) close(s); +				s = -1; +				continue; +			} +			/* +			 * Receive length & response +			 */ +			cp = answer; +			len = sizeof(short); +			while (len != 0 && +			    (n = read(s, (char *)cp, (int)len)) > 0) { +				cp += n; +				len -= n; +			} +			if (n <= 0) { +				terrno = errno; +#ifdef DEBUG +				if (_res.options & RES_DEBUG) +					perror("read failed"); +#endif +				(void) close(s); +				s = -1; +				/* +				 * A long running process might get its TCP +				 * connection reset if the remote server was +				 * restarted.  Requery the server instead of +				 * trying a new one.  When there is only one +				 * server, this means that a query might work +				 * instead of failing.  We only allow one reset +				 * per query to prevent looping. +				 */ +				if (terrno == ECONNRESET && !connreset) { +					connreset = 1; +					ns--; +				} +				continue; +			} +			cp = answer; +			if ((resplen = ntohs(*(u_short *)cp)) > anslen) { +#ifdef DEBUG +				if (_res.options & RES_DEBUG) +					fprintf(stderr, +						";; response truncated\n"); +#endif +				len = anslen; +				truncated = 1; +			} else +				len = resplen; +			while (len != 0 && +			   (n = read(s, (char *)cp, (int)len)) > 0) { +				cp += n; +				len -= n; +			} +			if (n <= 0) { +				terrno = errno; +#ifdef DEBUG +				if (_res.options & RES_DEBUG) +					perror("read failed"); +#endif +				(void) close(s); +				s = -1; +				continue; +			} +			if (truncated) { +				/* +				 * Flush rest of answer +				 * so connection stays in synch. +				 */ +				anhp->tc = 1; +				len = resplen - anslen; +				while (len != 0) { +					n = (len > sizeof(junk) ? +					    sizeof(junk) : len); +					if ((n = read(s, junk, n)) > 0) +						len -= n; +					else +						break; +				} +			} +		} else { +			/* +			 * Use datagrams. +			 */ +			if (s < 0) { +				s = socket(AF_INET, SOCK_DGRAM, 0); +				if (s < 0) { +					terrno = errno; +#ifdef DEBUG +					if (_res.options & RES_DEBUG) +					    perror("socket (dg) failed"); +#endif +					continue; +				} +			} +			/* +			 * I'm tired of answering this question, so: +			 * On a 4.3BSD+ machine (client and server, +			 * actually), sending to a nameserver datagram +			 * port with no nameserver will cause an +			 * ICMP port unreachable message to be returned. +			 * If our datagram socket is "connected" to the +			 * server, we get an ECONNREFUSED error on the next +			 * socket operation, and select returns if the +			 * error message is received.  We can thus detect +			 * the absence of a nameserver without timing out. +			 * If we have sent queries to at least two servers, +			 * however, we don't want to remain connected, +			 * as we wish to receive answers from the first +			 * server to respond. +			 */ +			if (_res.nscount == 1 || (try == 0 && ns == 0)) { +				/* +				 * Don't use connect if we might +				 * still receive a response +				 * from another server. +				 */ +				if (connected == 0) { +					if (connect(s, +					    (struct sockaddr *) +					    &_res.nsaddr_list[ns], +					    sizeof(struct sockaddr)) < 0) { +#ifdef DEBUG +						if (_res.options & RES_DEBUG) +							perror("connect"); +#endif +						continue; +					} +					connected = 1; +				} +				if (send(s, buf, buflen, 0) != buflen) { +#ifdef DEBUG +					if (_res.options & RES_DEBUG) +						perror("send"); +#endif +					continue; +				} +			} else { +				/* +				 * Disconnect if we want to listen +				 * for responses from more than one server. +				 */ +				if (connected) { +					(void) connect(s, &no_addr, +					    sizeof(no_addr)); +					connected = 0; +				} +				if (sendto(s, buf, buflen, 0, +				    (struct sockaddr *)&_res.nsaddr_list[ns], +				    sizeof(struct sockaddr)) != buflen) { +#ifdef DEBUG +					if (_res.options & RES_DEBUG) +						perror("sendto"); +#endif +					continue; +				} +			} + +			/* +			 * Wait for reply +			 */ +			timeout.tv_sec = (_res.retrans << try); +			if (try > 0) +				timeout.tv_sec /= _res.nscount; +			if ((long) timeout.tv_sec <= 0) +				timeout.tv_sec = 1; +			timeout.tv_usec = 0; +wait: +			FD_ZERO(&dsmask); +			FD_SET(s, &dsmask); +			n = select(s+1, &dsmask, (fd_set *)NULL, +				(fd_set *)NULL, &timeout); +			if (n < 0) { +#ifdef DEBUG +				if (_res.options & RES_DEBUG) +					perror("select"); +#endif +				continue; +			} +			if (n == 0) { +				/* +				 * timeout +				 */ +#ifdef DEBUG +				if (_res.options & RES_DEBUG) +					printf(";; timeout\n"); +#endif +				gotsomewhere = 1; +				continue; +			} +			if ((resplen = recv(s, answer, anslen, 0)) <= 0) { +#ifdef DEBUG +				if (_res.options & RES_DEBUG) +					perror("recvfrom"); +#endif +				continue; +			} +			gotsomewhere = 1; +			if (id != anhp->id) { +				/* +				 * response from old query, ignore it +				 */ +#ifdef DEBUG +				if ((_res.options & RES_DEBUG) || +				    (_res.pfcode & RES_PRF_REPLY)) { +					printf(";; old answer:\n"); +					__p_query(answer); +				} +#endif +				goto wait; +			} +			if (anhp->rcode == SERVFAIL || anhp->rcode == NOTIMP || +			    anhp->rcode == REFUSED) { +#ifdef DEBUG +				if (_res.options & RES_DEBUG) { +					printf("server rejected query:\n"); +					__p_query(answer); +				} +#endif +				badns |= (1<<ns); +				continue; +			} +			if (!(_res.options & RES_IGNTC) && anhp->tc) { +				/* +				 * get rest of answer; +				 * use TCP with same server. +				 */ +#ifdef DEBUG +				if (_res.options & RES_DEBUG) +					printf(";; truncated answer\n"); +#endif +				(void) close(s); +				s = -1; +				v_circuit = 1; +				goto usevc; +			} +		} +#ifdef DEBUG +		if (_res.options & RES_DEBUG) +			printf(";; got answer:\n"); +		if ((_res.options & RES_DEBUG) || +		    (_res.pfcode & RES_PRF_REPLY)) +			__p_query(answer); +#endif +		/* +		 * If using virtual circuits, we assume that the first server +		 * is preferred * over the rest (i.e. it is on the local +		 * machine) and only keep that one open. +		 * If we have temporarily opened a virtual circuit, +		 * or if we haven't been asked to keep a socket open, +		 * close the socket. +		 */ +		if ((v_circuit && +		    ((_res.options & RES_USEVC) == 0 || ns != 0)) || +		    (_res.options & RES_STAYOPEN) == 0) { +			(void) close(s); +			s = -1; +		} +		return (resplen); +	   } +	} +	if (s >= 0) { +		(void) close(s); +		s = -1; +	} +	if (v_circuit == 0) +		if (gotsomewhere == 0) +			errno = ECONNREFUSED;	/* no nameservers found */ +		else +			errno = ETIMEDOUT;	/* no answer obtained */ +	else +		errno = terrno; +	return (-1); +} + +/* + * This routine is for closing the socket if a virtual circuit is used and + * the program wants to close it.  This provides support for endhostent() + * which expects to close the socket. + * + * This routine is not expected to be user visible. + */ +_res_close() +{ +	if (s != -1) { +		(void) close(s); +		s = -1; +	} +} diff --git a/lib/libc/net/sethostent.c b/lib/libc/net/sethostent.c new file mode 100644 index 000000000000..dbc6e204060e --- /dev/null +++ b/lib/libc/net/sethostent.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 1985, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)sethostent.c	8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/param.h> +#include <netinet/in.h> +#include <arpa/nameser.h> +#include <netdb.h> +#include <resolv.h> + +void +sethostent(stayopen) +{ +	if (stayopen) +		_res.options |= RES_STAYOPEN | RES_USEVC; +} + +void +endhostent() +{ +	_res.options &= ~(RES_STAYOPEN | RES_USEVC); +	_res_close(); +} diff --git a/lib/libc/stdlib/free.3 b/lib/libc/stdlib/free.3 new file mode 100644 index 000000000000..17d99eb97c3b --- /dev/null +++ b/lib/libc/stdlib/free.3 @@ -0,0 +1,81 @@ +.\" Copyright (c) 1991, 1993 +.\"	The Regents of the University of California.  All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the American National Standards Committee X3, on Information +.\" Processing Systems. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\"    notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\"    notice, this list of conditions and the following disclaimer in the +.\"    documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\"    must display the following acknowledgement: +.\"	This product includes software developed by the University of +.\"	California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\"    may be used to endorse or promote products derived from this software +.\"    without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\"     @(#)free.3	8.1 (Berkeley) 6/4/93 +.\" +.Dd June 4, 1993 +.Dt FREE 3 +.Os +.Sh NAME +.Nm free +.Nd free up memory allocated with malloc, calloc or realloc +.Sh SYNOPSIS +.Fd #include <stdlib.h> +.Ft void +.Fn free "void *ptr" +.Sh DESCRIPTION +The +.Fn free +function causes the space pointed to by +.Fa ptr +to be deallocated, that is, made available +for further allocation. +If +.Fa ptr +is a null pointer, no action occurs. +Otherwise, if the argument does not match a pointer earlier +returned by the +.Xr calloc , +.Xr malloc , +or +.Xr realloc +function, or if the space has been deallocated by a call to +.Fn free +or +.Xr realloc , +general havoc may occur. +.Sh RETURN VALUES +The +.Fn free +function returns no value. +.Sh SEE ALSO +.Xr calloc 3 , +.Xr malloc 3 , +.Xr realloc 3 +.Sh STANDARDS +The +.Fn free +function conforms to +.St -ansiC . diff --git a/lib/libc/stdlib/realloc.3 b/lib/libc/stdlib/realloc.3 new file mode 100644 index 000000000000..903825cbb96f --- /dev/null +++ b/lib/libc/stdlib/realloc.3 @@ -0,0 +1,99 @@ +.\" Copyright (c) 1991, 1993 +.\"	The Regents of the University of California.  All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\"    notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\"    notice, this list of conditions and the following disclaimer in the +.\"    documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\"    must display the following acknowledgement: +.\"	This product includes software developed by the University of +.\"	California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\"    may be used to endorse or promote products derived from this software +.\"    without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\"     @(#)realloc.3	8.2 (Berkeley) 4/19/94 +.\" +.Dd April 19, 1994 +.Dt REALLOC 3 +.Os +.Sh NAME +.Nm realloc +.Nd reallocation of memory function +.Sh SYNOPSIS +.Fd #include <stdlib.h> +.Ft void * +.Fn realloc "void *ptr" "size_t size" +.Sh DESCRIPTION +The +.Fn realloc +function changes the size of the object pointed to by +.Fa ptr +to the size specified by +.Fa size . +The contents of the object are unchanged up to the lesser +of the new and old sizes. +If the new size is larger, the value of the newly allocated portion +of the object is indeterminate. +If +.Fa ptr +is a null pointer, the +.Fn realloc +function behaves like the +.Xr malloc 3 +function for the specified size. +Otherwise, if +.Fa ptr +does not match a pointer earlier returned by the +.Xr calloc 3 , +.Xr malloc 3 , +or  +.Fn realloc +function, or if the space has been deallocated +by a call to the +.Xr free +or +.Fn realloc +function, unpredictable and usually detrimental +behavior will occur. +If the space cannot be allocated, the object  +pointed to by +.Fa ptr +is unchanged. +If +.Fa size +is zero and +.Fa ptr +is not a null pointer, the object it points to is freed. +.Pp +The +.Fn realloc +function returns either a null pointer or a pointer +to the possibly moved allocated space. +.Sh SEE ALSO +.Xr alloca 3 , +.Xr calloc 3 , +.Xr free 3 , +.Xr malloc 3 , +.Sh STANDARDS +The +.Fn realloc +function conforms to +.St -ansiC . diff --git a/lib/libc/string/strftime.3 b/lib/libc/string/strftime.3 new file mode 100644 index 000000000000..3da35a1c4460 --- /dev/null +++ b/lib/libc/string/strftime.3 @@ -0,0 +1,186 @@ +.\" Copyright (c) 1989, 1991, 1993 +.\"	The Regents of the University of California.  All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the American National Standards Committee X3, on Information +.\" Processing Systems. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\"    notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\"    notice, this list of conditions and the following disclaimer in the +.\"    documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\"    must display the following acknowledgement: +.\"	This product includes software developed by the University of +.\"	California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\"    may be used to endorse or promote products derived from this software +.\"    without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\"     @(#)strftime.3	8.1 (Berkeley) 6/4/93 +.\" +.Dd June 4, 1993 +.Dt STRFTIME 3 +.Os +.Sh NAME +.Nm strftime +.Nd format date and time +.Sh SYNOPSIS +.Fd #include <sys/types.h> +.Fd #include <time.h> +.Fd #include <string.h> +.Ft size_t +.Fn strftime "char *buf" "size_t maxsize" "const char *format" "const struct tm *timeptr" +.Sh DESCRIPTION +The +.Fn strftime +function formats the information from +.Fa timeptr +into the buffer +.Fa buf +according to the string pointed to by +.Fa format . +.Pp +The +.Fa format +string consists of zero or more conversion specifications and +ordinary characters. +All ordinary characters are copied directly into the buffer. +A conversion specification consists of a percent sign +.Dq Ql % +and one other character. +.Pp +No more than +.Fa maxsize +characters will be placed into the array. +If the total number of resulting characters, including the terminating +null character, is not more than +.Fa maxsize , +.Fn strftime +returns the number of characters in the array, not counting the +terminating null. +Otherwise, zero is returned. +.Pp +Each conversion specification is replaced by the characters as +follows which are then copied into the buffer. +.Bl -tag -width "xxxx" +.It Cm \&%A +is replaced by the full weekday name. +.It Cm %a +is replaced by the abbreviated weekday name, where the abbreviation +is the first three characters. +.It Cm \&%B +is replaced by the full month name. +.It Cm %b  or  %h +is replaced by the abbreviated month name, where the abbreviation is +the first three characters. +.It Cm \&%C +is equivalent to +.Dq Li %a %b %e %H:%M:%S %Y +(the format produced by +.Xr asctime 3 . +.It Cm %c +is equivalent to +.Dq Li %m/%d/%y . +.It Cm \&%D +is replaced by the date in the format +.Dq Ql mm/dd/yy . +.It Cm %d +is replaced by the day of the month as a decimal number (01-31). +.It Cm %e +is replaced by the day of month as a decimal number (1-31); single +digits are preceded by a blank. +.It Cm \&%H +is replaced by the hour (24-hour clock) as a decimal number (00-23). +.It Cm \&%I +is replaced by the hour (12-hour clock) as a decimal number (01-12). +.It Cm %j +is replaced by the day of the year as a decimal number (001-366). +.It Cm %k +is replaced by the hour (24-hour clock) as a decimal number (0-23); +single digits are preceded by a blank. +.It Cm %l +is replaced by the hour (12-hour clock) as a decimal number (1-12); +single digits are preceded by a blank. +.It Cm \&%M +is replaced by the minute as a decimal number (00-59). +.It Cm %m +is replaced by the month as a decimal number (01-12). +.It Cm %n +is replaced by a newline. +.It Cm %p +is replaced by either +.Dq Tn AM +or +.Dq Tn PM +as appropriate. +.It Cm \&%R +is equivalent to +.Dq Li %H:%M +.It Cm %r +is equivalent to +.Dq Li %I:%M:%S %p . +.It Cm %t +is replaced by a tab. +.It Cm \&%S +is replaced by the second as a decimal number (00-60). +.It Cm %s +is replaced by the number of seconds since the Epoch, UCT (see +.Xr mktime 3 ) . +.It Cm \&%T No or Cm \&%X +is equivalent to +.Dq Li %H:%M:%S . +.It Cm \&%U +is replaced by the week number of the year (Sunday as the first day of +the week) as a decimal number (00-53). +.It Cm \&%W +is replaced by the week number of the year (Monday as the first day of +the week) as a decimal number (00-53). +.It Cm %w +is replaced by the weekday (Sunday as the first day of the week) +as a decimal number (0-6). +.It Cm %x +is equivalent to +.Dq Li %m/%d/%y %H:%M:%S . +.It Cm \&%Y +is replaced by the year with century as a decimal number. +.It Cm %y +is replaced by the year without century as a decimal number (00-99). +.It Cm \&%Z +is replaced by the time zone name. +.It Cm %% +is replaced by +.Ql % . +.El +.Sh SEE ALSO +.Xr date 1 , +.Xr ctime 3 , +.Xr printf 1 , +.Xr printf 3 +.Sh STANDARDS +The +.Fn strftime +function +conforms to +.St -ansiC . +The +.Ql %s +conversion specification is an extension. +.Sh BUGS +There is no conversion specification for the phase of the moon. diff --git a/lib/libc/string/strftime.c b/lib/libc/string/strftime.c new file mode 100644 index 000000000000..b39aeeb9917a --- /dev/null +++ b/lib/libc/string/strftime.c @@ -0,0 +1,292 @@ +/* + * Copyright (c) 1989, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *	This product includes software developed by the University of + *	California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)strftime.c	8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/types.h> +#include <sys/time.h> +#include <tzfile.h> +#include <string.h> + +static char *afmt[] = { +	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", +}; +static char *Afmt[] = { +	"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", +	"Saturday", +}; +static char *bfmt[] = { +	"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", +	"Oct", "Nov", "Dec", +}; +static char *Bfmt[] = { +	"January", "February", "March", "April", "May", "June", "July", +	"August", "September", "October", "November", "December", +}; + +static size_t gsize; +static char *pt; +static int _add __P((char *)); +static int _conv __P((int, int, int)); +static int _secs __P((const struct tm *)); +static size_t _fmt __P((const char *, const struct tm *)); + +size_t +strftime(s, maxsize, format, t) +	char *s; +	size_t maxsize; +	const char *format; +	const struct tm *t; +{ + +	pt = s; +	if ((gsize = maxsize) < 1) +		return(0); +	if (_fmt(format, t)) { +		*pt = '\0'; +		return(maxsize - gsize); +	} +	return(0); +} + +static size_t +_fmt(format, t) +	register const char *format; +	const struct tm *t; +{ +	for (; *format; ++format) { +		if (*format == '%') +			switch(*++format) { +			case '\0': +				--format; +				break; +			case 'A': +				if (t->tm_wday < 0 || t->tm_wday > 6) +					return(0); +				if (!_add(Afmt[t->tm_wday])) +					return(0); +				continue; +			case 'a': +				if (t->tm_wday < 0 || t->tm_wday > 6) +					return(0); +				if (!_add(afmt[t->tm_wday])) +					return(0); +				continue; +			case 'B': +				if (t->tm_mon < 0 || t->tm_mon > 11) +					return(0); +				if (!_add(Bfmt[t->tm_mon])) +					return(0); +				continue; +			case 'b': +			case 'h': +				if (t->tm_mon < 0 || t->tm_mon > 11) +					return(0); +				if (!_add(bfmt[t->tm_mon])) +					return(0); +				continue; +			case 'C': +				if (!_fmt("%a %b %e %H:%M:%S %Y", t)) +					return(0); +				continue; +			case 'c': +				if (!_fmt("%m/%d/%y %H:%M:%S", t)) +					return(0); +				continue; +			case 'D': +				if (!_fmt("%m/%d/%y", t)) +					return(0); +				continue; +			case 'd': +				if (!_conv(t->tm_mday, 2, '0')) +					return(0); +				continue; +			case 'e': +				if (!_conv(t->tm_mday, 2, ' ')) +					return(0); +				continue; +			case 'H': +				if (!_conv(t->tm_hour, 2, '0')) +					return(0); +				continue; +			case 'I': +				if (!_conv(t->tm_hour % 12 ? +				    t->tm_hour % 12 : 12, 2, '0')) +					return(0); +				continue; +			case 'j': +				if (!_conv(t->tm_yday + 1, 3, '0')) +					return(0); +				continue; +			case 'k': +				if (!_conv(t->tm_hour, 2, ' ')) +					return(0); +				continue; +			case 'l': +				if (!_conv(t->tm_hour % 12 ? +				    t->tm_hour % 12 : 12, 2, ' ')) +					return(0); +				continue; +			case 'M': +				if (!_conv(t->tm_min, 2, '0')) +					return(0); +				continue; +			case 'm': +				if (!_conv(t->tm_mon + 1, 2, '0')) +					return(0); +				continue; +			case 'n': +				if (!_add("\n")) +					return(0); +				continue; +			case 'p': +				if (!_add(t->tm_hour >= 12 ? "PM" : "AM")) +					return(0); +				continue; +			case 'R': +				if (!_fmt("%H:%M", t)) +					return(0); +				continue; +			case 'r': +				if (!_fmt("%I:%M:%S %p", t)) +					return(0); +				continue; +			case 'S': +				if (!_conv(t->tm_sec, 2, '0')) +					return(0); +				continue; +			case 's': +				if (!_secs(t)) +					return(0); +				continue; +			case 'T': +			case 'X': +				if (!_fmt("%H:%M:%S", t)) +					return(0); +				continue; +			case 't': +				if (!_add("\t")) +					return(0); +				continue; +			case 'U': +				if (!_conv((t->tm_yday + 7 - t->tm_wday) / 7, +				    2, '0')) +					return(0); +				continue; +			case 'W': +				if (!_conv((t->tm_yday + 7 - +				    (t->tm_wday ? (t->tm_wday - 1) : 6)) +				    / 7, 2, '0')) +					return(0); +				continue; +			case 'w': +				if (!_conv(t->tm_wday, 1, '0')) +					return(0); +				continue; +			case 'x': +				if (!_fmt("%m/%d/%y", t)) +					return(0); +				continue; +			case 'y': +				if (!_conv((t->tm_year + TM_YEAR_BASE) +				    % 100, 2, '0')) +					return(0); +				continue; +			case 'Y': +				if (!_conv(t->tm_year + TM_YEAR_BASE, 4, '0')) +					return(0); +				continue; +			case 'Z': +				if (!t->tm_zone || !_add(t->tm_zone)) +					return(0); +				continue; +			case '%': +			/* +			 * X311J/88-090 (4.12.3.5): if conversion char is +			 * undefined, behavior is undefined.  Print out the +			 * character itself as printf(3) does. +			 */ +			default: +				break; +		} +		if (!gsize--) +			return(0); +		*pt++ = *format; +	} +	return(gsize); +} + +static int +_secs(t) +	const struct tm *t; +{ +	static char buf[15]; +	register time_t s; +	register char *p; +	struct tm tmp; + +	/* Make a copy, mktime(3) modifies the tm struct. */ +	tmp = *t; +	s = mktime(&tmp); +	for (p = buf + sizeof(buf) - 2; s > 0 && p > buf; s /= 10) +		*p-- = s % 10 + '0'; +	return(_add(++p)); +} + +static int +_conv(n, digits, pad) +	int n, digits, pad; +{ +	static char buf[10]; +	register char *p; + +	for (p = buf + sizeof(buf) - 2; n > 0 && p > buf; n /= 10, --digits) +		*p-- = n % 10 + '0'; +	while (p > buf && digits-- > 0) +		*p-- = pad; +	return(_add(++p)); +} + +static int +_add(str) +	register char *str; +{ +	for (;; ++pt, --gsize) { +		if (!gsize) +			return(0); +		if (!(*pt = *str++)) +			return(1); +	} +}  | 
