2002-06-21 Jeff Johnston <jjohnstn@redhat.com>

* libc/include/stdio.h (__getline, __getdelim): New prototypes.
        * libc/include/time.h [HAVE_GETDATE](getdate, getdate_r): Ditto.
        [HAVE_GETDATE](getdate_err): New error code.
        * libc/stdio/Makefile.am: Add support for getline.c and getdelim.c.
        * libc/stdio/Makefile.in: Regenerated.
        * libc/stdio/getdelim.c: New file.
        * libc/stdio/getline.c: Ditto.
        * libc/sys/linux/Makefile.am: Add support for getdate.c, getdate_err.c
        and ntp_gettime.c.  Also add AM_CFLAGS to point to libc/stdio.
        * libc/sys/linux/Makefile.in: Regenerated.
        * libc/sys/linux/getdate.c: New file.
        * libc/sys/linux/getdate_err.c: Ditto.
        * libc/sys/linux/ntp_gettime.c: Ditto.
        * libc/sys/linux/time.c (adjtimex, ntp_adjtime): New functions.
        * libc/sys/linux/sys/stdio.h (getline, getdelim): New macros.
This commit is contained in:
Jeff Johnston 2002-06-21 18:29:23 +00:00
parent 35728d4f14
commit d427d09204
14 changed files with 667 additions and 29 deletions

View File

@ -1,3 +1,21 @@
2002-06-21 Jeff Johnston <jjohnstn@redhat.com>
* libc/include/stdio.h (__getline, __getdelim): New prototypes.
* libc/include/time.h [HAVE_GETDATE](getdate, getdate_r): Ditto.
[HAVE_GETDATE](getdate_err): New error code.
* libc/stdio/Makefile.am: Add support for getline.c and getdelim.c.
* libc/stdio/Makefile.in: Regenerated.
* libc/stdio/getdelim.c: New file.
* libc/stdio/getline.c: Ditto.
* libc/sys/linux/Makefile.am: Add support for getdate.c, getdate_err.c
and ntp_gettime.c. Also add AM_CFLAGS to point to libc/stdio.
* libc/sys/linux/Makefile.in: Regenerated.
* libc/sys/linux/getdate.c: New file.
* libc/sys/linux/getdate_err.c: Ditto.
* libc/sys/linux/ntp_gettime.c: Ditto.
* libc/sys/linux/time.c (adjtimex, ntp_adjtime): New functions.
* libc/sys/linux/sys/stdio.h (getline, getdelim): New macros.
2002-06-21 Jeff Johnston <jjohnstn@redhat.com>
* libc/include/math.h: Add <sys/types.h> to get _uint32_t definition.

View File

@ -46,13 +46,13 @@ extern "C" {
*/
#include <sys/reent.h>
#include <sys/stdio.h>
#include <sys/types.h>
typedef _fpos_t fpos_t;
typedef struct __sFILE FILE;
#include <sys/stdio.h>
#define __SLBF 0x0001 /* line buffered */
#define __SNBF 0x0002 /* unbuffered */
#define __SRD 0x0004 /* OK to read */
@ -271,6 +271,9 @@ int _EXFUN(_vfscanf_r, (struct _reent *, FILE *, const char *, __VALIST));
int _EXFUN(_vscanf_r, (struct _reent *, const char *, __VALIST));
int _EXFUN(_vsscanf_r, (struct _reent *, const char *, const char *, __VALIST));
ssize_t _EXFUN(__getdelim, (char **, size_t *, int, FILE *));
ssize_t _EXFUN(__getline, (char **, size_t *, FILE *));
/*
* Routines internal to the implementation.
*/

View File

@ -67,6 +67,29 @@ char *_EXFUN(strptime, (const char *, const char *, struct tm *));
_VOID _EXFUN(tzset, (_VOID));
_VOID _EXFUN(_tzset_r, (struct _reent *));
/* getdate functions */
#ifdef HAVE_GETDATE
#ifndef _REENT_ONLY
#define getdate_err (*__getdate_err())
int *_EXFUN(__getdate_err,(_VOID));
struct tm * _EXFUN(getdate, (const char *));
/* getdate_err is set to one of the following values to indicate the error.
1 the DATEMSK environment variable is null or undefined,
2 the template file cannot be opened for reading,
3 failed to get file status information,
4 the template file is not a regular file,
5 an error is encountered while reading the template file,
6 memory allication failed (not enough memory available),
7 there is no line in the template that matches the input,
8 invalid input specification */
#endif /* !_REENT_ONLY */
/* getdate_r returns the error code as above */
int _EXFUN(getdate_r, (const char *, struct tm *));
#endif /* HAVE_GETDATE */
/* defines for the opengroup specifications Derived from Issue 1 of the SVID. */
extern __IMPORT time_t _timezone;
extern __IMPORT int _daylight;

View File

@ -35,6 +35,8 @@ LIB_SOURCES = \
getchar.c \
getc_u.c \
getchar_u.c \
getdelim.c \
getline.c \
gets.c \
getw.c \
iprintf.c \
@ -129,6 +131,8 @@ CHEWOUT_FILES = \
getchar.def \
getc_u.def \
getchar_u.def \
getdelim.def \
getline.def \
gets.def \
getw.def \
iprintf.def \

View File

@ -139,6 +139,8 @@ LIB_SOURCES = \
getchar.c \
getc_u.c \
getchar_u.c \
getdelim.c \
getline.c \
gets.c \
getw.c \
iprintf.c \
@ -220,6 +222,8 @@ CHEWOUT_FILES = \
getchar.def \
getc_u.def \
getchar_u.def \
getdelim.def \
getline.def \
gets.def \
getw.def \
iprintf.def \
@ -274,7 +278,8 @@ LIBS = @LIBS@
@USE_LIBTOOL_FALSE@fseek.$(OBJEXT) fsetpos.$(OBJEXT) ftell.$(OBJEXT) \
@USE_LIBTOOL_FALSE@fvwrite.$(OBJEXT) fwalk.$(OBJEXT) fwrite.$(OBJEXT) \
@USE_LIBTOOL_FALSE@getc.$(OBJEXT) getchar.$(OBJEXT) getc_u.$(OBJEXT) \
@USE_LIBTOOL_FALSE@getchar_u.$(OBJEXT) gets.$(OBJEXT) getw.$(OBJEXT) \
@USE_LIBTOOL_FALSE@getchar_u.$(OBJEXT) getdelim.$(OBJEXT) \
@USE_LIBTOOL_FALSE@getline.$(OBJEXT) gets.$(OBJEXT) getw.$(OBJEXT) \
@USE_LIBTOOL_FALSE@iprintf.$(OBJEXT) makebuf.$(OBJEXT) mktemp.$(OBJEXT) \
@USE_LIBTOOL_FALSE@perror.$(OBJEXT) printf.$(OBJEXT) putc.$(OBJEXT) \
@USE_LIBTOOL_FALSE@putchar.$(OBJEXT) putc_u.$(OBJEXT) \
@ -299,15 +304,15 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
@USE_LIBTOOL_TRUE@fopen.lo fprintf.lo fputc.lo fputs.lo fread.lo \
@USE_LIBTOOL_TRUE@freopen.lo fscanf.lo fseek.lo fsetpos.lo ftell.lo \
@USE_LIBTOOL_TRUE@fvwrite.lo fwalk.lo fwrite.lo getc.lo getchar.lo \
@USE_LIBTOOL_TRUE@getc_u.lo getchar_u.lo gets.lo getw.lo iprintf.lo \
@USE_LIBTOOL_TRUE@makebuf.lo mktemp.lo perror.lo printf.lo putc.lo \
@USE_LIBTOOL_TRUE@putchar.lo putc_u.lo putchar_u.lo puts.lo putw.lo \
@USE_LIBTOOL_TRUE@refill.lo remove.lo rename.lo rewind.lo rget.lo \
@USE_LIBTOOL_TRUE@scanf.lo setbuf.lo setbuffer.lo setlinebuf.lo \
@USE_LIBTOOL_TRUE@setvbuf.lo siprintf.lo snprintf.lo sprintf.lo \
@USE_LIBTOOL_TRUE@sscanf.lo stdio.lo tmpfile.lo tmpnam.lo ungetc.lo \
@USE_LIBTOOL_TRUE@vfscanf.lo vprintf.lo vscanf.lo vsnprintf.lo \
@USE_LIBTOOL_TRUE@vsprintf.lo vsscanf.lo wbuf.lo wsetup.lo
@USE_LIBTOOL_TRUE@getc_u.lo getchar_u.lo getdelim.lo getline.lo gets.lo \
@USE_LIBTOOL_TRUE@getw.lo iprintf.lo makebuf.lo mktemp.lo perror.lo \
@USE_LIBTOOL_TRUE@printf.lo putc.lo putchar.lo putc_u.lo putchar_u.lo \
@USE_LIBTOOL_TRUE@puts.lo putw.lo refill.lo remove.lo rename.lo \
@USE_LIBTOOL_TRUE@rewind.lo rget.lo scanf.lo setbuf.lo setbuffer.lo \
@USE_LIBTOOL_TRUE@setlinebuf.lo setvbuf.lo siprintf.lo snprintf.lo \
@USE_LIBTOOL_TRUE@sprintf.lo sscanf.lo stdio.lo tmpfile.lo tmpnam.lo \
@USE_LIBTOOL_TRUE@ungetc.lo vfscanf.lo vprintf.lo vscanf.lo \
@USE_LIBTOOL_TRUE@vsnprintf.lo vsprintf.lo vsscanf.lo wbuf.lo wsetup.lo
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)

View File

@ -0,0 +1,139 @@
/*
FUNCTION
<<getdelim>>---read a line up to a specified line delimeter
INDEX
getdelim
ANSI_SYNOPSIS
#include <stdio.h>
int getdelim(char **<[bufptr]>, size_t *<[n]>,
int <[delim]>, FILE *<[fp]>);
TRAD_SYNOPSIS
#include <stdio.h>
int getdelim(<[bufptr]>, <[n]>, <[delim]>, <[fp]>)
char **<[bufptr]>;
size_t *<[n]>;
int <[delim]>;
FILE *<[fp]>;
DESCRIPTION
<<getdelim>> reads a file <[fp]> up to and possibly including a specified
delimeter <[delim]>. The line is read into a buffer pointed to
by <[bufptr]> and designated with size *<[n]>. If the buffer is
not large enough, it will be dynamically grown by <<getdelim>>.
As the buffer is grown, the pointer to the size <[n]> will be
updated.
RETURNS
<<getdelim>> returns <<-1>> if no characters were successfully read,
otherwise, it returns the number of bytes successfully read.
at end of file, the result is nonzero.
PORTABILITY
<<getdelim>> is a glibc extension.
No supporting OS subroutines are directly required.
*/
/* Copyright 2002, Red Hat Inc. - all rights reserved */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "local.h"
#define MIN_LINE_SIZE 4
#define DEFAULT_LINE_SIZE 128
ssize_t
__getdelim (bufptr, n, delim, fp)
char **bufptr;
size_t *n;
int delim;
FILE *fp;
{
char *buf;
char *ptr;
size_t newsize, numbytes;
int pos;
int ch;
int cont;
if (fp == NULL || bufptr == NULL || n == NULL)
{
errno = EINVAL;
return -1;
}
buf = *bufptr;
if (buf == NULL || *n < MIN_LINE_SIZE)
{
buf = (char *)realloc (*bufptr, DEFAULT_LINE_SIZE);
if (buf == NULL)
{
return -1;
}
*bufptr = buf;
*n = DEFAULT_LINE_SIZE;
}
_flockfile(fp);
CHECK_INIT(fp);
numbytes = *n;
ptr = buf;
cont = 1;
while (cont)
{
/* fill buffer - leaving room for nul-terminator */
while (--numbytes > 0)
{
if ((ch = getc_unlocked (fp)) == EOF)
{
cont = 0;
break;
}
else
{
*ptr++ = ch;
if (ch == delim)
{
cont = 0;
break;
}
}
}
/* Buffer is too small so reallocate a larger buffer. */
pos = ptr - buf;
newsize = (*n << 1);
buf = realloc (buf, newsize);
if (buf == NULL)
{
cont = 0;
break;
}
/* After reallocating, continue in new buffer */
*bufptr = buf;
*n = newsize;
ptr = buf + pos;
numbytes = newsize - pos;
}
_funlockfile (fp);
/* if no input data, return failure */
if (ptr == buf)
return -1;
/* otherwise, nul-terminate and return number of bytes read */
*ptr = '\0';
return (ssize_t)(ptr - buf);
}

View File

@ -0,0 +1,54 @@
/*
FUNCTION
<<getline>>---read a line from a file
INDEX
getline
ANSI_SYNOPSIS
#include <stdio.h>
ssize_t getline(char **<[bufptr]>, size_t *<[n]>, FILE *<[fp]>);
TRAD_SYNOPSIS
#include <stdio.h>
ssize_t getline(<[bufptr]>, <[n]>, <[fp]>)
char **<[bufptr]>;
size_t *<[n]>;
FILE *<[fp]>;
DESCRIPTION
<<getline>> reads a file <[fp]> up to and possibly including the
newline character. The line is read into a buffer pointed to
by <[bufptr]> and designated with size *<[n]>. If the buffer is
not large enough, it will be dynamically grown by <<getdelim>>.
As the buffer is grown, the pointer to the size <[n]> will be
updated.
<<getline>> is equivalent to getdelim(bufptr, n, '\n', fp);
RETURNS
<<getline>> returns <<-1>> if no characters were successfully read,
otherwise, it returns the number of bytes successfully read.
at end of file, the result is nonzero.
PORTABILITY
<<getline>> is a glibc extension.
No supporting OS subroutines are directly required.
*/
/* Copyright 2002, Red Hat Inc. - all rights reserved */
#include <stdio.h>
extern ssize_t __getdelim (char **, size_t *, int, FILE *);
ssize_t
__getline (lptr, n, fp)
char **lptr;
size_t *n;
FILE *fp;
{
return __getdelim (lptr, n, '\n', fp);
}

View File

@ -15,6 +15,8 @@ LIB_SOURCES = \
flockfile.c \
ftok.c \
funlockfile.c \
getdate.c \
getdate_err.c \
gethostname.c \
getoptlong.c \
getreent.c \
@ -33,6 +35,7 @@ LIB_SOURCES = \
mq_send.c \
mq_setattr.c \
mq_unlink.c \
ntp_gettime.c \
pread.c \
pread64.c \
process.c \
@ -124,5 +127,6 @@ siglist.inc:
< $(SIGNAL_H) > siglist.inc || \
{ rm -f siglist.inc; exit 1; }
AM_CFLAGS = -I $(srcdir)/../../stdio
ACLOCAL_AMFLAGS = -I ../../..
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host

View File

@ -112,6 +112,8 @@ LIB_SOURCES = \
flockfile.c \
ftok.c \
funlockfile.c \
getdate.c \
getdate_err.c \
gethostname.c \
getoptlong.c \
getreent.c \
@ -130,6 +132,7 @@ LIB_SOURCES = \
mq_send.c \
mq_setattr.c \
mq_unlink.c \
ntp_gettime.c \
pread.c \
pread64.c \
process.c \
@ -184,6 +187,7 @@ liblinux_la_LDFLAGS = -Xcompiler -nostdlib
@USE_LIBTOOL_FALSE@lib_a_LIBADD = @USE_LIBTOOL_FALSE@$(LINUX_MACH_LIB)
@USE_LIBTOOL_FALSE@lib_a_DEPENDENCIES = @USE_LIBTOOL_FALSE@$(LINUX_MACH_LIB)
AM_CFLAGS = -I $(srcdir)/../../stdio
ACLOCAL_AMFLAGS = -I ../../..
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@ -197,7 +201,8 @@ CPPFLAGS = @CPPFLAGS@
LIBS = @LIBS@
@USE_LIBTOOL_FALSE@lib_a_OBJECTS = brk.$(OBJEXT) cfspeed.$(OBJEXT) \
@USE_LIBTOOL_FALSE@flockfile.$(OBJEXT) ftok.$(OBJEXT) \
@USE_LIBTOOL_FALSE@funlockfile.$(OBJEXT) gethostname.$(OBJEXT) \
@USE_LIBTOOL_FALSE@funlockfile.$(OBJEXT) getdate.$(OBJEXT) \
@USE_LIBTOOL_FALSE@getdate_err.$(OBJEXT) gethostname.$(OBJEXT) \
@USE_LIBTOOL_FALSE@getoptlong.$(OBJEXT) getreent.$(OBJEXT) \
@USE_LIBTOOL_FALSE@ids.$(OBJEXT) inode.$(OBJEXT) io.$(OBJEXT) \
@USE_LIBTOOL_FALSE@io64.$(OBJEXT) ipc.$(OBJEXT) linux.$(OBJEXT) \
@ -205,8 +210,8 @@ LIBS = @LIBS@
@USE_LIBTOOL_FALSE@mq_getattr.$(OBJEXT) mq_notify.$(OBJEXT) \
@USE_LIBTOOL_FALSE@mq_open.$(OBJEXT) mq_receive.$(OBJEXT) \
@USE_LIBTOOL_FALSE@mq_send.$(OBJEXT) mq_setattr.$(OBJEXT) \
@USE_LIBTOOL_FALSE@mq_unlink.$(OBJEXT) pread.$(OBJEXT) \
@USE_LIBTOOL_FALSE@pread64.$(OBJEXT) process.$(OBJEXT) \
@USE_LIBTOOL_FALSE@mq_unlink.$(OBJEXT) ntp_gettime.$(OBJEXT) \
@USE_LIBTOOL_FALSE@pread.$(OBJEXT) pread64.$(OBJEXT) process.$(OBJEXT) \
@USE_LIBTOOL_FALSE@psignal.$(OBJEXT) pwrite.$(OBJEXT) \
@USE_LIBTOOL_FALSE@pwrite64.$(OBJEXT) raise.$(OBJEXT) \
@USE_LIBTOOL_FALSE@realpath.$(OBJEXT) rename.$(OBJEXT) \
@ -225,19 +230,19 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
@USE_LIBTOOL_TRUE@liblinux_la_DEPENDENCIES =
@USE_LIBTOOL_TRUE@liblinux_la_OBJECTS = brk.lo cfspeed.lo flockfile.lo \
@USE_LIBTOOL_TRUE@ftok.lo funlockfile.lo gethostname.lo getoptlong.lo \
@USE_LIBTOOL_TRUE@getreent.lo ids.lo inode.lo io.lo io64.lo ipc.lo \
@USE_LIBTOOL_TRUE@linux.lo mmap.lo mq_close.lo mq_getattr.lo \
@USE_LIBTOOL_TRUE@mq_notify.lo mq_open.lo mq_receive.lo mq_send.lo \
@USE_LIBTOOL_TRUE@mq_setattr.lo mq_unlink.lo pread.lo pread64.lo \
@USE_LIBTOOL_TRUE@process.lo psignal.lo pwrite.lo pwrite64.lo raise.lo \
@USE_LIBTOOL_TRUE@realpath.lo rename.lo resource.lo sched.lo select.lo \
@USE_LIBTOOL_TRUE@seteuid.lo shm_open.lo shm_unlink.lo sig.lo \
@USE_LIBTOOL_TRUE@sigaction.lo sigqueue.lo signal.lo siglongjmp.lo \
@USE_LIBTOOL_TRUE@sigset.lo sigwait.lo socket.lo sleep.lo stack.lo \
@USE_LIBTOOL_TRUE@strsignal.lo sysconf.lo sysctl.lo systat.lo system.lo \
@USE_LIBTOOL_TRUE@tcdrain.lo tcsendbrk.lo termios.lo time.lo usleep.lo \
@USE_LIBTOOL_TRUE@wait.lo
@USE_LIBTOOL_TRUE@ftok.lo funlockfile.lo getdate.lo getdate_err.lo \
@USE_LIBTOOL_TRUE@gethostname.lo getoptlong.lo getreent.lo ids.lo \
@USE_LIBTOOL_TRUE@inode.lo io.lo io64.lo ipc.lo linux.lo mmap.lo \
@USE_LIBTOOL_TRUE@mq_close.lo mq_getattr.lo mq_notify.lo mq_open.lo \
@USE_LIBTOOL_TRUE@mq_receive.lo mq_send.lo mq_setattr.lo mq_unlink.lo \
@USE_LIBTOOL_TRUE@ntp_gettime.lo pread.lo pread64.lo process.lo \
@USE_LIBTOOL_TRUE@psignal.lo pwrite.lo pwrite64.lo raise.lo realpath.lo \
@USE_LIBTOOL_TRUE@rename.lo resource.lo sched.lo select.lo seteuid.lo \
@USE_LIBTOOL_TRUE@shm_open.lo shm_unlink.lo sig.lo sigaction.lo \
@USE_LIBTOOL_TRUE@sigqueue.lo signal.lo siglongjmp.lo sigset.lo \
@USE_LIBTOOL_TRUE@sigwait.lo socket.lo sleep.lo stack.lo strsignal.lo \
@USE_LIBTOOL_TRUE@sysconf.lo sysctl.lo systat.lo system.lo tcdrain.lo \
@USE_LIBTOOL_TRUE@tcsendbrk.lo termios.lo time.lo usleep.lo wait.lo
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)

View File

@ -0,0 +1,319 @@
/* Convert a string representation of time to a time value.
Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/*
FUNCTION
<<getdate>>,<<getdate_r>>---convert a string representation of time to a time value
INDEX
getdate
INDEX
getdate_r
ANSI_SYNOPSIS
#include <time.h>
struct tm *getdate(const char *<[string]>);
int getdate_r(const char *<[string]>, struct tm *<[res]>);
TRAD_SYNOPSIS
#include <time.h>
struct tm *getdate(<[string]>);
const char *<[string]>;
int getdate_r(<[string]>, <[res]>);
const char *<[string]>;
struct tm *<[res]>;
DESCRIPTION
<<getdate>> reads a file which is specified by the environment variable:
DATEMSK. This file contains a number of formats valid for input to the
<<strptime>> function. The input <[string]> is used as input to the format
strings and the first valid match that occurs is used. The resultant
time struct is returned. If an error occurs, the value <<getdate_err>> is
set to one of the following values.
1 the DATEMSK environment variable is null or undefined,
2 the template file cannot be opened for reading,
3 failed to get file status information,
4 the template file is not a regular file,
5 an error is encountered while reading the template file,
6 memory allication failed (not enough memory available),
7 there is no line in the template that matches the input,
8 invalid input specification
The <<getdate_r>> routine is similar, except that it returns the error
code and has the <[res]> time struct pointer passed in. <<getdate>> is
non-reentrant. Applications that wish to be reentrant should use
<<getdate_r>> instead of <<getdate>>.
RETURNS
<<getdate>> returns a pointer to the traditional time representation
(<<struct tm>>). <<getdate_r>> returns 0 if successful, otherwise it
returns the error code.
PORTABILITY
<<getdate>> is defined by the Single Unix specification.
<<getdate_r>> is a reentrant extension.
<<getdate>> and <<getdate_r>> optionally require <<stat>> and <<access>>.
*/
/* Modified for newlib by Jeff Johnston, June 19/2002 */
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#define TM_YEAR_BASE 1900
extern ssize_t __getline (char **, size_t *, FILE *);
/* Prototypes for local functions. */
static int first_wday (int year, int mon, int wday);
static int check_mday (int year, int mon, int mday);
#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
/* Error code is set to one of the following values to indicate an error.
1 the DATEMSK environment variable is null or undefined,
2 the template file cannot be opened for reading,
3 failed to get file status information,
4 the template file is not a regular file,
5 an error is encountered while reading the template file,
6 memory allication failed (not enough memory available),
7 there is no line in the template that matches the input,
8 invalid input specification Example: February 31 or a time is
specified that can not be represented in a time_t (representing
the time in seconds since 00:00:00 UTC, January 1, 1970) */
/* Returns the first weekday WDAY of month MON in the year YEAR. */
static int
first_wday (int year, int mon, int wday)
{
struct tm tm;
if (wday == INT_MIN)
return 1;
memset (&tm, 0, sizeof (struct tm));
tm.tm_year = year;
tm.tm_mon = mon;
tm.tm_mday = 1;
mktime (&tm);
return (1 + (wday - tm.tm_wday + 7) % 7);
}
/* Returns 1 if MDAY is a valid day of the month in month MON of year
YEAR, and 0 if it is not. */
static int
check_mday (int year, int mon, int mday)
{
switch (mon)
{
case 0:
case 2:
case 4:
case 6:
case 7:
case 9:
case 11:
if (mday >= 1 && mday <= 31)
return 1;
break;
case 3:
case 5:
case 8:
case 10:
if (mday >= 1 && mday <= 30)
return 1;
break;
case 1:
if (mday >= 1 && mday <= (isleap (year) ? 29 : 28))
return 1;
break;
}
return 0;
}
int
getdate_r (const char *string, struct tm *tp)
{
FILE *fp;
char *line;
size_t len;
char *datemsk;
char *result = NULL;
time_t timer;
struct tm tm;
struct stat64 st;
int mday_ok = 0;
datemsk = getenv ("DATEMSK");
if (datemsk == NULL || *datemsk == '\0')
return 1;
if (stat64 (datemsk, &st) < 0)
return 3;
if (!S_ISREG (st.st_mode))
return 4;
if (access (datemsk, R_OK) < 0)
return 2;
/* Open the template file. */
fp = fopen (datemsk, "r");
if (fp == NULL)
return 2;
line = NULL;
len = 0;
do
{
ssize_t n;
n = __getline (&line, &len, fp);
if (n < 0)
break;
if (line[n - 1] == '\n')
line[n - 1] = '\0';
/* Do the conversion. */
tp->tm_year = tp->tm_mon = tp->tm_mday = tp->tm_wday = INT_MIN;
tp->tm_hour = tp->tm_sec = tp->tm_min = INT_MIN;
tp->tm_isdst = -1;
result = strptime (string, line, tp);
if (result && *result == '\0')
break;
}
while (!__sfeof (fp));
/* Free the buffer. */
free (line);
/* Check for errors. */
if (__sferror (fp))
{
fclose (fp);
return 5;
}
/* Close template file. */
fclose (fp);
if (result == NULL || *result != '\0')
return 7;
/* Get current time. */
time (&timer);
localtime_r (&timer, &tm);
/* If only the weekday is given, today is assumed if the given day
is equal to the current day and next week if it is less. */
if (tp->tm_wday >= 0 && tp->tm_wday <= 6 && tp->tm_year == INT_MIN
&& tp->tm_mon == INT_MIN && tp->tm_mday == INT_MIN)
{
tp->tm_year = tm.tm_year;
tp->tm_mon = tm.tm_mon;
tp->tm_mday = tm.tm_mday + (tp->tm_wday - tm.tm_wday + 7) % 7;
mday_ok = 1;
}
/* If only the month is given, the current month is assumed if the
given month is equal to the current month and next year if it is
less and no year is given (the first day of month is assumed if
no day is given. */
if (tp->tm_mon >= 0 && tp->tm_mon <= 11 && tp->tm_mday == INT_MIN)
{
if (tp->tm_year == INT_MIN)
tp->tm_year = tm.tm_year + (((tp->tm_mon - tm.tm_mon) < 0) ? 1 : 0);
tp->tm_mday = first_wday (tp->tm_year, tp->tm_mon, tp->tm_wday);
mday_ok = 1;
}
/* If no hour, minute and second are given the current hour, minute
and second are assumed. */
if (tp->tm_hour == INT_MIN && tp->tm_min == INT_MIN && tp->tm_sec == INT_MIN)
{
tp->tm_hour = tm.tm_hour;
tp->tm_min = tm.tm_min;
tp->tm_sec = tm.tm_sec;
}
/* If no date is given, today is assumed if the given hour is
greater than the current hour and tomorrow is assumed if
it is less. */
if (tp->tm_hour >= 0 && tp->tm_hour <= 23
&& tp->tm_year == INT_MIN && tp->tm_mon == INT_MIN
&& tp->tm_mday == INT_MIN && tp->tm_wday == INT_MIN)
{
tp->tm_year = tm.tm_year;
tp->tm_mon = tm.tm_mon;
tp->tm_mday = tm.tm_mday + ((tp->tm_hour - tm.tm_hour) < 0 ? 1 : 0);
mday_ok = 1;
}
/* Fill in the gaps. */
if (tp->tm_year == INT_MIN)
tp->tm_year = tm.tm_year;
if (tp->tm_hour == INT_MIN)
tp->tm_hour = 0;
if (tp->tm_min == INT_MIN)
tp->tm_min = 0;
if (tp->tm_sec == INT_MIN)
tp->tm_sec = 0;
/* Check if the day of month is within range, and if the time can be
represented in a time_t. We make use of the fact that the mktime
call normalizes the struct tm. */
if ((!mday_ok && !check_mday (TM_YEAR_BASE + tp->tm_year, tp->tm_mon,
tp->tm_mday))
|| mktime (tp) == (time_t) -1)
return 8;
return 0;
}
#ifndef _REENT_ONLY
struct tm *
getdate (const char *string)
{
/* Buffer returned by getdate. */
static struct tm tmbuf;
int errval = getdate_r (string, &tmbuf);
if (errval != 0)
{
getdate_err = errval;
return NULL;
}
return &tmbuf;
}
#endif /* _REENT_ONLY */

View File

@ -0,0 +1,18 @@
/* The getdate_err variable is stored in the reentrancy structure. This
function returns its address for use by the getdate_err macro defined in
time.h. */
#include <errno.h>
#include <reent.h>
#ifndef _REENT_ONLY
int *
__getdate_err ()
{
struct _reent *ptr = _REENT;
_REENT_CHECK_MISC(ptr);
return _REENT_GETDATE_ERR_P(ptr);
}
#endif

View File

@ -0,0 +1,38 @@
/* Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sys/timex.h>
#ifndef MOD_OFFSET
# define modes mode
#endif
int
ntp_gettime (ntv)
struct ntptimeval *ntv;
{
struct timex tntx;
int result;
tntx.modes = 0;
result = __adjtimex (&tntx);
ntv->time = tntx.time;
ntv->maxerror = tntx.maxerror;
ntv->esterror = tntx.esterror;
return result;
}

View File

@ -13,4 +13,7 @@
# endif
#endif /* __SINGLE_THREAD__ */
#define getline __getline
#define getdelim __getdelim
#endif /* _NEWLIB_STDIO_H */

View File

@ -6,10 +6,13 @@
#include <errno.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/timex.h>
#include <linux/times.h>
#include <machine/syscall.h>
#define __NR___adjtimex __NR_adjtimex
_syscall1(int,__adjtimex,struct timex *,tx)
_syscall1(time_t,time,time_t *,t)
_syscall1(clock_t,times,struct tms *,buf)
_syscall2(int,getitimer,int,type,struct itimerval *,old)
@ -19,3 +22,5 @@ _syscall2(int,settimeofday,const struct timeval *,tv,const struct timezone *,tz)
_syscall2(int,nanosleep,const struct timespec *,req,struct timespec *,rem)
weak_alias(__libc_gettimeofday,__gettimeofday);
weak_alias(__adjtimex,adjtimex);
weak_alias(__adjtimex,ntp_adjtime);