From de47eb59bb829423b1d0f47ba13099073999b3cb Mon Sep 17 00:00:00 2001 From: Nicolas Planel Date: Wed, 29 Oct 2003 16:07:11 +0000 Subject: Corporate Server 2.1.1 release --- mdk-stage1/dietlibc/libugly/asctime_r.c | 2 +- mdk-stage1/dietlibc/libugly/asprintf.c | 9 +- mdk-stage1/dietlibc/libugly/getmntent.c | 11 +- mdk-stage1/dietlibc/libugly/getprotoent.c | 130 +----------- mdk-stage1/dietlibc/libugly/gmtime_r.c | 6 +- mdk-stage1/dietlibc/libugly/isleap.c | 2 + mdk-stage1/dietlibc/libugly/localtime_r.c | 8 +- mdk-stage1/dietlibc/libugly/logging.c | 38 ++-- mdk-stage1/dietlibc/libugly/mktime.c | 68 +++++-- mdk-stage1/dietlibc/libugly/popen.c | 28 +-- mdk-stage1/dietlibc/libugly/setenv.c | 12 +- mdk-stage1/dietlibc/libugly/strftime.c | 284 +++++++++++---------------- mdk-stage1/dietlibc/libugly/strsignal.c | 92 +-------- mdk-stage1/dietlibc/libugly/system.c | 36 ++-- mdk-stage1/dietlibc/libugly/time_table_spd.c | 5 +- mdk-stage1/dietlibc/libugly/tzfile.c | 37 +++- 16 files changed, 280 insertions(+), 488 deletions(-) (limited to 'mdk-stage1/dietlibc/libugly') 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 -#include +#include #include +#include #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 -#include #include -#include -#include -#include -#include -#include -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) return 0; - if (*cur=='\n') goto parseerror; - *cur=0; cur++; - /* second, the protocol number */ - while (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)) break; - *cur++=0; - } - aliases[aliasidx]=0; - return &pe; -parseerror: - while (curp_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 + 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 #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 #include "dietfeatures.h" #include @@ -5,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -14,9 +14,9 @@ #include #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 -/* 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; itm_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 + +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 +#include +#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 #include - -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 && ttm_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 . - 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 #include -/* F....ng Kernel haeder is damn broken... */ -#ifndef _NSIG -#define _NSIG 64 -#endif -#include -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 -#include #include #include +#include #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 -/* 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 #include #include +#include -#include +/* #include */ + +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; i0); + for (i=0; i= 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 -- cgit v1.2.1