summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libugly
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libugly')
-rw-r--r--mdk-stage1/dietlibc/libugly/asctime_r.c2
-rw-r--r--mdk-stage1/dietlibc/libugly/asprintf.c9
-rw-r--r--mdk-stage1/dietlibc/libugly/getmntent.c11
-rw-r--r--mdk-stage1/dietlibc/libugly/getprotoent.c130
-rw-r--r--mdk-stage1/dietlibc/libugly/gmtime_r.c6
-rw-r--r--mdk-stage1/dietlibc/libugly/isleap.c2
-rw-r--r--mdk-stage1/dietlibc/libugly/localtime_r.c8
-rw-r--r--mdk-stage1/dietlibc/libugly/logging.c38
-rw-r--r--mdk-stage1/dietlibc/libugly/mktime.c68
-rw-r--r--mdk-stage1/dietlibc/libugly/popen.c28
-rw-r--r--mdk-stage1/dietlibc/libugly/setenv.c12
-rw-r--r--mdk-stage1/dietlibc/libugly/strftime.c284
-rw-r--r--mdk-stage1/dietlibc/libugly/strsignal.c92
-rw-r--r--mdk-stage1/dietlibc/libugly/system.c36
-rw-r--r--mdk-stage1/dietlibc/libugly/time_table_spd.c5
-rw-r--r--mdk-stage1/dietlibc/libugly/tzfile.c37
16 files changed, 280 insertions, 488 deletions
diff --git a/mdk-stage1/dietlibc/libugly/asctime_r.c b/mdk-stage1/dietlibc/libugly/asctime_r.c
index 46325927c..43c5e2cb2 100644
--- a/mdk-stage1/dietlibc/libugly/asctime_r.c
+++ b/mdk-stage1/dietlibc/libugly/asctime_r.c
@@ -16,7 +16,7 @@ char *asctime_r(const struct tm *t, char *buf) {
if (buf[8]=='0') buf[8]=' ';
buf[10]=' ';
num2str(buf+11,t->tm_hour);
- if (buf[11]=='0') buf[11]=' ';
+// if (buf[11]=='0') buf[11]=' ';
buf[13]=':';
num2str(buf+14,t->tm_min);
buf[16]=':';
diff --git a/mdk-stage1/dietlibc/libugly/asprintf.c b/mdk-stage1/dietlibc/libugly/asprintf.c
index d10c20b4a..9db1f67c7 100644
--- a/mdk-stage1/dietlibc/libugly/asprintf.c
+++ b/mdk-stage1/dietlibc/libugly/asprintf.c
@@ -1,21 +1,18 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <stdlib.h>
+#include <stdio.h>
#include "dietwarning.h"
-extern int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
int asprintf(char **s, const char *format,...)
{
int n;
va_list arg_ptr;
va_start(arg_ptr, format);
n=vsnprintf(0,1000000,format,arg_ptr);
- va_end (arg_ptr);
va_start (arg_ptr, format);
- if ((*s=malloc(n+2))) {
+ if ((*s=malloc(n+1))) {
n=vsnprintf(*s,n+1,format,arg_ptr);
- va_end(arg_ptr);
return n;
}
return -1;
diff --git a/mdk-stage1/dietlibc/libugly/getmntent.c b/mdk-stage1/dietlibc/libugly/getmntent.c
index 250a77b7f..1a1bdca24 100644
--- a/mdk-stage1/dietlibc/libugly/getmntent.c
+++ b/mdk-stage1/dietlibc/libugly/getmntent.c
@@ -5,11 +5,11 @@
struct mntent *getmntent(FILE *filep) {
static struct mntent m;
- char buf[1024];
+ static char buf[1024];
do {
char *tmp=buf;
int num;
- fgets(buf,1024,filep);
+ if (!fgets(buf,1024,filep)) return 0;
/* "/dev/ide/host0/bus0/target0/lun0/part2 / reiserfs defaults 1 1" */
for (num=0; num<6; ++num) {
switch (num) {
@@ -17,12 +17,13 @@ struct mntent *getmntent(FILE *filep) {
case 1: m.mnt_dir=tmp; break;
case 2: m.mnt_type=tmp; break;
case 3: m.mnt_opts=tmp; break;
- case 4: m.mnt_freq=strtol(tmp,&tmp,0); if (*tmp!=' ') continue; break;
+ case 4: m.mnt_freq=strtol(tmp,&tmp,0); if (*tmp!=' ' && *tmp!='\t') continue; break;
case 5: m.mnt_passno=strtol(tmp,&tmp,0); if (*tmp=='\n') return &m; break;
}
- if ((tmp=strchr(tmp,' '))) {
+ while (*tmp && *tmp!=' ' && *tmp!='\n' && *tmp!='\t') ++tmp;
+ if (*tmp) {
if (num<4) *tmp++=0;
- while (*tmp==' ') ++tmp;
+ while (*tmp==' ' || *tmp=='\t') ++tmp;
} else
continue;
}
diff --git a/mdk-stage1/dietlibc/libugly/getprotoent.c b/mdk-stage1/dietlibc/libugly/getprotoent.c
index a648e2307..3f0fd4d41 100644
--- a/mdk-stage1/dietlibc/libugly/getprotoent.c
+++ b/mdk-stage1/dietlibc/libugly/getprotoent.c
@@ -1,130 +1,10 @@
-#include <unistd.h>
-#include <fcntl.h>
#include <netdb.h>
-#include <sys/mman.h>
-#include <errno.h>
-#include <netinet/in.h>
-#include <string.h>
-#include <ctype.h>
-static int protofd=-1;
-static char* protomap;
-static unsigned int protolen;
+extern struct protoent __protoent_pw;
+extern char __protoent_buf[1000];
-static char* aliases[10];
-
-static char *cur;
-
-/* ip 0 IP # internet protocol, pseudo protocol number */
struct protoent *getprotoent(void) {
- static struct protoent pe;
- char *last;
- int aliasidx;
- if (protofd<0) {
- protofd=open(_PATH_SERVICES,O_RDONLY);
- if (protofd<0) return 0;
- protolen=lseek(protofd,0,SEEK_END);
- protomap=mmap(0,protolen,PROT_READ|PROT_WRITE,MAP_PRIVATE,protofd,0);
- if ((long)protomap==(-1)) goto error;
- cur=protomap;
- }
- last=protomap+protolen;
-again:
- pe.p_name=0;
- pe.p_aliases=aliases; aliases[0]=0;
- pe.p_proto=0;
- if (cur>=last) return 0;
- if (*cur=='#' || *cur=='\n') goto parseerror;
- /* first, the primary name */
- if (!isalpha(*cur)) goto parseerror;
- pe.p_name=cur;
- pe.p_aliases=aliases;
- while (cur<last && isalnum(*cur)) cur++;
- if (cur>=last) return 0;
- if (*cur=='\n') goto parseerror;
- *cur=0; cur++;
- /* second, the protocol number */
- while (cur<last && isblank(*cur)) cur++;
- while (cur<last && isdigit(*cur)) {
- pe.p_proto=pe.p_proto*10+*cur-'0';
- cur++;
- }
-/* pe.p_proto=htons(pe.s_proto); */
- if (cur>=last) return 0;
- if (*cur=='\n') { *cur++=0; return &pe; }
- *cur=0; cur++;
- /* now the aliases */
- for (aliasidx=0;aliasidx<10;++aliasidx) {
- while (cur<last && isblank(*cur)) ++cur;
- aliases[aliasidx]=cur;
- while (cur<last && isalpha(*cur)) ++cur;
- if (*cur=='\n') { *cur++=0; ++aliasidx; break; }
- if (cur>=last || !isblank(*cur)) break;
- *cur++=0;
- }
- aliases[aliasidx]=0;
- return &pe;
-parseerror:
- while (cur<last && *cur!='\n') cur++;
- cur++;
- goto again;
-error:
- if (protomap!=(char*)-1) munmap(protomap,protolen);
- if (protofd!=-1) close(protofd);
- protomap=(char*)-1;
- protofd=-1;
- errno=ENOMEM;
- return 0;
-}
-
-void setprotoent(int stayopen) {
- cur=protomap;
-}
-
-struct protoent *getprotobyname(const char *name) {
- struct protoent *s;
- setprotoent(0);
- for (s=getprotoent(); s; s=getprotoent()) {
- char **tmp;
-#if 0
- write(1,"found ",6);
- write(1,s->p_name,strlen(s->p_name));
- write(1,"/",1);
- write(1,s->p_proto,strlen(s->p_proto));
- write(1,"\n",1);
- if (!strcmp(name,"auth")) {
- tmp=s->p_aliases;
- write(1," aka ",5);
- while (*tmp) {
- write(1,*tmp,strlen(*tmp));
- write(1,", ",2);
- ++tmp;
- }
- write(1,"\n",1);
- }
-#endif
- if (!strcmp(name,s->p_name))
- return s;
- tmp=s->p_aliases;
- while (*tmp)
- if (!strcmp(name,*tmp++)) return s;
- }
- return 0;
+ struct protoent* tmp;
+ getprotoent_r(&__protoent_pw,__protoent_buf,sizeof(__protoent_buf),&tmp);
+ return tmp;
}
-
-struct protoent *getprotobynumber(int proto) {
- struct protoent *s;
- for (s=getprotoent(); s; s=getprotoent()) {
- if (proto==s->p_proto)
- return s;
- }
- return 0;
-}
-
-void endprotoent(void) {
- if (protomap!=(char*)-1) munmap(protomap,protolen);
- if (protofd!=-1) close(protofd);
- protomap=(char*)-1;
- protofd=-1;
-}
-
diff --git a/mdk-stage1/dietlibc/libugly/gmtime_r.c b/mdk-stage1/dietlibc/libugly/gmtime_r.c
index c102d10fa..6bc0bb5b2 100644
--- a/mdk-stage1/dietlibc/libugly/gmtime_r.c
+++ b/mdk-stage1/dietlibc/libugly/gmtime_r.c
@@ -3,7 +3,7 @@
/* seconds per day */
#define SPD 24*60*60
-extern unsigned int __spm[];
+extern short __spm[];
struct tm *gmtime_r(const time_t *timep, struct tm *r) {
time_t i;
@@ -14,7 +14,7 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r) {
r->tm_wday=(4+work)%7;
for (i=1970; ; ++i) {
register time_t k=__isleap(i)?366:365;
- if (work>k)
+ if (work>=k)
work-=k;
else
break;
@@ -28,7 +28,7 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r) {
work-=1;
}
- for (i=11; i && __spm[i]>work; --i) ;
+ for (i=11; i && (__spm[i]>work); --i) ;
r->tm_mon=i;
r->tm_mday+=work-__spm[i];
return r;
diff --git a/mdk-stage1/dietlibc/libugly/isleap.c b/mdk-stage1/dietlibc/libugly/isleap.c
index dcfa1ced6..d83712792 100644
--- a/mdk-stage1/dietlibc/libugly/isleap.c
+++ b/mdk-stage1/dietlibc/libugly/isleap.c
@@ -1,3 +1,5 @@
+#include <time.h>
+
int __isleap(int year) {
/* every fourth year is a leap year except for century years that are
* not divisible by 400. */
diff --git a/mdk-stage1/dietlibc/libugly/localtime_r.c b/mdk-stage1/dietlibc/libugly/localtime_r.c
index d4bc073ce..5d420303c 100644
--- a/mdk-stage1/dietlibc/libugly/localtime_r.c
+++ b/mdk-stage1/dietlibc/libugly/localtime_r.c
@@ -3,8 +3,11 @@
#include <sys/time.h>
#ifdef WANT_TZFILE_PARSER
-extern void __maplocaltime();
+extern void __maplocaltime(void);
extern time_t __tzfile_map(time_t t, int *isdst);
+#else
+extern long int timezone;
+extern int daylight;
#endif
struct tm* localtime_r(const time_t* t, struct tm* r) {
@@ -15,7 +18,8 @@ struct tm* localtime_r(const time_t* t, struct tm* r) {
#else
struct timezone tz;
gettimeofday(0, &tz);
- tmp=*t-tz.tz_minuteswest*60L;
+ timezone=tz.tz_minuteswest*60L;
+ tmp=*t+timezone;
#endif
return gmtime_r(&tmp,r);
}
diff --git a/mdk-stage1/dietlibc/libugly/logging.c b/mdk-stage1/dietlibc/libugly/logging.c
index 69c2c2337..680a1f850 100644
--- a/mdk-stage1/dietlibc/libugly/logging.c
+++ b/mdk-stage1/dietlibc/libugly/logging.c
@@ -1,3 +1,4 @@
+#include <errno.h>
#include "dietfeatures.h"
#include <stdio.h>
@@ -5,7 +6,6 @@
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
-#include <asm/socket.h>
#include <fcntl.h>
#include <syslog.h>
#include <string.h>
@@ -14,9 +14,9 @@
#include <signal.h>
#define _PATH_CONSOLE "/dev/console"
-#define BUF_SIZE 512 /* messagebuffer size (>= 200) */
+#define BUF_SIZE 2048 /* messagebuffer size (>= 200) */
-#define MAX_LOGTAG 80
+#define MAX_LOGTAG 1000
/* those have to be global *sigh* */
static volatile int connected = 0; /* have done connect */
@@ -37,13 +37,15 @@ static void closelog_intern(void)
connected = 0;
}
-void closelog(void)
+void __libc_closelog(void);
+void __libc_closelog(void)
{
closelog_intern();
LogTag[0]=0;
LogType = SOCK_DGRAM;
}
+void closelog(void) __attribute__((weak,alias("__libc_closelog")));
static void openlog_intern(int option, int facility)
{
@@ -63,27 +65,15 @@ static void openlog_intern(int option, int facility)
}
}
if ((LogFile != -1) && !connected) {
-#ifdef WANT_THREAD_SAFE
- int old_errno = (*(__errno_location()));
-#else
int old_errno=errno;
-#endif
if(connect(LogFile, &SyslogAddr, sizeof(SyslogAddr)) == -1) {
-#ifdef WANT_THREAD_SAFE
- int saved_errno = (*(__errno_location()));
-#else
int saved_errno=errno;
-#endif
close(LogFile);
LogFile = -1;
if((LogType == SOCK_DGRAM) && (saved_errno == EPROTOTYPE)) {
/* retry with SOCK_STREAM instead of SOCK_DGRAM */
LogType = SOCK_STREAM;
-#ifdef WANT_THREAD_SAFE
- (*(__errno_location()))=old_errno;
-#else
errno=old_errno;
-#endif
continue;
}
}
@@ -94,7 +84,8 @@ static void openlog_intern(int option, int facility)
}
/* has to be secured against multiple, simultanious call's in threaded environment */
-void openlog(const char *ident, int option, int facility)
+void __libc_openlog(const char *ident, int option, int facility);
+void __libc_openlog(const char *ident, int option, int facility)
{
if (ident) {
strncpy(LogTag,ident,MAX_LOGTAG);
@@ -102,6 +93,7 @@ void openlog(const char *ident, int option, int facility)
}
openlog_intern(option, facility);
}
+void openlog(const char *ident, int option, int facility) __attribute__((weak,alias("__libc_openlog")));
int setlogmask(int mask)
{
@@ -110,7 +102,8 @@ int setlogmask(int mask)
return old;
}
-void vsyslog(int priority, const char *format, va_list arg_ptr)
+void __libc_vsyslog(int priority, const char *format, va_list arg_ptr);
+void __libc_vsyslog(int priority, const char *format, va_list arg_ptr)
{
char buffer[BUF_SIZE];
char time_buf[20];
@@ -122,11 +115,7 @@ void vsyslog(int priority, const char *format, va_list arg_ptr)
int sigpipe;
struct sigaction action, oldaction;
struct sigaction *oldaction_ptr = NULL;
-#ifdef WANT_THREAD_SAFE
- int saved_errno = (*(__errno_location()));
-#else
int saved_errno = errno;
-#endif
/* check for invalid priority/facility bits */
if (priority & ~(LOG_PRIMASK|LOG_FACMASK)) {
@@ -156,11 +145,7 @@ void vsyslog(int priority, const char *format, va_list arg_ptr)
buflen = 41;
}
else {
-#ifdef WANT_THREAD_SAFE
- (*(__errno_location()))=saved_errno;
-#else
errno=saved_errno;
-#endif
buflen = vsnprintf(buffer+headerlen, BUF_SIZE - headerlen, format, arg_ptr);
}
if (LogStat & LOG_PERROR) {
@@ -201,6 +186,7 @@ void vsyslog(int priority, const char *format, va_list arg_ptr)
if (sigpipe == 0)
sigaction(SIGPIPE, &oldaction, (struct sigaction *) NULL);
}
+void vsyslog(int priority, const char *format, va_list arg_ptr) __attribute__((weak,alias("__libc_vsyslog")));
void syslog(int priority, const char *format, ...)
{
diff --git a/mdk-stage1/dietlibc/libugly/mktime.c b/mdk-stage1/dietlibc/libugly/mktime.c
index ee4dab6c1..348068e1d 100644
--- a/mdk-stage1/dietlibc/libugly/mktime.c
+++ b/mdk-stage1/dietlibc/libugly/mktime.c
@@ -1,21 +1,53 @@
#include <time.h>
-/* seconds per day */
-#define SPD 24*60*60
-
-extern unsigned int __spm[];
-
-time_t mktime(struct tm *t) {
- time_t x=0;
- unsigned int i;
- if (t->tm_year<70) return (time_t)(-1);
- for (i=70; i<t->tm_year; ++i) {
- x+=__isleap(i+1900)?366:365;
- }
- t->tm_yday=__spm[t->tm_mon] + t->tm_mday-1 + ((t->tm_mon>2) && __isleap(t->tm_year)?1:0);
- x+=t->tm_yday;
- /* x is now the number of days since Jan 1 1970 */
- t->tm_wday=(4+x)%7;
- x = x*SPD + t->tm_hour*60*60 + t->tm_min*60 + t->tm_sec;
- return x;
+extern const short __spm [];
+
+time_t mktime ( register struct tm* const t )
+{
+ register time_t day;
+ register time_t i;
+
+ if ( t->tm_year < 70 )
+ return (time_t) -1;
+
+ day = t->tm_yday = __spm [t->tm_mon] + t->tm_mday-1 + ( __isleap (t->tm_year+1900) & (t->tm_mon > 1) );
+
+ for ( i = 70; i < t->tm_year; i++ )
+ day += 365 + __isleap (i+1900);
+
+ /* day is now the number of days since 'Jan 1 1970' */
+ i = 7;
+ t->tm_wday = (day + 4) % i; /* Sunday=0, Monday=1, ..., Saturday=6 */
+
+ i = 24;
+ day *= i;
+ i = 60;
+ return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
+}
+
+#if 0
+
+#include <math.h>
+
+main()
+{
+ int i, j, k;
+ static char *s[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
+
+ for (i=70; i<200; i++)
+ for (j=0; j<12; j++)
+ for (k=1; k<=31; k++) {
+ struct tm t;
+ double x;
+ t.tm_year = i;
+ t.tm_mon = j;
+ t.tm_mday = k;
+ t.tm_hour = 0;
+ t.tm_min = 0;
+ t.tm_sec = 0;
+ x = mktime (&t);
+ printf ("%4d.%5.0f %2u.%02u.%04u %s\n", (int)floor(x/86400), x-86400.*(int)floor(x/86400), k, j+1, 1900+i, s[t.tm_wday] );
+ }
+
}
+#endif
diff --git a/mdk-stage1/dietlibc/libugly/popen.c b/mdk-stage1/dietlibc/libugly/popen.c
index e0e441495..aa9a2cde0 100644
--- a/mdk-stage1/dietlibc/libugly/popen.c
+++ b/mdk-stage1/dietlibc/libugly/popen.c
@@ -1,32 +1,38 @@
#include "dietstdio.h"
#include <unistd.h>
+#include <fcntl.h>
+#include "binshstr.h"
extern char **environ;
FILE *popen(const char *command, const char *type) {
int pfd[2];
int fd0;
+ FILE* f;
pid_t pid;
+
if (pipe(pfd)<0) return 0;
fd0=(*type=='r');
- if ((pid=vfork())<0) {
+ if (!(f=fdopen(pfd[!fd0],type))) {
+ close(pfd[0]); /* malloc failed */
+ close(pfd[1]);
+ return 0;
+ }
+ if ((pid=fork())<0) {
close(pfd[0]);
close(pfd[1]);
return 0;
}
if (!pid) { /* child */
- char *argv[]={"sh","-c",0,0};
+ const char *argv[]={__sh,"-c",0,0};
close(pfd[!fd0]); close(fd0);
dup2(pfd[fd0],fd0); close(pfd[fd0]);
- argv[2]=(char*)command;
- execve("/bin/sh",argv,environ);
- _exit(255);
+ argv[2]=command;
+ execve(__binsh,(char*const*)argv,environ);
+ _exit(127);
}
close(pfd[fd0]);
- {
- register FILE* f;
- if ((f=fdopen(pfd[!fd0],type)))
- f->popen_kludge=pid;
- return f;
- }
+ fcntl (pfd[!fd0], F_SETFD, FD_CLOEXEC);
+ f->popen_kludge=pid;
+ return f;
}
diff --git a/mdk-stage1/dietlibc/libugly/setenv.c b/mdk-stage1/dietlibc/libugly/setenv.c
index bf47cdb79..c65910471 100644
--- a/mdk-stage1/dietlibc/libugly/setenv.c
+++ b/mdk-stage1/dietlibc/libugly/setenv.c
@@ -5,13 +5,15 @@
link_warning("setenv","setenv calls malloc. Avoid it in small programs.");
int setenv(const char *name, const char *value, int overwrite) {
- char *c=malloc(strlen(name)+strlen(value)+3);
if (getenv(name)) {
if (!overwrite) return 0;
unsetenv(name);
}
- strcpy(c,name);
- strcat(c,"=");
- strcat(c,value);
- return putenv(c);
+ {
+ char *c=malloc(strlen(name)+strlen(value)+3);
+ strcpy(c,name);
+ strcat(c,"=");
+ strcat(c,value);
+ return putenv(c);
+ }
}
diff --git a/mdk-stage1/dietlibc/libugly/strftime.c b/mdk-stage1/dietlibc/libugly/strftime.c
index b7e750ab1..365d0c84f 100644
--- a/mdk-stage1/dietlibc/libugly/strftime.c
+++ b/mdk-stage1/dietlibc/libugly/strftime.c
@@ -1,182 +1,118 @@
#include <sys/types.h>
#include <time.h>
-
-static char *sweekdays[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
-static char *weekdays[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
-static char *smonths[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
-static char *months[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
-static char *ampm[]={"am","pm","AM","PM"};
-
-static int i2a(char* dest,unsigned int x) {
- register unsigned int tmp=x;
- register int len=0;
- *dest++=tmp/10+'0'; tmp=tmp%10; ++len;
- *dest++=tmp+'0';
- return 2;
+#include "dietfeatures.h"
+
+static const char sweekdays [7] [4] = {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+};
+static const char weekdays [7] [10] = {
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
+};
+static const char smonths [12] [4] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+static const char* months [12] = {
+ "January", "February", "March", "April", smonths[5-1], "June",
+ "July", "August", "September", "October", "November", "December"
+};
+static const char ampm [4] [3] = {
+ "am", "pm",
+ "AM", "PM"
+};
+
+static int i2a ( char* dest,unsigned int x )
+{
+ int div = 10;
+ *dest++ = x/div + '0';
+ *dest++ = x%div + '0';
+ *dest++ = '\0';
+ return 2;
}
-static int i2as(char* dest,unsigned int x) {
- int len=i2a(dest,x);
- if (*dest=='0') *dest=' ';
- return len;
-}
-
-size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) {
- char *t=s;
- const char *src;
- char buf[5];
- while (*format) {
- switch (*format) {
- case 0: break;
- case '%':
- switch (*++format) {
- case '%': *t='%'; ++t; break;
- case 'a': src=sweekdays[tm->tm_wday]; goto append;
- case 'A': src=weekdays[tm->tm_wday]; goto append;
- case 'h':
- case 'b': src=smonths[tm->tm_mon]; goto append;
- case 'B': src=months[tm->tm_mon]; goto append;
- case 'c': t+=strftime(t,max-(t-s),"%b %a %d %k:%M:%S %Z %Y",tm); break;
- case 'C': buf[i2a(buf,(tm->tm_year+1900)/100)]=0; src=buf; goto append;
- case 'd': buf[i2a(buf,tm->tm_mday)]=0; src=buf; goto append;
- case 'e': buf[i2as(buf,tm->tm_mday)]=0; src=buf; goto append;
- case 'H': buf[i2a(buf,tm->tm_hour)]=0; src=buf; goto append;
- case 'I': buf[i2a(buf,tm->tm_hour%12)]=0; src=buf; goto append;
- case 'j': buf[i2a(buf,tm->tm_yday)]=0; src=buf; goto append;
- case 'k': buf[i2as(buf,tm->tm_hour)]=0; src=buf; goto append;
- case 'l': buf[i2as(buf,tm->tm_hour%12)]=0; src=buf; goto append;
- case 'm': buf[i2a(buf,tm->tm_mon+1)]=0; src=buf; goto append;
- case 'M': buf[i2a(buf,tm->tm_min)]=0; src=buf; goto append;
- case 'n': *t='\n'; break;
- case 'p': src=ampm[tm->tm_hour>11?3:2]; goto append;
- case 'P': src=ampm[tm->tm_hour>11?1:0]; goto append;
- case 'r': t+=strftime(t,max-(t-s),"%I:%M:%S %p",tm); break;
- case 'R': t+=strftime(t,max-(t-s),"%H:%M",tm); break;
- case 'S': buf[i2a(buf,tm->tm_sec)]=0; src=buf; goto append;
- case 't': *t='\t'; break;
- case 'T': t+=strftime(t,max-(t-s),"%H:%M:%S",tm); break;
- case 'u': buf[i2a(buf,tm->tm_wday?tm->tm_wday:7)]=0; src=buf; goto append;
- case 'w': buf[i2a(buf,tm->tm_wday)]=0; src=buf; goto append;
- case 'x': t+=strftime(t,max-(t-s),"%b %a %d",tm); break;
- case 'X': t+=strftime(t,max-(t-s),"%k:%M:%S",tm); break;
- case 'y': buf[i2a(buf,tm->tm_year%100)]=0; src=buf; goto append;
- case 'Y': i2a(buf,(tm->tm_year+1900)/100); buf[i2a(buf+2,(tm->tm_year%100))+2]=0; src=buf; goto append;
- case 'Z': src="GMT"; goto append; /* hehe */
-append:
- while (*src && t<s+max) { *t=*src; ++t; ++src; }
- };
- break;
- default:
- *t=*format; ++t;
+size_t strftime ( char* dst, size_t max, const char* format, const struct tm* tm )
+{
+ char* p = dst;
+ const char* src;
+ unsigned int no;
+ char buf [5];
+
+
+ for ( ; *format != '\0'; format++ ) {
+ if (*format == '%') {
+ if (*++format == '%') {
+ *p++ = '%';
+ }
+ else
+again:
+ switch (*format) {
+// case '%': *p++ = '%'; break; // reduce size of jump table
+ case 'n': *p++ = '\n'; break;
+ case 't': *p++ = '\t'; break;
+ case 'O': case 'E': ++format; goto again;
+ case 'c': src = "%b %a %d %k:%M:%S %Z %Y"; goto _strf;
+ case 'r': src = "%I:%M:%S %p"; goto _strf;
+ case 'R': src = "%H:%M"; goto _strf;
+ case 'x': src = "%b %a %d"; goto _strf;
+ case 'X': src = "%k:%M:%S"; goto _strf;
+ case 'D': src = "%m/%d/%y"; goto _strf;
+ case 'T': src = "%H:%M:%S";
+ _strf: p += strftime (p, (size_t)(dst+max-p), src, tm); break;
+ case 'a': src = sweekdays [tm->tm_wday]; goto _str;
+ case 'A': src = weekdays [tm->tm_wday]; goto _str;
+ case 'h':
+ case 'b': src = smonths [tm->tm_mon]; goto _str;
+ case 'B': src = months [tm->tm_mon]; goto _str;
+ case 'p': src = ampm [tm->tm_hour > 12 ? 3 : 2]; goto _str;
+ case 'P': src = ampm [tm->tm_hour > 12 ? 1 : 0]; goto _str;
+ case 'C': no = tm->tm_year/100 + 19; goto _no;
+ case 'd': no = tm->tm_mday; goto _no;
+ case 'e': no = tm->tm_mday; goto _nos;
+ case 'H': no = tm->tm_hour; goto _no;
+ case 'I': no = tm->tm_hour % 12; goto _no;
+ case 'j': no = tm->tm_yday; goto _no;
+ case 'k': no = tm->tm_hour; goto _nos;
+ case 'l': no = tm->tm_hour % 12; goto _nos;
+ case 'm': no = tm->tm_mon + 1; goto _no;
+ case 'M': no = tm->tm_min; goto _no;
+ case 'S': no = tm->tm_sec; goto _no;
+ case 'u': no = tm->tm_wday ? tm->tm_wday : 7; goto _no;
+ case 'w': no = tm->tm_wday; goto _no;
+ case 'U': no = (tm->tm_yday - tm->tm_wday + 7) / 7; goto _no;
+ case 'W': no = (tm->tm_yday - (tm->tm_wday - 1 + 7) % 7 + 7) / 7; goto _no;
+ case 'Z':
+#ifdef WANT_TZFILE_PARSER
+ tzset(); src = tzname[0];
+#else
+ src = "[unknown timezone]";
+#endif
+ goto _str;
+ case 'Y': i2a ( buf+0, (unsigned int)(tm->tm_year / 100 + 19) );
+ i2a ( buf+2, (unsigned int)(tm->tm_year % 100) );
+ src = buf;
+ goto _str;
+ case 'y': no = tm->tm_year % 100; goto _no;
+ _no: i2a ( buf, no ); /* append number 'no' */
+ src = buf;
+ goto _str;
+ _nos: i2a ( buf, no ); /* the same, but '0'->' ' */
+ if (buf[0] == '0')
+ buf[0] = ' ';
+ src = buf;
+ _str: while (*src && p < dst+max) /* append string */
+ *p++ = *src++;
+ break;
+ };
+ } else {
+ *p++ = *format;
+ }
+
+ if (p >= dst+max)
+ break;
}
- ++format;
- if (t>=s+max) break;
- continue;
- }
- *t=0; return t-s;
+
+ *p = '\0';
+ return p - dst;
}
-
-/*
- %u The day of the week as a decimal, range 1 to 7,
- Monday being 1. See also %w. (SU)
-
- %U The week number of the current year as a decimal
- number, range 00 to 53, starting with the first
- Sunday as the first day of week 01. See also %V and
- %W.
-
- %V The ISO 8601:1988 week number of the current year
- as a decimal number, range 01 to 53, where week 1
- is the first week that has at least 4 days in the
- current year, and with Monday as the first day of
- the week. See also %U and %W. (SU)
-
- %w The day of the week as a decimal, range 0 to 6,
- Sunday being 0. See also %u.
-
- %W The week number of the current year as a decimal
- number, range 00 to 53, starting with the first
- Monday as the first day of week 01.
-
- %x The preferred date representation for the current
- locale without the time.
-
- %X The preferred time representation for the current
- locale without the date.
-
- %y The year as a decimal number without a century
- (range 00 to 99).
-
- %Y The year as a decimal number including the century.
-
- %z The time-zone as hour offset from GMT. Required to
- emit RFC822-conformant dates (using "%a, %d %b %Y
- %H:%M:%S %z"). (GNU)
-
- %Z The time zone or name or abbreviation.
-
- %+ The date and time in date(1) format. (TZ)
-
- %% A literal `%' character.
-
- Some conversion specifiers can be modified by preceding
- them by the E or O modifier to indicate that an alterna­
- tive format should be used. If the alternative format or
- specification does not exist for the current locale, the
- behaviour will be as if the unmodified conversion specifi­
- cation were used. (SU) The Single Unix Specification men­
- tions %Ec, %EC, %Ex, %EX, %Ry, %EY, %Od, %Oe, %OH, %OI,
- %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, where the
- effect of the O modifier is to use alternative numeric
- symbols (say, roman numerals), and that of the E modifier
-
-
-
-GNU 29 March 1999 3
-
-
-
-
-
-STRFTIME(3) Linux Programmer's Manual STRFTIME(3)
-
-
- is to use a locale-dependent alternative representation.
-
- The broken-down time structure tm is defined in <time.h>.
- See also ctime(3).
-
-
-RETURN VALUE
- The strftime() function returns the number of characters
- placed in the array s, not including the terminating NUL
- character, provided the string, including the terminating
- NUL, fits. Otherwise, it returns 0, and the contents of
- the array is undefined. (Thus at least since libc 4.4.4;
- very old versions of libc, such as libc 4.4.1, would
- return max if the array was too small.)
-
- Note that the return value 0 does not necessarily indicate
- an error; for example, in many locales %p yields an empty
- string.
-
-ENVIRONMENT
- The environment variables TZ and LC_TIME are used.
-
-CONFORMING TO
- ANSI C, SVID 3, ISO 9899. There are strict inclusions
- between the set of conversions given in ANSI C (unmarked),
- those given in the Single Unix Specification (marked SU),
- those given in Olson's timezone package (marked TZ), and
- those given in glibc (marked GNU), except that %+ is not
- supported in glibc2. On the other hand glibc2 has several
- more extensions. POSIX.1 only refers to ANSI C; POSIX.2
- describes under date(1) several extensions that could
- apply to strftime as well.
-
-SEE ALSO
- date(1), time(2), ctime(3), setlocale(3), sprintf(3)
-
-*/
diff --git a/mdk-stage1/dietlibc/libugly/strsignal.c b/mdk-stage1/dietlibc/libugly/strsignal.c
index 54314d2c7..d72777571 100644
--- a/mdk-stage1/dietlibc/libugly/strsignal.c
+++ b/mdk-stage1/dietlibc/libugly/strsignal.c
@@ -1,92 +1,10 @@
+#define _GNU_SOURCE
+#include <string.h>
#include <signal.h>
-/* F....ng Kernel haeder is damn broken... */
-#ifndef _NSIG
-#define _NSIG 64
-#endif
-#include <asm/signal.h>
-char * strsignal(int sig) {
- if (sig==SIGHUP)
- return "Hangup";
- else if (sig==SIGINT)
- return "Interrupt";
- else if (sig==SIGQUIT)
- return "Quit";
- else if (sig==SIGILL)
- return "Illegal instruction";
- else if (sig==SIGTRAP)
- return "Trace/breakpoint trap";
- else if (sig==SIGABRT)
- return "Aborted";
- else if (sig==SIGFPE)
- return "Floating point exception";
- else if (sig==SIGKILL)
- return "Killed";
- else if (sig==SIGBUS)
- return "Bus error";
- else if (sig==SIGSEGV)
- return "Segmentation fault";
- else if (sig==SIGPIPE)
- return "Broken pipe";
- else if (sig==SIGALRM)
- return "Alarm clock";
- else if (sig==SIGTERM)
- return "Terminated";
- else if (sig==SIGURG)
- return "Urgent I/O condition";
- else if (sig==SIGSTOP)
- return "Stopped (signal)";
- else if (sig==SIGTSTP)
- return "Stopped";
- else if (sig==SIGCONT)
- return "Continue";
- else if (sig==SIGCHLD)
- return "Child exited";
- else if (sig==SIGTTIN)
- return "Stopped (tty input)";
- else if (sig==SIGTTOU)
- return "Stopped (tty output)";
- else if (sig==SIGIO)
- return "I/O possible";
- else if (sig==SIGXCPU)
- return "CPU time limit exceeded";
- else if (sig==SIGXFSZ)
- return "File size limit exceeded";
- else if (sig==SIGVTALRM)
- return "Virtual timer expired";
- else if (sig==SIGPROF)
- return "Profiling timer expired";
- else if (sig==SIGWINCH)
- return "Window changed";
- else if (sig==SIGUSR1)
- return "User defined signal 1";
- else if (sig==SIGUSR2)
- return "User defined signal 1";
-#ifdef SIGEMT
- else if (sig==SIGEMT)
- return "EMT trap";
-#endif
-#ifdef SIGSYS
- else if (sig==SIGSYS)
- return "Bad system call";
-#endif
-#ifdef SIGSTKFLT
- else if (sig==SIGSTKFLT)
- return "Stack fault";
-#endif
-#ifdef SIGINFO
- else if (sig==SIGINFO)
- return "Information request";
-#elif defined(SIGPWR) && (!defined(SIGLOST) || (SIGPWR!=SIGLOST))
- else if (sig==SIGPWR)
- return "Power falure";
-#endif
-#ifdef SIGLOST
- else if (sig==SIGLOST)
- return "Resource lost";
-#endif
- else if ((sig>=SIGRTMIN)&&(sig<=SIGRTMAX))
- return "Real time signal";
+const char* strsignal(int sig) {
+ if (sig<=SIGRTMAX)
+ return sys_siglist[sig];
else
return "(unknown signal)";
}
diff --git a/mdk-stage1/dietlibc/libugly/system.c b/mdk-stage1/dietlibc/libugly/system.c
index b9eea20eb..714aad056 100644
--- a/mdk-stage1/dietlibc/libugly/system.c
+++ b/mdk-stage1/dietlibc/libugly/system.c
@@ -1,23 +1,19 @@
#include <signal.h>
-#include <asm/errno.h>
#include <errno.h>
#include <unistd.h>
+#include <sys/wait.h>
#include "dietwarning.h"
-
-#define SHELL_PATH "/bin/sh" /* Path of the shell. */
-#define SHELL_NAME "sh" /* Name to give it. */
+#include "dietfeatures.h"
+#include "binshstr.h"
extern char **environ;
-int __libc_fork();
-int __libc_waitpid(int pid, int *status, int options);
-int execve(const char*filename, char *const argv[], char *const envp[]);
-void __set_errno(int errno);
-int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
+int __libc_system (const char *line);
int __libc_system (const char *line)
{
struct sigaction sa, intr, quit;
+ sigset_t block,omask;
int save,pid,ret=-1;
if (line == 0) return __libc_system("exit 0") == 0;
@@ -29,38 +25,48 @@ int __libc_system (const char *line)
if (sigaction(SIGINT, &sa, &intr)<0) return -1;
if (sigaction(SIGQUIT, &sa, &quit)<0) {
save = errno;
+undo:
sigaction (SIGINT, &intr, (struct sigaction*)0);
- __set_errno (save);
+ errno=save;
return -1;
}
+ sigemptyset(&block);
+ sigaddset(&block,SIGCHLD);
+ if (sigprocmask(SIG_BLOCK,&block,&omask)<0) {
+ save=errno;
+ sigaction (SIGQUIT, &quit, (struct sigaction*)0);
+ goto undo;
+ }
- pid=__libc_fork();
+ pid=fork();
if (pid>0)
{ /* parent */
int n;
do
- n=__libc_waitpid(pid, &ret, 0);
+ n=waitpid(pid, &ret, 0);
while ((n==-1) && (errno==EINTR));
if (n!=pid) ret=-1;
}
else if (!pid)
{ /* child */
const char *nargs[4];
- nargs[0] = SHELL_NAME;
+ nargs[0] = __sh;
nargs[1] = "-c";
nargs[2] = line;
nargs[3] = 0;
sigaction(SIGINT, &intr, (struct sigaction*)0);
sigaction(SIGQUIT, &quit, (struct sigaction*)0);
+ sigprocmask(SIG_SETMASK,&omask,0);
- execve(SHELL_PATH,(char *const *)nargs, environ);
+ execve(__binsh,(char *const *)nargs, environ);
_exit(127);
}
save = errno;
sigaction (SIGINT, &intr, (struct sigaction *)0);
sigaction (SIGQUIT, &quit, (struct sigaction *)0);
- __set_errno(save);
+ sigprocmask(SIG_SETMASK,&omask,0);
+ errno=save;
return ret;
}
diff --git a/mdk-stage1/dietlibc/libugly/time_table_spd.c b/mdk-stage1/dietlibc/libugly/time_table_spd.c
index bfe1cf86d..6850d76c4 100644
--- a/mdk-stage1/dietlibc/libugly/time_table_spd.c
+++ b/mdk-stage1/dietlibc/libugly/time_table_spd.c
@@ -1,6 +1,7 @@
+#include <time.h>
-/* seconds per month -- nonleap! */
-const unsigned int __spm[12] =
+/* days per month -- nonleap! */
+const short __spm[12] =
{ 0,
(31),
(31+28),
diff --git a/mdk-stage1/dietlibc/libugly/tzfile.c b/mdk-stage1/dietlibc/libugly/tzfile.c
index 5702d4bea..e0e8f7846 100644
--- a/mdk-stage1/dietlibc/libugly/tzfile.c
+++ b/mdk-stage1/dietlibc/libugly/tzfile.c
@@ -3,28 +3,30 @@
#include <fcntl.h>
#include <sys/mman.h>
#include <netinet/in.h>
+#include <time.h>
-#include <stdio.h>
+/* #include <stdio.h> */
+
+char* tzname[2]={"GMT","GMT"};
#ifdef WANT_TZFILE_PARSER
static char *tzfile=0;
static int tzlen=-1;
-void __maplocaltime() {
+void __maplocaltime(void);
+void __maplocaltime(void) {
int fd;
unsigned int len;
if (tzlen>=0) return;
tzlen=0;
if ((fd=open("/etc/localtime",O_RDONLY))<0) return;
len=lseek(fd,0,SEEK_END);
- if ((tzfile=mmap(0,len,PROT_READ,MAP_SHARED,fd,0))==MAP_FAILED) return;
+ if ((tzfile=mmap(0,len,PROT_READ,MAP_PRIVATE,fd,0))==MAP_FAILED) return;
close(fd);
if (ntohl(*(int*)tzfile) != 0x545a6966) return;
tzlen=len;
}
-char *tzset(void) __attribute__((weak,alias("__maplocaltime")));
-
static unsigned long __myntohl(const unsigned char* c) {
return (((unsigned long)c[0])<<24) +
(((unsigned long)c[1])<<16) +
@@ -32,6 +34,7 @@ static unsigned long __myntohl(const unsigned char* c) {
((unsigned long)c[3]);
}
+time_t __tzfile_map(time_t t, int *isdst);
time_t __tzfile_map(time_t t, int *isdst) {
/* "TZif" plus 16 reserved bytes. */
char *tmp;
@@ -64,23 +67,41 @@ time_t __tzfile_map(time_t t, int *isdst) {
printf("%s(%lu,%d,%d)",i?", ":"",ntohl(*(int*)tmp),tmp[4],tmp[5]); tmp+=6;
}
printf("\n");
+ for (i=0; i<tzh_charcnt; ++i) {
+ printf("%s\"%s\"",i?", ":"",tmp);
+ tmp+=strlen(tmp);
+ }
+ printf("\n");
#endif
tmp=tzfile+20+6*4;
- for (i=0; i<tzh_timecnt; ++i)
+ daylight=(tzh_timecnt>0);
+ for (i=0; i<tzh_timecnt; ++i) {
if ((time_t)__myntohl(tmp+i*4) >= t) {
+ char* tz=tmp;
/* printf("match at %d\n",i); */
tmp+=tzh_timecnt*4;
i=tmp[i-1];
/* printf("using index %d\n",i); */
tmp+=tzh_timecnt;
+ tz+=tzh_timecnt*5+tzh_leapcnt*4+tzh_typecnt*6;
tmp+=i*6;
/* printf("(%lu,%d,%d)\n",ntohl(*(int*)tmp),tmp[4],tmp[5]); */
*isdst=tmp[4];
- return t+__myntohl(tmp);
+ tzname[0]=tz+tmp[5];
+ timezone=-(__myntohl(tmp));
+ return t-timezone;
}
+ }
return t;
}
+
+void tzset(void) {
+ int isdst;
+ __maplocaltime();
+ __tzfile_map(time(0),&isdst);
+}
+
#else
-void tzset(void) __attribute__((weak,alias("return0")));
+void tzset(void) __attribute__((weak,alias("__nop")));
#endif