From d427d09204c97df14607149e94a1da9beddd76ab Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Fri, 21 Jun 2002 18:29:23 +0000 Subject: 2002-06-21 Jeff Johnston * 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. --- newlib/libc/include/stdio.h | 9 +- newlib/libc/include/time.h | 23 +++ newlib/libc/stdio/Makefile.am | 4 + newlib/libc/stdio/Makefile.in | 25 +-- newlib/libc/stdio/getdelim.c | 139 ++++++++++++++++ newlib/libc/stdio/getline.c | 54 ++++++ newlib/libc/sys/linux/Makefile.am | 4 + newlib/libc/sys/linux/Makefile.in | 37 +++-- newlib/libc/sys/linux/getdate.c | 319 ++++++++++++++++++++++++++++++++++++ newlib/libc/sys/linux/getdate_err.c | 18 ++ newlib/libc/sys/linux/ntp_gettime.c | 38 +++++ newlib/libc/sys/linux/sys/stdio.h | 3 + newlib/libc/sys/linux/time.c | 5 + 13 files changed, 649 insertions(+), 29 deletions(-) create mode 100644 newlib/libc/stdio/getdelim.c create mode 100644 newlib/libc/stdio/getline.c create mode 100644 newlib/libc/sys/linux/getdate.c create mode 100644 newlib/libc/sys/linux/getdate_err.c create mode 100644 newlib/libc/sys/linux/ntp_gettime.c (limited to 'newlib/libc') diff --git a/newlib/libc/include/stdio.h b/newlib/libc/include/stdio.h index 73204cb72..51403a352 100644 --- a/newlib/libc/include/stdio.h +++ b/newlib/libc/include/stdio.h @@ -46,13 +46,13 @@ extern "C" { */ #include - -#include +#include typedef _fpos_t fpos_t; - typedef struct __sFILE FILE; +#include + #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. */ diff --git a/newlib/libc/include/time.h b/newlib/libc/include/time.h index c45be5484..9b164170c 100644 --- a/newlib/libc/include/time.h +++ b/newlib/libc/include/time.h @@ -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; diff --git a/newlib/libc/stdio/Makefile.am b/newlib/libc/stdio/Makefile.am index e7d4fea21..b7eaab8e4 100644 --- a/newlib/libc/stdio/Makefile.am +++ b/newlib/libc/stdio/Makefile.am @@ -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 \ diff --git a/newlib/libc/stdio/Makefile.in b/newlib/libc/stdio/Makefile.in index b8d348f90..7210cb771 100644 --- a/newlib/libc/stdio/Makefile.in +++ b/newlib/libc/stdio/Makefile.in @@ -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) diff --git a/newlib/libc/stdio/getdelim.c b/newlib/libc/stdio/getdelim.c new file mode 100644 index 000000000..8ec9d40c8 --- /dev/null +++ b/newlib/libc/stdio/getdelim.c @@ -0,0 +1,139 @@ +/* +FUNCTION +<>---read a line up to a specified line delimeter + +INDEX + getdelim + +ANSI_SYNOPSIS + #include + int getdelim(char **<[bufptr]>, size_t *<[n]>, + int <[delim]>, FILE *<[fp]>); + +TRAD_SYNOPSIS + #include + int getdelim(<[bufptr]>, <[n]>, <[delim]>, <[fp]>) + char **<[bufptr]>; + size_t *<[n]>; + int <[delim]>; + FILE *<[fp]>; + +DESCRIPTION +<> 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 <>. +As the buffer is grown, the pointer to the size <[n]> will be +updated. + +RETURNS +<> 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 +<> is a glibc extension. + +No supporting OS subroutines are directly required. +*/ + +/* Copyright 2002, Red Hat Inc. - all rights reserved */ + +#include +#include +#include +#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); +} + diff --git a/newlib/libc/stdio/getline.c b/newlib/libc/stdio/getline.c new file mode 100644 index 000000000..741a7dc77 --- /dev/null +++ b/newlib/libc/stdio/getline.c @@ -0,0 +1,54 @@ +/* +FUNCTION +<>---read a line from a file + +INDEX + getline + +ANSI_SYNOPSIS + #include + ssize_t getline(char **<[bufptr]>, size_t *<[n]>, FILE *<[fp]>); + +TRAD_SYNOPSIS + #include + ssize_t getline(<[bufptr]>, <[n]>, <[fp]>) + char **<[bufptr]>; + size_t *<[n]>; + FILE *<[fp]>; + +DESCRIPTION +<> 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 <>. +As the buffer is grown, the pointer to the size <[n]> will be +updated. + +<> is equivalent to getdelim(bufptr, n, '\n', fp); + +RETURNS +<> 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 +<> is a glibc extension. + +No supporting OS subroutines are directly required. +*/ + +/* Copyright 2002, Red Hat Inc. - all rights reserved */ + +#include + +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); +} + diff --git a/newlib/libc/sys/linux/Makefile.am b/newlib/libc/sys/linux/Makefile.am index 861340d22..78cdd399e 100644 --- a/newlib/libc/sys/linux/Makefile.am +++ b/newlib/libc/sys/linux/Makefile.am @@ -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 diff --git a/newlib/libc/sys/linux/Makefile.in b/newlib/libc/sys/linux/Makefile.in index 9f8459e65..68a483b71 100644 --- a/newlib/libc/sys/linux/Makefile.in +++ b/newlib/libc/sys/linux/Makefile.in @@ -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) diff --git a/newlib/libc/sys/linux/getdate.c b/newlib/libc/sys/linux/getdate.c new file mode 100644 index 000000000..9137a2e5b --- /dev/null +++ b/newlib/libc/sys/linux/getdate.c @@ -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 , 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 +<>,<>---convert a string representation of time to a time value + +INDEX + getdate +INDEX + getdate_r + +ANSI_SYNOPSIS + #include + struct tm *getdate(const char *<[string]>); + int getdate_r(const char *<[string]>, struct tm *<[res]>); + +TRAD_SYNOPSIS + #include + struct tm *getdate(<[string]>); + const char *<[string]>; + + int getdate_r(<[string]>, <[res]>); + const char *<[string]>; + struct tm *<[res]>; + +DESCRIPTION +<> reads a file which is specified by the environment variable: +DATEMSK. This file contains a number of formats valid for input to the +<> 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 <> 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 <> routine is similar, except that it returns the error +code and has the <[res]> time struct pointer passed in. <> is +non-reentrant. Applications that wish to be reentrant should use +<> instead of <>. + +RETURNS +<> returns a pointer to the traditional time representation +(<>). <> returns 0 if successful, otherwise it +returns the error code. + +PORTABILITY +<> is defined by the Single Unix specification. +<> is a reentrant extension. + +<> and <> optionally require <> and <>. +*/ + + +/* Modified for newlib by Jeff Johnston, June 19/2002 */ + +#include +#include +#include +#include +#include +#include +#include + +#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 */ diff --git a/newlib/libc/sys/linux/getdate_err.c b/newlib/libc/sys/linux/getdate_err.c new file mode 100644 index 000000000..e90b74b83 --- /dev/null +++ b/newlib/libc/sys/linux/getdate_err.c @@ -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 +#include + +#ifndef _REENT_ONLY + +int * +__getdate_err () +{ + struct _reent *ptr = _REENT; + _REENT_CHECK_MISC(ptr); + return _REENT_GETDATE_ERR_P(ptr); +} + +#endif diff --git a/newlib/libc/sys/linux/ntp_gettime.c b/newlib/libc/sys/linux/ntp_gettime.c new file mode 100644 index 000000000..2bcabbc63 --- /dev/null +++ b/newlib/libc/sys/linux/ntp_gettime.c @@ -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 + +#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; +} diff --git a/newlib/libc/sys/linux/sys/stdio.h b/newlib/libc/sys/linux/sys/stdio.h index 5c51d3b0d..29097c89e 100644 --- a/newlib/libc/sys/linux/sys/stdio.h +++ b/newlib/libc/sys/linux/sys/stdio.h @@ -13,4 +13,7 @@ # endif #endif /* __SINGLE_THREAD__ */ +#define getline __getline +#define getdelim __getdelim + #endif /* _NEWLIB_STDIO_H */ diff --git a/newlib/libc/sys/linux/time.c b/newlib/libc/sys/linux/time.c index efb90b266..a7313505e 100644 --- a/newlib/libc/sys/linux/time.c +++ b/newlib/libc/sys/linux/time.c @@ -6,10 +6,13 @@ #include #include #include +#include #include #include +#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); -- cgit v1.2.3