summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGwenolé Beauchesne <gbeauchesne@mandriva.org>2003-02-18 16:48:11 +0000
committerGwenolé Beauchesne <gbeauchesne@mandriva.org>2003-02-18 16:48:11 +0000
commit8182e7cfe7d9c60567e48b876282594395062530 (patch)
treebb743948c6e926539b030102b804b5708222e8d4
parentc93f95560d3fde9eaefcc62c454c67b8b5626fa7 (diff)
downloaddrakx-backup-do-not-use-8182e7cfe7d9c60567e48b876282594395062530.tar
drakx-backup-do-not-use-8182e7cfe7d9c60567e48b876282594395062530.tar.gz
drakx-backup-do-not-use-8182e7cfe7d9c60567e48b876282594395062530.tar.bz2
drakx-backup-do-not-use-8182e7cfe7d9c60567e48b876282594395062530.tar.xz
drakx-backup-do-not-use-8182e7cfe7d9c60567e48b876282594395062530.zip
Merge in CVS dietlibc 0.21 for IA-64 and X86-64 support. However, drop the
following architectures we currently don't support: arm, mips, mipsel, parisc, s390, sparc64.
-rw-r--r--mdk-stage1/dietlibc/i386/hypot.S15
-rw-r--r--mdk-stage1/dietlibc/i386/ilogb.S23
-rw-r--r--mdk-stage1/dietlibc/i386/ipow.S27
-rw-r--r--mdk-stage1/dietlibc/i386/isleap.S28
-rw-r--r--mdk-stage1/dietlibc/i386/ldexp.S15
-rw-r--r--mdk-stage1/dietlibc/i386/libm2.S666
-rw-r--r--mdk-stage1/dietlibc/i386/listen.S4
-rw-r--r--mdk-stage1/dietlibc/i386/log.S26
-rw-r--r--mdk-stage1/dietlibc/i386/log10.S11
-rw-r--r--mdk-stage1/dietlibc/i386/log1p.S12
-rw-r--r--mdk-stage1/dietlibc/i386/log2.S11
-rw-r--r--mdk-stage1/dietlibc/i386/ltostr.S62
-rw-r--r--mdk-stage1/dietlibc/i386/mcount.S44
-rw-r--r--mdk-stage1/dietlibc/i386/md5asm.S300
-rw-r--r--mdk-stage1/dietlibc/i386/memccpy.S39
-rw-r--r--mdk-stage1/dietlibc/i386/memchr.S24
-rw-r--r--mdk-stage1/dietlibc/i386/memcmp.S26
-rw-r--r--mdk-stage1/dietlibc/i386/memcpy.S16
-rw-r--r--mdk-stage1/dietlibc/i386/memset.S15
-rw-r--r--mdk-stage1/dietlibc/i386/mmap.S14
-rw-r--r--mdk-stage1/dietlibc/i386/mmap.c16
-rw-r--r--mdk-stage1/dietlibc/i386/mmap64.S52
-rw-r--r--mdk-stage1/dietlibc/i386/poly.S24
-rw-r--r--mdk-stage1/dietlibc/i386/pow.S67
-rw-r--r--mdk-stage1/dietlibc/i386/recv.S4
-rw-r--r--mdk-stage1/dietlibc/i386/recvfrom.S4
-rw-r--r--mdk-stage1/dietlibc/i386/recvmsg.S4
-rw-r--r--mdk-stage1/dietlibc/i386/rint.S23
-rw-r--r--mdk-stage1/dietlibc/i386/send.S4
-rw-r--r--mdk-stage1/dietlibc/i386/sendmsg.S4
-rw-r--r--mdk-stage1/dietlibc/i386/sendto.S4
-rw-r--r--mdk-stage1/dietlibc/i386/setjmp.S55
-rw-r--r--mdk-stage1/dietlibc/i386/setsockopt.S4
-rw-r--r--mdk-stage1/dietlibc/i386/shutdown.S4
-rw-r--r--mdk-stage1/dietlibc/i386/sin.S24
-rw-r--r--mdk-stage1/dietlibc/i386/sincos.S18
-rw-r--r--mdk-stage1/dietlibc/i386/sinh.S29
-rw-r--r--mdk-stage1/dietlibc/i386/sleep.S25
-rw-r--r--mdk-stage1/dietlibc/i386/socket.S4
-rw-r--r--mdk-stage1/dietlibc/i386/socketcall.S17
-rw-r--r--mdk-stage1/dietlibc/i386/socketpair.S4
-rw-r--r--mdk-stage1/dietlibc/i386/sqrt.S23
-rw-r--r--mdk-stage1/dietlibc/i386/sqrtl.S11
-rw-r--r--mdk-stage1/dietlibc/i386/start.S69
-rw-r--r--mdk-stage1/dietlibc/i386/stpcpy.S22
-rw-r--r--mdk-stage1/dietlibc/i386/strcasecmp.S31
-rw-r--r--mdk-stage1/dietlibc/i386/strcat.S29
-rw-r--r--mdk-stage1/dietlibc/i386/strchr.S22
-rw-r--r--mdk-stage1/dietlibc/i386/strcmp.S31
-rw-r--r--mdk-stage1/dietlibc/i386/strcpy.S24
-rw-r--r--mdk-stage1/dietlibc/i386/strlen.S18
-rw-r--r--mdk-stage1/dietlibc/i386/strncmp.S28
-rw-r--r--mdk-stage1/dietlibc/i386/strncpy.S42
-rw-r--r--mdk-stage1/dietlibc/i386/strrchr.S19
-rw-r--r--mdk-stage1/dietlibc/i386/syscalls.h303
-rw-r--r--mdk-stage1/dietlibc/i386/tan.S12
-rw-r--r--mdk-stage1/dietlibc/i386/tanh.S32
-rw-r--r--mdk-stage1/dietlibc/i386/unified.S35
-rw-r--r--mdk-stage1/dietlibc/i386/usleep.S31
-rw-r--r--mdk-stage1/dietlibc/i386/write12.S37
-rw-r--r--mdk-stage1/dietlibc/ia64/Makefile.add2
-rw-r--r--mdk-stage1/dietlibc/ia64/README4
-rw-r--r--mdk-stage1/dietlibc/ia64/__alarm.c1
-rw-r--r--mdk-stage1/dietlibc/ia64/__longjmp.S1
-rw-r--r--mdk-stage1/dietlibc/ia64/__nice.c6
-rw-r--r--mdk-stage1/dietlibc/ia64/__testandset.S11
-rw-r--r--mdk-stage1/dietlibc/ia64/__time.c14
-rw-r--r--mdk-stage1/dietlibc/ia64/__waitpid.c5
-rw-r--r--mdk-stage1/dietlibc/ia64/accept.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/bind.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/clone.S41
-rw-r--r--mdk-stage1/dietlibc/ia64/connect.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/fork.S8
-rw-r--r--mdk-stage1/dietlibc/ia64/getpeername.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/getsockname.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/getsockopt.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/listen.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/mmap.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/pipe.S20
-rw-r--r--mdk-stage1/dietlibc/ia64/recv.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/recvfrom.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/recvmsg.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/send.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/sendmsg.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/sendto.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/setjmp.S1
-rw-r--r--mdk-stage1/dietlibc/ia64/setsockopt.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/shutdown.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/socket.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/socketpair.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/start.S45
-rw-r--r--mdk-stage1/dietlibc/ia64/syscalls.h242
-rw-r--r--mdk-stage1/dietlibc/ia64/unified.S46
-rw-r--r--mdk-stage1/dietlibc/ia64/utime.S3
-rw-r--r--mdk-stage1/dietlibc/ia64/vfork.S8
-rw-r--r--mdk-stage1/dietlibc/include/alloca.h13
-rw-r--r--mdk-stage1/dietlibc/include/arpa/inet.h1
-rw-r--r--mdk-stage1/dietlibc/include/arpa/nameser.h36
-rw-r--r--mdk-stage1/dietlibc/include/assert.h10
-rw-r--r--mdk-stage1/dietlibc/include/cpio.h27
-rw-r--r--mdk-stage1/dietlibc/include/daemon.h2
-rw-r--r--mdk-stage1/dietlibc/include/dietref.h22
-rw-r--r--mdk-stage1/dietlibc/include/dirent.h36
-rw-r--r--mdk-stage1/dietlibc/include/dlfcn.h2
-rw-r--r--mdk-stage1/dietlibc/include/elf.h781
-rw-r--r--mdk-stage1/dietlibc/include/endian.h45
-rw-r--r--mdk-stage1/dietlibc/include/errno.h543
-rw-r--r--mdk-stage1/dietlibc/include/fcntl.h550
-rw-r--r--mdk-stage1/dietlibc/include/features.h9
-rw-r--r--mdk-stage1/dietlibc/include/float.h96
-rw-r--r--mdk-stage1/dietlibc/include/fnmatch.h2
-rw-r--r--mdk-stage1/dietlibc/include/ftw.h16
-rw-r--r--mdk-stage1/dietlibc/include/getopt.h6
-rw-r--r--mdk-stage1/dietlibc/include/glob.h2
-rw-r--r--mdk-stage1/dietlibc/include/grp.h10
-rw-r--r--mdk-stage1/dietlibc/include/iconv.h25
-rw-r--r--mdk-stage1/dietlibc/include/inttypes.h247
-rw-r--r--mdk-stage1/dietlibc/include/libgen.h9
-rw-r--r--mdk-stage1/dietlibc/include/libintl.h23
-rw-r--r--mdk-stage1/dietlibc/include/limits.h51
-rw-r--r--mdk-stage1/dietlibc/include/locale.h86
-rw-r--r--mdk-stage1/dietlibc/include/math.h35
-rw-r--r--mdk-stage1/dietlibc/include/md5.h48
-rw-r--r--mdk-stage1/dietlibc/include/net/if.h93
-rw-r--r--mdk-stage1/dietlibc/include/net/if_arp.h109
-rw-r--r--mdk-stage1/dietlibc/include/net/if_ether.h74
-rw-r--r--mdk-stage1/dietlibc/include/net/route.h52
-rw-r--r--mdk-stage1/dietlibc/include/netdb.h64
-rw-r--r--mdk-stage1/dietlibc/include/netinet/in.h399
-rw-r--r--mdk-stage1/dietlibc/include/netinet/ip.h117
-rw-r--r--mdk-stage1/dietlibc/include/netinet/ip_icmp.h145
-rw-r--r--mdk-stage1/dietlibc/include/netinet/tcp.h164
-rw-r--r--mdk-stage1/dietlibc/include/netinet/udp.h16
-rw-r--r--mdk-stage1/dietlibc/include/paths.h7
-rw-r--r--mdk-stage1/dietlibc/include/pthread.h37
-rw-r--r--mdk-stage1/dietlibc/include/pty.h13
-rw-r--r--mdk-stage1/dietlibc/include/pwd.h15
-rw-r--r--mdk-stage1/dietlibc/include/regex.h6
-rw-r--r--mdk-stage1/dietlibc/include/resolv.h125
-rw-r--r--mdk-stage1/dietlibc/include/rpc/auth.h23
-rw-r--r--mdk-stage1/dietlibc/include/rpc/auth_des.h8
-rw-r--r--mdk-stage1/dietlibc/include/rpc/auth_unix.h4
-rw-r--r--mdk-stage1/dietlibc/include/rpc/clnt.h112
-rw-r--r--mdk-stage1/dietlibc/include/rpc/key_prot.h74
-rw-r--r--mdk-stage1/dietlibc/include/rpc/netdb.h4
-rw-r--r--mdk-stage1/dietlibc/include/rpc/pmap_clnt.h38
-rw-r--r--mdk-stage1/dietlibc/include/rpc/pmap_prot.h22
-rw-r--r--mdk-stage1/dietlibc/include/rpc/pmap_rmt.h10
-rw-r--r--mdk-stage1/dietlibc/include/rpc/rpc.h2
-rw-r--r--mdk-stage1/dietlibc/include/rpc/rpc_msg.h24
-rw-r--r--mdk-stage1/dietlibc/include/rpc/svc.h22
-rw-r--r--mdk-stage1/dietlibc/include/rpc/types.h6
-rw-r--r--mdk-stage1/dietlibc/include/rpc/xdr.h78
-rw-r--r--mdk-stage1/dietlibc/include/sched.h13
-rw-r--r--mdk-stage1/dietlibc/include/setjmp.h152
-rw-r--r--mdk-stage1/dietlibc/include/shadow.h8
-rw-r--r--mdk-stage1/dietlibc/include/signal.h487
-rw-r--r--mdk-stage1/dietlibc/include/stdarg-cruft.h299
-rw-r--r--mdk-stage1/dietlibc/include/stdarg.h24
-rw-r--r--mdk-stage1/dietlibc/include/stddef.h23
-rw-r--r--mdk-stage1/dietlibc/include/stdint.h26
-rw-r--r--mdk-stage1/dietlibc/include/stdio.h106
-rw-r--r--mdk-stage1/dietlibc/include/stdlib.h75
-rw-r--r--mdk-stage1/dietlibc/include/string.h63
-rw-r--r--mdk-stage1/dietlibc/include/strings.h25
-rw-r--r--mdk-stage1/dietlibc/include/sys/alpha-ioctl.h168
-rw-r--r--mdk-stage1/dietlibc/include/sys/arm-ioctl.h149
-rw-r--r--mdk-stage1/dietlibc/include/sys/cdefs.h31
-rw-r--r--mdk-stage1/dietlibc/include/sys/epoll.h60
-rw-r--r--mdk-stage1/dietlibc/include/sys/file.h11
-rw-r--r--mdk-stage1/dietlibc/include/sys/fsuid.h12
-rw-r--r--mdk-stage1/dietlibc/include/sys/gmon.h99
-rw-r--r--mdk-stage1/dietlibc/include/sys/gmon_out.h1
-rw-r--r--mdk-stage1/dietlibc/include/sys/hppa-ioctl.h133
-rw-r--r--mdk-stage1/dietlibc/include/sys/i386-ioctl.h141
-rw-r--r--mdk-stage1/dietlibc/include/sys/io.h47
-rw-r--r--mdk-stage1/dietlibc/include/sys/ioctl.h20
-rw-r--r--mdk-stage1/dietlibc/include/sys/ipc.h45
-rw-r--r--mdk-stage1/dietlibc/include/sys/kd.h179
-rw-r--r--mdk-stage1/dietlibc/include/sys/klog.h8
-rw-r--r--mdk-stage1/dietlibc/include/sys/mips-ioctl.h177
-rw-r--r--mdk-stage1/dietlibc/include/sys/mman.h165
-rw-r--r--mdk-stage1/dietlibc/include/sys/mount.h73
-rw-r--r--mdk-stage1/dietlibc/include/sys/msg.h48
-rw-r--r--mdk-stage1/dietlibc/include/sys/mtio.h336
-rw-r--r--mdk-stage1/dietlibc/include/sys/param.h22
-rw-r--r--mdk-stage1/dietlibc/include/sys/poll.h26
-rw-r--r--mdk-stage1/dietlibc/include/sys/ppc-ioctl.h164
-rw-r--r--mdk-stage1/dietlibc/include/sys/prctl.h8
-rw-r--r--mdk-stage1/dietlibc/include/sys/ptrace.h840
-rw-r--r--mdk-stage1/dietlibc/include/sys/reboot.h21
-rw-r--r--mdk-stage1/dietlibc/include/sys/resource.h53
-rw-r--r--mdk-stage1/dietlibc/include/sys/s390-ioctl.h141
-rw-r--r--mdk-stage1/dietlibc/include/sys/select.h22
-rw-r--r--mdk-stage1/dietlibc/include/sys/sem.h74
-rw-r--r--mdk-stage1/dietlibc/include/sys/sendfile.h8
-rw-r--r--mdk-stage1/dietlibc/include/sys/shm.h66
-rw-r--r--mdk-stage1/dietlibc/include/sys/socket.h492
-rw-r--r--mdk-stage1/dietlibc/include/sys/soundcard.h1300
-rw-r--r--mdk-stage1/dietlibc/include/sys/sparc-ioctl.h172
-rw-r--r--mdk-stage1/dietlibc/include/sys/stat.h494
-rw-r--r--mdk-stage1/dietlibc/include/sys/sysinfo.h20
-rw-r--r--mdk-stage1/dietlibc/include/sys/syslog.h2
-rw-r--r--mdk-stage1/dietlibc/include/sys/sysmacros.h6
-rw-r--r--mdk-stage1/dietlibc/include/sys/time.h48
-rw-r--r--mdk-stage1/dietlibc/include/sys/timeb.h13
-rw-r--r--mdk-stage1/dietlibc/include/sys/times.h12
-rw-r--r--mdk-stage1/dietlibc/include/sys/timex.h50
-rw-r--r--mdk-stage1/dietlibc/include/sys/types.h133
-rw-r--r--mdk-stage1/dietlibc/include/sys/ucontext.h110
-rw-r--r--mdk-stage1/dietlibc/include/sys/uio.h2
-rw-r--r--mdk-stage1/dietlibc/include/sys/un.h7
-rw-r--r--mdk-stage1/dietlibc/include/sys/vfs.h23
-rw-r--r--mdk-stage1/dietlibc/include/sys/wait.h10
-rw-r--r--mdk-stage1/dietlibc/include/sysexits.h26
-rw-r--r--mdk-stage1/dietlibc/include/tar.h36
-rw-r--r--mdk-stage1/dietlibc/include/termio.h4
-rw-r--r--mdk-stage1/dietlibc/include/termios.h371
-rw-r--r--mdk-stage1/dietlibc/include/time.h20
-rw-r--r--mdk-stage1/dietlibc/include/unistd.h110
-rw-r--r--mdk-stage1/dietlibc/include/utmp.h23
-rw-r--r--mdk-stage1/dietlibc/include/write12.h4
-rw-r--r--mdk-stage1/dietlibc/lib/__dtostr.c175
-rw-r--r--mdk-stage1/dietlibc/lib/__fstat64.c7
-rw-r--r--mdk-stage1/dietlibc/lib/__ftruncate64.c23
-rw-r--r--mdk-stage1/dietlibc/lib/__getcwd.c1
-rw-r--r--mdk-stage1/dietlibc/lib/__isnan.c5
-rw-r--r--mdk-stage1/dietlibc/lib/__lltostr.c4
-rw-r--r--mdk-stage1/dietlibc/lib/__lstat64.c7
-rw-r--r--mdk-stage1/dietlibc/lib/__ltostr.c5
-rw-r--r--mdk-stage1/dietlibc/lib/__ptrace.c27
-rw-r--r--mdk-stage1/dietlibc/lib/__stat64.c7
-rw-r--r--mdk-stage1/dietlibc/lib/__stat64_cvt.c2
-rw-r--r--mdk-stage1/dietlibc/lib/__stime.c14
-rw-r--r--mdk-stage1/dietlibc/lib/__truncate64.c23
-rw-r--r--mdk-stage1/dietlibc/lib/__v_printf.c299
-rw-r--r--mdk-stage1/dietlibc/lib/__v_scanf.c391
-rw-r--r--mdk-stage1/dietlibc/lib/__xmknod.c6
-rw-r--r--mdk-stage1/dietlibc/lib/_brk.c13
-rw-r--r--mdk-stage1/dietlibc/lib/abort.c10
-rw-r--r--mdk-stage1/dietlibc/lib/abs.c10
-rw-r--r--mdk-stage1/dietlibc/lib/accept.c8
-rw-r--r--mdk-stage1/dietlibc/lib/adjtime.c18
-rw-r--r--mdk-stage1/dietlibc/lib/alarm.c47
-rw-r--r--mdk-stage1/dietlibc/lib/alloc.c372
-rw-r--r--mdk-stage1/dietlibc/lib/assert_fail.c11
-rw-r--r--mdk-stage1/dietlibc/lib/atexit.c32
-rw-r--r--mdk-stage1/dietlibc/lib/atoi.c21
-rw-r--r--mdk-stage1/dietlibc/lib/atol.c25
-rw-r--r--mdk-stage1/dietlibc/lib/atoll.c19
-rw-r--r--mdk-stage1/dietlibc/lib/bcd.c185
-rw-r--r--mdk-stage1/dietlibc/lib/bind.c11
-rw-r--r--mdk-stage1/dietlibc/lib/binshstr.c5
-rw-r--r--mdk-stage1/dietlibc/lib/bsearch.c30
-rw-r--r--mdk-stage1/dietlibc/lib/cfgetospeed.c8
-rw-r--r--mdk-stage1/dietlibc/lib/cfmakeraw.c3
-rw-r--r--mdk-stage1/dietlibc/lib/cfsetispeed.c22
-rw-r--r--mdk-stage1/dietlibc/lib/cfsetospeed.c14
-rw-r--r--mdk-stage1/dietlibc/lib/closedir.c3
-rw-r--r--mdk-stage1/dietlibc/lib/connect.c7
-rw-r--r--mdk-stage1/dietlibc/lib/creat.c4
-rw-r--r--mdk-stage1/dietlibc/lib/errlist.c132
-rw-r--r--mdk-stage1/dietlibc/lib/errlistu.c6
-rw-r--r--mdk-stage1/dietlibc/lib/errno_location.c2
-rw-r--r--mdk-stage1/dietlibc/lib/exec_lib.c7
-rw-r--r--mdk-stage1/dietlibc/lib/execl.c3
-rw-r--r--mdk-stage1/dietlibc/lib/execle.c26
-rw-r--r--mdk-stage1/dietlibc/lib/execlp.c6
-rw-r--r--mdk-stage1/dietlibc/lib/execv.c4
-rw-r--r--mdk-stage1/dietlibc/lib/execvp.c23
-rw-r--r--mdk-stage1/dietlibc/lib/ftw.c77
-rw-r--r--mdk-stage1/dietlibc/lib/getdomainname.c3
-rw-r--r--mdk-stage1/dietlibc/lib/getenv.c3
-rw-r--r--mdk-stage1/dietlibc/lib/gethostname.c3
-rw-r--r--mdk-stage1/dietlibc/lib/getopt.c155
-rw-r--r--mdk-stage1/dietlibc/lib/getpeername.c13
-rw-r--r--mdk-stage1/dietlibc/lib/getservent.c137
-rw-r--r--mdk-stage1/dietlibc/lib/getsockname.c11
-rw-r--r--mdk-stage1/dietlibc/lib/getsockopt.c11
-rw-r--r--mdk-stage1/dietlibc/lib/htonl.c1
-rw-r--r--mdk-stage1/dietlibc/lib/htons.c1
-rw-r--r--mdk-stage1/dietlibc/lib/if_indextoname.c3
-rw-r--r--mdk-stage1/dietlibc/lib/if_nameindex.c40
-rw-r--r--mdk-stage1/dietlibc/lib/if_nametoindex.c5
-rw-r--r--mdk-stage1/dietlibc/lib/ipv6constants.c4
-rw-r--r--mdk-stage1/dietlibc/lib/isalnum.c8
-rw-r--r--mdk-stage1/dietlibc/lib/isalpha.c7
-rw-r--r--mdk-stage1/dietlibc/lib/isascii.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isatty.c8
-rw-r--r--mdk-stage1/dietlibc/lib/isblank.c4
-rw-r--r--mdk-stage1/dietlibc/lib/iscntrl.c7
-rw-r--r--mdk-stage1/dietlibc/lib/isdigit.c7
-rw-r--r--mdk-stage1/dietlibc/lib/isgraph.c7
-rw-r--r--mdk-stage1/dietlibc/lib/islower.c7
-rw-r--r--mdk-stage1/dietlibc/lib/isprint.c7
-rw-r--r--mdk-stage1/dietlibc/lib/ispunct.c8
-rw-r--r--mdk-stage1/dietlibc/lib/isspace.c7
-rw-r--r--mdk-stage1/dietlibc/lib/isupper.c8
-rw-r--r--mdk-stage1/dietlibc/lib/isxdigit.c9
-rw-r--r--mdk-stage1/dietlibc/lib/labs.c6
-rw-r--r--mdk-stage1/dietlibc/lib/listen.c11
-rw-r--r--mdk-stage1/dietlibc/lib/llabs.c6
-rw-r--r--mdk-stage1/dietlibc/lib/lockf.c1
-rw-r--r--mdk-stage1/dietlibc/lib/longjmp.c57
-rw-r--r--mdk-stage1/dietlibc/lib/lseek64.c10
-rw-r--r--mdk-stage1/dietlibc/lib/memccmp.c17
-rw-r--r--mdk-stage1/dietlibc/lib/memccpy.c1
-rw-r--r--mdk-stage1/dietlibc/lib/memchr.c12
-rw-r--r--mdk-stage1/dietlibc/lib/memcmp.c2
-rw-r--r--mdk-stage1/dietlibc/lib/memcpy.c2
-rw-r--r--mdk-stage1/dietlibc/lib/memmem.c14
-rw-r--r--mdk-stage1/dietlibc/lib/memmove.c1
-rw-r--r--mdk-stage1/dietlibc/lib/memrchr.c15
-rw-r--r--mdk-stage1/dietlibc/lib/memset.c4
-rw-r--r--mdk-stage1/dietlibc/lib/mkfifo.c4
-rw-r--r--mdk-stage1/dietlibc/lib/msgctl.c3
-rw-r--r--mdk-stage1/dietlibc/lib/msgget.c3
-rw-r--r--mdk-stage1/dietlibc/lib/msgrcv.c8
-rw-r--r--mdk-stage1/dietlibc/lib/msgsnd.c3
-rw-r--r--mdk-stage1/dietlibc/lib/nop.c7
-rw-r--r--mdk-stage1/dietlibc/lib/open64.c9
-rw-r--r--mdk-stage1/dietlibc/lib/opendir.c26
-rw-r--r--mdk-stage1/dietlibc/lib/perror.c32
-rw-r--r--mdk-stage1/dietlibc/lib/pread.c1
-rw-r--r--mdk-stage1/dietlibc/lib/pread64.c3
-rw-r--r--mdk-stage1/dietlibc/lib/putenv.c19
-rw-r--r--mdk-stage1/dietlibc/lib/puts.c12
-rw-r--r--mdk-stage1/dietlibc/lib/pwrite.c11
-rw-r--r--mdk-stage1/dietlibc/lib/pwrite64.c14
-rw-r--r--mdk-stage1/dietlibc/lib/qsort.c22
-rw-r--r--mdk-stage1/dietlibc/lib/raise.c3
-rw-r--r--mdk-stage1/dietlibc/lib/rand.c7
-rw-r--r--mdk-stage1/dietlibc/lib/rand48.c89
-rw-r--r--mdk-stage1/dietlibc/lib/rand_r.c30
-rw-r--r--mdk-stage1/dietlibc/lib/random.c9
-rw-r--r--mdk-stage1/dietlibc/lib/readdir.c2
-rw-r--r--mdk-stage1/dietlibc/lib/readdir64.c62
-rw-r--r--mdk-stage1/dietlibc/lib/reboot.c6
-rw-r--r--mdk-stage1/dietlibc/lib/recv.c8
-rw-r--r--mdk-stage1/dietlibc/lib/recvfrom.c8
-rw-r--r--mdk-stage1/dietlibc/lib/recvmsg.c8
-rw-r--r--mdk-stage1/dietlibc/lib/remove.c2
-rw-r--r--mdk-stage1/dietlibc/lib/sbrk.c11
-rw-r--r--mdk-stage1/dietlibc/lib/semctl.c13
-rw-r--r--mdk-stage1/dietlibc/lib/semget.c3
-rw-r--r--mdk-stage1/dietlibc/lib/semop.c3
-rw-r--r--mdk-stage1/dietlibc/lib/send.c8
-rw-r--r--mdk-stage1/dietlibc/lib/sendmsg.c8
-rw-r--r--mdk-stage1/dietlibc/lib/sendto.c10
-rw-r--r--mdk-stage1/dietlibc/lib/set_errno.c9
-rw-r--r--mdk-stage1/dietlibc/lib/setlinebuf.c12
-rw-r--r--mdk-stage1/dietlibc/lib/setsockopt.c11
-rw-r--r--mdk-stage1/dietlibc/lib/shmat.c5
-rw-r--r--mdk-stage1/dietlibc/lib/shmctl.c3
-rw-r--r--mdk-stage1/dietlibc/lib/shmdt.c3
-rw-r--r--mdk-stage1/dietlibc/lib/shmget.c3
-rw-r--r--mdk-stage1/dietlibc/lib/shutdown.c8
-rw-r--r--mdk-stage1/dietlibc/lib/sigaction.c11
-rw-r--r--mdk-stage1/dietlibc/lib/sigaddset.c28
-rw-r--r--mdk-stage1/dietlibc/lib/sigdelset.c28
-rw-r--r--mdk-stage1/dietlibc/lib/sigemptyset.c12
-rw-r--r--mdk-stage1/dietlibc/lib/sigfillset.c16
-rw-r--r--mdk-stage1/dietlibc/lib/siginterrupt.c17
-rw-r--r--mdk-stage1/dietlibc/lib/sigismember.c29
-rw-r--r--mdk-stage1/dietlibc/lib/sigjmp.c35
-rw-r--r--mdk-stage1/dietlibc/lib/signal.c12
-rw-r--r--mdk-stage1/dietlibc/lib/sigpending.c7
-rw-r--r--mdk-stage1/dietlibc/lib/sigprocmask.c7
-rw-r--r--mdk-stage1/dietlibc/lib/sigqueueinfo.c7
-rw-r--r--mdk-stage1/dietlibc/lib/sigsuspend.c10
-rw-r--r--mdk-stage1/dietlibc/lib/sigtimedwait.c7
-rw-r--r--mdk-stage1/dietlibc/lib/sleep.c2
-rw-r--r--mdk-stage1/dietlibc/lib/snprintf.c3
-rw-r--r--mdk-stage1/dietlibc/lib/socket.c11
-rw-r--r--mdk-stage1/dietlibc/lib/socketpair.c12
-rw-r--r--mdk-stage1/dietlibc/lib/speed.c67
-rw-r--r--mdk-stage1/dietlibc/lib/sprintf.c10
-rw-r--r--mdk-stage1/dietlibc/lib/sscanf.c3
-rw-r--r--mdk-stage1/dietlibc/lib/strcasecmp.c29
-rw-r--r--mdk-stage1/dietlibc/lib/strchr.c1
-rw-r--r--mdk-stage1/dietlibc/lib/strcmp.c2
-rw-r--r--mdk-stage1/dietlibc/lib/strcpy.c7
-rw-r--r--mdk-stage1/dietlibc/lib/strerror.c19
-rw-r--r--mdk-stage1/dietlibc/lib/strlen.c2
-rw-r--r--mdk-stage1/dietlibc/lib/strncasecmp.c34
-rw-r--r--mdk-stage1/dietlibc/lib/strncat.c7
-rw-r--r--mdk-stage1/dietlibc/lib/strncmp.c13
-rw-r--r--mdk-stage1/dietlibc/lib/strncpy.c9
-rw-r--r--mdk-stage1/dietlibc/lib/strsep.c4
-rw-r--r--mdk-stage1/dietlibc/lib/strstr.c8
-rw-r--r--mdk-stage1/dietlibc/lib/strtod.c104
-rw-r--r--mdk-stage1/dietlibc/lib/strtof.c66
-rw-r--r--mdk-stage1/dietlibc/lib/strtok.c2
-rw-r--r--mdk-stage1/dietlibc/lib/strtol.c17
-rw-r--r--mdk-stage1/dietlibc/lib/strtold.c66
-rw-r--r--mdk-stage1/dietlibc/lib/strtoll.c5
-rw-r--r--mdk-stage1/dietlibc/lib/strtoul.c32
-rw-r--r--mdk-stage1/dietlibc/lib/strtoull.c1
-rw-r--r--mdk-stage1/dietlibc/lib/strxfrm.c12
-rw-r--r--mdk-stage1/dietlibc/lib/sys_siglist.c209
-rw-r--r--mdk-stage1/dietlibc/lib/tcdrain.c1
-rw-r--r--mdk-stage1/dietlibc/lib/tcflow.c35
-rw-r--r--mdk-stage1/dietlibc/lib/tcflush.c24
-rw-r--r--mdk-stage1/dietlibc/lib/tcgetpgrp.c7
-rw-r--r--mdk-stage1/dietlibc/lib/tcsendbreak.c11
-rw-r--r--mdk-stage1/dietlibc/lib/tcsetattr.c46
-rw-r--r--mdk-stage1/dietlibc/lib/tcsetpgrp.c1
-rw-r--r--mdk-stage1/dietlibc/lib/tolower.c6
-rw-r--r--mdk-stage1/dietlibc/lib/toupper.c6
-rw-r--r--mdk-stage1/dietlibc/lib/ttyname.c21
-rw-r--r--mdk-stage1/dietlibc/lib/usleep.c6
-rw-r--r--mdk-stage1/dietlibc/lib/vfork.c6
-rw-r--r--mdk-stage1/dietlibc/lib/vfprintf.c19
-rw-r--r--mdk-stage1/dietlibc/lib/vprintf.c14
-rw-r--r--mdk-stage1/dietlibc/lib/vsnprintf.c255
-rw-r--r--mdk-stage1/dietlibc/lib/vsprintf.c10
-rw-r--r--mdk-stage1/dietlibc/lib/vsscanf.c311
-rw-r--r--mdk-stage1/dietlibc/lib/write12.c11
-rw-r--r--mdk-stage1/dietlibc/libcompat/daemon.c29
-rw-r--r--mdk-stage1/dietlibc/libcompat/getdelim.c32
-rw-r--r--mdk-stage1/dietlibc/libcompat/getline.c9
-rw-r--r--mdk-stage1/dietlibc/libcompat/re_bsd.c34
-rw-r--r--mdk-stage1/dietlibc/libcompat/stpcpy.c6
-rw-r--r--mdk-stage1/dietlibc/libcompat/syscall.S70
-rw-r--r--mdk-stage1/dietlibc/libcruft/__end_parse.c10
-rw-r--r--mdk-stage1/dietlibc/libcruft/__parse.c10
-rw-r--r--mdk-stage1/dietlibc/libcruft/__parse_1.c9
-rw-r--r--mdk-stage1/dietlibc/libcruft/__parse_nws.c10
-rw-r--r--mdk-stage1/dietlibc/libcruft/__parse_ws.c11
-rw-r--r--mdk-stage1/dietlibc/libcruft/__prepare_parse.c19
-rw-r--r--mdk-stage1/dietlibc/libcruft/alphasort.c6
-rw-r--r--mdk-stage1/dietlibc/libcruft/bcopy.c11
-rw-r--r--mdk-stage1/dietlibc/libcruft/bzero.c10
-rw-r--r--mdk-stage1/dietlibc/libcruft/clock.c21
-rw-r--r--mdk-stage1/dietlibc/libcruft/dn_expand.c11
-rw-r--r--mdk-stage1/dietlibc/libcruft/dnscruft.c132
-rw-r--r--mdk-stage1/dietlibc/libcruft/dnscruft2.c258
-rw-r--r--mdk-stage1/dietlibc/libcruft/dnscruft3.c3
-rw-r--r--mdk-stage1/dietlibc/libcruft/dnscruft4.c11
-rw-r--r--mdk-stage1/dietlibc/libcruft/entlib.c153
-rw-r--r--mdk-stage1/dietlibc/libcruft/entlib.h44
-rw-r--r--mdk-stage1/dietlibc/libcruft/getgrent.c10
-rw-r--r--mdk-stage1/dietlibc/libcruft/getgrent_r.c78
-rw-r--r--mdk-stage1/dietlibc/libcruft/getgrgid.c13
-rw-r--r--mdk-stage1/dietlibc/libcruft/getgrgid_r.c14
-rw-r--r--mdk-stage1/dietlibc/libcruft/getgrnam.c13
-rw-r--r--mdk-stage1/dietlibc/libcruft/getgrnam_r.c14
-rw-r--r--mdk-stage1/dietlibc/libcruft/gethostbyaddr.c37
-rw-r--r--mdk-stage1/dietlibc/libcruft/gethostbyaddr2_r.c2
-rw-r--r--mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c67
-rw-r--r--mdk-stage1/dietlibc/libcruft/gethostbyname.c39
-rw-r--r--mdk-stage1/dietlibc/libcruft/gethostbyname2.c40
-rw-r--r--mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c35
-rw-r--r--mdk-stage1/dietlibc/libcruft/gethostbyname_r.c54
-rw-r--r--mdk-stage1/dietlibc/libcruft/getlogin.c3
-rw-r--r--mdk-stage1/dietlibc/libcruft/getopt_data.c10
-rw-r--r--mdk-stage1/dietlibc/libcruft/getopt_long.c103
-rw-r--r--mdk-stage1/dietlibc/libcruft/getopt_long_only.c108
-rw-r--r--mdk-stage1/dietlibc/libcruft/getpagesize.c1
-rw-r--r--mdk-stage1/dietlibc/libcruft/getpass.c24
-rw-r--r--mdk-stage1/dietlibc/libcruft/getpwent.c10
-rw-r--r--mdk-stage1/dietlibc/libcruft/getpwent_r.c65
-rw-r--r--mdk-stage1/dietlibc/libcruft/getpwnam.c15
-rw-r--r--mdk-stage1/dietlibc/libcruft/getpwnam_r.c14
-rw-r--r--mdk-stage1/dietlibc/libcruft/getpwuid.c12
-rw-r--r--mdk-stage1/dietlibc/libcruft/getpwuid_r.c13
-rw-r--r--mdk-stage1/dietlibc/libcruft/getspent.c10
-rw-r--r--mdk-stage1/dietlibc/libcruft/getspent_r.c68
-rw-r--r--mdk-stage1/dietlibc/libcruft/getspnam.c15
-rw-r--r--mdk-stage1/dietlibc/libcruft/getspnam_r.c14
-rw-r--r--mdk-stage1/dietlibc/libcruft/getusershell.c33
-rw-r--r--mdk-stage1/dietlibc/libcruft/grbuf.c5
-rw-r--r--mdk-stage1/dietlibc/libcruft/grent.c54
-rw-r--r--mdk-stage1/dietlibc/libcruft/herrno_location.c9
-rw-r--r--mdk-stage1/dietlibc/libcruft/herror.c8
-rw-r--r--mdk-stage1/dietlibc/libcruft/hstrerror.c11
-rw-r--r--mdk-stage1/dietlibc/libcruft/inet_aton.c2
-rw-r--r--mdk-stage1/dietlibc/libcruft/inet_ntoa.c2
-rw-r--r--mdk-stage1/dietlibc/libcruft/inet_ntop.c12
-rw-r--r--mdk-stage1/dietlibc/libcruft/inet_pton.c17
-rw-r--r--mdk-stage1/dietlibc/libcruft/initgroups.c3
-rw-r--r--mdk-stage1/dietlibc/libcruft/killpg.c5
-rw-r--r--mdk-stage1/dietlibc/libcruft/localeconv.c15
-rw-r--r--mdk-stage1/dietlibc/libcruft/mkdtemp.c28
-rw-r--r--mdk-stage1/dietlibc/libcruft/mkstemp.c14
-rw-r--r--mdk-stage1/dietlibc/libcruft/mktemp.c17
-rw-r--r--mdk-stage1/dietlibc/libcruft/pwbuf.c5
-rw-r--r--mdk-stage1/dietlibc/libcruft/pwent.c43
-rw-r--r--mdk-stage1/dietlibc/libcruft/res_init.c6
-rw-r--r--mdk-stage1/dietlibc/libcruft/res_mkquery.c75
-rw-r--r--mdk-stage1/dietlibc/libcruft/res_query.c95
-rw-r--r--mdk-stage1/dietlibc/libcruft/res_search.c35
-rw-r--r--mdk-stage1/dietlibc/libcruft/scan_ulong.c13
-rw-r--r--mdk-stage1/dietlibc/libcruft/scandir.c47
-rw-r--r--mdk-stage1/dietlibc/libcruft/setegid.c11
-rw-r--r--mdk-stage1/dietlibc/libcruft/seteuid.c11
-rw-r--r--mdk-stage1/dietlibc/libcruft/setlocale.c7
-rw-r--r--mdk-stage1/dietlibc/libcruft/spbuf.c5
-rw-r--r--mdk-stage1/dietlibc/libcruft/spent.c45
-rw-r--r--mdk-stage1/dietlibc/libcruft/sysconf.c40
-rw-r--r--mdk-stage1/dietlibc/libcruft/sysconf_cpus.c64
-rw-r--r--mdk-stage1/dietlibc/libcruft/tempnam.c32
-rw-r--r--mdk-stage1/dietlibc/libcruft/tmpnam.c31
-rw-r--r--mdk-stage1/dietlibc/libcrypt/crypt.c31
-rw-r--r--mdk-stage1/dietlibc/libcrypt/md5.c243
-rw-r--r--mdk-stage1/dietlibc/libcrypt/md5crypt.c157
-rw-r--r--mdk-stage1/dietlibc/libdl/Makefile32
-rw-r--r--mdk-stage1/dietlibc/libdl/README82
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_alloc.c81
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_int.h138
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_jump.S53
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_load.c401
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_main.c1059
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_open.c228
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_queue.c39
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_rel.c42
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_rel.h25
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_relocate.c96
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_search.c81
-rw-r--r--mdk-stage1/dietlibc/libdl/dlclose.c40
-rw-r--r--mdk-stage1/dietlibc/libdl/dlerror.c57
-rw-r--r--mdk-stage1/dietlibc/libdl/dlopen.c31
-rw-r--r--mdk-stage1/dietlibc/libdl/dlsym.c93
-rw-r--r--mdk-stage1/dietlibc/libdl/elf_hash.c12
-rw-r--r--mdk-stage1/dietlibc/libdl/elf_hash.h10
-rw-r--r--mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c3
-rw-r--r--mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c5
-rw-r--r--mdk-stage1/dietlibc/liblatin1/latin1-islower.c3
-rw-r--r--mdk-stage1/dietlibc/liblatin1/latin1-isprint.c4
-rw-r--r--mdk-stage1/dietlibc/liblatin1/latin1-isupper.c3
-rw-r--r--mdk-stage1/dietlibc/libm/acosh.c6
-rw-r--r--mdk-stage1/dietlibc/libm/asinh.c6
-rw-r--r--mdk-stage1/dietlibc/libm/atanh.c8
-rw-r--r--mdk-stage1/dietlibc/libm/bessel.c171
-rw-r--r--mdk-stage1/dietlibc/libm/cosh.c9
-rw-r--r--mdk-stage1/dietlibc/libm/erf.c95
-rw-r--r--mdk-stage1/dietlibc/libm/gamma.c98
-rw-r--r--mdk-stage1/dietlibc/libm/ipow.c29
-rw-r--r--mdk-stage1/dietlibc/libm/poly.c41
-rw-r--r--mdk-stage1/dietlibc/libm/pow.c42
-rw-r--r--mdk-stage1/dietlibc/libm/rint.c5
-rw-r--r--mdk-stage1/dietlibc/libm/sinh.c9
-rw-r--r--mdk-stage1/dietlibc/libm/tanh.c7
-rw-r--r--mdk-stage1/dietlibc/libpthread/CHANGES6
-rw-r--r--mdk-stage1/dietlibc/libpthread/Makefile7
-rw-r--r--mdk-stage1/dietlibc/libpthread/README10
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_atfork.c2
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_attr_init.c1
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c5
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c5
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c5
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_cancel.c6
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c9
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c4
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_cond_init.c1
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c2
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c51
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c26
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_create.c27
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_detach.c11
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_equal.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_errno.c5
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_fdglue2.c16
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_fgetc.c10
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_flockfile.c5
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_fputc.c9
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_funlockfile.c5
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_getschedparam.c22
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_internal.c (renamed from mdk-stage1/dietlibc/libpthread/thread_internal.c)67
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_join.c21
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_key.c (renamed from mdk-stage1/dietlibc/libpthread/thread_key.c)11
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_key_create.c7
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_key_delete.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c5
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c2
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c21
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c9
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c9
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_setschedparam.c21
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_setspecific.c3
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_sigmask.c8
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_spinlock.c12
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c18
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c1
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_sys_fdatasync.c10
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c2
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_sys_open.c1
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c2
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c2
-rw-r--r--mdk-stage1/dietlibc/libpthread/pthread_testcancel.c2
-rw-r--r--mdk-stage1/dietlibc/libpthread/thread_internal.h23
-rw-r--r--mdk-stage1/dietlibc/libregex/rx.c125
-rw-r--r--mdk-stage1/dietlibc/librpc/auth_none.c12
-rw-r--r--mdk-stage1/dietlibc/librpc/auth_unix.c17
-rw-r--r--mdk-stage1/dietlibc/librpc/authunix_prot.c2
-rw-r--r--mdk-stage1/dietlibc/librpc/bindresvport.c4
-rw-r--r--mdk-stage1/dietlibc/librpc/clnt_generic.c10
-rw-r--r--mdk-stage1/dietlibc/librpc/clnt_raw.c17
-rw-r--r--mdk-stage1/dietlibc/librpc/clnt_simple.c10
-rw-r--r--mdk-stage1/dietlibc/librpc/clnt_tcp.c48
-rw-r--r--mdk-stage1/dietlibc/librpc/clnt_udp.c51
-rw-r--r--mdk-stage1/dietlibc/librpc/get_myaddress.c2
-rw-r--r--mdk-stage1/dietlibc/librpc/getrpcent.c9
-rw-r--r--mdk-stage1/dietlibc/librpc/getrpcport.c6
-rw-r--r--mdk-stage1/dietlibc/librpc/pmap_clnt.c17
-rw-r--r--mdk-stage1/dietlibc/librpc/pmap_getmaps.c5
-rw-r--r--mdk-stage1/dietlibc/librpc/pmap_getport.c16
-rw-r--r--mdk-stage1/dietlibc/librpc/pmap_prot2.c4
-rw-r--r--mdk-stage1/dietlibc/librpc/pmap_rmt.c111
-rw-r--r--mdk-stage1/dietlibc/librpc/rpc_callmsg.c12
-rw-r--r--mdk-stage1/dietlibc/librpc/rpc_prot.c4
-rw-r--r--mdk-stage1/dietlibc/librpc/svc.c39
-rw-r--r--mdk-stage1/dietlibc/librpc/svc_auth_unix.c6
-rw-r--r--mdk-stage1/dietlibc/librpc/svc_raw.c6
-rw-r--r--mdk-stage1/dietlibc/librpc/svc_run.c2
-rw-r--r--mdk-stage1/dietlibc/librpc/svc_simple.c6
-rw-r--r--mdk-stage1/dietlibc/librpc/svc_tcp.c58
-rw-r--r--mdk-stage1/dietlibc/librpc/svc_udp.c86
-rw-r--r--mdk-stage1/dietlibc/librpc/xdr.c36
-rw-r--r--mdk-stage1/dietlibc/librpc/xdr_array.c38
-rw-r--r--mdk-stage1/dietlibc/librpc/xdr_mem.c36
-rw-r--r--mdk-stage1/dietlibc/librpc/xdr_rec.c138
-rw-r--r--mdk-stage1/dietlibc/librpc/xdr_reference.c14
-rw-r--r--mdk-stage1/dietlibc/librpc/xdr_stdio.c26
-rw-r--r--mdk-stage1/dietlibc/libshell/basename.c27
-rw-r--r--mdk-stage1/dietlibc/libshell/dirname.c25
-rw-r--r--mdk-stage1/dietlibc/libshell/fnmatch.c34
-rw-r--r--mdk-stage1/dietlibc/libshell/glob.c79
-rw-r--r--mdk-stage1/dietlibc/libshell/realpath.c18
-rw-r--r--mdk-stage1/dietlibc/libstdio/fclose.c8
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdglue.c34
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdglue2.c37
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdopen.c18
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdprintf.c13
-rw-r--r--mdk-stage1/dietlibc/libstdio/feof.c2
-rw-r--r--mdk-stage1/dietlibc/libstdio/fflush.c34
-rw-r--r--mdk-stage1/dietlibc/libstdio/fgetc_unlocked.c (renamed from mdk-stage1/dietlibc/libstdio/fgetc.c)18
-rw-r--r--mdk-stage1/dietlibc/libstdio/fgetpos.c8
-rw-r--r--mdk-stage1/dietlibc/libstdio/fgets.c4
-rw-r--r--mdk-stage1/dietlibc/libstdio/fopen.c8
-rw-r--r--mdk-stage1/dietlibc/libstdio/fprintf.c18
-rw-r--r--mdk-stage1/dietlibc/libstdio/fputc.c19
-rw-r--r--mdk-stage1/dietlibc/libstdio/fputc_unlocked.c20
-rw-r--r--mdk-stage1/dietlibc/libstdio/fread.c55
-rw-r--r--mdk-stage1/dietlibc/libstdio/fscanf.c14
-rw-r--r--mdk-stage1/dietlibc/libstdio/fseek.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/fseeko.c10
-rw-r--r--mdk-stage1/dietlibc/libstdio/fseeko64.c12
-rw-r--r--mdk-stage1/dietlibc/libstdio/fsetpos.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/ftell.c2
-rw-r--r--mdk-stage1/dietlibc/libstdio/ftello.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/ftello64.c9
-rw-r--r--mdk-stage1/dietlibc/libstdio/fwrite.c28
-rw-r--r--mdk-stage1/dietlibc/libstdio/printf.c20
-rw-r--r--mdk-stage1/dietlibc/libstdio/puts.c16
-rw-r--r--mdk-stage1/dietlibc/libstdio/scanf.c14
-rw-r--r--mdk-stage1/dietlibc/libstdio/setvbuf.c32
-rw-r--r--mdk-stage1/dietlibc/libstdio/stderr.c25
-rw-r--r--mdk-stage1/dietlibc/libstdio/stdin.c26
-rw-r--r--mdk-stage1/dietlibc/libstdio/stdout.c25
-rw-r--r--mdk-stage1/dietlibc/libstdio/tmpfile.c12
-rw-r--r--mdk-stage1/dietlibc/libstdio/ungetc.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/vfdprintf.c15
-rw-r--r--mdk-stage1/dietlibc/libstdio/vfprintf.c15
-rw-r--r--mdk-stage1/dietlibc/libstdio/vfscanf.c11
-rw-r--r--mdk-stage1/dietlibc/libstdio/vprintf.c15
-rw-r--r--mdk-stage1/dietlibc/libstdio/vscanf.c10
-rw-r--r--mdk-stage1/dietlibc/libugly/asctime_r.c2
674 files changed, 24760 insertions, 4684 deletions
diff --git a/mdk-stage1/dietlibc/i386/hypot.S b/mdk-stage1/dietlibc/i386/hypot.S
new file mode 100644
index 000000000..730b2c5c9
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/hypot.S
@@ -0,0 +1,15 @@
+
+.text
+.type hypot,@function
+.global hypot
+hypot:
+ fldl 4(%esp)
+ fmul %st(0),%st(0)
+ fldl 12(%esp)
+ fmul %st(0),%st(0)
+ faddp
+ fsqrt
+ ret
+
+.ende:
+.size hypot,.ende-hypot
diff --git a/mdk-stage1/dietlibc/i386/ilogb.S b/mdk-stage1/dietlibc/i386/ilogb.S
new file mode 100644
index 000000000..3bebd88ba
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/ilogb.S
@@ -0,0 +1,23 @@
+#
+# int ilogb ( double x );
+#
+# returns (int) log2 (fabs(x)) for x!=0
+# returns MIN_INT for x==0
+#
+
+.text
+.global ilogb
+.type ilogb,@function
+
+ilogb:
+ movl 8(%esp),%eax
+ addl %eax,%eax
+ jz .Lzero
+ shrl $21,%eax
+ subl $1023,%eax
+ ret
+
+.Lzero:
+ stc
+ rcrl %eax
+ ret
diff --git a/mdk-stage1/dietlibc/i386/ipow.S b/mdk-stage1/dietlibc/i386/ipow.S
new file mode 100644
index 000000000..cca6a0ce1
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/ipow.S
@@ -0,0 +1,27 @@
+#
+# This is not standard, but often you only need such this function
+# which is much shorter than the generic pow() function.
+#
+# double ipow ( double mant, int expo );
+#
+
+.text
+.global ipow
+.type ipow,@function
+
+ipow: fld1
+ movl 12(%esp),%ecx
+ fldl 4(%esp)
+ and %ecx,%ecx
+ jns .Lstart
+ negl %ecx
+ fdivr %st(1),%st(0)
+ jmp .Lstart
+
+.Lnext: fmul %st(0),%st(0)
+.Lstart:shrl %ecx
+ jnc .Lnomul
+ fmul %st(0),%st(1)
+.Lnomul:jnz .Lnext
+ fcomp
+ ret
diff --git a/mdk-stage1/dietlibc/i386/isleap.S b/mdk-stage1/dietlibc/i386/isleap.S
new file mode 100644
index 000000000..28d1ee0ce
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/isleap.S
@@ -0,0 +1,28 @@
+.text
+.globl __isleap
+.type __isleap,@function
+
+__isleap:
+ movl 4(%esp),%eax
+ testb $3,%al
+ jne .Lretzero
+#if 1
+ movb $100,%cl /* this works only for 0 a.D. ... 25599 a.C. */
+ divb %cl
+ andb %ah,%ah
+#else
+ cltd /* This works for 2147483648 b.C. ... 2147483647 a.C. */
+ movl $100,%ecx
+ divl %ecx
+ andl %edx,%edx
+#endif
+ jne .Lretone
+ testb $3,%al
+ jne .Lretzero
+.Lretone: xorl %eax,%eax
+ incl %eax
+ ret
+
+.Lretzero:xorl %eax,%eax
+ ret
+
diff --git a/mdk-stage1/dietlibc/i386/ldexp.S b/mdk-stage1/dietlibc/i386/ldexp.S
new file mode 100644
index 000000000..4429b6e22
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/ldexp.S
@@ -0,0 +1,15 @@
+.text
+.type ldexp,@function
+.global ldexp
+
+# double ldexp ( double value, int expo );
+
+ldexp:
+ fildl 12(%esp)
+ fldl 4(%esp)
+ fscale
+ fstp %st(1)
+ ret
+
+.ende:
+.size ldexp,.ende-ldexp
diff --git a/mdk-stage1/dietlibc/i386/libm2.S b/mdk-stage1/dietlibc/i386/libm2.S
new file mode 100644
index 000000000..8ad85b7f2
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/libm2.S
@@ -0,0 +1,666 @@
+.text
+#d.half:
+# .long 0x3f000000 # 1/2
+#d.log1p:
+# .long 0x3ed413cc # < sqrt(2)-1-2^(-25)
+
+.global fabsf,fabs,fabsl
+ .type fabsf,@function
+ .type fabs,@function
+ .type fabsl,@function
+fabsf:
+ flds 4(%esp)
+ fabs
+ ret
+fabs:
+ fldl 4(%esp)
+ fabs
+ ret
+fabsl:
+ fldt 4(%esp)
+ fabs
+ ret
+
+.global sincosf,sincos,sincosl
+.type sincosf,@function
+.type sincos,@function
+.type sincosl,@function
+# void sincos ( double x, double* sinx, double* cosx );
+
+sincosf:
+ flds 4(%esp)
+ call __fmod2pi
+ movl 12(%esp),%eax
+ movl 8(%esp),%ecx
+ fsincos
+ fstps (%eax)
+ fstps (%ecx)
+ ret
+sincos:
+ fldl 4(%esp)
+ call __fmod2pi
+ movl 16(%esp),%eax
+ movl 12(%esp),%ecx
+ fsincos
+ fstpl (%eax)
+ fstpl (%ecx)
+ ret
+sincosl:
+ fldt 4(%esp)
+ call __fmod2pi
+ movl 20(%esp),%eax
+ movl 16(%esp),%ecx
+ fsincos
+ fstpt (%eax)
+ fstpt (%ecx)
+ ret
+
+.global tanf,tan,tanl
+.type tanf,@function
+.type tan,@function
+.type tanl,@function
+tanf:
+ flds 4(%esp)
+ jmp __tan
+tan:
+ fldl 4(%esp)
+__tan:
+ call __fmod2pi
+ fsincos
+ fdivrp
+ ret
+tanl:
+ fldt 4(%esp)
+ jmp __tan
+
+.global atan2f,atan2,atan2l
+ .type atan2f,@function
+ .type atan2,@function
+ .type atan2l,@function
+atan2f:
+ flds 4(%esp)
+ flds 8(%esp)
+ fpatan
+ ret
+atan2l:
+ fldt 4(%esp)
+ fldt 16(%esp)
+ fpatan
+ ret
+atan2:
+ fldl 4(%esp)
+ fldl 12(%esp)
+ fpatan
+ ret
+
+.global cbrtf,cbrt,cbrtl
+ .type cbrtf,@function
+ .type cbrt,@function
+ .type cbrtl,@function
+cbrtf:
+ flds 4(%esp)
+ jmp __cbrt
+cbrtl:
+ fldt 4(%esp)
+ jmp __cbrt
+cbrt:
+ fldl 4(%esp)
+# fldt 1/3
+__cbrt:
+ pushl $0x00003ffd # yes, this method of loading 1/3
+ pushl $0xaaaaaaaa # is shorter than keeping the data
+ pushl $0xaaaaaaab # separate
+ fldt (%esp)
+ addl $12,%esp
+ fxch # st(0)=x, st(1)=1/3
+ ftst
+ fstsw %ax
+ sahf
+ jz 1f
+ jnc finpow
+ fchs
+ call finpow
+ fchs
+1: ret
+
+# x^y; st(0)=x, st(1)=y (x > 0)
+finpow:
+ fyl2x
+ jmp __finexp
+
+.global exp2f,exp2,exp2l
+ .type exp2f,@function
+ .type exp2,@function
+ .type exp2l,@function
+exp2f:
+ flds 4(%esp)
+ jmp __finexp
+exp2:
+ fldl 4(%esp)
+ jmp __finexp
+exp2l:
+ fldt 4(%esp)
+ jmp __finexp
+
+.global exp10f,exp10,exp10l #,pow10f,pow10,pow10l
+ .type exp10f,@function
+ .type exp10,@function
+ .type exp10l,@function
+# .type pow10f,@function
+# .type pow10,@function
+# .type pow10l,@function
+exp10f:
+#pow10f:
+ fldl2t
+ fmuls 4(%esp)
+ jmp __finexp
+exp10:
+#pow10:
+ fldl2t
+ fmull 4(%esp)
+ jmp __finexp
+exp10l:
+#pow10l:
+ fldl2t
+ fldt 4(%esp)
+ fmulp
+ jmp __finexp
+
+# exp(x)-1
+.global expm1f,expm1,expm1l
+ .type expm1f,@function
+ .type expm1,@function
+ .type expm1l,@function
+expm1f:
+ fldl2e
+ fmuls 4(%esp)
+ jmp finem1
+expm1l:
+ fldl2e
+ fldt 4(%esp)
+ fmulp
+ jmp finem1
+expm1:
+ fldl2e
+ fmull 4(%esp)
+# -1 <= st <= 1 ?
+finem1:
+ fst %st(1) # st(1)=st(0)
+ fabs
+ fld1
+ fcompp
+ fstsw %ax
+ sahf
+# |x| >= 1
+ jc 1f
+ f2xm1
+ ret
+1: call __finexp
+ fld1
+ fsubrp
+ ret
+
+# sinh(x)=(exp(x)-exp(-x))/2
+# cosh(x)=(exp(x)+exp(-x))/2
+# tanh(x)=sinh(x)/cosh(x)
+.global sinhf,sinh,sinhl
+ .type sinhf,@function
+ .type sinh,@function
+ .type sinhl,@function
+sinhf:
+ fldl2e
+ fmuls 4(%esp)
+ jmp finsinh
+sinh:
+ fldl2e
+ fmull 4(%esp)
+finsinh:
+ call __finexp
+ fld1
+ fdiv %st(1),%st(0) # st(0)=1/exp(x), st(1)=exp(x)
+ fsubrp %st(0),%st(1)
+ pushl $0x3f000000 # 1/2
+ flds (%esp)
+ popl %eax
+ fmulp
+ ret
+
+sinhl:
+ fldl2e
+ fldt 4(%esp)
+ fmulp
+ jmp finsinh
+
+.global coshf,cosh,coshl
+ .type coshf,@function
+ .type cosh,@function
+ .type coshl,@function
+coshf:
+ fldl2e
+ fmuls 4(%esp)
+ jmp fincosh
+cosh:
+ fldl2e
+ fmull 4(%esp)
+fincosh:
+ call __finexp
+ fld1
+ fdiv %st(1),%st(0) # st(0)=1/exp(x), st(1)=exp(x)
+ faddp %st,%st(1)
+ pushl $0x3f000000 # 1/2
+ flds (%esp)
+ popl %eax
+ fmulp
+ ret
+
+coshl:
+ fldl2e
+ fldt 4(%esp)
+ fmulp
+ jmp fincosh
+
+.global tanhf,tanh,tanhl
+ .type tanhf,@function
+ .type tanh,@function
+ .type tanhl,@function
+tanhf:
+ fldl2e
+ fmuls 4(%esp)
+ call __finexp
+ jmp fintanh
+tanh:
+ fldl2e
+ fmull 4(%esp)
+ call __finexp
+fintanh:
+ fld1
+ fdiv %st(1),%st # st(0)=1/exp(x), st(1)=exp(x)
+ fst %st(2) # st(2)=1/exp(x)
+ fadd %st(1),%st(0)
+ fstp %st(3) # st(2)=exp(x)+exp(-x), st(1)=exp(-x), st(0)=exp(x)
+ fsubp # st(1)=exp(x)+exp(-x), st(0)=exp(x)-exp(-x)
+ fdivp
+ ret
+
+tanhl:
+ fldl2e
+ fldt 4(%esp)
+ fmulp
+ call __finexp
+ jmp fintanh
+
+.global hypotf,hypot,hypotl # ,__hypot
+ .type hypotf,@function
+ .type hypot,@function
+ .type hypotl,@function
+# .type __hypot,@function
+hypotf:
+ flds 8(%esp)
+ flds 4(%esp)
+ jmp __hypot
+hypotl:
+ fldt 16(%esp)
+ fldt 4(%esp)
+ jmp __hypot
+hypot:
+ fldl 12(%esp)
+ fldl 4(%esp)
+__hypot:
+ fmul %st(0),%st(0)
+ fxch
+ fmul %st(0),%st(0)
+ faddp
+ fsqrt
+ ret
+
+.global log1pf,log1p,log1pl
+ .type log1pf,@function
+ .type log1p,@function
+ .type log1pl,@function
+log1pf:
+ flds 4(%esp)
+ jmp __log1p
+log1pl:
+ fldt 4(%esp)
+ jmp __log1p
+log1p:
+ fldl 4(%esp)
+__log1p:
+# Sprawdzenie zakresu parametru
+ fst %st(1)
+ pushl $0x3ed413cc # sqrt(2)-1-2^(-25)
+ fabs
+ flds (%esp)
+ popl %eax
+ fcompp # porownanie
+ fstsw %ax
+ fldln2
+ fxch
+ sahf
+# |x| >= sqrt(2)-1
+ jc 1f
+ fyl2xp1
+ ret
+1: fld1 # x = x + 1
+ faddp
+ fyl2x
+ ret
+
+.global log10f,log10,log10l
+ .type log10f,@function
+ .type log10,@function
+ .type log10l,@function
+log10f:
+ fldlg2
+ flds 4(%esp)
+ fyl2x
+ ret
+log10l:
+ fldlg2
+ fldt 4(%esp)
+ fyl2x
+ ret
+log10:
+ fldlg2
+ fldl 4(%esp)
+ fyl2x
+ ret
+
+.global log2f,log2,log2l
+ .type log2f,@function
+ .type log2,@function
+ .type log2l,@function
+log2f:
+ fld1
+ flds 4(%esp)
+ fyl2x
+ ret
+log2l:
+ fld1
+ fldt 4(%esp)
+ fyl2x
+ ret
+log2:
+ fld1
+ fldl 4(%esp)
+ fyl2x
+ ret
+
+.global fmaf,fma,fmal
+ .type fmaf,@function
+ .type fma,@function
+ .type fmal,@function
+fmaf:
+ flds 4(%esp)
+ fmuls 8(%esp)
+ fadds 12(%esp)
+ ret
+fma:
+ fldl 4(%esp)
+ fmull 12(%esp)
+ faddl 20(%esp)
+ ret
+fmal:
+ fldt 4(%esp)
+ fldt 16(%esp)
+ fmulp %st,%st(1)
+ fldt 28(%esp)
+ faddp %st,%st(1)
+ ret
+
+.global asinhf,asinh,asinhl
+ .type asinhf,@function
+ .type asinh,@function
+ .type asinhl,@function
+asinhf:
+ flds 4(%esp)
+ jmp __asinh
+asinh:
+ fldl 4(%esp)
+__asinh:
+ fld %st(0)
+ fmul %st(0),%st(0)
+ fld1
+ faddp %st(0),%st(1)
+finasch:
+ fsqrt
+ faddp %st(0),%st(1)
+ fldln2
+ fxch
+ fyl2x
+ ret
+asinhl:
+ fldt 4(%esp)
+ jmp __asinh
+
+.global acoshf,acosh,acoshl
+ .type acoshf,@function
+ .type acosh,@function
+ .type acoshl,@function
+acoshf:
+ flds 4(%esp)
+ jmp __acosh
+acosh:
+ fldl 4(%esp)
+__acosh:
+ fld %st(0)
+ fmul %st(0),%st(0)
+ fld1
+ fsubrp %st(0),%st(1) # st1=st1-st0; pop
+ jmp finasch
+acoshl:
+ fldt 4(%esp)
+ jmp __acosh
+
+.global atanhf,atanh,atanhl
+ .type atanhf,@function
+ .type atanh,@function
+ .type atanhl,@function
+atanhf:
+ flds 4(%esp)
+ jmp __atanh
+atanh:
+ fldl 4(%esp)
+__atanh:
+ fst %st(1)
+ fld1 # st0=1, st1=x, st2=x
+ fadd %st(0),%st(2) # st0=1, st1=x, st2=x+1
+ fsubp %st(0),%st(1) # st0=1-x, st1=x+1
+ fdivrp %st(0),%st(1)
+ fsqrt
+ fldln2
+ fxch
+ fyl2x
+ ret
+atanhl:
+ fldt 4(%esp)
+ jmp __atanh
+
+.global dremf,drem,dreml
+ .type dremf,@function
+ .type drem,@function
+ .type dreml,@function
+dremf:
+ flds 8(%esp) # y
+ flds 4(%esp) # x
+ jmp __drem
+drem:
+ fldl 12(%esp)
+ fldl 4(%esp)
+__drem:
+ fprem1
+ fstsw %ax
+ sahf
+ jp __drem
+ ret
+
+dreml:
+ fldt 16(%esp)
+ fldt 4(%esp)
+ jmp __drem
+
+# |ret| = |x|, sign(ret) = sign(y)
+.global copysignf,copysign,copysignl
+ .type copysignf,@function
+ .type copysign,@function
+ .type copysignl,@function
+copysignf:
+ flds 4(%esp) # x
+ flds 8(%esp) # y
+ jmp __copysign
+copysign:
+ fldl 4(%esp)
+ fldl 12(%esp)
+__copysign:
+ fmul %st(1),%st # st = x*y
+ ftst
+ fstsw %ax
+ fincstp
+ sahf
+ jnc 1f
+ fchs
+1: ret
+
+copysignl:
+ fldt 4(%esp)
+ fldt 16(%esp)
+ jmp __copysign
+
+.global fdimf,fdim,fdiml
+ .type fdimf,@function
+ .type fdim,@function
+ .type fdiml,@function
+fdimf:
+ flds 4(%esp)
+ fsubl 12(%esp)
+ jmp __fdim
+fdim:
+ fldl 4(%esp)
+ fsubl 12(%esp)
+__fdim:
+ fstsw %ax
+ sahf
+ jnc 1f
+ fldz
+1: ret
+fdiml:
+ fldt 4(%esp)
+ fldt 16(%esp)
+ fsubp
+ jmp __fdim
+
+
+.global truncf,trunc,truncl
+ .type truncf,@function
+ .type trunc,@function
+ .type truncl,@function
+
+truncf:
+ flds 4(%esp)
+ movb $0x0c,%ah
+ jmp __flcetr
+
+trunc:
+ fldl 4(%esp)
+ movb $0x0c,%ah
+ jmp __flcetr
+
+truncl:
+ fldt 4(%esp)
+ movb $0x0c,%ah
+ jmp __flcetr
+
+.global frexpf,frexp,frexpl
+ .type frexpf,@function
+ .type frexp,@function
+ .type frexpl,@function
+
+frexpf:
+ flds 4(%esp)
+ movl 8(%esp),%eax
+ jmp __frexp
+
+frexp:
+ fldl 4(%esp)
+ movl 12(%esp),%eax
+__frexp:
+ fxtract
+ fxch
+ fistpl (%eax)
+ pushl $0x3f000000 # 1/2
+ fmuls (%esp)
+ incl (%eax)
+ popl %eax
+ ret
+
+frexpl:
+ fldt 4(%esp)
+ movl 16(%esp),%eax
+ jmp __frexp
+
+.global ldexpf,ldexp,ldexpl
+ .type ldexpf,@function
+ .type ldexp,@function
+ .type ldexpl,@function
+
+ldexpf:
+ fildl 8(%esp)
+ flds 4(%esp)
+ fscale
+ ret
+
+ldexp:
+ fildl 12(%esp)
+ fldl 4(%esp)
+ fscale
+ ret
+
+ldexpl:
+ fildl 16(%esp)
+ fldt 4(%esp)
+ fscale
+ ret
+
+.global logbf,logb,logbl
+ .type logbf,@function
+ .type logb,@function
+ .type logbl,@function
+
+#logbf: flds 4(%esp)
+# fxtract
+# fxch
+# ret
+
+#logb: fldl 4(%esp)
+# fxtract
+# fxch
+# ret
+
+#logbl: fldt 4(%esp)
+# fxtract
+# fxch
+# ret
+
+.global ilogbf,ilogb,ilogbl
+ .type ilogbf,@function
+ .type ilogb,@function
+ .type ilogbl,@function
+
+logbf:
+ilogbf: flds 4(%esp)
+ jmp __ilogb
+
+logb:
+ilogb: fldl 4(%esp)
+__ilogb:
+ fxtract
+ pushl %eax
+ fxch
+ fistl (%esp)
+ popl %eax
+ ret
+
+logbl:
+ilogbl: fldt 4(%esp)
+ jmp __ilogb
+
diff --git a/mdk-stage1/dietlibc/i386/listen.S b/mdk-stage1/dietlibc/i386/listen.S
new file mode 100644
index 000000000..a0879be37
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/listen.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(listen,LISTEN)
diff --git a/mdk-stage1/dietlibc/i386/log.S b/mdk-stage1/dietlibc/i386/log.S
new file mode 100644
index 000000000..0d42c9297
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/log.S
@@ -0,0 +1,26 @@
+.text
+
+.global logf,log,logl
+ .type logf,@function
+ .type log,@function
+ .type logl,@function
+logf:
+ fldln2
+ flds 4(%esp)
+ fyl2x
+ ret
+logl:
+ fldln2
+ fldt 4(%esp)
+ fyl2x
+ ret
+log:
+ fldln2
+ fldl 4(%esp)
+ fyl2x
+ ret
+
+.Lende:
+.size log,.Lende-log
+.size logl,.Lende-logl
+.size logf,.Lende-logf
diff --git a/mdk-stage1/dietlibc/i386/log10.S b/mdk-stage1/dietlibc/i386/log10.S
new file mode 100644
index 000000000..dcd08cc3f
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/log10.S
@@ -0,0 +1,11 @@
+.text
+.type log10,@function
+.global log10
+log10:
+ fldlg2
+ fldl 4(%esp)
+ fyl2x
+ ret
+
+.ende:
+.size log10,.ende-log10
diff --git a/mdk-stage1/dietlibc/i386/log1p.S b/mdk-stage1/dietlibc/i386/log1p.S
new file mode 100644
index 000000000..4dd2d58b4
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/log1p.S
@@ -0,0 +1,12 @@
+.text
+.type log1p,@function
+.global log1p
+log1p:
+ fldln2
+ fldl 4(%esp)
+ fyl2xp1
+ ret
+
+.ende:
+.size log1p,.ende-log1p
+
diff --git a/mdk-stage1/dietlibc/i386/log2.S b/mdk-stage1/dietlibc/i386/log2.S
new file mode 100644
index 000000000..80e99a8c9
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/log2.S
@@ -0,0 +1,11 @@
+.text
+.type log2,@function
+.global log2
+log2:
+ fld1
+ fldl 4(%esp)
+ fyl2x
+ ret
+
+.ende:
+.size log2,.ende-log2
diff --git a/mdk-stage1/dietlibc/i386/ltostr.S b/mdk-stage1/dietlibc/i386/ltostr.S
new file mode 100644
index 000000000..ddf85a4f6
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/ltostr.S
@@ -0,0 +1,62 @@
+/*
+ Copyright (C) 2002 Thomas M. Ogrisegg
+
+ __ltostr.S -- convert an integer into a string
+
+ %eax = dividend
+ %ebx = divisor
+ %ecx = size of output-buffer
+ %edi = output-buffer
+ %ebp = if uppercase is set, then %ebp is 'A'-10 else %ebp is 'a'-10
+
+*/
+
+.text
+.globl __ltostr
+__ltostr:
+ pushl %esi
+ pushl %edi # destination
+ pushl %ebp
+ pushl %ebx
+ movl %esp, %eax
+ movl 0x14(%eax), %edi
+ movl 0x18(%eax), %ecx # size
+ movl 0x20(%eax), %ebx # divisor
+ movl 0x1c(%eax), %eax # dividend
+ decl %ecx
+ movl %ecx, %esi
+ movl $('A'-0xa), %ebp
+ xorl %edx, %edx # must be 0 -- used by idiv
+ cmpl $0x0, 36(%esp) # check for uppercase
+ jnz .Lnext
+ addl $0x20, %ebp # set lowercase
+.Lnext:
+ idiv %ebx, %eax
+ cmpb $0x9, %dl
+ jg .Lnext2
+ addb $'0', %dl
+ jmp .Lstos
+.Lnext2:
+ addl %ebp, %edx
+.Lstos:
+ movb %dl, (%edi, %ecx)
+ xorl %edx, %edx
+ decl %ecx
+ jz .Lout
+ orl %eax, %eax
+ jnz .Lnext
+.Lout:
+ cld
+ movl %esi, %ebx
+ leal 1(%edi, %ecx), %esi
+ subl %ebx, %ecx
+ negl %ecx
+ movl %ecx, %eax
+ repnz movsb
+ movb $0x0, (%edi)
+ popl %ebx
+ popl %ebp
+ popl %edi
+ popl %esi
+ ret
+.size __ltostr, . - __ltostr
diff --git a/mdk-stage1/dietlibc/i386/mcount.S b/mdk-stage1/dietlibc/i386/mcount.S
new file mode 100644
index 000000000..11feed5e0
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/mcount.S
@@ -0,0 +1,44 @@
+/*
+ Copyright (C) 2001, 2002 Thomas M. Ogrisegg
+
+ This is free software. You can redistribute and
+ modify it under the terms of the GNU General Public
+ Public License.
+
+ mcount.S
+ i386 assembler implementation of mcount
+*/
+
+/* .section ".profile" */
+.text
+.globl mcount
+.type mcount,@function
+mcount:
+/*
+ save all generic registers which
+ might be used by __mcount, but aren't
+ automatically saved
+ */
+ pushl %eax
+ pushl %ecx
+ pushl %edx
+
+/* push the instruction pointer of the calling function */
+ pushl 0xc(%esp)
+
+/* push the instruction pointer of the
+ function that called the calling function */
+ pushl 0x4(%ebp)
+
+ call __mcount
+
+/* clean up stack */
+ addl $0x8, %esp
+
+/* restore the previously saved registers */
+ popl %edx
+ popl %ecx
+ popl %eax
+ ret
+
+.size mcount,.-mcount
diff --git a/mdk-stage1/dietlibc/i386/md5asm.S b/mdk-stage1/dietlibc/i386/md5asm.S
new file mode 100644
index 000000000..a99a92934
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/md5asm.S
@@ -0,0 +1,300 @@
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+
+// #define F(x, y, z) (x & y) + (~x & z) = x&y + (z - z&x) = z + y&x - z&x
+//#define F(x, y, z) movl x,%ebx; movl x,%eax; notl %ebx; andl y,%eax; andl z,%ebx; addl %ebx,%eax
+#define F(x, y, z) movl y,%eax; movl z,%ebx; andl x,%eax; andl x,%ebx; addl z,%eax; subl %ebx,%eax
+
+// #define G(x, y, z) (x & z) + (y & ~z) = x&z + (y - y&z) = y + x&z - y&z
+#define G(x, y, z) movl z,%ebx; movl z,%eax; notl %ebx; andl x,%eax; andl y,%ebx; addl %ebx,%eax
+//#define G(x, y, z) movl x,%eax; movl y,%ebx; andl z,%eax; andl z,%ebx; addl y,%eax; subl %ebx,%eax
+//#define G(x, y, z) movl z,%eax; movl z,%ebx; andl x,%eax; andl y,%ebx; addl y,%eax; subl %ebx,%eax
+
+// #define H(x, y, z) x ^ y ^ z
+#define H(x, y, z) movl z,%eax; xorl y,%eax; xorl x,%eax
+
+// #define I(x, y, z) y ^ (x | ~z)
+#define I(x, y, z) movl z,%eax; notl %eax; orl x,%eax; xorl y,%eax
+
+
+// #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+#define ROTATE_LEFT(x, n) roll $n,x
+
+// #define FF(a, b, c, d, x, s, ac) { (a) += F (b, c, d) + (x) + (word)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); }
+// #define GG(a, b, c, d, x, s, ac) { (a) += G (b, c, d) + (x) + (word)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); }
+// #define HH(a, b, c, d, x, s, ac) { (a) += H (b, c, d) + (x) + (word)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); }
+// #define II(a, b, c, d, x, s, ac) { (a) += I (b, c, d) + (x) + (word)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); }
+
+#define FF(a, b, c, d, x, s, ac) addl x, a; addl $ac,a; F (b, c, d); addl %eax,a; roll $s,a; addl b,a
+#define GG(a, b, c, d, x, s, ac) addl x, a; addl $ac,a; G (b, c, d); addl %eax,a; roll $s,a; addl b,a
+#define HH(a, b, c, d, x, s, ac) addl x, a; addl $ac,a; H (b, c, d); addl %eax,a; roll $s,a; addl b,a
+#define II(a, b, c, d, x, s, ac) addl x, a; addl $ac,a; I (b, c, d); addl %eax,a; roll $s,a; addl b,a
+
+
+// // x is ecx
+// word a = state [0]; // a is edx
+// word b = state [1]; // b is esi
+// word c = state [2]; // c is edi
+// word d = state [3]; // d is ebp
+
+#define X(n) 4*(n)(%ecx)
+#define X0 (%ecx)
+#define a %edx
+#define b %esi
+#define c %edi
+#define d %ebp
+
+
+
+/* MD5 basic transformation: Transforms state based on data block */
+
+// void __MD5Transform ( word state[4], const word* x, size_t repeat )
+
+.text
+.type __MD5Transform, @function
+.align 32
+.global __MD5Transform
+
+ .align 32
+.Lrepeat:
+
+ /* Round 1 */
+ FF (a, b, c, d, X0 , S11, 0xd76aa478); /* 1 */
+ FF (d, a, b, c, X( 1), S12, 0xe8c7b756); /* 2 */
+ FF (c, d, a, b, X( 2), S13, 0x242070db); /* 3 */
+ FF (b, c, d, a, X( 3), S14, 0xc1bdceee); /* 4 */
+ FF (a, b, c, d, X( 4), S11, 0xf57c0faf); /* 5 */
+ FF (d, a, b, c, X( 5), S12, 0x4787c62a); /* 6 */
+ FF (c, d, a, b, X( 6), S13, 0xa8304613); /* 7 */
+ FF (b, c, d, a, X( 7), S14, 0xfd469501); /* 8 */
+ FF (a, b, c, d, X( 8), S11, 0x698098d8); /* 9 */
+ FF (d, a, b, c, X( 9), S12, 0x8b44f7af); /* 10 */
+ FF (c, d, a, b, X(10), S13, 0xffff5bb1); /* 11 */
+ FF (b, c, d, a, X(11), S14, 0x895cd7be); /* 12 */
+ FF (a, b, c, d, X(12), S11, 0x6b901122); /* 13 */
+ FF (d, a, b, c, X(13), S12, 0xfd987193); /* 14 */
+ FF (c, d, a, b, X(14), S13, 0xa679438e); /* 15 */
+ FF (b, c, d, a, X(15), S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG (a, b, c, d, X( 1), S21, 0xf61e2562); /* 17 */
+ GG (d, a, b, c, X( 6), S22, 0xc040b340); /* 18 */
+ GG (c, d, a, b, X(11), S23, 0x265e5a51); /* 19 */
+ GG (b, c, d, a, X0 , S24, 0xe9b6c7aa); /* 20 */
+ GG (a, b, c, d, X( 5), S21, 0xd62f105d); /* 21 */
+ GG (d, a, b, c, X(10), S22, 0x02441453); /* 22 */
+ GG (c, d, a, b, X(15), S23, 0xd8a1e681); /* 23 */
+ GG (b, c, d, a, X( 4), S24, 0xe7d3fbc8); /* 24 */
+ GG (a, b, c, d, X( 9), S21, 0x21e1cde6); /* 25 */
+ GG (d, a, b, c, X(14), S22, 0xc33707d6); /* 26 */
+ GG (c, d, a, b, X( 3), S23, 0xf4d50d87); /* 27 */
+ GG (b, c, d, a, X( 8), S24, 0x455a14ed); /* 28 */
+ GG (a, b, c, d, X(13), S21, 0xa9e3e905); /* 29 */
+ GG (d, a, b, c, X( 2), S22, 0xfcefa3f8); /* 30 */
+ GG (c, d, a, b, X( 7), S23, 0x676f02d9); /* 31 */
+ GG (b, c, d, a, X(12), S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH (a, b, c, d, X( 5), S31, 0xfffa3942); /* 33 */
+ HH (d, a, b, c, X( 8), S32, 0x8771f681); /* 34 */
+ HH (c, d, a, b, X(11), S33, 0x6d9d6122); /* 35 */
+ HH (b, c, d, a, X(14), S34, 0xfde5380c); /* 36 */
+ HH (a, b, c, d, X( 1), S31, 0xa4beea44); /* 37 */
+ HH (d, a, b, c, X( 4), S32, 0x4bdecfa9); /* 38 */
+ HH (c, d, a, b, X( 7), S33, 0xf6bb4b60); /* 39 */
+ HH (b, c, d, a, X(10), S34, 0xbebfbc70); /* 40 */
+ HH (a, b, c, d, X(13), S31, 0x289b7ec6); /* 41 */
+ HH (d, a, b, c, X0 , S32, 0xeaa127fa); /* 42 */
+ HH (c, d, a, b, X( 3), S33, 0xd4ef3085); /* 43 */
+ HH (b, c, d, a, X( 6), S34, 0x04881d05); /* 44 */
+ HH (a, b, c, d, X( 9), S31, 0xd9d4d039); /* 45 */
+ HH (d, a, b, c, X(12), S32, 0xe6db99e5); /* 46 */
+ HH (c, d, a, b, X(15), S33, 0x1fa27cf8); /* 47 */
+ HH (b, c, d, a, X( 2), S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II (a, b, c, d, X0 , S41, 0xf4292244); /* 49 */
+ II (d, a, b, c, X( 7), S42, 0x432aff97); /* 50 */
+ II (c, d, a, b, X(14), S43, 0xab9423a7); /* 51 */
+ II (b, c, d, a, X( 5), S44, 0xfc93a039); /* 52 */
+ II (a, b, c, d, X(12), S41, 0x655b59c3); /* 53 */
+ II (d, a, b, c, X( 3), S42, 0x8f0ccc92); /* 54 */
+ II (c, d, a, b, X(10), S43, 0xffeff47d); /* 55 */
+ II (b, c, d, a, X( 1), S44, 0x85845dd1); /* 56 */
+ II (a, b, c, d, X( 8), S41, 0x6fa87e4f); /* 57 */
+ II (d, a, b, c, X(15), S42, 0xfe2ce6e0); /* 58 */
+ II (c, d, a, b, X( 6), S43, 0xa3014314); /* 59 */
+ II (b, c, d, a, X(13), S44, 0x4e0811a1); /* 60 */
+ II (a, b, c, d, X( 4), S41, 0xf7537e82); /* 61 */
+ II (d, a, b, c, X(11), S42, 0xbd3af235); /* 62 */
+ II (c, d, a, b, X( 2), S43, 0x2ad7d2bb); /* 63 */
+ II (b, c, d, a, X( 9), S44, 0xeb86d391); /* 64 */
+
+// state [0] += a;
+// state [1] += b;
+// state [2] += c;
+// state [3] += d;
+
+ addl $64,%ecx
+
+ movl 4+32(%esp),%eax // state
+ addl (%eax),a
+ addl 4(%eax),b
+ addl 8(%eax),c
+ addl 12(%eax),d
+ movl a, (%eax)
+ movl b, 4(%eax)
+ movl c, 8(%eax)
+ movl d,12(%eax)
+
+.Lstart:
+ decl 12+32(%esp)
+ jns .Lrepeat
+
+ popal
+ ret
+
+__MD5Transform:
+__MD5TransformLocal:
+ pushal
+ movl 8+32(%esp),%ecx // x
+ movl 4+32(%esp),%eax // state
+ movl (%eax),a
+ movl 4(%eax),b
+ movl 8(%eax),c
+ movl 12(%eax),d
+ jmp .Lstart
+
+.Lende:
+.size __MD5Transform, .Lende-__MD5Transform
+
+.type MD5Init,@function
+.global MD5Init
+
+MD5Init:
+ movl 4(%esp), %ecx
+ xorl %eax,%eax
+ movl $0x67452301, (%ecx)
+ movl $0xefcdab89, 4(%ecx)
+ movl $0x98badcfe, 8(%ecx)
+ movl $0x10325476, 12(%ecx)
+ movl %eax, 16(%ecx)
+ movl %eax, 20(%ecx)
+ ret
+
+
+.global MD5Update
+.type MD5Update,@function
+
+
+// void MD5Update ( MD5_CTX* context, const byte* input, size_t inputBytes )
+
+#define CONTEXT 4+32(%esp)
+#define INPUT 8+32(%esp)
+#define INPUTBYTES 12+32(%esp)
+
+#define COUNT 16(%ebx)
+#define BUFFER 24(%ebx)
+
+
+MD5Update:
+ pushal
+ cld
+ movl CONTEXT, %ebx
+
+// ByteIndex = (context->count[0] >> 3) & 0x3F;
+
+ movl COUNT, %ebp
+ shrl $3, %ebp
+ andl $63,%ebp // ebp = ByteIndex
+
+// if ( (context->count[0] += inputBytes << 3 ) < (inputBytes << 3) )
+// context->count[1]++;
+// context->count[1] += inputBytes >> (32-3);
+
+ movl $8, %eax
+ mull INPUTBYTES
+ addl %eax, 0+COUNT
+ adcl %edx, 4+COUNT
+
+// partLen = 64 - ByteIndex;
+
+ movl $64, %eax
+ subl %ebp, %eax // eax = partLen
+
+// i = 0;
+// if ( partLen <= inputBytes ) {
+
+ xorl %ecx,%ecx // ecx = i
+ cmpl INPUTBYTES, %eax
+ ja .Lende2
+
+// memcpy ( context->buffer + ByteIndex, input, partLen );
+
+ leal 24(%ebx,%ebp,1), %edi
+ movl INPUT, %esi
+ movl %eax, %ecx
+ rep movsb
+
+// MD5Transform ( context->state, context->buffer, 1 );
+
+ pushl $1
+ leal BUFFER, %ecx
+ pushl %ecx
+ push %ebx
+ call __MD5TransformLocal
+
+// len = (inputBytes - partLen) / 64;
+
+ movl 12+INPUTBYTES, %ecx
+ subl %eax, %ecx
+ shrl $6, %ecx
+
+// MD5Transform ( context->state, input+partLen, len );
+
+ pushl %ecx
+ pushl %esi
+ pushl %ebx
+ call __MD5TransformLocal
+ addl $24,%esp
+
+// i = partLen + 64 * len;
+// ByteIndex = 0;
+
+ shll $6, %ecx
+ addl %eax, %ecx
+ xorl %ebp, %ebp
+
+.Lende2:
+
+// }
+// memcpy ( context->buffer + ByteIndex, input + i, inputBytes - i );
+
+ movl INPUT, %esi
+ addl %ecx, %esi
+
+ negl %ecx
+ addl INPUTBYTES, %ecx
+
+ leal 24(%ebx,%ebp,1), %edi
+ rep movsb
+
+ popal
+ ret
+
+
diff --git a/mdk-stage1/dietlibc/i386/memccpy.S b/mdk-stage1/dietlibc/i386/memccpy.S
new file mode 100644
index 000000000..0b7dce49e
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/memccpy.S
@@ -0,0 +1,39 @@
+/*
+ Copyright (C) 2002 Thomas M. Ogrisegg
+
+ This is free software. You can redistribute and
+ modify it under the terms of the GNU General Public
+ Public License.
+
+ memccpy.S
+ i386 assembler implementation of memccpy(3)
+*/
+
+.text
+.global memccpy
+.type memccpy,@function
+memccpy:
+ pushl %esi
+ pushl %edi
+
+ movl %esp, %ecx
+ movl 0x0c(%ecx), %edi
+ movl 0x10(%ecx), %esi
+ movb 0x14(%ecx), %dl
+ movl 0x18(%ecx), %ecx
+ cld
+.Lloop:
+ lodsb
+ stosb
+ cmp %al, %dl
+ jz .Lout
+ decl %ecx
+ jnz .Lloop
+ xorl %edi, %edi
+.Lout:
+ movl %edi, %eax
+ popl %edi
+ popl %esi
+ ret
+.Lende:
+.size memccpy,.Lende-memccpy
diff --git a/mdk-stage1/dietlibc/i386/memchr.S b/mdk-stage1/dietlibc/i386/memchr.S
new file mode 100644
index 000000000..de01aa47f
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/memchr.S
@@ -0,0 +1,24 @@
+.text
+.align 0
+.global memchr
+.type memchr,@function
+memchr:
+ pushl %edi
+ movl 8(%esp),%edi
+ movl 12(%esp),%eax
+ movl 16(%esp),%ecx
+ cld
+ jcxz .Lnotfound
+
+ repne scasb
+
+ je .Lfound
+.Lnotfound:
+ xorl %edi, %edi
+ incl %edi
+.Lfound:
+ movl %edi, %eax
+ decl %eax
+
+ popl %edi
+ ret
diff --git a/mdk-stage1/dietlibc/i386/memcmp.S b/mdk-stage1/dietlibc/i386/memcmp.S
new file mode 100644
index 000000000..aa6d55f23
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/memcmp.S
@@ -0,0 +1,26 @@
+.text
+.align 0
+.global memcmp
+.type memcmp,@function
+memcmp:
+ xorl %eax,%eax
+ orl 12(%esp),%eax
+ jz .Lempty
+ pushl %esi
+ pushl %edi
+ movl 12(%esp),%esi
+ movl 16(%esp),%edi
+ movl %eax,%ecx
+
+ rep cmpsb
+
+ decl %esi
+ decl %edi
+ lodsb
+ subb (%edi), %al
+ movsx %al, %eax
+
+ popl %edi
+ popl %esi
+.Lempty:
+ ret
diff --git a/mdk-stage1/dietlibc/i386/memcpy.S b/mdk-stage1/dietlibc/i386/memcpy.S
new file mode 100644
index 000000000..cbe74459f
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/memcpy.S
@@ -0,0 +1,16 @@
+.text
+.align 0
+.global memcpy
+.type memcpy,@function
+memcpy:
+ pushl %esi
+ pushl %edi
+ movl 12(%esp),%edi
+ movl 16(%esp),%esi
+ movl 20(%esp),%ecx
+ movl %edi, %eax
+ cld
+ rep movsb
+ popl %edi
+ popl %esi
+ ret
diff --git a/mdk-stage1/dietlibc/i386/memset.S b/mdk-stage1/dietlibc/i386/memset.S
new file mode 100644
index 000000000..472390b84
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/memset.S
@@ -0,0 +1,15 @@
+.text
+.align 0
+.global memset
+.type memset,@function
+memset:
+ pushl %edi
+ movl 8(%esp),%edi
+ movl 12(%esp),%eax
+ movl 16(%esp),%ecx
+ cld
+ pushl %edi
+ rep stosb
+ popl %eax
+ popl %edi
+ ret
diff --git a/mdk-stage1/dietlibc/i386/mmap.S b/mdk-stage1/dietlibc/i386/mmap.S
new file mode 100644
index 000000000..c824aa037
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/mmap.S
@@ -0,0 +1,14 @@
+#include "syscalls.h"
+
+.text
+.global mmap
+.type mmap,@function
+mmap:
+ mov $__NR_mmap,%al
+ lea 0x4(%esp,1),%edx
+ push %edx
+ call __unified_syscall
+ pop %ecx
+ ret
+.Lende3:
+.size mmap,.Lende3-mmap
diff --git a/mdk-stage1/dietlibc/i386/mmap.c b/mdk-stage1/dietlibc/i386/mmap.c
deleted file mode 100644
index 26ecb55c0..000000000
--- a/mdk-stage1/dietlibc/i386/mmap.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <linux/types.h>
-#include <linux/unistd.h>
-
-#define __NR__mmap __NR_mmap
-_syscall1(int,_mmap,unsigned long *,buffer)
-
-char *mmap(char *addr, size_t len, int prot, int flags, int fd, unsigned long off) {
- unsigned long buffer[6];
- buffer[0] = (unsigned long)addr;
- buffer[1] = (unsigned long)len;
- buffer[2] = (unsigned long)prot;
- buffer[3] = (unsigned long)flags;
- buffer[4] = (unsigned long)fd;
- buffer[5] = (unsigned long)off;
- return (char*) _mmap(buffer);
-}
diff --git a/mdk-stage1/dietlibc/i386/mmap64.S b/mdk-stage1/dietlibc/i386/mmap64.S
new file mode 100644
index 000000000..210fec6ce
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/mmap64.S
@@ -0,0 +1,52 @@
+#include <syscalls.h>
+#include <errno.h>
+
+.text
+.global mmap64
+.type mmap64,@function
+mmap64:
+/* man is this ugly! */
+ push %ebp
+ push %edi
+ push %esi
+ push %ebx
+ movl %esp, %edi
+ movl 0x28(%edi), %eax
+ movl 0x2c(%edi), %edx
+ testl $0xfff, %eax /* offset in pages */
+ jnz .Leinval
+ shrdl $12, %edx, %eax
+ shrl $12, %edx
+ jnz .Leinval
+ movl %eax, %ebp
+ movl 0x14(%edi),%ebx
+ movl 0x18(%edi),%ecx
+ movl 0x1c(%edi),%edx
+ movl 0x20(%edi),%esi
+ movl 0x24(%edi),%edi
+ movl $__NR_mmap2,%eax
+ int $0x80
+ cmp $-124,%eax
+ jbe .Lnoerror
+ neg %eax
+.Lerror:
+#ifdef WANT_THREAD_SAFE
+ movl %eax,%ebx
+ call __errno_location
+ movl %ebx,(%eax)
+ orl $-1,%eax
+#else
+ mov %eax,errno
+ sbb %eax,%eax # eax = eax - eax - CY = -1
+#endif
+.Lnoerror:
+ pop %ebx
+ pop %esi
+ pop %edi
+ pop %ebp
+ ret
+.Leinval:
+ movl $EINVAL,%eax
+ jmp .Lerror
+.Lende2:
+.size mmap64,.Lende2-mmap64
diff --git a/mdk-stage1/dietlibc/i386/poly.S b/mdk-stage1/dietlibc/i386/poly.S
new file mode 100644
index 000000000..d8be7d7f5
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/poly.S
@@ -0,0 +1,24 @@
+
+.text
+.global __poly
+.type __poly,@function
+
+
+#
+# double __poly ( double x, int n, const double* c );
+#
+
+__poly:
+ movl 16(%esp),%eax
+ movl 12(%esp),%ecx
+ leal (%eax,%ecx,8),%eax
+ fldl 4(%esp)
+ fldz
+.Lloop:
+ fmul %st(1),%st(0)
+ faddl (%eax)
+ addl $-8,%eax
+ decl %ecx
+ jns .Lloop
+ fstp %st(1)
+ ret
diff --git a/mdk-stage1/dietlibc/i386/pow.S b/mdk-stage1/dietlibc/i386/pow.S
new file mode 100644
index 000000000..46562a299
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/pow.S
@@ -0,0 +1,67 @@
+.text
+.global pow
+.type pow,@function
+
+# pow(x,y)
+.global powf,pow,powl
+ .type powf,@function
+ .type pow,@function
+ .type powl,@function
+powf:
+ flds 4(%esp) # x
+ flds 8(%esp) # y
+ jmp .L__pow
+powl:
+ fldt 4(%esp)
+ fldt 16(%esp)
+ jmp .L__pow
+pow:
+ fldl 4(%esp)
+ fldl 12(%esp)
+# x^y; st(0)=y, st(1)=x
+.L__pow:
+ ftst # y = 0 ?
+ fstsw %ax
+ fld1 # st(0)=1, st(1)=y, st(2)=x
+ sahf
+ jz 1f # return 1
+ fcomp %st(1) # y = 1 ?
+ fstsw %ax
+ fxch # st(0)=x, st(1)=y
+ sahf
+ jz 1f # return x
+ ftst # x = 0 ?
+ fstsw %ax
+ sahf
+ jz 1f
+ jnc .Lfinpow # x > 0
+ fxch # st(0)=y, st(1)=x
+ fld %st(0) # st(0)=y, st(1)=y, st(2)=x
+ frndint # st(0)=int(y)
+ fcomp %st(1) # y = int(y)?
+ fstsw %ax
+ fxch
+ sahf
+ jnz .Lfinpow # fyl2x -> st(0) = NaN
+# y even or odd ?
+ fld1
+ fadd %st(0) # st(0) = 2
+ fdivr %st(2),%st(0) # st(0)=st(2)/2
+ frndint
+ fadd %st(0),%st(0)
+ fcomp %st(2) # st(0) = x, st(1) = y
+ fstsw %ax
+ fchs # st(0) = -x
+ sahf
+ jz .Lfinpow # y even
+ call .Lfinpow # y odd
+ fchs
+1: ret
+.Lfinpow:
+ fyl2x
+ jmp __finexp
+
+.Lende:
+.size pow,.Lende-pow
+.size powf,.Lende-powf
+.size powl,.Lende-powl
diff --git a/mdk-stage1/dietlibc/i386/recv.S b/mdk-stage1/dietlibc/i386/recv.S
new file mode 100644
index 000000000..215343ccc
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/recv.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(recv,RECV)
diff --git a/mdk-stage1/dietlibc/i386/recvfrom.S b/mdk-stage1/dietlibc/i386/recvfrom.S
new file mode 100644
index 000000000..a9dde840d
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/recvfrom.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(recvfrom,RECVFROM)
diff --git a/mdk-stage1/dietlibc/i386/recvmsg.S b/mdk-stage1/dietlibc/i386/recvmsg.S
new file mode 100644
index 000000000..cb26e2f08
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/recvmsg.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(recvmsg,RECVMSG)
diff --git a/mdk-stage1/dietlibc/i386/rint.S b/mdk-stage1/dietlibc/i386/rint.S
new file mode 100644
index 000000000..f56ab1f93
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/rint.S
@@ -0,0 +1,23 @@
+.text
+
+.global rintf,rint,rintl
+ .type rintf,@function
+ .type rint,@function
+ .type rintl,@function
+rintf:
+ flds 4(%esp)
+ frndint
+ ret
+rint:
+ fldl 4(%esp)
+ frndint
+ ret
+rintl:
+ fldt 4(%esp)
+ frndint
+ ret
+
+.Lende:
+.size rint,.Lende-rint
+.size rintl,.Lende-rintl
+.size rintf,.Lende-rintf
diff --git a/mdk-stage1/dietlibc/i386/send.S b/mdk-stage1/dietlibc/i386/send.S
new file mode 100644
index 000000000..f2dd7e3d5
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/send.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(send,SEND)
diff --git a/mdk-stage1/dietlibc/i386/sendmsg.S b/mdk-stage1/dietlibc/i386/sendmsg.S
new file mode 100644
index 000000000..484d62e50
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/sendmsg.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(sendmsg,SENDMSG)
diff --git a/mdk-stage1/dietlibc/i386/sendto.S b/mdk-stage1/dietlibc/i386/sendto.S
new file mode 100644
index 000000000..04270f0f0
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/sendto.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(sendto,SENDTO)
diff --git a/mdk-stage1/dietlibc/i386/setjmp.S b/mdk-stage1/dietlibc/i386/setjmp.S
index 9bfecf565..09b266c61 100644
--- a/mdk-stage1/dietlibc/i386/setjmp.S
+++ b/mdk-stage1/dietlibc/i386/setjmp.S
@@ -1,61 +1,40 @@
#include <setjmp.h>
-/* setjmp for i386.
- Copyright (C) 1995, 1996, 1997 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 Library General Public License as
- published by the Free Software Foundation; either version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-.section .rodata
.text
.weak setjmp
+.type setjmp,@function
setjmp:
.globl __setjmp
+.type __setjmp,@function
__setjmp:
- popl %eax /* Pop return address. */
- popl %ecx /* Pop jmp_buf. */
- pushl $0 /* Push zero argument. */
- pushl %ecx /* Push jmp_buf. */
- pushl %eax /* Push back return address. */
+ popl %eax
+ popl %ecx
+ pushl $0
+ pushl %ecx
+ pushl %eax
.globl __sigsetjmp
+.type __sigsetjmp,@function
__sigsetjmp:
- movl 4(%esp), %eax /* User's jmp_buf in %eax. */
+ movl 4(%esp), %eax
+
/* Save registers. */
movl %ebx, (JB_BX*4)(%eax)
movl %esi, (JB_SI*4)(%eax)
movl %edi, (JB_DI*4)(%eax)
movl %ebp, (JB_BP*4)(%eax)
- leal 4(%esp), %ecx /* Save SP as it will be after we return. */
- movl %ecx, (JB_SP*4)(%eax)
+ leal 4(%esp), %edx /* Save SP as it will be after we return. */
movl 0(%esp), %ecx /* Save PC we are returning to now. */
+ movl %edx, (JB_SP*4)(%eax)
movl %ecx, (JB_PC*4)(%eax)
/* Make a tail call to __sigjmp_save; it takes the same args. */
#ifdef PIC
- /* We cannot use the PLT, because it requires that %ebx be set, but
- we can't save and restore our caller's value. Instead, we do an
- indirect jump through the GOT, using for the temporary register
- %ecx, which is call-clobbered. */
- call L(here)
-L(here):
- popl %ecx
- addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ecx
- movl C_SYMBOL_NAME(__sigjmp_save@GOT)(%ecx), %ecx
- jmp *%ecx
+ call 1f
+ addl $_GLOBAL_OFFSET_TABLE_, %ecx
+ jmp *__sigjmp_save@GOT(%ecx)
+1: movl (%esp), %ecx
+ ret
#else
jmp __sigjmp_save
#endif
diff --git a/mdk-stage1/dietlibc/i386/setsockopt.S b/mdk-stage1/dietlibc/i386/setsockopt.S
new file mode 100644
index 000000000..6a81aec82
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/setsockopt.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(setsockopt,SETSOCKOPT)
diff --git a/mdk-stage1/dietlibc/i386/shutdown.S b/mdk-stage1/dietlibc/i386/shutdown.S
new file mode 100644
index 000000000..f9dc707e8
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/shutdown.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(shutdown,SHUTDOWN)
diff --git a/mdk-stage1/dietlibc/i386/sin.S b/mdk-stage1/dietlibc/i386/sin.S
new file mode 100644
index 000000000..1c99b2d12
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/sin.S
@@ -0,0 +1,24 @@
+
+.text
+
+.global sinf,sin,sinl
+.type sinf,@function
+.type sin,@function
+.type sinl,@function
+sinf:
+ flds 4(%esp)
+ jmp __sin
+sin:
+ fldl 4(%esp)
+__sin:
+ call __fmod2pi
+ fsin
+ ret
+sinl:
+ fldt 4(%esp)
+ jmp __sin
+
+.ende:
+.size sin,.ende-sin
+.size sinf,.ende-sinf
+.size sinl,.ende-sinl
diff --git a/mdk-stage1/dietlibc/i386/sincos.S b/mdk-stage1/dietlibc/i386/sincos.S
new file mode 100644
index 000000000..7395075f3
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/sincos.S
@@ -0,0 +1,18 @@
+
+.text
+.type sincos,@function
+.global sincos
+
+# void sincos ( double x, double* sinx, double* cosx );
+
+sincos:
+ fldl 4(%esp)
+ fsincos
+ movl 16(%esp),%eax
+ movl 12(%esp),%ecx
+ fstpl (%eax)
+ fstpl (%ecx)
+ ret
+
+.ende:
+.size sincos,.ende-sincos
diff --git a/mdk-stage1/dietlibc/i386/sinh.S b/mdk-stage1/dietlibc/i386/sinh.S
new file mode 100644
index 000000000..98f7ee752
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/sinh.S
@@ -0,0 +1,29 @@
+
+.text
+.type sinh,@function
+.global sinh
+
+sinh: # note: exp(x) = 2^(x*log2(e))
+ fldl2e
+ fmull 4(%esp) # x*log2(e)
+ fld %st(0) # x*log2(e) x*log2(e)
+ frndint # int(x*log2(e)) x*log2(e)
+ fxch # x*log2(e) int(x*log2(e))
+ fsub %st(1),%st(0) # frac(x*log2(e)) int(x*log2(e))
+ f2xm1 # 2^(fract(x*log2(e)))-1 int(x*log2(e))
+ fld1 # 1 2^(fract(x*log2(e)))-1 int(x*log2(e))
+ faddp %st(0),%st(1) # 2^(fract(x*log2(e))) int(x*log2(e))
+ fscale # 2^(x*log2(e)) int(x*log2(e))
+ fstp %st(1) # 2^(x*log2(e))
+
+# now we have y = exp(x), but sinh(x) = (y - 1/y) * 0.5
+
+ fld1
+ fdiv %st(1),%st(0)
+ fsubrp
+ fmuls __half
+ ret
+
+.Lende:
+
+.size sinh,.ende-sinh
diff --git a/mdk-stage1/dietlibc/i386/sleep.S b/mdk-stage1/dietlibc/i386/sleep.S
new file mode 100644
index 000000000..356552dc2
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/sleep.S
@@ -0,0 +1,25 @@
+#include "PIC.h"
+
+.text
+.global sleep
+.type sleep,@function
+
+sleep:
+ movl 4(%esp),%eax # Argument holen
+ PIC_SAVE # non-PIC: empty line
+ PIC_INIT # non-PIC: empty line
+ pushl $0 # 0 ns
+ pushl %eax # 'x' µs warten
+ movl %esp,%eax
+ pushl %eax # zweimal ein Zeiger auf das Stackobjekt
+ pushl %eax # ptr ptr sec nsec return arg
+#ifdef __DYN_LIB
+ call nanosleep@PLT
+#else
+ call nanosleep
+#endif
+ movl 20(%esp),%eax # 'x' holen
+ subl 8(%esp),%eax # schon abgelaufende Zeit subtrahieren
+ addl $16,%esp
+ PIC_RESTORE # non-PIC: empty line
+ ret
diff --git a/mdk-stage1/dietlibc/i386/socket.S b/mdk-stage1/dietlibc/i386/socket.S
new file mode 100644
index 000000000..bc8cbe536
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/socket.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(socket,SOCKET)
diff --git a/mdk-stage1/dietlibc/i386/socketcall.S b/mdk-stage1/dietlibc/i386/socketcall.S
new file mode 100644
index 000000000..4e8019ec2
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/socketcall.S
@@ -0,0 +1,17 @@
+#include <syscalls.h>
+
+.text
+.global socketcall
+.type socketcall,@function
+socketcall:
+ leal 4(%esp), %ecx
+ pushl %ecx
+ movzbl %al,%eax
+ pushl %eax
+ movb $__NR_socketcall,%al
+ call __unified_syscall
+ popl %ecx
+ popl %ecx
+ retl
+.Lende:
+.size socketcall,.Lende-socketcall
diff --git a/mdk-stage1/dietlibc/i386/socketpair.S b/mdk-stage1/dietlibc/i386/socketpair.S
new file mode 100644
index 000000000..a5de65f25
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/socketpair.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(socketpair,SOCKETPAIR)
diff --git a/mdk-stage1/dietlibc/i386/sqrt.S b/mdk-stage1/dietlibc/i386/sqrt.S
new file mode 100644
index 000000000..5e4527612
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/sqrt.S
@@ -0,0 +1,23 @@
+.text
+
+.global sqrtf,sqrt,sqrtl
+ .type sqrtf,@function
+ .type sqrt,@function
+ .type sqrtl,@function
+sqrtf:
+ flds 4(%esp)
+ fsqrt
+ ret
+sqrt:
+ fldl 4(%esp)
+ fsqrt
+ ret
+sqrtl:
+ fldt 4(%esp)
+ fsqrt
+ ret
+
+.ende:
+.size sqrt,.ende-sqrt
+.size sqrtf,.ende-sqrtf
+.size sqrtl,.ende-sqrtl
diff --git a/mdk-stage1/dietlibc/i386/sqrtl.S b/mdk-stage1/dietlibc/i386/sqrtl.S
new file mode 100644
index 000000000..c1a931fd8
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/sqrtl.S
@@ -0,0 +1,11 @@
+.text
+.type sqrtl,@function
+.global sqrtl
+sqrtl:
+ fldt 4(%esp)
+ fsqrt
+ ret
+
+.ende:
+.size sqrtl,.ende-sqrtl
+
diff --git a/mdk-stage1/dietlibc/i386/start.S b/mdk-stage1/dietlibc/i386/start.S
index 167bb779c..1a825fc2a 100644
--- a/mdk-stage1/dietlibc/i386/start.S
+++ b/mdk-stage1/dietlibc/i386/start.S
@@ -1,42 +1,51 @@
-#include "start.h"
+#include "dietfeatures.h"
+#include "PIC.h"
-#ifdef __i386__
.text
-.globl _start
+.global _start
_start:
-#if 0
- popl %ecx
- movl %esp, %esi
- leal 4(%esp,%ecx,4),%eax
+#if 1
+ popl %ecx /* %ecx = argc */
+ movl %esp,%esi /* %esi = argv */
+ pushl %ecx
#else
- movl (%esp),%ecx /* %ecx = argc */
- leal 4(%esp),%esi /* %esi = argv */
-
- leal 4(%esi,%ecx,4),%eax /* eax = 4*ecx+4 = envp */
+ movl (%esp),%ecx /* %ecx = argc */
+ leal 4(%esp),%esi /* %esi = argv */
#endif
- pushl %eax
- pushl %esi
- pushl %ecx
- movl %eax,environ
+ leal 4(%esi,%ecx,4),%eax /* %eax = envp = (4*ecx)+%esi+4 */
#ifdef WANT_DYNAMIC
-/* in %edx we have the dynamic _fini ( register this if non null ) */
- test %edx, %edx
- je .Linit
+/* in %edx we have the ld.so dynamic _fini ( register this if non null ) */
push %edx
- call atexit
- pop %edx
-.Linit:
- call _init
- push $_fini
- call atexit
- pop %edx
#endif
- call main
- pushl %eax
- call exit
-.Lfefe:
- .size _start,.Lfefe-_start
+ pushl %eax
+ pushl %esi
+ pushl %ecx
+ PIC_INIT /* non-PIC: this is an empty line */
+ PUT_VAR %eax, environ, %ecx /* non-PIC: movl %eax,environ */
+
+#ifdef PROFILING
+ pushl $_etext
+ pushl $.text
+ call monitor
+ addl $0x8, %esp
+#endif
+
+#ifdef WANT_DYNAMIC
+ call _dyn_start
+#else
+ call main
+#endif
+
+#ifdef PROFILING
+ pushl %eax
+ call _stop_monitor
+ popl %eax
#endif
+ pushl %eax
+ call exit
+ hlt /* die now ! will ya ... */
+.Lstart:
+ .size _start,.Lstart-_start
diff --git a/mdk-stage1/dietlibc/i386/stpcpy.S b/mdk-stage1/dietlibc/i386/stpcpy.S
new file mode 100644
index 000000000..1cb74b2ea
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/stpcpy.S
@@ -0,0 +1,22 @@
+.text
+.global stpcpy
+.type stpcpy,@function
+stpcpy:
+ pushl %edi
+ pushl %esi
+ movl 0xc(%esp), %edi
+ movl 0x10(%esp), %esi
+
+.Lcopy:
+ lodsb
+ stosb
+ testb %al, %al
+ jnz .Lcopy
+
+ movl %edi, %eax
+ decl %eax
+ popl %esi
+ popl %edi
+ ret
+.Lende:
+.size stpcpy,.Lende-stpcpy
diff --git a/mdk-stage1/dietlibc/i386/strcasecmp.S b/mdk-stage1/dietlibc/i386/strcasecmp.S
new file mode 100644
index 000000000..a836680db
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strcasecmp.S
@@ -0,0 +1,31 @@
+.text
+.globl strcasecmp
+
+strcasecmp:
+ pushl %esi
+ movl 0x8(%esp), %esi
+ movl 0xc(%esp), %edx
+ xorl %eax, %eax
+ xorl %ecx, %ecx
+ cld
+.Lloop:
+ lodsb
+ movb (%edx), %cl
+ incl %edx
+ or %al, %al
+ jz .Lfinifirst
+ cmp $'A', %al
+ jnge .Lcmp
+ cmp $'z', %al
+ jg .Lcmp
+ or $0x20, %al
+ or $0x20, %cl
+.Lcmp:
+ subl %ecx, %eax
+ jz .Lloop
+.Lret:
+ popl %esi
+ ret
+.Lfinifirst:
+ subl %ecx, %eax
+ jmp .Lret
diff --git a/mdk-stage1/dietlibc/i386/strcat.S b/mdk-stage1/dietlibc/i386/strcat.S
new file mode 100644
index 000000000..e7d74ef13
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strcat.S
@@ -0,0 +1,29 @@
+.text
+.align 0
+.global strcat
+.type strcat,@function
+strcat:
+ pushl %edi
+ pushl %esi
+
+ movl 12(%esp), %edi
+ movl 16(%esp), %esi
+
+ pushl %edi
+
+ xorl %eax, %eax
+ xorl %ecx, %ecx
+ decl %ecx
+ repne scasb
+ decl %edi
+
+.Lloop:
+ lodsb
+ stosb
+ testb %al, %al
+ jnz .Lloop
+
+ popl %eax
+ popl %esi
+ popl %edi
+ ret
diff --git a/mdk-stage1/dietlibc/i386/strchr.S b/mdk-stage1/dietlibc/i386/strchr.S
new file mode 100644
index 000000000..4515d9835
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strchr.S
@@ -0,0 +1,22 @@
+
+.text
+.type strchr,@function
+.global strchr
+.weak index
+.type index,@function
+
+index:
+strchr:
+ movl 4(%esp),%ecx
+ movb 8(%esp),%dl
+.Lloop:
+ movb (%ecx),%al
+ cmpb %al,%dl
+ jz .Lfound
+ incl %ecx
+ testb %al,%al
+ jnz .Lloop
+ xorl %ecx,%ecx
+.Lfound:
+ movl %ecx,%eax
+ ret
diff --git a/mdk-stage1/dietlibc/i386/strcmp.S b/mdk-stage1/dietlibc/i386/strcmp.S
new file mode 100644
index 000000000..e01064ffb
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strcmp.S
@@ -0,0 +1,31 @@
+.text
+.global strcmp
+.type strcmp,@function
+.weak strcoll
+.type strcoll,@function
+
+#ifdef HIGH_PERFORMANCE
+.align 16
+#endif
+
+.Ldiff:
+ movzbl (%edx), %ecx
+ subl %ecx, %eax # (unsigned char)*p - (unsigned char)*q, so wie die Original libc
+ ret # und ohne Überlaufprobleme:
+ # (int) ((signed char)c - (signed char)d) != (int)(signed char) ((unsigned char)c - (unsigned char)d)
+ # c = 'ä', d = 'e': left expression: -129, right expression: 127
+
+strcoll:
+strcmp:
+ movl 4(%esp), %ecx
+ movl 8(%esp), %edx
+ xorl %eax, %eax
+.Lloop: # Schleifenanfang liegt genau auf Modulanfang + 0x10, damit alignbar
+ movb (%ecx), %al
+ cmpb (%edx), %al
+ jnz .Ldiff
+ incl %edx
+ incl %ecx
+ testb %al, %al
+ jnz .Lloop
+ ret
diff --git a/mdk-stage1/dietlibc/i386/strcpy.S b/mdk-stage1/dietlibc/i386/strcpy.S
new file mode 100644
index 000000000..a597436bc
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strcpy.S
@@ -0,0 +1,24 @@
+
+.text
+.align 0
+.global strcpy
+.type strcpy,@function
+strcpy:
+ pushl %esi
+ pushl %edi
+
+ movl 12(%esp), %edx
+ movl 16(%esp), %esi
+ movl %edx, %edi
+ cld
+
+.Lloop:
+ lodsb
+ stosb
+ orb %al, %al
+ jnz .Lloop
+
+ popl %edi
+ popl %esi
+ movl %edx,%eax
+ ret
diff --git a/mdk-stage1/dietlibc/i386/strlen.S b/mdk-stage1/dietlibc/i386/strlen.S
new file mode 100644
index 000000000..66f8ee553
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strlen.S
@@ -0,0 +1,18 @@
+
+.text
+.type strlen,@function
+.global strlen
+
+strlen:
+ movl 4(%esp),%ecx
+ xorl %eax,%eax
+ jecxz .Lnull
+ decl %eax
+.Llbl: incl %eax
+ cmpb $0,(%ecx, %eax)
+ jne .Llbl
+.Lnull: ret
+
+.Lende:
+
+.size strlen,.Lende-strlen
diff --git a/mdk-stage1/dietlibc/i386/strncmp.S b/mdk-stage1/dietlibc/i386/strncmp.S
new file mode 100644
index 000000000..bf07b07d0
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strncmp.S
@@ -0,0 +1,28 @@
+.text
+.align 0
+.global strncmp
+.type strncmp,@function
+strncmp:
+ push %ebx
+ movl %esp,%ebx
+ movl 12(%ebx),%edx
+ movl 16(%ebx),%ecx
+ movl 8(%ebx),%ebx
+.Lloop:
+ jecxz .Ldone
+ decl %ecx
+ movb (%ebx),%al
+ incl %edx
+ incl %ebx
+ movb %al,%ah
+ subb -1(%edx),%al
+ jnz .Lnotequal
+ testb %ah,%ah
+ jnz .Lloop
+
+.Ldone:
+ xorl %eax,%eax
+.Lnotequal:
+ movsx %al, %eax
+ popl %ebx
+ ret
diff --git a/mdk-stage1/dietlibc/i386/strncpy.S b/mdk-stage1/dietlibc/i386/strncpy.S
new file mode 100644
index 000000000..837b43c41
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strncpy.S
@@ -0,0 +1,42 @@
+/*
+ Copyright (C) 2002 Thomas M. Ogrisegg
+
+ This is free software. You can redistribute and
+ modify it under the terms of the GNU General Public
+ Public License.
+
+ strncpy.S
+ i386 assembler implementation of strncpy(3)
+*/
+
+#include "dietfeatures.h"
+
+.text
+.globl strncpy
+.type strncpy,@function
+
+strncpy:
+ pushl %esi
+ pushl %edi
+ movl %esp, %ecx
+ movl 0x0c(%ecx), %edi
+ movl 0x10(%ecx), %esi
+ movl 0x14(%ecx), %ecx
+
+ movl %edi, %edx
+
+.Lloop:
+ dec %ecx
+ js .Lout
+ lodsb
+ stosb
+ or %al, %al
+ jnz .Lloop
+#ifdef WANT_FULL_POSIX_COMPAT
+ repnz stosb
+#endif
+.Lout:
+ movl %edx, %eax
+ popl %edi
+ popl %esi
+ ret
diff --git a/mdk-stage1/dietlibc/i386/strrchr.S b/mdk-stage1/dietlibc/i386/strrchr.S
new file mode 100644
index 000000000..9fd6e8b32
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strrchr.S
@@ -0,0 +1,19 @@
+.text
+.globl strrchr
+.type strrchr,@function
+
+strrchr:
+ movl 0x4(%esp), %edx
+ movb 0x8(%esp), %cl
+ xorl %eax, %eax
+ decl %edx
+.Lloop:
+ incl %edx
+ cmpb $0x0,(%edx)
+ jz .Lret
+ cmpb %cl, (%edx)
+ jnz .Lloop
+ movl %edx, %eax
+ jmp .Lloop
+.Lret:
+ ret
diff --git a/mdk-stage1/dietlibc/i386/syscalls.h b/mdk-stage1/dietlibc/i386/syscalls.h
new file mode 100644
index 000000000..3cbf7b605
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/syscalls.h
@@ -0,0 +1,303 @@
+
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_waitpid 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_time 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lchown 16
+#define __NR_break 17
+#define __NR_oldstat 18
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_stime 25
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_oldfstat 28
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_stty 31
+#define __NR_gtty 32
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_ftime 35
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_prof 44
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_signal 48
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_lock 53
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_mpx 56
+#define __NR_setpgid 57
+#define __NR_ulimit 58
+#define __NR_oldolduname 59
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sgetmask 68
+#define __NR_ssetmask 69
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */
+#define __NR_getrusage 77
+#define __NR_gettimeofday 78
+#define __NR_settimeofday 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_select 82
+#define __NR_symlink 83
+#define __NR_oldlstat 84
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_profil 98
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_ioperm 101
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_olduname 109
+#define __NR_iopl 110
+#define __NR_vhangup 111
+#define __NR_idle 112
+#define __NR_vm86old 113
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_modify_ldt 123
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_create_module 127
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_get_kernel_syms 130
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_vm86 166
+#define __NR_query_module 167
+#define __NR_poll 168
+#define __NR_nfsservctl 169
+#define __NR_setresgid 170
+#define __NR_getresgid 171
+#define __NR_prctl 172
+#define __NR_rt_sigreturn 173
+#define __NR_rt_sigaction 174
+#define __NR_rt_sigprocmask 175
+#define __NR_rt_sigpending 176
+#define __NR_rt_sigtimedwait 177
+#define __NR_rt_sigqueueinfo 178
+#define __NR_rt_sigsuspend 179
+#define __NR_pread 180
+#define __NR_pwrite 181
+#define __NR_chown 182
+#define __NR_getcwd 183
+#define __NR_capget 184
+#define __NR_capset 185
+#define __NR_sigaltstack 186
+#define __NR_sendfile 187
+#define __NR_getpmsg 188 /* some people actually want streams */
+#define __NR_putpmsg 189 /* some people actually want streams */
+#define __NR_vfork 190
+#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */
+#define __NR_mmap2 192
+#define __NR_truncate64 193
+#define __NR_ftruncate64 194
+#define __NR_stat64 195
+#define __NR_lstat64 196
+#define __NR_fstat64 197
+#define __NR_lchown32 198
+#define __NR_getuid32 199
+#define __NR_getgid32 200
+#define __NR_geteuid32 201
+#define __NR_getegid32 202
+#define __NR_setreuid32 203
+#define __NR_setregid32 204
+#define __NR_getgroups32 205
+#define __NR_setgroups32 206
+#define __NR_fchown32 207
+#define __NR_setresuid32 208
+#define __NR_getresuid32 209
+#define __NR_setresgid32 210
+#define __NR_getresgid32 211
+#define __NR_chown32 212
+#define __NR_setuid32 213
+#define __NR_setgid32 214
+#define __NR_setfsuid32 215
+#define __NR_setfsgid32 216
+#define __NR_pivot_root 217
+#define __NR_mincore 218
+#define __NR_madvise 219
+#define __NR_madvise1 219 /* delete when C lib stub is removed */
+#define __NR_getdents64 220
+#define __NR_fcntl64 221
+#define __NR_security 223 /* syscall for security modules */
+#define __NR_gettid 224
+#define __NR_readahead 225
+#define __NR_setxattr 226
+#define __NR_lsetxattr 227
+#define __NR_fsetxattr 228
+#define __NR_getxattr 229
+#define __NR_lgetxattr 230
+#define __NR_fgetxattr 231
+#define __NR_listxattr 232
+#define __NR_llistxattr 233
+#define __NR_flistxattr 234
+#define __NR_removexattr 235
+#define __NR_lremovexattr 236
+#define __NR_fremovexattr 237
+#define __NR_tkill 238
+#define __NR_sendfile64 239
+#define __NR_futex 240
+#define __NR_sched_setaffinity 241
+#define __NR_sched_getaffinity 242
+#define __NR_set_thread_area 243
+#define __NR_get_thread_area 244
+#define __NR_io_setup 245
+#define __NR_io_destroy 246
+#define __NR_io_getevents 247
+#define __NR_io_submit 248
+#define __NR_io_cancel 249
+#define __NR_alloc_hugepages 250
+#define __NR_free_hugepages 251
+#define __NR_exit_group 252
+#define __NR_lookup_dcookie 253
+#define __NR_sys_epoll_create 254
+#define __NR_sys_epoll_ctl 255
+#define __NR_sys_epoll_wait 256
+#define __NR_remap_file_pages 257
+#define __NR_set_tid_address 258
+
+#define syscall_weak(name,wsym,sym) \
+.text; \
+.type wsym,@function; \
+.weak wsym; \
+wsym: ; \
+.type sym,@function; \
+.global sym; \
+sym: \
+ movb $__NR_##name,%al; \
+ jmp __unified_syscall; \
+.Lend##sym: ; \
+.size sym,.Lend##sym-sym
+
+#define syscall(name,sym) \
+.text; \
+.type sym,@function; \
+.global sym; \
+sym: \
+.ifle __NR_##name-255; \
+ movb $__NR_##name,%al; \
+ jmp __unified_syscall; \
+.else; \
+ movw $__NR_##name,%ax; \
+ jmp __unified_syscall_256; \
+.endif; \
+.Lend##sym: ; \
+.size sym,.Lend##sym-sym
+
+#ifndef __PIC__
+#define __socketcall(name,NAME) \
+.text; \
+.type name,@function; \
+.weak name; \
+name: ; \
+.global __libc_##name; \
+__libc_##name: ; \
+ movb $SYS_##NAME,%al; \
+ jmp socketcall; \
+.Lend##name:; \
+.size name,.Lend##name-name
+#else
+#define __socketcall(name,NAME)
+#endif
diff --git a/mdk-stage1/dietlibc/i386/tan.S b/mdk-stage1/dietlibc/i386/tan.S
new file mode 100644
index 000000000..4904c2d59
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/tan.S
@@ -0,0 +1,12 @@
+
+.text
+.type tan,@function
+.global tan
+tan:
+ fldl 4(%esp)
+ fsincos
+ fdivrp
+ ret
+
+.Lende:
+.size tan,.Lende-tan
diff --git a/mdk-stage1/dietlibc/i386/tanh.S b/mdk-stage1/dietlibc/i386/tanh.S
new file mode 100644
index 000000000..61d3f3376
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/tanh.S
@@ -0,0 +1,32 @@
+
+.text
+.type tanh,@function
+.global tanh
+
+tanh: # note: exp(x) = 2^(x*log2(e))
+ fldl2e
+ fmull 4(%esp) # x*log2(e)
+ fld %st(0) # x*log2(e) x*log2(e)
+ frndint # int(x*log2(e)) x*log2(e)
+ fxch # x*log2(e) int(x*log2(e))
+ fsub %st(1),%st(0) # frac(x*log2(e)) int(x*log2(e))
+ f2xm1 # 2^(fract(x*log2(e)))-1 int(x*log2(e))
+ fld1 # 1 2^(fract(x*log2(e)))-1 int(x*log2(e))
+ faddp %st(0),%st(1) # 2^(fract(x*log2(e))) int(x*log2(e))
+ fscale # 2^(x*log2(e)) int(x*log2(e))
+ fstp %st(1) # 2^(x*log2(e))
+
+# now we have y = exp(x), but tanh(x) = (y - 1/y) / (y + 1/y)
+
+ fld1
+ fdiv %st(1),%st(0) # 1/y y
+ fld %st(0) # 1/y 1/y y
+ fadd %st(2) # y+1/y 1/y y
+ fxch %st(2) # y 1/y y+1/y
+ fsubp # y-1/y y+1/y
+ fdivp # (y-1/y)/(y+1/y)
+ ret
+
+.Lende:
+
+.size tanh,.ende-tanh
diff --git a/mdk-stage1/dietlibc/i386/unified.S b/mdk-stage1/dietlibc/i386/unified.S
index f182bdb4b..989bf37b5 100644
--- a/mdk-stage1/dietlibc/i386/unified.S
+++ b/mdk-stage1/dietlibc/i386/unified.S
@@ -1,13 +1,33 @@
+
#include <dietfeatures.h>
.text
+.global __unified_syscall_256
+.type __unified_syscall_256,@function
+__unified_syscall_256:
+ movzwl %ax,%eax
+ jmp .L1
+.L2:
+.size __unified_syscall_256,.L2-__unified_syscall_256
+.weak exit
+exit:
+.global _exit
+.type _exit,@function
+_exit:
+ movb $1,%al
.global __unified_syscall
+.type __unified_syscall,@function
__unified_syscall:
+.size _exit,__unified_syscall-_exit
movzbl %al, %eax
+.L1:
push %edi
push %esi
push %ebx
movl %esp,%edi
+ /* we use movl instead of pop because otherwise a signal would
+ destroy the stack frame and crash the program, although it
+ would save a few bytes. */
movl 0x10(%edi),%ebx
movl 0x14(%edi),%ecx
movl 0x18(%edi),%edx
@@ -16,19 +36,24 @@ __unified_syscall:
int $0x80
cmp $-124,%eax
jbe .Lnoerror
-#ifdef WANT_THREAD_SAVE
+ neg %eax
+#ifdef WANT_THREAD_SAFE
movl %eax,%ebx
call __errno_location
- neg %ebx
movl %ebx,(%eax)
+ orl $-1,%eax
#else
- neg %eax
mov %eax,errno
+ sbb %eax,%eax # eax = eax - eax - CY = -1
#endif
- xor %eax,%eax
- dec %eax
.Lnoerror:
pop %ebx
pop %esi
pop %edi
+
+/* here we go and "reuse" the return for weak-void functions */
+#include "dietuglyweaks.h"
+
ret
+.L3:
+.size __unified_syscall,.L3-__unified_syscall
diff --git a/mdk-stage1/dietlibc/i386/usleep.S b/mdk-stage1/dietlibc/i386/usleep.S
new file mode 100644
index 000000000..7c0cc6ce7
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/usleep.S
@@ -0,0 +1,31 @@
+#include "PIC.h"
+
+.text
+.global usleep
+.type usleep,@function
+
+usleep:
+ movl 4(%esp),%eax
+ PIC_SAVE # non-PIC: empty line
+ PIC_INIT # non-PIC: empty line
+ xorl %edx,%edx
+ movl $1000000,%ecx
+ divl %ecx
+ imull $1000,%edx
+ pushl %edx
+ pushl %eax
+ movl %esp,%eax
+ pushl %eax
+ pushl %eax
+#ifdef __DYN_LIB
+ call nanosleep@PLT
+#else
+ call nanosleep
+#endif
+ addl $16,%esp
+ PIC_RESTORE # non-PIC: empty line
+ ret
+
+.Lende:
+.size usleep,.Lende-usleep
+
diff --git a/mdk-stage1/dietlibc/i386/write12.S b/mdk-stage1/dietlibc/i386/write12.S
new file mode 100644
index 000000000..a40f63a86
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/write12.S
@@ -0,0 +1,37 @@
+#include "PIC.h"
+
+.text
+
+.global __write1
+.type __write1,@function
+
+.global __write2
+.type __write2,@function
+
+ # regparm=1, daher Stringadresse in %eax
+__write2:
+ clc # CY = 0
+ .byte 0xB2 # zusammen mit nächstem Byte: mov dl,0xF9
+__write1:
+ stc # CY = 1
+ sbbl %ecx,%ecx # __write2: ecx=0, __write1: ecx=-1
+ incl %ecx
+ incl %ecx # __write2: ecx=2, __write1: ecx=1
+ xorl %edx,%edx
+ decl %edx
+.Lnext: incl %edx
+ cmpb %ch,(%edx,%eax) # ch=0, da bei beiden Filedescriptoren Bits 15:8 0 sind
+ jnz .Lnext # Stringlänge in edx, ohne eax zerstört zu haben
+ PIC_SAVE # non-PIC: empty line
+ PIC_INIT # non-PIC: empty line
+ pushl %edx
+ pushl %eax
+ pushl %ecx
+#ifdef __DYN_LIB
+ call write@PLT
+#else
+ call write # alles ruf uf dn Stack und ab damit
+#endif
+ addl $12,%esp # und das leidvolle Putzen
+ PIC_RESTORE # non-PIC: empty line
+ ret
diff --git a/mdk-stage1/dietlibc/ia64/Makefile.add b/mdk-stage1/dietlibc/ia64/Makefile.add
new file mode 100644
index 000000000..f660930af
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/Makefile.add
@@ -0,0 +1,2 @@
+VPATH:=ia64:syscalls.s:$(VPATH)
+LIBOBJ+=$(OBJDIR)/__time.o $(OBJDIR)/__waitpid.o $(OBJDIR)/__nice.o $(OBJDIR)/__alarm.o
diff --git a/mdk-stage1/dietlibc/ia64/README b/mdk-stage1/dietlibc/ia64/README
new file mode 100644
index 000000000..684364d93
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/README
@@ -0,0 +1,4 @@
+A Port for IA64.
+
+Does not yet support: clone, FPU and profiling. And includes
+some subtle bugs which will hopefully be fixed later.
diff --git a/mdk-stage1/dietlibc/ia64/__alarm.c b/mdk-stage1/dietlibc/ia64/__alarm.c
new file mode 100644
index 000000000..e2c499f2c
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/__alarm.c
@@ -0,0 +1 @@
+#include "alpha/__alarm.c"
diff --git a/mdk-stage1/dietlibc/ia64/__longjmp.S b/mdk-stage1/dietlibc/ia64/__longjmp.S
new file mode 100644
index 000000000..698bda528
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/__longjmp.S
@@ -0,0 +1 @@
+/* No longjmp yet */
diff --git a/mdk-stage1/dietlibc/ia64/__nice.c b/mdk-stage1/dietlibc/ia64/__nice.c
new file mode 100644
index 000000000..012ea2628
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/__nice.c
@@ -0,0 +1,6 @@
+#include <sys/resource.h>
+
+int nice(int x) {
+ if (setpriority(PRIO_PROCESS,0,x)) return -1;
+ return getpriority(PRIO_PROCESS,0);
+}
diff --git a/mdk-stage1/dietlibc/ia64/__testandset.S b/mdk-stage1/dietlibc/ia64/__testandset.S
new file mode 100644
index 000000000..d462e3c58
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/__testandset.S
@@ -0,0 +1,11 @@
+.text
+.globl __testandset
+.proc __testandset
+__testandset:
+ mov ar.ccv = r0
+ mov r29 = 1
+ ld8 r3 = [r32]
+ cmpxchg8.acq r8 = [r32], r29, ar.ccv /* cmpxchg is atomic */
+ br.ret.sptk.clr b0
+.endp __testandset
+.size __testandset, . - __testandset
diff --git a/mdk-stage1/dietlibc/ia64/__time.c b/mdk-stage1/dietlibc/ia64/__time.c
new file mode 100644
index 000000000..7547acb1d
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/__time.c
@@ -0,0 +1,14 @@
+#include <time.h>
+#include <sys/time.h>
+
+time_t time(time_t*t) {
+ struct timeval tv;
+ time_t ret;
+ if (gettimeofday(&tv,0)) {
+ ret=(time_t)-1;
+ } else {
+ ret=(time_t)tv.tv_sec;
+ }
+ if (t) *t=ret;
+ return ret;
+}
diff --git a/mdk-stage1/dietlibc/ia64/__waitpid.c b/mdk-stage1/dietlibc/ia64/__waitpid.c
new file mode 100644
index 000000000..8c228f375
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/__waitpid.c
@@ -0,0 +1,5 @@
+#include <sys/types.h>
+
+pid_t waitpid(int pid, int * wait_stat, int flags) {
+ return wait4(pid, wait_stat, flags, 0);
+}
diff --git a/mdk-stage1/dietlibc/ia64/accept.S b/mdk-stage1/dietlibc/ia64/accept.S
new file mode 100644
index 000000000..7bdc38c7e
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/accept.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(accept, accept);
diff --git a/mdk-stage1/dietlibc/ia64/bind.S b/mdk-stage1/dietlibc/ia64/bind.S
new file mode 100644
index 000000000..05849d470
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/bind.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(bind, bind);
diff --git a/mdk-stage1/dietlibc/ia64/clone.S b/mdk-stage1/dietlibc/ia64/clone.S
new file mode 100644
index 000000000..ba768141c
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/clone.S
@@ -0,0 +1,41 @@
+/* This is untested code which probably won´t work out of the box! */
+
+#include "syscalls.h"
+#include <errno.h>
+
+.text
+.globl __clone
+.proc __clone
+.weak __clone2
+__clone2:
+__clone:
+ mov r8 = EINVAL
+ cmp.eq p6,p0=0,r32
+(p6) br.cond.spnt.few __error_unified_syscall
+ cmp.eq p6,p0=0,r33
+(p6) br.cond.spnt.few __error_unified_syscall
+ flushrs
+
+ mov.m r17 = ar.rsc
+ mov r14 = r32
+ mov r18 = r33
+ mov r16 = r36;;
+ mov r15 = __NR_clone2
+ break 0x100000
+ cmp.eq p6,p0=-1,r10
+(p6) br.cond.spnt.few __error_unified_syscall
+ cmp.eq p6,p7=0,r8
+(p6) ld8 r34=[r14],8
+(p6) mov.m ar.bspstore=r18
+(p6) mov r32 = r16
+ mov.m ar.rsc = r17
+(p7) br.ret.sptk b0
+ ld8 r1 = [r14]
+ mov b6 = r34
+ br.call.dptk.few b0=b6
+ mov r32 = r8
+ br.call.dptk.few b0=__error_unified_syscall
+ br.ret.sptk.few b0
+.endp __clone
+.endp __clone2
+.size __clone, . - __clone
diff --git a/mdk-stage1/dietlibc/ia64/connect.S b/mdk-stage1/dietlibc/ia64/connect.S
new file mode 100644
index 000000000..5fbd151ae
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/connect.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(connect, connect);
diff --git a/mdk-stage1/dietlibc/ia64/fork.S b/mdk-stage1/dietlibc/ia64/fork.S
new file mode 100644
index 000000000..3b253a80b
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/fork.S
@@ -0,0 +1,8 @@
+#include "syscalls.h"
+
+.text
+.globl fork
+fork:
+ mov r15 = __NR_clone
+ mov r32 = 17
+ br __unified_syscall
diff --git a/mdk-stage1/dietlibc/ia64/getpeername.S b/mdk-stage1/dietlibc/ia64/getpeername.S
new file mode 100644
index 000000000..fdaa1038a
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/getpeername.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getpeername, getpeername);
diff --git a/mdk-stage1/dietlibc/ia64/getsockname.S b/mdk-stage1/dietlibc/ia64/getsockname.S
new file mode 100644
index 000000000..1ea0bc000
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/getsockname.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getsockname, getsockname);
diff --git a/mdk-stage1/dietlibc/ia64/getsockopt.S b/mdk-stage1/dietlibc/ia64/getsockopt.S
new file mode 100644
index 000000000..465c4e08e
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/getsockopt.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getsockopt, getsockopt);
diff --git a/mdk-stage1/dietlibc/ia64/listen.S b/mdk-stage1/dietlibc/ia64/listen.S
new file mode 100644
index 000000000..66a3fe376
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/listen.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(listen, listen);
diff --git a/mdk-stage1/dietlibc/ia64/mmap.S b/mdk-stage1/dietlibc/ia64/mmap.S
new file mode 100644
index 000000000..cca4bbdbb
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/mmap.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall (mmap, mmap)
diff --git a/mdk-stage1/dietlibc/ia64/pipe.S b/mdk-stage1/dietlibc/ia64/pipe.S
new file mode 100644
index 000000000..c3bf4570b
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/pipe.S
@@ -0,0 +1,20 @@
+#include "syscalls.h"
+
+.text
+.globl pipe
+.proc pipe
+
+pipe:
+ st8 [r12] = r32
+ mov r15 = __NR_pipe
+ break.i 0x100000
+ ld8 r2 = [r12]
+ cmp.eq p7,p6=-1,r10
+(p6) st4 [r2] = r8,4
+ mov r8 = r0
+(p7) br.cond.spnt.few __error_unified_syscall
+(p6) st4 [r2] = r9
+(p6) br.ret.sptk.few b0
+
+.endp pipe
+.size pipe, . - pipe
diff --git a/mdk-stage1/dietlibc/ia64/recv.S b/mdk-stage1/dietlibc/ia64/recv.S
new file mode 100644
index 000000000..1f1640390
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/recv.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(recv, recv);
diff --git a/mdk-stage1/dietlibc/ia64/recvfrom.S b/mdk-stage1/dietlibc/ia64/recvfrom.S
new file mode 100644
index 000000000..d3c2e602f
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/recvfrom.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(recvfrom, recvfrom);
diff --git a/mdk-stage1/dietlibc/ia64/recvmsg.S b/mdk-stage1/dietlibc/ia64/recvmsg.S
new file mode 100644
index 000000000..cfbbafdc1
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/recvmsg.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(recvmsg, recvmsg);
diff --git a/mdk-stage1/dietlibc/ia64/send.S b/mdk-stage1/dietlibc/ia64/send.S
new file mode 100644
index 000000000..38f47f398
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/send.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(send, send);
diff --git a/mdk-stage1/dietlibc/ia64/sendmsg.S b/mdk-stage1/dietlibc/ia64/sendmsg.S
new file mode 100644
index 000000000..c2bc80f72
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/sendmsg.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(sendmsg, sendmsg);
diff --git a/mdk-stage1/dietlibc/ia64/sendto.S b/mdk-stage1/dietlibc/ia64/sendto.S
new file mode 100644
index 000000000..1579a3b45
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/sendto.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(sendto, sendto);
diff --git a/mdk-stage1/dietlibc/ia64/setjmp.S b/mdk-stage1/dietlibc/ia64/setjmp.S
new file mode 100644
index 000000000..f0f5bc431
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/setjmp.S
@@ -0,0 +1 @@
+/* No, I am not going to save 128 registers */
diff --git a/mdk-stage1/dietlibc/ia64/setsockopt.S b/mdk-stage1/dietlibc/ia64/setsockopt.S
new file mode 100644
index 000000000..45fcfbb6c
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/setsockopt.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setsockopt, setsockopt);
diff --git a/mdk-stage1/dietlibc/ia64/shutdown.S b/mdk-stage1/dietlibc/ia64/shutdown.S
new file mode 100644
index 000000000..024e99e18
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/shutdown.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(shutdown, shutdown);
diff --git a/mdk-stage1/dietlibc/ia64/socket.S b/mdk-stage1/dietlibc/ia64/socket.S
new file mode 100644
index 000000000..cc453881f
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/socket.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(socket, socket);
diff --git a/mdk-stage1/dietlibc/ia64/socketpair.S b/mdk-stage1/dietlibc/ia64/socketpair.S
new file mode 100644
index 000000000..d92eaa4d8
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/socketpair.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(socketpair, socketpair);
diff --git a/mdk-stage1/dietlibc/ia64/start.S b/mdk-stage1/dietlibc/ia64/start.S
new file mode 100644
index 000000000..dbacb25f6
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/start.S
@@ -0,0 +1,45 @@
+/*
+ Copyright (C) 2002 Thomas M. Ogrisegg
+
+ This is free software. You can redistribute and
+ modify it under the terms of the GNU General Public
+ Public License.
+
+ This file is part of the IA64-Port of the dietlibc
+
+ start.S
+ Implemenation of the _start startup function
+*/
+
+.psr abi64
+.psr lsb
+.lsb
+
+.text
+.globl _start
+.proc _start
+
+_start:
+ alloc r2 = ar.pfs,0,0,7,0
+ adds out1 = 16, sp /* base arguments */
+ movl gp = @gprel(0f) /* base offset */
+ ;;
+0:
+ ld8 out0 = [out1], 8 /* load argc and set argv */
+ mov r9 = ip
+ ;;
+ shladd out2=out0,3,out1 /* envp = argv+8*argc */
+ sub gp = r9, gp /* subtract program counter */
+ ;;
+ addl r15 = @ltoff(environ#), gp /* offset to environ */
+ adds out2 = 8, out2 /* envp += 8 */
+ ;;
+ ld8 r14 = [r15]
+ ;;
+ st8 [r14] = out2 /* store envp in environ */
+ br.call.sptk.few rp = main /* call main */
+ ;;
+ mov r32 = r8 /* store return code */
+ br _exit /* branch to _exit */
+.endp _start
+.size _start, . - _start
diff --git a/mdk-stage1/dietlibc/ia64/syscalls.h b/mdk-stage1/dietlibc/ia64/syscalls.h
new file mode 100644
index 000000000..65eda0ed2
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/syscalls.h
@@ -0,0 +1,242 @@
+#ifndef __DLIBC_SYSCALL_H_
+#define __DLIBC_SYSCALL_H_
+
+#define __NR_ni_syscall 1024
+#define __NR_exit 1025
+#define __NR_read 1026
+#define __NR_write 1027
+#define __NR_open 1028
+#define __NR_close 1029
+#define __NR_creat 1030
+#define __NR_link 1031
+#define __NR_unlink 1032
+#define __NR_execve 1033
+#define __NR_chdir 1034
+#define __NR_fchdir 1035
+#define __NR_utimes 1036
+#define __NR_mknod 1037
+#define __NR_chmod 1038
+#define __NR_chown 1039
+#define __NR_lseek 1040
+#define __NR_getpid 1041
+#define __NR_getppid 1042
+#define __NR_mount 1043
+#define __NR_umount 1044
+#define __NR_setuid 1045
+#define __NR_getuid 1046
+#define __NR_geteuid 1047
+#define __NR_ptrace 1048
+#define __NR_access 1049
+#define __NR_sync 1050
+#define __NR_fsync 1051
+#define __NR_fdatasync 1052
+#define __NR_kill 1053
+#define __NR_rename 1054
+#define __NR_mkdir 1055
+#define __NR_rmdir 1056
+#define __NR_dup 1057
+#define __NR_pipe 1058
+#define __NR_times 1059
+#define __NR_brk 1060
+#define __NR_setgid 1061
+#define __NR_getgid 1062
+#define __NR_getegid 1063
+#define __NR_acct 1064
+#define __NR_ioctl 1065
+#define __NR_fcntl 1066
+#define __NR_umask 1067
+#define __NR_chroot 1068
+#define __NR_ustat 1069
+#define __NR_dup2 1070
+#define __NR_setreuid 1071
+#define __NR_setregid 1072
+#define __NR_getresuid 1073
+#define __NR_setresuid 1074
+#define __NR_getresgid 1075
+#define __NR_setresgid 1076
+#define __NR_getgroups 1077
+#define __NR_setgroups 1078
+#define __NR_getpgid 1079
+#define __NR_setpgid 1080
+#define __NR_setsid 1081
+#define __NR_getsid 1082
+#define __NR_sethostname 1083
+#define __NR_setrlimit 1084
+#define __NR_getrlimit 1085
+#define __NR_getrusage 1086
+#define __NR_gettimeofday 1087
+#define __NR_settimeofday 1088
+#define __NR_select 1089
+#define __NR_poll 1090
+#define __NR_symlink 1091
+#define __NR_readlink 1092
+#define __NR_uselib 1093
+#define __NR_swapon 1094
+#define __NR_swapoff 1095
+#define __NR_reboot 1096
+#define __NR_truncate 1097
+#define __NR_ftruncate 1098
+#define __NR_fchmod 1099
+#define __NR_fchown 1100
+#define __NR_getpriority 1101
+#define __NR_setpriority 1102
+#define __NR_statfs 1103
+#define __NR_fstatfs 1104
+#define __NR_gettid 1105
+#define __NR_semget 1106
+#define __NR_semop 1107
+#define __NR_semctl 1108
+#define __NR_msgget 1109
+#define __NR_msgsnd 1110
+#define __NR_msgrcv 1111
+#define __NR_msgctl 1112
+#define __NR_shmget 1113
+#define __NR_shmat 1114
+#define __NR_shmdt 1115
+#define __NR_shmctl 1116
+#define __NR_syslog 1117
+#define __NR_setitimer 1118
+#define __NR_getitimer 1119
+#define __NR_old_stat 1120
+#define __NR_old_lstat 1121
+#define __NR_old_fstat 1122
+#define __NR_vhangup 1123
+#define __NR_lchown 1124
+#define __NR_vm86 1125
+#define __NR_wait4 1126
+#define __NR_sysinfo 1127
+#define __NR_clone 1128
+#define __NR_setdomainname 1129
+#define __NR_uname 1130
+#define __NR_adjtimex 1131
+#define __NR_create_module 1132
+#define __NR_init_module 1133
+#define __NR_delete_module 1134
+#define __NR_get_kernel_syms 1135
+#define __NR_query_module 1136
+#define __NR_quotactl 1137
+#define __NR_bdflush 1138
+#define __NR_sysfs 1139
+#define __NR_personality 1140
+#define __NR_afs_syscall 1141
+#define __NR_setfsuid 1142
+#define __NR_setfsgid 1143
+#define __NR_getdents 1144
+#define __NR_flock 1145
+#define __NR_readv 1146
+#define __NR_writev 1147
+#define __NR_pread 1148
+#define __NR_pwrite 1149
+#define __NR__sysctl 1150
+#define __NR_mmap 1151
+#define __NR_munmap 1152
+#define __NR_mlock 1153
+#define __NR_mlockall 1154
+#define __NR_mprotect 1155
+#define __NR_mremap 1156
+#define __NR_msync 1157
+#define __NR_munlock 1158
+#define __NR_munlockall 1159
+#define __NR_sched_getparam 1160
+#define __NR_sched_setparam 1161
+#define __NR_sched_getscheduler 1162
+#define __NR_sched_setscheduler 1163
+#define __NR_sched_yield 1164
+#define __NR_sched_get_priority_max 1165
+#define __NR_sched_get_priority_min 1166
+#define __NR_sched_rr_get_interval 1167
+#define __NR_nanosleep 1168
+#define __NR_nfsservctl 1169
+#define __NR_prctl 1170
+#define __NR_mmap2 1172
+#define __NR_pciconfig_read 1173
+#define __NR_pciconfig_write 1174
+#define __NR_perfmonctl 1175
+#define __NR_sigaltstack 1176
+#define __NR_rt_sigaction 1177
+#define __NR_rt_sigpending 1178
+#define __NR_rt_sigprocmask 1179
+#define __NR_rt_sigqueueinfo 1180
+#define __NR_rt_sigreturn 1181
+#define __NR_rt_sigsuspend 1182
+#define __NR_rt_sigtimedwait 1183
+#define __NR_getcwd 1184
+#define __NR_capget 1185
+#define __NR_capset 1186
+#define __NR_sendfile 1187
+#define __NR_getpmsg 1188
+#define __NR_putpmsg 1189
+#define __NR_socket 1190
+#define __NR_bind 1191
+#define __NR_connect 1192
+#define __NR_listen 1193
+#define __NR_accept 1194
+#define __NR_getsockname 1195
+#define __NR_getpeername 1196
+#define __NR_socketpair 1197
+#define __NR_send 1198
+#define __NR_sendto 1199
+#define __NR_recv 1200
+#define __NR_recvfrom 1201
+#define __NR_shutdown 1202
+#define __NR_setsockopt 1203
+#define __NR_getsockopt 1204
+#define __NR_sendmsg 1205
+#define __NR_recvmsg 1206
+#define __NR_pivot_root 1207
+#define __NR_mincore 1208
+#define __NR_madvise 1209
+#define __NR_stat 1210
+#define __NR_lstat 1211
+#define __NR_fstat 1212
+#define __NR_clone2 1213
+#define __NR_getdents64 1214
+#define __NR_getunwind 1215
+#define __NR_readahead 1216
+#define __NR_setxattr 1217
+#define __NR_lsetxattr 1218
+#define __NR_fsetxattr 1219
+#define __NR_getxattr 1220
+#define __NR_lgetxattr 1221
+#define __NR_fgetxattr 1222
+#define __NR_listxattr 1223
+#define __NR_llistxattr 1224
+#define __NR_flistxattr 1225
+#define __NR_removexattr 1226
+#define __NR_lremovexattr 1227
+#define __NR_fremovexattr 1228
+#define __NR_tkill 1229
+#define __NR_futex 1230
+#define __NR_sched_setaffinity 1231
+#define __NR_sched_getaffinity 1232
+#define __NR_security 1233
+#define __NR_alloc_hugepages 1234
+#define __NR_free_hugepages 1235
+#define __NR_exit_group 1236
+#define __NR_lookup_dcookie 1237
+#define __NR_io_setup 1238
+#define __NR_io_destroy 1239
+#define __NR_io_getevents 1240
+#define __NR_io_submit 1241
+#define __NR_io_cancel 1242
+#define __NR_epoll_create 1243
+#define __NR_epoll_ctl 1244
+#define __NR_epoll_wait 1245
+
+#define syscall(name, sym) \
+.text; \
+.globl sym; \
+sym: \
+ mov r15 = __NR_##name; \
+ br __unified_syscall;
+
+#define syscall_weak(name, sym, wsym) \
+.text; \
+.weak wsym; \
+wsym: \
+.globl sym; \
+sym: \
+ mov r15 = __NR_##name; \
+ br __unified_syscall;
+
+#endif
diff --git a/mdk-stage1/dietlibc/ia64/unified.S b/mdk-stage1/dietlibc/ia64/unified.S
new file mode 100644
index 000000000..998fba75e
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/unified.S
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2002 Thomas M. Ogrisegg
+
+ This is free software. You can redistribute and
+ modify it under the terms of the GNU General Public
+ Public License.
+
+ This file is part of the ia64-Port of dietlibc
+
+ unified.S
+ General system-call interface
+*/
+
+.lsb
+
+.text
+
+.globl __unified_syscall
+.proc __unified_syscall
+.globl __error_unified_syscall
+.proc __error_unified_syscall
+.globl _exit
+.proc _exit
+
+_exit:
+ mov r15 = 1025
+.endp _exit
+.size _exit, . - _exit
+
+__unified_syscall:
+ break.i 0x100000
+ movl r2=errno
+ cmp.eq p6,p0=-1,r10
+ ;;
+__error_unified_syscall:
+(p6) st4 [r2]=r8
+(p6) mov r8=-1
+
+#include "dietuglyweaks.h"
+
+ br.ret.sptk.few rp
+
+.endp __unified_syscall
+.endp __error_unified_syscall
+.size __unified_syscall, __error_unified_syscall - __unified_syscall
+.size __error_unified_syscall, . - __error_unified_syscall
diff --git a/mdk-stage1/dietlibc/ia64/utime.S b/mdk-stage1/dietlibc/ia64/utime.S
new file mode 100644
index 000000000..a9a8aada6
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/utime.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(utimes,utime)
diff --git a/mdk-stage1/dietlibc/ia64/vfork.S b/mdk-stage1/dietlibc/ia64/vfork.S
new file mode 100644
index 000000000..e59f04364
--- /dev/null
+++ b/mdk-stage1/dietlibc/ia64/vfork.S
@@ -0,0 +1,8 @@
+#include "syscalls.h"
+
+.text
+.globl vfork
+vfork:
+ mov r15 = __NR_clone
+ mov r32 = 16657
+ br __unified_syscall
diff --git a/mdk-stage1/dietlibc/include/alloca.h b/mdk-stage1/dietlibc/include/alloca.h
index e69de29bb..41f92354f 100644
--- a/mdk-stage1/dietlibc/include/alloca.h
+++ b/mdk-stage1/dietlibc/include/alloca.h
@@ -0,0 +1,13 @@
+#ifndef _ALLOCA_H
+#define _ALLOCA_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+#ifdef __GNUC__
+#define alloca(x) __builtin_alloca(x)
+#else
+void *alloca(size_t size) __THROW;
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/arpa/inet.h b/mdk-stage1/dietlibc/include/arpa/inet.h
index 6d5a6dc35..bb278d399 100644
--- a/mdk-stage1/dietlibc/include/arpa/inet.h
+++ b/mdk-stage1/dietlibc/include/arpa/inet.h
@@ -9,6 +9,7 @@ int inet_aton(const char *cp, struct in_addr *inp) __THROW;
unsigned long int inet_addr(const char *cp) __THROW;
unsigned long int inet_network(const char *cp) __THROW;
char *inet_ntoa(struct in_addr in) __THROW;
+char *inet_ntoa_r(struct in_addr in,char* buf) __THROW;
struct in_addr inet_makeaddr(int net, int host) __THROW;
unsigned long int inet_lnaof(struct in_addr in) __THROW;
unsigned long int inet_netof(struct in_addr in) __THROW;
diff --git a/mdk-stage1/dietlibc/include/arpa/nameser.h b/mdk-stage1/dietlibc/include/arpa/nameser.h
index 1ee048d66..9327006b0 100644
--- a/mdk-stage1/dietlibc/include/arpa/nameser.h
+++ b/mdk-stage1/dietlibc/include/arpa/nameser.h
@@ -89,6 +89,42 @@ typedef enum __ns_class {
ns_c_max = 65536
} ns_class;
+/*
+ * Currently defined opcodes.
+ */
+typedef enum __ns_opcode {
+ ns_o_query = 0, /* Standard query. */
+ ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */
+ ns_o_status = 2, /* Name server status query (unsupported). */
+ /* Opcode 3 is undefined/reserved. */
+ ns_o_notify = 4, /* Zone change notification. */
+ ns_o_update = 5, /* Zone update message. */
+ ns_o_max = 6
+} ns_opcode;
+
+/*
+ * Currently defined response codes.
+ */
+typedef enum __ns_rcode {
+ ns_r_noerror = 0, /* No error occurred. */
+ ns_r_formerr = 1, /* Format error. */
+ ns_r_servfail = 2, /* Server failure. */
+ ns_r_nxdomain = 3, /* Name error. */
+ ns_r_notimpl = 4, /* Unimplemented. */
+ ns_r_refused = 5, /* Operation refused. */
+ /* these are for BIND_UPDATE */
+ ns_r_yxdomain = 6, /* Name exists */
+ ns_r_yxrrset = 7, /* RRset exists */
+ ns_r_nxrrset = 8, /* RRset does not exist */
+ ns_r_notauth = 9, /* Not authoritative for zone */
+ ns_r_notzone = 10, /* Zone of record different from zone section */
+ ns_r_max = 11,
+ /* The following are TSIG extended errors */
+ ns_r_badsig = 16,
+ ns_r_badkey = 17,
+ ns_r_badtime = 18
+} ns_rcode;
+
typedef struct {
unsigned id :16; /* query identification number */
#if BYTE_ORDER == BIG_ENDIAN
diff --git a/mdk-stage1/dietlibc/include/assert.h b/mdk-stage1/dietlibc/include/assert.h
index bb573d0f2..b135369b8 100644
--- a/mdk-stage1/dietlibc/include/assert.h
+++ b/mdk-stage1/dietlibc/include/assert.h
@@ -4,14 +4,18 @@
#include <sys/cdefs.h>
/* This prints an "Assertion failed" message and aborts. */
-extern void __assert_fail (__const char *__assertion, __const char *__file,
- unsigned int __line, __const char *__function)
+extern void __assert_fail (const char *__assertion, const char *__file,
+ unsigned int __line, const char *__function)
__THROW __attribute__ ((__noreturn__));
#ifdef __PRETTY_FUNCTION__
#define __ASSERT_FUNCTION __PRETTY_FUNCTION__
#else
-#define __ASSERT_FUNCTION __func__
+# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+# define __ASSERT_FUNCTION __func__
+# else
+# define __ASSERT_FUNCTION ((const char *) 0)
+# endif
#endif
#undef assert
diff --git a/mdk-stage1/dietlibc/include/cpio.h b/mdk-stage1/dietlibc/include/cpio.h
new file mode 100644
index 000000000..a18c2fbb6
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/cpio.h
@@ -0,0 +1,27 @@
+#ifndef _CPIO_H_
+#define _CPIO_H_
+
+#define C_IRUSR 0000400
+#define C_IWUSR 0000200
+#define C_IXUSR 0000100
+#define C_IRGRP 0000040
+#define C_IWGRP 0000020
+#define C_IXGRP 0000010
+#define C_IROTH 0000004
+#define C_IWOTH 0000002
+#define C_IXOTH 0000001
+#define C_ISUID 0004000
+#define C_ISGID 0002000
+#define C_ISVTX 0001000
+#define C_ISDIR 0040000
+#define C_ISFIFO 0010000
+#define C_ISREG 0100000
+#define C_ISBLK 0060000
+#define C_ISCHR 0020000
+#define C_ISCTG 0110000
+#define C_ISLNK 0120000
+#define C_ISSOCK 0140000
+
+#define MAGIC "070707"
+
+#endif /* _CPIO_H_ */
diff --git a/mdk-stage1/dietlibc/include/daemon.h b/mdk-stage1/dietlibc/include/daemon.h
index 9049f367d..e2413d42b 100644
--- a/mdk-stage1/dietlibc/include/daemon.h
+++ b/mdk-stage1/dietlibc/include/daemon.h
@@ -1,6 +1,6 @@
#ifndef _DAEMON_H
#define _DAEMON_H
-extern int daemon (int nochdir,int noclose);
+#include <unistd.h>
#endif
diff --git a/mdk-stage1/dietlibc/include/dietref.h b/mdk-stage1/dietlibc/include/dietref.h
new file mode 100644
index 000000000..99d446300
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/dietref.h
@@ -0,0 +1,22 @@
+/* diet includes this file to create linker dependencies on the diet
+ * libc, so trying to link an object file compiled with diet against
+ * glibc will fail. */
+
+#ifndef NODIETREF
+#include <endian.h>
+#ifdef __ASSEMBLER__
+.section .note
+#if (__WORDSIZE == 64)
+.quad __you_tried_to_link_a_dietlibc_object_against_glibc
+#else
+.long __you_tried_to_link_a_dietlibc_object_against_glibc
+#endif
+.previous
+#else
+#if (__WORDSIZE == 64)
+__asm__ (".section .note\n\t.quad __you_tried_to_link_a_dietlibc_object_against_glibc\n\t.previous");
+#else
+__asm__ (".section .note\n\t.long __you_tried_to_link_a_dietlibc_object_against_glibc\n\t.previous");
+#endif
+#endif
+#endif
diff --git a/mdk-stage1/dietlibc/include/dirent.h b/mdk-stage1/dietlibc/include/dirent.h
index b0ad4f5ec..636ebc2b0 100644
--- a/mdk-stage1/dietlibc/include/dirent.h
+++ b/mdk-stage1/dietlibc/include/dirent.h
@@ -3,15 +3,30 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <limits.h>
-#include <linux/dirent.h>
+struct dirent {
+ long d_ino;
+ off_t d_off;
+ unsigned short d_reclen;
+ char d_name[256]; /* We must not include limits.h! */
+};
+
+#ifndef __STRICT_ANSI__
+struct dirent64 {
+ uint64_t d_ino;
+ int64_t d_off;
+ unsigned short d_reclen;
+ unsigned char d_type;
+ char d_name[256];
+};
+#endif
#define d_fileno d_ino /* Backwards compatibility. */
#undef _DIRENT_HAVE_D_NAMLEN
#define _DIRENT_HAVE_D_RECLEN
#define _DIRENT_HAVE_D_OFF
-#define _DIRENT_HAVE_D_TYPE
typedef struct __dirstream DIR;
@@ -23,4 +38,21 @@ void rewinddir (DIR *__dirp) __THROW;
void seekdir (DIR *__dirp, long int __pos) __THROW;
long int telldir (DIR *__dirp) __THROW;
+int scandir(const char *dir, struct dirent ***namelist,
+ int (*selection)(const struct dirent *),
+ int (*compar)(const struct dirent **, const struct dirent **)) __THROW;
+
+int alphasort(const struct dirent **a, const struct dirent **b) __THROW __attribute__((const));
+
+#define MAXNAMLEN NAME_MAX
+
+#ifdef _BSD_SOURCE
+extern int dirfd(DIR *dirp) __THROW;
+#endif
+
+#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
+#define dirent dirent64
+#define readdir readdir64
+#endif
+
#endif
diff --git a/mdk-stage1/dietlibc/include/dlfcn.h b/mdk-stage1/dietlibc/include/dlfcn.h
index b96f8f615..5195cc41f 100644
--- a/mdk-stage1/dietlibc/include/dlfcn.h
+++ b/mdk-stage1/dietlibc/include/dlfcn.h
@@ -7,6 +7,8 @@
#define RTLD_LOCAL 0x00000
#define RTLD_GLOBAL 0x10000
+#define RTLD_DEFAULT ((void*)1)
+
void *dlopen (const char *filename, int flag);
const char *dlerror(void);
void *dlsym(void *handle, char *symbol);
diff --git a/mdk-stage1/dietlibc/include/elf.h b/mdk-stage1/dietlibc/include/elf.h
index be09dbee4..7b198bad3 100644
--- a/mdk-stage1/dietlibc/include/elf.h
+++ b/mdk-stage1/dietlibc/include/elf.h
@@ -1 +1,780 @@
-#include <linux/elf.h>
+#ifndef _ELF_H
+#define _ELF_H
+
+#include <inttypes.h>
+
+/* 32-bit ELF base types. */
+typedef uint32_t Elf32_Addr;
+typedef uint16_t Elf32_Half;
+typedef uint32_t Elf32_Off;
+typedef int32_t Elf32_Sword;
+typedef uint32_t Elf32_Word;
+
+/* 64-bit ELF base types. */
+typedef uint64_t Elf64_Addr;
+typedef uint16_t Elf64_Half;
+typedef int16_t Elf64_SHalf;
+typedef uint64_t Elf64_Off;
+typedef int32_t Elf64_Sword;
+typedef uint32_t Elf64_Word;
+typedef uint64_t Elf64_Xword;
+typedef int64_t Elf64_Sxword;
+
+/* These constants are for the segment types stored in the image headers */
+#define PT_NULL 0
+#define PT_LOAD 1
+#define PT_DYNAMIC 2
+#define PT_INTERP 3
+#define PT_NOTE 4
+#define PT_SHLIB 5
+#define PT_PHDR 6
+#define PT_LOPROC 0x70000000
+#define PT_HIPROC 0x7fffffff
+#define PT_MIPS_REGINFO 0x70000000
+
+/* Flags in the e_flags field of the header */
+#define EF_MIPS_NOREORDER 0x00000001
+#define EF_MIPS_PIC 0x00000002
+#define EF_MIPS_CPIC 0x00000004
+#define EF_MIPS_ARCH 0xf0000000
+
+/* These constants define the different elf file types */
+#define ET_NONE 0
+#define ET_REL 1
+#define ET_EXEC 2
+#define ET_DYN 3
+#define ET_CORE 4
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
+
+/* These constants define the various ELF target machines */
+#define EM_NONE 0
+#define EM_M32 1
+#define EM_SPARC 2
+#define EM_386 3
+#define EM_68K 4
+#define EM_88K 5
+#define EM_486 6 /* Perhaps disused */
+#define EM_860 7
+
+#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */
+#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */
+
+#define EM_PARISC 15 /* HPPA */
+#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
+#define EM_PPC 20 /* PowerPC */
+#define EM_S390 22 /* IBM S/390 */
+
+#define EM_ARM 40 /* ARM */
+#define EM_SH 42 /* SuperH */
+#define EM_SPARCV9 43 /* SPARC v9 64-bit */
+#define EM_IA_64 50 /* HP/Intel IA-64 */
+#define EM_X86_64 62 /* AMD x86-64 */
+#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
+
+/*
+ * This is an interim value that we will use until the committee comes
+ * up with a final number.
+ */
+#define EM_ALPHA 0x9026
+
+/*
+ * This is the old interim value for S/390 architecture
+ */
+#define EM_S390_OLD 0xA390
+
+/* This is the info that is needed to parse the dynamic section of the file */
+#define DT_NULL 0
+#define DT_NEEDED 1
+#define DT_PLTRELSZ 2
+#define DT_PLTGOT 3
+#define DT_HASH 4
+#define DT_STRTAB 5
+#define DT_SYMTAB 6
+#define DT_RELA 7
+#define DT_RELASZ 8
+#define DT_RELAENT 9
+#define DT_STRSZ 10
+#define DT_SYMENT 11
+#define DT_INIT 12
+#define DT_FINI 13
+#define DT_SONAME 14
+#define DT_RPATH 15
+#define DT_SYMBOLIC 16
+#define DT_REL 17
+#define DT_RELSZ 18
+#define DT_RELENT 19
+#define DT_PLTREL 20
+#define DT_DEBUG 21
+#define DT_TEXTREL 22
+#define DT_JMPREL 23
+#define DT_NUM 24
+#define DT_LOPROC 0x70000000
+#define DT_HIPROC 0x7fffffff
+#define DT_MIPS_RLD_VERSION 0x70000001
+#define DT_MIPS_TIME_STAMP 0x70000002
+#define DT_MIPS_ICHECKSUM 0x70000003
+#define DT_MIPS_IVERSION 0x70000004
+#define DT_MIPS_FLAGS 0x70000005
+ #define RHF_NONE 0
+ #define RHF_HARDWAY 1
+ #define RHF_NOTPOT 2
+#define DT_MIPS_BASE_ADDRESS 0x70000006
+#define DT_MIPS_CONFLICT 0x70000008
+#define DT_MIPS_LIBLIST 0x70000009
+#define DT_MIPS_LOCAL_GOTNO 0x7000000a
+#define DT_MIPS_CONFLICTNO 0x7000000b
+#define DT_MIPS_LIBLISTNO 0x70000010
+#define DT_MIPS_SYMTABNO 0x70000011
+#define DT_MIPS_UNREFEXTNO 0x70000012
+#define DT_MIPS_GOTSYM 0x70000013
+#define DT_MIPS_HIPAGENO 0x70000014
+#define DT_MIPS_RLD_MAP 0x70000016
+
+/* This info is needed when parsing the symbol table */
+#define STB_LOCAL 0
+#define STB_GLOBAL 1
+#define STB_WEAK 2
+
+#define STT_NOTYPE 0
+#define STT_OBJECT 1
+#define STT_FUNC 2
+#define STT_SECTION 3
+#define STT_FILE 4
+
+#define ELF32_ST_BIND(x) ((x) >> 4)
+#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
+
+#define ELF64_ST_BIND(val) ELF32_ST_BIND (val)
+#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val)
+
+/* Symbolic values for the entries in the auxiliary table
+ put on the initial stack */
+#define AT_NULL 0 /* end of vector */
+#define AT_IGNORE 1 /* entry should be ignored */
+#define AT_EXECFD 2 /* file descriptor of program */
+#define AT_PHDR 3 /* program headers for program */
+#define AT_PHENT 4 /* size of program header entry */
+#define AT_PHNUM 5 /* number of program headers */
+#define AT_PAGESZ 6 /* system page size */
+#define AT_BASE 7 /* base address of interpreter */
+#define AT_FLAGS 8 /* flags */
+#define AT_ENTRY 9 /* entry point of program */
+#define AT_NOTELF 10 /* program is not ELF */
+#define AT_UID 11 /* real uid */
+#define AT_EUID 12 /* effective uid */
+#define AT_GID 13 /* real gid */
+#define AT_EGID 14 /* effective gid */
+#define AT_PLATFORM 15 /* string identifying CPU for optimizations */
+#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */
+#define AT_CLKTCK 17 /* frequency at which times() increments */
+
+typedef struct dynamic{
+ Elf32_Sword d_tag;
+ union{
+ Elf32_Sword d_val;
+ Elf32_Addr d_ptr;
+ } d_un;
+} Elf32_Dyn;
+
+typedef struct {
+ Elf64_Sxword d_tag; /* entry tag value */
+ union {
+ Elf64_Xword d_val;
+ Elf64_Addr d_ptr;
+ } d_un;
+} Elf64_Dyn;
+
+/* The following are used with relocations */
+#define ELF32_R_SYM(x) ((x) >> 8)
+#define ELF32_R_TYPE(x) ((x) & 0xff)
+
+#define ELF64_R_SYM(x) ((x) >> 32)
+#define ELF64_R_TYPE(x) ((x) & 0xffffffff)
+
+#define R_386_NONE 0
+#define R_386_32 1
+#define R_386_PC32 2
+#define R_386_GOT32 3
+#define R_386_PLT32 4
+#define R_386_COPY 5
+#define R_386_GLOB_DAT 6
+#define R_386_JMP_SLOT 7
+#define R_386_RELATIVE 8
+#define R_386_GOTOFF 9
+#define R_386_GOTPC 10
+#define R_386_NUM 11
+
+#define R_MIPS_NONE 0
+#define R_MIPS_16 1
+#define R_MIPS_32 2
+#define R_MIPS_REL32 3
+#define R_MIPS_26 4
+#define R_MIPS_HI16 5
+#define R_MIPS_LO16 6
+#define R_MIPS_GPREL16 7
+#define R_MIPS_LITERAL 8
+#define R_MIPS_GOT16 9
+#define R_MIPS_PC16 10
+#define R_MIPS_CALL16 11
+#define R_MIPS_GPREL32 12
+/* The remaining relocs are defined on Irix, although they are not
+ in the MIPS ELF ABI. */
+#define R_MIPS_UNUSED1 13
+#define R_MIPS_UNUSED2 14
+#define R_MIPS_UNUSED3 15
+#define R_MIPS_SHIFT5 16
+#define R_MIPS_SHIFT6 17
+#define R_MIPS_64 18
+#define R_MIPS_GOT_DISP 19
+#define R_MIPS_GOT_PAGE 20
+#define R_MIPS_GOT_OFST 21
+/*
+ * The following two relocation types are specified in the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_GOTHI16 22
+#define R_MIPS_GOTLO16 23
+#define R_MIPS_SUB 24
+#define R_MIPS_INSERT_A 25
+#define R_MIPS_INSERT_B 26
+#define R_MIPS_DELETE 27
+#define R_MIPS_HIGHER 28
+#define R_MIPS_HIGHEST 29
+/*
+ * The following two relocation types are specified in the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_CALLHI16 30
+#define R_MIPS_CALLLO16 31
+/*
+ * This range is reserved for vendor specific relocations.
+ */
+#define R_MIPS_LOVENDOR 100
+#define R_MIPS_HIVENDOR 127
+
+
+/*
+ * Sparc ELF relocation types
+ */
+#define R_SPARC_NONE 0
+#define R_SPARC_8 1
+#define R_SPARC_16 2
+#define R_SPARC_32 3
+#define R_SPARC_DISP8 4
+#define R_SPARC_DISP16 5
+#define R_SPARC_DISP32 6
+#define R_SPARC_WDISP30 7
+#define R_SPARC_WDISP22 8
+#define R_SPARC_HI22 9
+#define R_SPARC_22 10
+#define R_SPARC_13 11
+#define R_SPARC_LO10 12
+#define R_SPARC_GOT10 13
+#define R_SPARC_GOT13 14
+#define R_SPARC_GOT22 15
+#define R_SPARC_PC10 16
+#define R_SPARC_PC22 17
+#define R_SPARC_WPLT30 18
+#define R_SPARC_COPY 19
+#define R_SPARC_GLOB_DAT 20
+#define R_SPARC_JMP_SLOT 21
+#define R_SPARC_RELATIVE 22
+#define R_SPARC_UA32 23
+#define R_SPARC_PLT32 24
+#define R_SPARC_HIPLT22 25
+#define R_SPARC_LOPLT10 26
+#define R_SPARC_PCPLT32 27
+#define R_SPARC_PCPLT22 28
+#define R_SPARC_PCPLT10 29
+#define R_SPARC_10 30
+#define R_SPARC_11 31
+#define R_SPARC_WDISP16 40
+#define R_SPARC_WDISP19 41
+#define R_SPARC_7 43
+#define R_SPARC_5 44
+#define R_SPARC_6 45
+
+/* Bits present in AT_HWCAP, primarily for Sparc32. */
+
+#define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */
+#define HWCAP_SPARC_STBAR 2
+#define HWCAP_SPARC_SWAP 4
+#define HWCAP_SPARC_MULDIV 8
+#define HWCAP_SPARC_V9 16
+#define HWCAP_SPARC_ULTRA3 32
+
+/*
+ * 68k ELF relocation types
+ */
+#define R_68K_NONE 0
+#define R_68K_32 1
+#define R_68K_16 2
+#define R_68K_8 3
+#define R_68K_PC32 4
+#define R_68K_PC16 5
+#define R_68K_PC8 6
+#define R_68K_GOT32 7
+#define R_68K_GOT16 8
+#define R_68K_GOT8 9
+#define R_68K_GOT32O 10
+#define R_68K_GOT16O 11
+#define R_68K_GOT8O 12
+#define R_68K_PLT32 13
+#define R_68K_PLT16 14
+#define R_68K_PLT8 15
+#define R_68K_PLT32O 16
+#define R_68K_PLT16O 17
+#define R_68K_PLT8O 18
+#define R_68K_COPY 19
+#define R_68K_GLOB_DAT 20
+#define R_68K_JMP_SLOT 21
+#define R_68K_RELATIVE 22
+
+/*
+ * Alpha ELF relocation types
+ */
+#define R_ALPHA_NONE 0 /* No reloc */
+#define R_ALPHA_REFLONG 1 /* Direct 32 bit */
+#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */
+#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */
+#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */
+#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */
+#define R_ALPHA_GPDISP 6 /* Add displacement to GP */
+#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */
+#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */
+#define R_ALPHA_SREL16 9 /* PC relative 16 bit */
+#define R_ALPHA_SREL32 10 /* PC relative 32 bit */
+#define R_ALPHA_SREL64 11 /* PC relative 64 bit */
+#define R_ALPHA_OP_PUSH 12 /* OP stack push */
+#define R_ALPHA_OP_STORE 13 /* OP stack pop and store */
+#define R_ALPHA_OP_PSUB 14 /* OP stack subtract */
+#define R_ALPHA_OP_PRSHIFT 15 /* OP stack right shift */
+#define R_ALPHA_GPVALUE 16
+#define R_ALPHA_GPRELHIGH 17
+#define R_ALPHA_GPRELLOW 18
+#define R_ALPHA_IMMED_GP_16 19
+#define R_ALPHA_IMMED_GP_HI32 20
+#define R_ALPHA_IMMED_SCN_HI32 21
+#define R_ALPHA_IMMED_BR_HI32 22
+#define R_ALPHA_IMMED_LO32 23
+#define R_ALPHA_COPY 24 /* Copy symbol at runtime */
+#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */
+#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */
+#define R_ALPHA_RELATIVE 27 /* Adjust by program base */
+
+/* Legal values for e_flags field of Elf64_Ehdr. */
+
+#define EF_ALPHA_32BIT 1 /* All addresses are below 2GB */
+
+/*
+ * PowerPC
+ */
+
+/* Values for Elf32/64_Ehdr.e_flags. */
+#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */
+
+/* Cygnus local bits below */
+#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/
+#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib flag */
+
+/* PowerPC relocations defined by the ABIs */
+#define R_PPC_NONE 0
+#define R_PPC_ADDR32 1 /* 32bit absolute address */
+#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */
+#define R_PPC_ADDR16 3 /* 16bit absolute address */
+#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */
+#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */
+#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */
+#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */
+#define R_PPC_ADDR14_BRTAKEN 8
+#define R_PPC_ADDR14_BRNTAKEN 9
+#define R_PPC_REL24 10 /* PC relative 26 bit */
+#define R_PPC_REL14 11 /* PC relative 16 bit */
+#define R_PPC_REL14_BRTAKEN 12
+#define R_PPC_REL14_BRNTAKEN 13
+#define R_PPC_GOT16 14
+#define R_PPC_GOT16_LO 15
+#define R_PPC_GOT16_HI 16
+#define R_PPC_GOT16_HA 17
+#define R_PPC_PLTREL24 18
+#define R_PPC_COPY 19
+#define R_PPC_GLOB_DAT 20
+#define R_PPC_JMP_SLOT 21
+#define R_PPC_RELATIVE 22
+#define R_PPC_LOCAL24PC 23
+#define R_PPC_UADDR32 24
+#define R_PPC_UADDR16 25
+#define R_PPC_REL32 26
+#define R_PPC_PLT32 27
+#define R_PPC_PLTREL32 28
+#define R_PPC_PLT16_LO 29
+#define R_PPC_PLT16_HI 30
+#define R_PPC_PLT16_HA 31
+#define R_PPC_SDAREL16 32
+#define R_PPC_SECTOFF 33
+#define R_PPC_SECTOFF_LO 34
+#define R_PPC_SECTOFF_HI 35
+#define R_PPC_SECTOFF_HA 36
+/* Keep this the last entry. */
+#define R_PPC_NUM 37
+
+/* The remaining relocs are from the Embedded ELF ABI, and are not
+ in the SVR4 ELF ABI. */
+#define R_PPC_EMB_NADDR32 101
+#define R_PPC_EMB_NADDR16 102
+#define R_PPC_EMB_NADDR16_LO 103
+#define R_PPC_EMB_NADDR16_HI 104
+#define R_PPC_EMB_NADDR16_HA 105
+#define R_PPC_EMB_SDAI16 106
+#define R_PPC_EMB_SDA2I16 107
+#define R_PPC_EMB_SDA2REL 108
+#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */
+#define R_PPC_EMB_MRKREF 110
+#define R_PPC_EMB_RELSEC16 111
+#define R_PPC_EMB_RELST_LO 112
+#define R_PPC_EMB_RELST_HI 113
+#define R_PPC_EMB_RELST_HA 114
+#define R_PPC_EMB_BIT_FLD 115
+#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */
+
+/* Diab tool relocations. */
+#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */
+#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */
+#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */
+#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */
+#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */
+#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */
+
+/* This is a phony reloc to handle any old fashioned TOC16 references
+ that may still be in object files. */
+#define R_PPC_TOC16 255
+
+/*
+ * ARM ELF relocation types
+ */
+#define R_ARM_NONE 0 /* No reloc */
+#define R_ARM_PC24 1 /* PC relative 26 bit branch */
+#define R_ARM_ABS32 2 /* Direct 32 bit */
+#define R_ARM_REL32 3 /* PC relative 32 bit */
+#define R_ARM_PC13 4
+#define R_ARM_ABS16 5 /* Direct 16 bit */
+#define R_ARM_ABS12 6 /* Direct 12 bit */
+#define R_ARM_THM_ABS5 7
+#define R_ARM_ABS8 8 /* Direct 8 bit */
+#define R_ARM_SBREL32 9
+#define R_ARM_THM_PC22 10
+#define R_ARM_THM_PC8 11
+#define R_ARM_AMP_VCALL9 12
+#define R_ARM_SWI24 13
+#define R_ARM_THM_SWI8 14
+#define R_ARM_XPC25 15
+#define R_ARM_THM_XPC22 16
+#define R_ARM_COPY 20 /* Copy symbol at runtime */
+#define R_ARM_GLOB_DAT 21 /* Create GOT entry */
+#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */
+#define R_ARM_RELATIVE 23 /* Adjust by program base */
+#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */
+#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
+#define R_ARM_GOT32 26 /* 32 bit GOT entry */
+#define R_ARM_PLT32 27 /* 32 bit PLT address */
+#define R_ARM_GNU_VTENTRY 100
+#define R_ARM_GNU_VTINHERIT 101
+#define R_ARM_THM_PC11 102 /* thumb unconditional branch */
+#define R_ARM_THM_PC9 103 /* thumb conditional branch */
+#define R_ARM_RXPC25 249
+#define R_ARM_RSBREL32 250
+#define R_ARM_THM_RPC22 251
+#define R_ARM_RREL32 252
+#define R_ARM_RABS22 253
+#define R_ARM_RPC24 254
+#define R_ARM_RBASE 255
+/* Keep this the last entry. */
+#define R_ARM_NUM 256
+
+/* Processor specific flags for the ELF header e_flags field. */
+#define EF_ARM_RELEXEC 0x01
+#define EF_ARM_HASENTRY 0x02
+#define EF_ARM_INTERWORK 0x04
+#define EF_ARM_APCS_26 0x08
+#define EF_ARM_APCS_FLOAT 0x10
+#define EF_ARM_PIC 0x20
+#define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use */
+#define EF_NEW_ABI 0x80
+#define EF_OLD_ABI 0x100
+
+/* Additional symbol types for Thumb */
+#define STT_ARM_TFUNC 0xd
+
+/* AMD x86-64 relocations. */
+#define R_X86_64_NONE 0 /* No reloc */
+#define R_X86_64_64 1 /* Direct 64 bit */
+#define R_X86_64_PC32 2 /* PC relative 32 bit signed */
+#define R_X86_64_GOT32 3 /* 32 bit GOT entry */
+#define R_X86_64_PLT32 4 /* 32 bit PLT address */
+#define R_X86_64_COPY 5 /* Copy symbol at runtime */
+#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
+#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
+#define R_X86_64_RELATIVE 8 /* Adjust by program base */
+#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative
+ offset to GOT */
+#define R_X86_64_32 10 /* Direct 32 bit zero extended */
+#define R_X86_64_32S 11 /* Direct 32 bit sign extended */
+#define R_X86_64_16 12 /* Direct 16 bit zero extended */
+#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
+#define R_X86_64_8 14 /* Direct 8 bit sign extended */
+#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
+#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */
+#define R_X86_64_DTPOFF64 17 /* Offset in module's TLS block */
+#define R_X86_64_TPOFF64 18 /* Offset in initial TLS block */
+#define R_X86_64_TLSGD 19 /* 32 bit signed PC relative offset
+ to two GOT entries for GD symbol */
+#define R_X86_64_TLSLD 20 /* 32 bit signed PC relative offset
+ to two GOT entries for LD symbol */
+#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */
+#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset
+ to GOT entry for IE symbol */
+#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */
+
+#define R_X86_64_NUM 24
+
+typedef struct elf32_rel {
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+} Elf32_Rel;
+
+typedef struct elf64_rel {
+ Elf64_Addr r_offset; /* Location at which to apply the action */
+ Elf64_Xword r_info; /* index and type of relocation */
+} Elf64_Rel;
+
+typedef struct elf32_rela{
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+ Elf32_Sword r_addend;
+} Elf32_Rela;
+
+typedef struct elf64_rela {
+ Elf64_Addr r_offset; /* Location at which to apply the action */
+ Elf64_Xword r_info; /* index and type of relocation */
+ Elf64_Sxword r_addend; /* Constant addend used to compute value */
+} Elf64_Rela;
+
+typedef struct elf32_sym{
+ Elf32_Word st_name;
+ Elf32_Addr st_value;
+ Elf32_Word st_size;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf32_Half st_shndx;
+} Elf32_Sym;
+
+typedef struct elf64_sym {
+ Elf64_Word st_name; /* Symbol name, index in string tbl */
+ unsigned char st_info; /* Type and binding attributes */
+ unsigned char st_other; /* No defined meaning, 0 */
+ Elf64_Half st_shndx; /* Associated section index */
+ Elf64_Addr st_value; /* Value of the symbol */
+ Elf64_Xword st_size; /* Associated symbol size */
+} Elf64_Sym;
+
+
+#define EI_NIDENT 16
+
+typedef struct elf32_hdr{
+ unsigned char e_ident[EI_NIDENT];
+ Elf32_Half e_type;
+ Elf32_Half e_machine;
+ Elf32_Word e_version;
+ Elf32_Addr e_entry; /* Entry point */
+ Elf32_Off e_phoff;
+ Elf32_Off e_shoff;
+ Elf32_Word e_flags;
+ Elf32_Half e_ehsize;
+ Elf32_Half e_phentsize;
+ Elf32_Half e_phnum;
+ Elf32_Half e_shentsize;
+ Elf32_Half e_shnum;
+ Elf32_Half e_shstrndx;
+} Elf32_Ehdr;
+
+typedef struct elf64_hdr {
+ unsigned char e_ident[16]; /* ELF "magic number" */
+ Elf64_Half e_type;
+ Elf64_Half e_machine;
+ Elf64_Word e_version;
+ Elf64_Addr e_entry; /* Entry point virtual address */
+ Elf64_Off e_phoff; /* Program header table file offset */
+ Elf64_Off e_shoff; /* Section header table file offset */
+ Elf64_Word e_flags;
+ Elf64_Half e_ehsize;
+ Elf64_Half e_phentsize;
+ Elf64_Half e_phnum;
+ Elf64_Half e_shentsize;
+ Elf64_Half e_shnum;
+ Elf64_Half e_shstrndx;
+} Elf64_Ehdr;
+
+/* These constants define the permissions on sections in the program
+ header, p_flags. */
+#define PF_R 0x4
+#define PF_W 0x2
+#define PF_X 0x1
+
+typedef struct elf32_phdr{
+ Elf32_Word p_type;
+ Elf32_Off p_offset;
+ Elf32_Addr p_vaddr;
+ Elf32_Addr p_paddr;
+ Elf32_Word p_filesz;
+ Elf32_Word p_memsz;
+ Elf32_Word p_flags;
+ Elf32_Word p_align;
+} Elf32_Phdr;
+
+typedef struct elf64_phdr {
+ Elf64_Word p_type;
+ Elf64_Word p_flags;
+ Elf64_Off p_offset; /* Segment file offset */
+ Elf64_Addr p_vaddr; /* Segment virtual address */
+ Elf64_Addr p_paddr; /* Segment physical address */
+ Elf64_Xword p_filesz; /* Segment size in file */
+ Elf64_Xword p_memsz; /* Segment size in memory */
+ Elf64_Xword p_align; /* Segment alignment, file & memory */
+} Elf64_Phdr;
+
+/* sh_type */
+#define SHT_NULL 0
+#define SHT_PROGBITS 1
+#define SHT_SYMTAB 2
+#define SHT_STRTAB 3
+#define SHT_RELA 4
+#define SHT_HASH 5
+#define SHT_DYNAMIC 6
+#define SHT_NOTE 7
+#define SHT_NOBITS 8
+#define SHT_REL 9
+#define SHT_SHLIB 10
+#define SHT_DYNSYM 11
+#define SHT_NUM 12
+#define SHT_LOPROC 0x70000000
+#define SHT_HIPROC 0x7fffffff
+#define SHT_LOUSER 0x80000000
+#define SHT_HIUSER 0xffffffff
+#define SHT_MIPS_LIST 0x70000000
+#define SHT_MIPS_CONFLICT 0x70000002
+#define SHT_MIPS_GPTAB 0x70000003
+#define SHT_MIPS_UCODE 0x70000004
+
+/* sh_flags */
+#define SHF_WRITE 0x1
+#define SHF_ALLOC 0x2
+#define SHF_EXECINSTR 0x4
+#define SHF_MASKPROC 0xf0000000
+#define SHF_MIPS_GPREL 0x10000000
+#define SHF_ALPHA_GPREL 0x10000000
+
+/* special section indexes */
+#define SHN_UNDEF 0
+#define SHN_LORESERVE 0xff00
+#define SHN_LOPROC 0xff00
+#define SHN_HIPROC 0xff1f
+#define SHN_ABS 0xfff1
+#define SHN_COMMON 0xfff2
+#define SHN_HIRESERVE 0xffff
+#define SHN_MIPS_ACCOMON 0xff00
+
+typedef struct {
+ Elf32_Word sh_name;
+ Elf32_Word sh_type;
+ Elf32_Word sh_flags;
+ Elf32_Addr sh_addr;
+ Elf32_Off sh_offset;
+ Elf32_Word sh_size;
+ Elf32_Word sh_link;
+ Elf32_Word sh_info;
+ Elf32_Word sh_addralign;
+ Elf32_Word sh_entsize;
+} Elf32_Shdr;
+
+typedef struct elf64_shdr {
+ Elf64_Word sh_name; /* Section name, index in string tbl */
+ Elf64_Word sh_type; /* Type of section */
+ Elf64_Xword sh_flags; /* Miscellaneous section attributes */
+ Elf64_Addr sh_addr; /* Section virtual addr at execution */
+ Elf64_Off sh_offset; /* Section file offset */
+ Elf64_Xword sh_size; /* Size of section in bytes */
+ Elf64_Word sh_link; /* Index of another section */
+ Elf64_Word sh_info; /* Additional section information */
+ Elf64_Xword sh_addralign; /* Section alignment */
+ Elf64_Xword sh_entsize; /* Entry size if section holds table */
+} Elf64_Shdr;
+
+#define EI_MAG0 0 /* e_ident[] indexes */
+#define EI_MAG1 1
+#define EI_MAG2 2
+#define EI_MAG3 3
+#define EI_CLASS 4
+#define EI_DATA 5
+#define EI_VERSION 6
+#define EI_PAD 7
+
+#define ELFMAG0 0x7f /* EI_MAG */
+#define ELFMAG1 'E'
+#define ELFMAG2 'L'
+#define ELFMAG3 'F'
+#define ELFMAG "\177ELF"
+#define SELFMAG 4
+
+#define ELFCLASSNONE 0 /* EI_CLASS */
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+#define ELFCLASSNUM 3
+
+#define ELFDATANONE 0 /* e_ident[EI_DATA] */
+#define ELFDATA2LSB 1
+#define ELFDATA2MSB 2
+
+#define EV_NONE 0 /* e_version, EI_VERSION */
+#define EV_CURRENT 1
+#define EV_NUM 2
+
+/* Notes used in ET_CORE */
+#define NT_PRSTATUS 1
+#define NT_PRFPREG 2
+#define NT_PRPSINFO 3
+#define NT_TASKSTRUCT 4
+#define NT_PRFPXREG 20
+
+/* Note header in a PT_NOTE section */
+typedef struct elf32_note {
+ Elf32_Word n_namesz; /* Name size */
+ Elf32_Word n_descsz; /* Content size */
+ Elf32_Word n_type; /* Content type */
+} Elf32_Nhdr;
+
+/* Note header in a PT_NOTE section */
+typedef struct elf64_note {
+ Elf64_Word n_namesz; /* Name size */
+ Elf64_Word n_descsz; /* Content size */
+ Elf64_Word n_type; /* Content type */
+} Elf64_Nhdr;
+
+#if ELF_CLASS == ELFCLASS32
+
+extern Elf32_Dyn _DYNAMIC [];
+#define elfhdr elf32_hdr
+#define elf_phdr elf32_phdr
+#define elf_note elf32_note
+
+#else
+
+extern Elf64_Dyn _DYNAMIC [];
+#define elfhdr elf64_hdr
+#define elf_phdr elf64_phdr
+#define elf_note elf64_note
+
+#endif
+
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/endian.h b/mdk-stage1/dietlibc/include/endian.h
index 463c24fff..93b1f2948 100644
--- a/mdk-stage1/dietlibc/include/endian.h
+++ b/mdk-stage1/dietlibc/include/endian.h
@@ -4,35 +4,42 @@
#define __LITTLE_ENDIAN 1234
#define __BIG_ENDIAN 4321
-#ifdef __i386__
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
#endif
#ifdef __sparc__
-#define __BYTE_ORDER __BIG_ENDIAN
-#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#endif
+
+#ifdef __hppa__
+/* I hope this is correct...? */
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
#endif
#ifdef __mips__
#ifdef __MIPSEB__
-#define __BIG_ENDIAN__
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
#endif
#endif
#ifndef __BYTE_ORDER
#ifdef __BIG_ENDIAN__
-#define __BYTE_ORDER __BIG_ENDIAN
-#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
#else
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
#endif
#endif
-#define LITTLE_ENDIAN __LITTLE_ENDIAN
-#define BIG_ENDIAN __BIG_ENDIAN
-#define BYTE_ORDER __BYTE_ORDER
+#define LITTLE_ENDIAN __LITTLE_ENDIAN
+#define BIG_ENDIAN __BIG_ENDIAN
+#define BYTE_ORDER __BYTE_ORDER
#if __BYTE_ORDER == __LITTLE_ENDIAN
# define __LONG_LONG_PAIR(HI, LO) LO, HI
@@ -40,4 +47,16 @@
# define __LONG_LONG_PAIR(HI, LO) HI, LO
#endif
+#if defined(__alpha__) || defined(__mips64) || defined(__sparc_v9__) || defined(__x86_64__) || defined(__ia64__)
+#define __WORDSIZE 64
+#endif
+
+#if defined(__sparc__) && (__arch64__)
+#define __WORDSIZE 64
+#endif
+
+#ifndef __WORDSIZE
+#define __WORDSIZE 32
+#endif
+
#endif
diff --git a/mdk-stage1/dietlibc/include/errno.h b/mdk-stage1/dietlibc/include/errno.h
index d1c68f39c..12aa394da 100644
--- a/mdk-stage1/dietlibc/include/errno.h
+++ b/mdk-stage1/dietlibc/include/errno.h
@@ -1,11 +1,546 @@
#ifndef _ERRNO_H
-#define _ERRNO_H
+#define _ERRNO_H
-extern int errno;
+#if defined(__alpha__)
+
+#define EPERM 1 /* Operation not permitted */
+#define ENOENT 2 /* No such file or directory */
+#define ESRCH 3 /* No such process */
+#define EINTR 4 /* Interrupted system call */
+#define EIO 5 /* I/O error */
+#define ENXIO 6 /* No such device or address */
+#define E2BIG 7 /* Arg list too long */
+#define ENOEXEC 8 /* Exec format error */
+#define EBADF 9 /* Bad file number */
+#define ECHILD 10 /* No child processes */
+#define EDEADLK 11 /* Resource deadlock would occur */
+#define ENOMEM 12 /* Out of memory */
+#define EACCES 13 /* Permission denied */
+#define EFAULT 14 /* Bad address */
+#define ENOTBLK 15 /* Block device required */
+#define EBUSY 16 /* Device or resource busy */
+#define EEXIST 17 /* File exists */
+#define EXDEV 18 /* Cross-device link */
+#define ENODEV 19 /* No such device */
+#define ENOTDIR 20 /* Not a directory */
+#define EISDIR 21 /* Is a directory */
+#define EINVAL 22 /* Invalid argument */
+#define ENFILE 23 /* File table overflow */
+#define EMFILE 24 /* Too many open files */
+#define ENOTTY 25 /* Not a typewriter */
+#define ETXTBSY 26 /* Text file busy */
+#define EFBIG 27 /* File too large */
+#define ENOSPC 28 /* No space left on device */
+#define ESPIPE 29 /* Illegal seek */
+#define EROFS 30 /* Read-only file system */
+#define EMLINK 31 /* Too many links */
+#define EPIPE 32 /* Broken pipe */
+#define EDOM 33 /* Math argument out of domain of func */
+#define ERANGE 34 /* Math result not representable */
+#define EAGAIN 35 /* Try again */
+#define EWOULDBLOCK EAGAIN /* Operation would block */
+#define EINPROGRESS 36 /* Operation now in progress */
+#define EALREADY 37 /* Operation already in progress */
+#define ENOTSOCK 38 /* Socket operation on non-socket */
+#define EDESTADDRREQ 39 /* Destination address required */
+#define EMSGSIZE 40 /* Message too long */
+#define EPROTOTYPE 41 /* Protocol wrong type for socket */
+#define ENOPROTOOPT 42 /* Protocol not available */
+#define EPROTONOSUPPORT 43 /* Protocol not supported */
+#define ESOCKTNOSUPPORT 44 /* Socket type not supported */
+#define EOPNOTSUPP 45 /* Operation not supported on transport endpoint */
+#define ENOTSUP EOPNOTSUPP/* Operation not supported on transport endpoint */
+#define EPFNOSUPPORT 46 /* Protocol family not supported */
+#define EAFNOSUPPORT 47 /* Address family not supported by protocol */
+#define EADDRINUSE 48 /* Address already in use */
+#define EADDRNOTAVAIL 49 /* Cannot assign requested address */
+#define ENETDOWN 50 /* Network is down */
+#define ENETUNREACH 51 /* Network is unreachable */
+#define ENETRESET 52 /* Network dropped connection because of reset */
+#define ECONNABORTED 53 /* Software caused connection abort */
+#define ECONNRESET 54 /* Connection reset by peer */
+#define ENOBUFS 55 /* No buffer space available */
+#define EISCONN 56 /* Transport endpoint is already connected */
+#define ENOTCONN 57 /* Transport endpoint is not connected */
+#define ESHUTDOWN 58 /* Cannot send after transport endpoint shutdown */
+#define ETOOMANYREFS 59 /* Too many references: cannot splice */
+#define ETIMEDOUT 60 /* Connection timed out */
+#define ECONNREFUSED 61 /* Connection refused */
+#define ELOOP 62 /* Too many symbolic links encountered */
+#define ENAMETOOLONG 63 /* File name too long */
+#define EHOSTDOWN 64 /* Host is down */
+#define EHOSTUNREACH 65 /* No route to host */
+#define ENOTEMPTY 66 /* Directory not empty */
+#define EUSERS 68 /* Too many users */
+#define EDQUOT 69 /* Quota exceeded */
+#define ESTALE 70 /* Stale NFS file handle */
+#define EREMOTE 71 /* Object is remote */
+#define ENOLCK 77 /* No record locks available */
+#define ENOSYS 78 /* Function not implemented */
+#define ENOMSG 80 /* No message of desired type */
+#define EIDRM 81 /* Identifier removed */
+#define ENOSR 82 /* Out of streams resources */
+#define ETIME 83 /* Timer expired */
+#define EBADMSG 84 /* Not a data message */
+#define EPROTO 85 /* Protocol error */
+#define ENODATA 86 /* No data available */
+#define ENOSTR 87 /* Device not a stream */
+#define ENOPKG 92 /* Package not installed */
+#define EILSEQ 116 /* Illegal byte sequence */
+/* The following are just random noise.. */
+#define ECHRNG 88 /* Channel number out of range */
+#define EL2NSYNC 89 /* Level 2 not synchronized */
+#define EL3HLT 90 /* Level 3 halted */
+#define EL3RST 91 /* Level 3 reset */
+#define ELNRNG 93 /* Link number out of range */
+#define EUNATCH 94 /* Protocol driver not attached */
+#define ENOCSI 95 /* No CSI structure available */
+#define EL2HLT 96 /* Level 2 halted */
+#define EBADE 97 /* Invalid exchange */
+#define EBADR 98 /* Invalid request descriptor */
+#define EXFULL 99 /* Exchange full */
+#define ENOANO 100 /* No anode */
+#define EBADRQC 101 /* Invalid request code */
+#define EBADSLT 102 /* Invalid slot */
+#define EDEADLOCK EDEADLK
+#define EBFONT 104 /* Bad font file format */
+#define ENONET 105 /* Machine is not on the network */
+#define ENOLINK 106 /* Link has been severed */
+#define EADV 107 /* Advertise error */
+#define ESRMNT 108 /* Srmount error */
+#define ECOMM 109 /* Communication error on send */
+#define EMULTIHOP 110 /* Multihop attempted */
+#define EDOTDOT 111 /* RFS specific error */
+#define EOVERFLOW 112 /* Value too large for defined data type */
+#define ENOTUNIQ 113 /* Name not unique on network */
+#define EBADFD 114 /* File descriptor in bad state */
+#define EREMCHG 115 /* Remote address changed */
+#define EUCLEAN 117 /* Structure needs cleaning */
+#define ENOTNAM 118 /* Not a XENIX named type file */
+#define ENAVAIL 119 /* No XENIX semaphores available */
+#define EISNAM 120 /* Is a named type file */
+#define EREMOTEIO 121 /* Remote I/O error */
+#define ELIBACC 122 /* Can not access a needed shared library */
+#define ELIBBAD 123 /* Accessing a corrupted shared library */
+#define ELIBSCN 124 /* .lib section in a.out corrupted */
+#define ELIBMAX 125 /* Attempting to link in too many shared libraries */
+#define ELIBEXEC 126 /* Cannot exec a shared library directly */
+#define ERESTART 127 /* Interrupted system call should be restarted */
+#define ESTRPIPE 128 /* Streams pipe error */
+#define ENOMEDIUM 129 /* No medium found */
+#define EMEDIUMTYPE 130 /* Wrong medium type */
+
+#elif defined(__mips__)
+
+#define EPERM 1 /* Operation not permitted */
+#define ENOENT 2 /* No such file or directory */
+#define ESRCH 3 /* No such process */
+#define EINTR 4 /* Interrupted system call */
+#define EIO 5 /* I/O error */
+#define ENXIO 6 /* No such device or address */
+#define E2BIG 7 /* Arg list too long */
+#define ENOEXEC 8 /* Exec format error */
+#define EBADF 9 /* Bad file number */
+#define ECHILD 10 /* No child processes */
+#define EAGAIN 11 /* Try again */
+#define ENOMEM 12 /* Out of memory */
+#define EACCES 13 /* Permission denied */
+#define EFAULT 14 /* Bad address */
+#define ENOTBLK 15 /* Block device required */
+#define EBUSY 16 /* Device or resource busy */
+#define EEXIST 17 /* File exists */
+#define EXDEV 18 /* Cross-device link */
+#define ENODEV 19 /* No such device */
+#define ENOTDIR 20 /* Not a directory */
+#define EISDIR 21 /* Is a directory */
+#define EINVAL 22 /* Invalid argument */
+#define ENFILE 23 /* File table overflow */
+#define EMFILE 24 /* Too many open files */
+#define ENOTTY 25 /* Not a typewriter */
+#define ETXTBSY 26 /* Text file busy */
+#define EFBIG 27 /* File too large */
+#define ENOSPC 28 /* No space left on device */
+#define ESPIPE 29 /* Illegal seek */
+#define EROFS 30 /* Read-only file system */
+#define EMLINK 31 /* Too many links */
+#define EPIPE 32 /* Broken pipe */
+#define EDOM 33 /* Math argument out of domain of func */
+#define ERANGE 34 /* Math result not representable */
+#define ENOMSG 35 /* No message of desired type */
+#define EIDRM 36 /* Identifier removed */
+#define ECHRNG 37 /* Channel number out of range */
+#define EL2NSYNC 38 /* Level 2 not synchronized */
+#define EL3HLT 39 /* Level 3 halted */
+#define EL3RST 40 /* Level 3 reset */
+#define ELNRNG 41 /* Link number out of range */
+#define EUNATCH 42 /* Protocol driver not attached */
+#define ENOCSI 43 /* No CSI structure available */
+#define EL2HLT 44 /* Level 2 halted */
+#define EDEADLK 45 /* Resource deadlock would occur */
+#define ENOLCK 46 /* No record locks available */
+#define EBADE 50 /* Invalid exchange */
+#define EBADR 51 /* Invalid request descriptor */
+#define EXFULL 52 /* Exchange full */
+#define ENOANO 53 /* No anode */
+#define EBADRQC 54 /* Invalid request code */
+#define EBADSLT 55 /* Invalid slot */
+#define EDEADLOCK 56 /* File locking deadlock error */
+#define EBFONT 59 /* Bad font file format */
+#define ENOSTR 60 /* Device not a stream */
+#define ENODATA 61 /* No data available */
+#define ETIME 62 /* Timer expired */
+#define ENOSR 63 /* Out of streams resources */
+#define ENONET 64 /* Machine is not on the network */
+#define ENOPKG 65 /* Package not installed */
+#define EREMOTE 66 /* Object is remote */
+#define ENOLINK 67 /* Link has been severed */
+#define EADV 68 /* Advertise error */
+#define ESRMNT 69 /* Srmount error */
+#define ECOMM 70 /* Communication error on send */
+#define EPROTO 71 /* Protocol error */
+#define EDOTDOT 73 /* RFS specific error */
+#define EMULTIHOP 74 /* Multihop attempted */
+#define EBADMSG 77 /* Not a data message */
+#define ENAMETOOLONG 78 /* File name too long */
+#define EOVERFLOW 79 /* Value too large for defined data type */
+#define ENOTUNIQ 80 /* Name not unique on network */
+#define EBADFD 81 /* File descriptor in bad state */
+#define EREMCHG 82 /* Remote address changed */
+#define ELIBACC 83 /* Can not access a needed shared library */
+#define ELIBBAD 84 /* Accessing a corrupted shared library */
+#define ELIBSCN 85 /* .lib section in a.out corrupted */
+#define ELIBMAX 86 /* Attempting to link in too many shared libraries */
+#define ELIBEXEC 87 /* Cannot exec a shared library directly */
+#define EILSEQ 88 /* Illegal byte sequence */
+#define ENOSYS 89 /* Function not implemented */
+#define ELOOP 90 /* Too many symbolic links encountered */
+#define ERESTART 91 /* Interrupted system call should be restarted */
+#define ESTRPIPE 92 /* Streams pipe error */
+#define ENOTEMPTY 93 /* Directory not empty */
+#define EUSERS 94 /* Too many users */
+#define ENOTSOCK 95 /* Socket operation on non-socket */
+#define EDESTADDRREQ 96 /* Destination address required */
+#define EMSGSIZE 97 /* Message too long */
+#define EPROTOTYPE 98 /* Protocol wrong type for socket */
+#define ENOPROTOOPT 99 /* Protocol not available */
+#define EPROTONOSUPPORT 120 /* Protocol not supported */
+#define ESOCKTNOSUPPORT 121 /* Socket type not supported */
+#define EOPNOTSUPP 122 /* Operation not supported on transport endpoint */
+#define ENOTSUP EOPNOTSUPP/* Operation not supported on transport endpoint */
+#define EPFNOSUPPORT 123 /* Protocol family not supported */
+#define EAFNOSUPPORT 124 /* Address family not supported by protocol */
+#define EADDRINUSE 125 /* Address already in use */
+#define EADDRNOTAVAIL 126 /* Cannot assign requested address */
+#define ENETDOWN 127 /* Network is down */
+#define ENETUNREACH 128 /* Network is unreachable */
+#define ENETRESET 129 /* Network dropped connection because of reset */
+#define ECONNABORTED 130 /* Software caused connection abort */
+#define ECONNRESET 131 /* Connection reset by peer */
+#define ENOBUFS 132 /* No buffer space available */
+#define EISCONN 133 /* Transport endpoint is already connected */
+#define ENOTCONN 134 /* Transport endpoint is not connected */
+#define EUCLEAN 135 /* Structure needs cleaning */
+#define ENOTNAM 137 /* Not a XENIX named type file */
+#define ENAVAIL 138 /* No XENIX semaphores available */
+#define EISNAM 139 /* Is a named type file */
+#define EREMOTEIO 140 /* Remote I/O error */
+#define EINIT 141 /* Reserved */
+#define EREMDEV 142 /* Error 142 */
+#define ESHUTDOWN 143 /* Cannot send after transport endpoint shutdown */
+#define ETOOMANYREFS 144 /* Too many references: cannot splice */
+#define ETIMEDOUT 145 /* Connection timed out */
+#define ECONNREFUSED 146 /* Connection refused */
+#define EHOSTDOWN 147 /* Host is down */
+#define EHOSTUNREACH 148 /* No route to host */
+#define EWOULDBLOCK EAGAIN /* Operation would block */
+#define EALREADY 149 /* Operation already in progress */
+#define EINPROGRESS 150 /* Operation now in progress */
+#define ESTALE 151 /* Stale NFS file handle */
+#define ECANCELED 158 /* AIO operation canceled */
+#define ENOMEDIUM 159 /* No medium found */
+#define EMEDIUMTYPE 160 /* Wrong medium type */
+#define EDQUOT 1133 /* Quota exceeded */
+
+#elif defined(__sparc__)
+
+#define EPERM 1 /* Operation not permitted */
+#define ENOENT 2 /* No such file or directory */
+#define ESRCH 3 /* No such process */
+#define EINTR 4 /* Interrupted system call */
+#define EIO 5 /* I/O error */
+#define ENXIO 6 /* No such device or address */
+#define E2BIG 7 /* Arg list too long */
+#define ENOEXEC 8 /* Exec format error */
+#define EBADF 9 /* Bad file number */
+#define ECHILD 10 /* No child processes */
+#define EAGAIN 11 /* Try again */
+#define ENOMEM 12 /* Out of memory */
+#define EACCES 13 /* Permission denied */
+#define EFAULT 14 /* Bad address */
+#define ENOTBLK 15 /* Block device required */
+#define EBUSY 16 /* Device or resource busy */
+#define EEXIST 17 /* File exists */
+#define EXDEV 18 /* Cross-device link */
+#define ENODEV 19 /* No such device */
+#define ENOTDIR 20 /* Not a directory */
+#define EISDIR 21 /* Is a directory */
+#define EINVAL 22 /* Invalid argument */
+#define ENFILE 23 /* File table overflow */
+#define EMFILE 24 /* Too many open files */
+#define ENOTTY 25 /* Not a typewriter */
+#define ETXTBSY 26 /* Text file busy */
+#define EFBIG 27 /* File too large */
+#define ENOSPC 28 /* No space left on device */
+#define ESPIPE 29 /* Illegal seek */
+#define EROFS 30 /* Read-only file system */
+#define EMLINK 31 /* Too many links */
+#define EPIPE 32 /* Broken pipe */
+#define EDOM 33 /* Math argument out of domain of func */
+#define ERANGE 34 /* Math result not representable */
+#define EWOULDBLOCK EAGAIN /* Operation would block */
+#define EINPROGRESS 36 /* Operation now in progress */
+#define EALREADY 37 /* Operation already in progress */
+#define ENOTSOCK 38 /* Socket operation on non-socket */
+#define EDESTADDRREQ 39 /* Destination address required */
+#define EMSGSIZE 40 /* Message too long */
+#define EPROTOTYPE 41 /* Protocol wrong type for socket */
+#define ENOPROTOOPT 42 /* Protocol not available */
+#define EPROTONOSUPPORT 43 /* Protocol not supported */
+#define ESOCKTNOSUPPORT 44 /* Socket type not supported */
+#define EOPNOTSUPP 45 /* Op not supported on transport endpoint */
+#define ENOTSUP EOPNOTSUPP/* Operation not supported on transport endpoint */
+#define EPFNOSUPPORT 46 /* Protocol family not supported */
+#define EAFNOSUPPORT 47 /* Address family not supported by protocol */
+#define EADDRINUSE 48 /* Address already in use */
+#define EADDRNOTAVAIL 49 /* Cannot assign requested address */
+#define ENETDOWN 50 /* Network is down */
+#define ENETUNREACH 51 /* Network is unreachable */
+#define ENETRESET 52 /* Net dropped connection because of reset */
+#define ECONNABORTED 53 /* Software caused connection abort */
+#define ECONNRESET 54 /* Connection reset by peer */
+#define ENOBUFS 55 /* No buffer space available */
+#define EISCONN 56 /* Transport endpoint is already connected */
+#define ENOTCONN 57 /* Transport endpoint is not connected */
+#define ESHUTDOWN 58 /* No send after transport endpoint shutdown */
+#define ETOOMANYREFS 59 /* Too many references: cannot splice */
+#define ETIMEDOUT 60 /* Connection timed out */
+#define ECONNREFUSED 61 /* Connection refused */
+#define ELOOP 62 /* Too many symbolic links encountered */
+#define ENAMETOOLONG 63 /* File name too long */
+#define EHOSTDOWN 64 /* Host is down */
+#define EHOSTUNREACH 65 /* No route to host */
+#define ENOTEMPTY 66 /* Directory not empty */
+#define EPROCLIM 67 /* SUNOS: Too many processes */
+#define EUSERS 68 /* Too many users */
+#define EDQUOT 69 /* Quota exceeded */
+#define ESTALE 70 /* Stale NFS file handle */
+#define EREMOTE 71 /* Object is remote */
+#define ENOSTR 72 /* Device not a stream */
+#define ETIME 73 /* Timer expired */
+#define ENOSR 74 /* Out of streams resources */
+#define ENOMSG 75 /* No message of desired type */
+#define EBADMSG 76 /* Not a data message */
+#define EIDRM 77 /* Identifier removed */
+#define EDEADLK 78 /* Resource deadlock would occur */
+#define ENOLCK 79 /* No record locks available */
+#define ENONET 80 /* Machine is not on the network */
+#define ERREMOTE 81 /* SunOS: Too many lvls of remote in path */
+#define ENOLINK 82 /* Link has been severed */
+#define EADV 83 /* Advertise error */
+#define ESRMNT 84 /* Srmount error */
+#define ECOMM 85 /* Communication error on send */
+#define EPROTO 86 /* Protocol error */
+#define EMULTIHOP 87 /* Multihop attempted */
+#define EDOTDOT 88 /* RFS specific error */
+#define EREMCHG 89 /* Remote address changed */
+#define ENOSYS 90 /* Function not implemented */
+#define ESTRPIPE 91 /* Streams pipe error */
+#define EOVERFLOW 92 /* Value too large for defined data type */
+#define EBADFD 93 /* File descriptor in bad state */
+#define ECHRNG 94 /* Channel number out of range */
+#define EL2NSYNC 95 /* Level 2 not synchronized */
+#define EL3HLT 96 /* Level 3 halted */
+#define EL3RST 97 /* Level 3 reset */
+#define ELNRNG 98 /* Link number out of range */
+#define EUNATCH 99 /* Protocol driver not attached */
+#define ENOCSI 100 /* No CSI structure available */
+#define EL2HLT 101 /* Level 2 halted */
+#define EBADE 102 /* Invalid exchange */
+#define EBADR 103 /* Invalid request descriptor */
+#define EXFULL 104 /* Exchange full */
+#define ENOANO 105 /* No anode */
+#define EBADRQC 106 /* Invalid request code */
+#define EBADSLT 107 /* Invalid slot */
+#define EDEADLOCK 108 /* File locking deadlock error */
+#define EBFONT 109 /* Bad font file format */
+#define ELIBEXEC 110 /* Cannot exec a shared library directly */
+#define ENODATA 111 /* No data available */
+#define ELIBBAD 112 /* Accessing a corrupted shared library */
+#define ENOPKG 113 /* Package not installed */
+#define ELIBACC 114 /* Can not access a needed shared library */
+#define ENOTUNIQ 115 /* Name not unique on network */
+#define ERESTART 116 /* Interrupted syscall should be restarted */
+#define EUCLEAN 117 /* Structure needs cleaning */
+#define ENOTNAM 118 /* Not a XENIX named type file */
+#define ENAVAIL 119 /* No XENIX semaphores available */
+#define EISNAM 120 /* Is a named type file */
+#define EREMOTEIO 121 /* Remote I/O error */
+#define EILSEQ 122 /* Illegal byte sequence */
+#define ELIBMAX 123 /* Atmpt to link in too many shared libs */
+#define ELIBSCN 124 /* .lib section in a.out corrupted */
+#define ENOMEDIUM 125 /* No medium found */
+#define EMEDIUMTYPE 126 /* Wrong medium type */
+
+#else
+
+/* i386, arm, ppc, x86_64, ia64 */
+
+#define EPERM 1 /* Operation not permitted */
+#define ENOENT 2 /* No such file or directory */
+#define ESRCH 3 /* No such process */
+#define EINTR 4 /* Interrupted system call */
+#define EIO 5 /* I/O error */
+#define ENXIO 6 /* No such device or address */
+#define E2BIG 7 /* Arg list too long */
+#define ENOEXEC 8 /* Exec format error */
+#define EBADF 9 /* Bad file number */
+#define ECHILD 10 /* No child processes */
+#define EAGAIN 11 /* Try again */
+#define ENOMEM 12 /* Out of memory */
+#define EACCES 13 /* Permission denied */
+#define EFAULT 14 /* Bad address */
+#define ENOTBLK 15 /* Block device required */
+#define EBUSY 16 /* Device or resource busy */
+#define EEXIST 17 /* File exists */
+#define EXDEV 18 /* Cross-device link */
+#define ENODEV 19 /* No such device */
+#define ENOTDIR 20 /* Not a directory */
+#define EISDIR 21 /* Is a directory */
+#define EINVAL 22 /* Invalid argument */
+#define ENFILE 23 /* File table overflow */
+#define EMFILE 24 /* Too many open files */
+#define ENOTTY 25 /* Not a typewriter */
+#define ETXTBSY 26 /* Text file busy */
+#define EFBIG 27 /* File too large */
+#define ENOSPC 28 /* No space left on device */
+#define ESPIPE 29 /* Illegal seek */
+#define EROFS 30 /* Read-only file system */
+#define EMLINK 31 /* Too many links */
+#define EPIPE 32 /* Broken pipe */
+#define EDOM 33 /* Math argument out of domain of func */
+#define ERANGE 34 /* Math result not representable */
+#define EDEADLK 35 /* Resource deadlock would occur */
+#define ENAMETOOLONG 36 /* File name too long */
+#define ENOLCK 37 /* No record locks available */
+#define ENOSYS 38 /* Function not implemented */
+#define ENOTEMPTY 39 /* Directory not empty */
+#define ELOOP 40 /* Too many symbolic links encountered */
+#define EWOULDBLOCK EAGAIN /* Operation would block */
+#define ENOMSG 42 /* No message of desired type */
+#define EIDRM 43 /* Identifier removed */
+#define ECHRNG 44 /* Channel number out of range */
+#define EL2NSYNC 45 /* Level 2 not synchronized */
+#define EL3HLT 46 /* Level 3 halted */
+#define EL3RST 47 /* Level 3 reset */
+#define ELNRNG 48 /* Link number out of range */
+#define EUNATCH 49 /* Protocol driver not attached */
+#define ENOCSI 50 /* No CSI structure available */
+#define EL2HLT 51 /* Level 2 halted */
+#define EBADE 52 /* Invalid exchange */
+#define EBADR 53 /* Invalid request descriptor */
+#define EXFULL 54 /* Exchange full */
+#define ENOANO 55 /* No anode */
+#define EBADRQC 56 /* Invalid request code */
+#define EBADSLT 57 /* Invalid slot */
+#define EDEADLOCK EDEADLK
+#define EBFONT 59 /* Bad font file format */
+#define ENOSTR 60 /* Device not a stream */
+#define ENODATA 61 /* No data available */
+#define ETIME 62 /* Timer expired */
+#define ENOSR 63 /* Out of streams resources */
+#define ENONET 64 /* Machine is not on the network */
+#define ENOPKG 65 /* Package not installed */
+#define EREMOTE 66 /* Object is remote */
+#define ENOLINK 67 /* Link has been severed */
+#define EADV 68 /* Advertise error */
+#define ESRMNT 69 /* Srmount error */
+#define ECOMM 70 /* Communication error on send */
+#define EPROTO 71 /* Protocol error */
+#define EMULTIHOP 72 /* Multihop attempted */
+#define EDOTDOT 73 /* RFS specific error */
+#define EBADMSG 74 /* Not a data message */
+#define EOVERFLOW 75 /* Value too large for defined data type */
+#define ENOTUNIQ 76 /* Name not unique on network */
+#define EBADFD 77 /* File descriptor in bad state */
+#define EREMCHG 78 /* Remote address changed */
+#define ELIBACC 79 /* Can not access a needed shared library */
+#define ELIBBAD 80 /* Accessing a corrupted shared library */
+#define ELIBSCN 81 /* .lib section in a.out corrupted */
+#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
+#define ELIBEXEC 83 /* Cannot exec a shared library directly */
+#define EILSEQ 84 /* Illegal byte sequence */
+#define ERESTART 85 /* Interrupted system call should be restarted */
+#define ESTRPIPE 86 /* Streams pipe error */
+#define EUSERS 87 /* Too many users */
+#define ENOTSOCK 88 /* Socket operation on non-socket */
+#define EDESTADDRREQ 89 /* Destination address required */
+#define EMSGSIZE 90 /* Message too long */
+#define EPROTOTYPE 91 /* Protocol wrong type for socket */
+#define ENOPROTOOPT 92 /* Protocol not available */
+#define EPROTONOSUPPORT 93 /* Protocol not supported */
+#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
+#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
+#define ENOTSUP EOPNOTSUPP/* Operation not supported on transport endpoint */
+#define EPFNOSUPPORT 96 /* Protocol family not supported */
+#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
+#define EADDRINUSE 98 /* Address already in use */
+#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
+#define ENETDOWN 100 /* Network is down */
+#define ENETUNREACH 101 /* Network is unreachable */
+#define ENETRESET 102 /* Network dropped connection because of reset */
+#define ECONNABORTED 103 /* Software caused connection abort */
+#define ECONNRESET 104 /* Connection reset by peer */
+#define ENOBUFS 105 /* No buffer space available */
+#define EISCONN 106 /* Transport endpoint is already connected */
+#define ENOTCONN 107 /* Transport endpoint is not connected */
+#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
+#define ETOOMANYREFS 109 /* Too many references: cannot splice */
+#define ETIMEDOUT 110 /* Connection timed out */
+#define ECONNREFUSED 111 /* Connection refused */
+#define EHOSTDOWN 112 /* Host is down */
+#define EHOSTUNREACH 113 /* No route to host */
+#define EALREADY 114 /* Operation already in progress */
+#define EINPROGRESS 115 /* Operation now in progress */
+#define ESTALE 116 /* Stale NFS file handle */
+#define EUCLEAN 117 /* Structure needs cleaning */
+#define ENOTNAM 118 /* Not a XENIX named type file */
+#define ENAVAIL 119 /* No XENIX semaphores available */
+#define EISNAM 120 /* Is a named type file */
+#define EREMOTEIO 121 /* Remote I/O error */
+#define EDQUOT 122 /* Quota exceeded */
+#define ENOMEDIUM 123 /* No medium found */
+#define EMEDIUMTYPE 124 /* Wrong medium type */
+#endif
-#include <linux/errno.h>
+#define __SYS_NERR ((EMEDIUMTYPE) + 1)
+
+#ifndef __ASSEMBLER__
+
+#ifndef _REENTRANT
+extern int errno;
+#else
+#define errno (*__errno_location())
+#endif
extern int *__errno_location(void);
-extern void __set_errno(int error);
+
+#define __set_errno(x) errno=(x)
+
+#ifdef _BSD_SOURCE
+extern const char *const sys_errlist[];
+extern int sys_nerr;
+#endif
+
+#endif
#endif
diff --git a/mdk-stage1/dietlibc/include/fcntl.h b/mdk-stage1/dietlibc/include/fcntl.h
index b792502c1..33f58d82a 100644
--- a/mdk-stage1/dietlibc/include/fcntl.h
+++ b/mdk-stage1/dietlibc/include/fcntl.h
@@ -6,13 +6,549 @@
#include <sys/types.h>
#include <unistd.h>
-#include <asm/fcntl.h>
+#define F_LINUX_SPECIFIC_BASE 1024
+
+#if defined(__i386__) || defined(__s390__) || defined(__x86_64__) || defined(__ia64__)
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0003
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100 /* not fcntl */
+#define O_EXCL 0200 /* not fcntl */
+#define O_NOCTTY 0400 /* not fcntl */
+#define O_TRUNC 01000 /* not fcntl */
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_NDELAY O_NONBLOCK
+#define O_SYNC 010000
+#define FASYNC 020000 /* fcntl, for BSD compatibility */
+#define O_DIRECT 040000 /* direct disk access hint - currently ignored */
+#define O_LARGEFILE 0100000
+#define O_DIRECTORY 0200000 /* must be a directory */
+#define O_NOFOLLOW 0400000 /* don't follow links */
+
+#define F_DUPFD 0 /* dup */
+#define F_GETFD 1 /* get close_on_exec */
+#define F_SETFD 2 /* set/clear close_on_exec */
+#define F_GETFL 3 /* get file->f_flags */
+#define F_SETFL 4 /* set file->f_flags */
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+#define F_SETOWN 8 /* for sockets. */
+#define F_GETOWN 9 /* for sockets. */
+#define F_SETSIG 10 /* for sockets. */
+#define F_GETSIG 11 /* for sockets. */
+
+#define F_GETLK64 12 /* using 'struct flock64' */
+#define F_SETLK64 13
+#define F_SETLKW64 14
+
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK 0
+#define F_WRLCK 1
+#define F_UNLCK 2
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+/* for leases */
+#define F_INPROGRESS 16
+
+/* operations for bsd flock(), also used by the kernel implementation */
+#define LOCK_SH 1 /* shared lock */
+#define LOCK_EX 2 /* exclusive lock */
+#define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+#define LOCK_UN 8 /* remove lock */
+
+#define LOCK_MAND 32 /* This is a mandatory flock */
+#define LOCK_READ 64 /* ... Which allows concurrent read operations */
+#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */
+#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */
+
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+};
+
+struct flock64 {
+ short l_type;
+ short l_whence;
+ loff_t l_start;
+ loff_t l_len;
+ pid_t l_pid;
+};
+
+#elif defined(__alpha__)
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0003
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 01000 /* not fcntl */
+#define O_TRUNC 02000 /* not fcntl */
+#define O_EXCL 04000 /* not fcntl */
+#define O_NOCTTY 010000 /* not fcntl */
+
+#define O_NONBLOCK 00004
+#define O_APPEND 00010
+#define O_NDELAY O_NONBLOCK
+#define O_SYNC 040000
+#define FASYNC 020000 /* fcntl, for BSD compatibility */
+#define O_DIRECT 040000 /* direct disk access - should check with OSF/1 */
+#define O_DIRECTORY 0100000 /* must be a directory */
+#define O_NOFOLLOW 0200000 /* don't follow links */
+#define O_LARGEFILE 0400000 /* will be set by the kernel on every open */
+
+#define F_DUPFD 0 /* dup */
+#define F_GETFD 1 /* get close_on_exec */
+#define F_SETFD 2 /* set/clear close_on_exec */
+#define F_GETFL 3 /* get file->f_flags */
+#define F_SETFL 4 /* set file->f_flags */
+#define F_GETLK 7
+#define F_SETLK 8
+#define F_SETLKW 9
+
+#define F_SETOWN 5 /* for sockets. */
+#define F_GETOWN 6 /* for sockets. */
+#define F_SETSIG 10 /* for sockets. */
+#define F_GETSIG 11 /* for sockets. */
+
+/* for F_[GET|SET]FL */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK 1
+#define F_WRLCK 2
+#define F_UNLCK 8
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK 16 /* or 3 */
+#define F_SHLCK 32 /* or 4 */
+
+#define F_INPROGRESS 64
+
+/* operations for bsd flock(), also used by the kernel implementation */
+#define LOCK_SH 1 /* shared lock */
+#define LOCK_EX 2 /* exclusive lock */
+#define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+#define LOCK_UN 8 /* remove lock */
+#define LOCK_MAND 32 /* This is a mandatory flock */
+#define LOCK_READ 64 /* ... Which allows concurrent read operations */
+#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */
+#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */
+
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+};
+
+#elif defined(__mips__)
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0x0003
+#define O_RDONLY 0x0000
+#define O_WRONLY 0x0001
+#define O_RDWR 0x0002
+#define O_APPEND 0x0008
+#define O_SYNC 0x0010
+#define O_NONBLOCK 0x0080
+#define O_CREAT 0x0100 /* not fcntl */
+#define O_TRUNC 0x0200 /* not fcntl */
+#define O_EXCL 0x0400 /* not fcntl */
+#define O_NOCTTY 0x0800 /* not fcntl */
+#define FASYNC 0x1000 /* fcntl, for BSD compatibility */
+#define O_LARGEFILE 0x2000 /* allow large file opens - currently ignored */
+#define O_DIRECT 0x8000 /* direct disk access hint - currently ignored */
+#define O_DIRECTORY 0x10000 /* must be a directory */
+#define O_NOFOLLOW 0x20000 /* don't follow links */
+
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0 /* dup */
+#define F_GETFD 1 /* get close_on_exec */
+#define F_SETFD 2 /* set/clear close_on_exec */
+#define F_GETFL 3 /* get file->f_flags */
+#define F_SETFL 4 /* set file->f_flags */
+#define F_GETLK 14
+#define F_SETLK 6
+#define F_SETLKW 7
+
+#define F_SETOWN 24 /* for sockets. */
+#define F_GETOWN 23 /* for sockets. */
+#define F_SETSIG 10 /* for sockets. */
+#define F_GETSIG 11 /* for sockets. */
+
+/* for F_[GET|SET]FL */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK 0
+#define F_WRLCK 1
+#define F_UNLCK 2
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+/* for leases */
+#define F_INPROGRESS 16
+
+/* operations for bsd flock(), also used by the kernel implementation */
+#define LOCK_SH 1 /* shared lock */
+#define LOCK_EX 2 /* exclusive lock */
+#define LOCK_NB 4 /* or'd with one of the above to prevent XXXXXXXXXXXXXXXXXX
+ blocking */
+#define LOCK_UN 8 /* remove lock */
+
+#define LOCK_MAND 32 /* This is a mandatory flock */
+#define LOCK_READ 64 /* ... Which allows concurrent read operations */
+#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */
+#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */
+
+typedef struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ long l_sysid; /* XXXXXXXXXXXXXXXXXXXXXXXXX */
+ pid_t l_pid;
+ long pad[4]; /* ZZZZZZZZZZZZZZZZZZZZZZZZZZ */
+} flock_t;
+
+#elif defined(__sparc__)
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_RDONLY 0x0000
+#define O_WRONLY 0x0001
+#define O_RDWR 0x0002
+#define O_ACCMODE 0x0003
+#define O_APPEND 0x0008
+#define FASYNC 0x0040 /* fcntl, for BSD compatibility */
+#define O_CREAT 0x0200 /* not fcntl */
+#define O_TRUNC 0x0400 /* not fcntl */
+#define O_EXCL 0x0800 /* not fcntl */
+#define O_SYNC 0x2000
+#define O_NONBLOCK 0x4000
+#define O_NDELAY (0x0004 | O_NONBLOCK)
+#define O_NOCTTY 0x8000 /* not fcntl */
+#define O_DIRECTORY 0x10000 /* must be a directory */
+#define O_NOFOLLOW 0x20000 /* don't follow links */
+#define O_LARGEFILE 0x40000
+
+#define F_DUPFD 0 /* dup */
+#define F_GETFD 1 /* get close_on_exec */
+#define F_SETFD 2 /* set/clear close_on_exec */
+#define F_GETFL 3 /* get file->f_flags */
+#define F_SETFL 4 /* set file->f_flags */
+#define F_GETOWN 5 /* for sockets. */
+#define F_SETOWN 6 /* for sockets. */
+#define F_GETLK 7
+#define F_SETLK 8
+#define F_SETLKW 9
+#define F_SETSIG 10 /* for sockets. */
+#define F_GETSIG 11 /* for sockets. */
+
+#define F_GETLK64 12 /* using 'struct flock64' */
+#define F_SETLK64 13
+#define F_SETLKW64 14
+
+/* for F_[GET|SET]FL */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK 1
+#define F_WRLCK 2
+#define F_UNLCK 3
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+/* for leases */
+#define F_INPROGRESS 16
+
+/* operations for bsd flock(), also used by the kernel implementation */
+#define LOCK_SH 1 /* shared lock */
+#define LOCK_EX 2 /* exclusive lock */
+#define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+#define LOCK_UN 8 /* remove lock */
+
+#define LOCK_MAND 32 /* This is a mandatory flock */
+#define LOCK_READ 64 /* ... Which allows concurrent read operations */
+#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */
+#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */
+
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+ short __unused;
+};
+
+#ifdef __arch64__
+#define flock64 flock
+#else
+struct flock64 {
+ short l_type;
+ short l_whence;
+ loff_t l_start;
+ loff_t l_len;
+ pid_t l_pid;
+ short __unused;
+};
+#endif
+
+#elif defined(__powerpc__)
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0003
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100 /* not fcntl */
+#define O_EXCL 0200 /* not fcntl */
+#define O_NOCTTY 0400 /* not fcntl */
+#define O_TRUNC 01000 /* not fcntl */
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_NDELAY O_NONBLOCK
+#define O_SYNC 010000
+#define FASYNC 020000 /* fcntl, for BSD compatibility */
+#define O_DIRECTORY 040000 /* must be a directory */
+#define O_NOFOLLOW 0100000 /* don't follow links */
+#define O_LARGEFILE 0200000
+#define O_DIRECT 0400000 /* direct disk access hint - currently ignored */
+
+#define F_DUPFD 0 /* dup */
+#define F_GETFD 1 /* get close_on_exec */
+#define F_SETFD 2 /* set/clear close_on_exec */
+#define F_GETFL 3 /* get file->f_flags */
+#define F_SETFL 4 /* set file->f_flags */
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+
+#define F_SETOWN 8 /* for sockets. */
+#define F_GETOWN 9 /* for sockets. */
+#define F_SETSIG 10 /* for sockets. */
+#define F_GETSIG 11 /* for sockets. */
+
+#define F_GETLK64 12 /* using 'struct flock64' */
+#define F_SETLK64 13
+#define F_SETLKW64 14
+
+/* for F_[GET|SET]FL */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK 0
+#define F_WRLCK 1
+#define F_UNLCK 2
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+/* for leases */
+#define F_INPROGRESS 16
+
+/* operations for bsd flock(), also used by the kernel implementation */
+#define LOCK_SH 1 /* shared lock */
+#define LOCK_EX 2 /* exclusive lock */
+#define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+#define LOCK_UN 8 /* remove lock */
+
+#define LOCK_MAND 32 /* This is a mandatory flock */
+#define LOCK_READ 64 /* ... Which allows concurrent read operations */
+#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */
+#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */
+
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+};
+
+struct flock64 {
+ short l_type;
+ short l_whence;
+ loff_t l_start;
+ loff_t l_len;
+ pid_t l_pid;
+};
+
+#elif defined (__arm__)
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0003
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100 /* not fcntl */
+#define O_EXCL 0200 /* not fcntl */
+#define O_NOCTTY 0400 /* not fcntl */
+#define O_TRUNC 01000 /* not fcntl */
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_NDELAY O_NONBLOCK
+#define O_SYNC 010000
+#define FASYNC 020000 /* fcntl, for BSD compatibility */
+#define O_DIRECTORY 040000 /* must be a directory */
+#define O_NOFOLLOW 0100000 /* don't follow links */
+#define O_DIRECT 0200000 /* direct disk access hint - currently ignored */
+#define O_LARGEFILE 0400000
+
+#define F_DUPFD 0 /* dup */
+#define F_GETFD 1 /* get close_on_exec */
+#define F_SETFD 2 /* set/clear close_on_exec */
+#define F_GETFL 3 /* get file->f_flags */
+#define F_SETFL 4 /* set file->f_flags */
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+
+#define F_SETOWN 8 /* for sockets. */
+#define F_GETOWN 9 /* for sockets. */
+#define F_SETSIG 10 /* for sockets. */
+#define F_GETSIG 11 /* for sockets. */
+
+#define F_GETLK64 12 /* using 'struct flock64' */
+#define F_SETLK64 13
+#define F_SETLKW64 14
+
+/* for F_[GET|SET]FL */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK 0
+#define F_WRLCK 1
+#define F_UNLCK 2
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+/* for leases */
+#define F_INPROGRESS 16
+
+/* operations for bsd flock(), also used by the kernel implementation */
+#define LOCK_SH 1 /* shared lock */
+#define LOCK_EX 2 /* exclusive lock */
+#define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+#define LOCK_UN 8 /* remove lock */
+
+#define LOCK_MAND 32 /* This is a mandatory flock */
+#define LOCK_READ 64 /* ... Which allows concurrent read operations */
+#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */
+#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */
+
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+};
+
+struct flock64 {
+ short l_type;
+ short l_whence;
+ loff_t l_start;
+ loff_t l_len;
+ pid_t l_pid;
+};
+
+#elif defined(__hppa__)
+
+/* Copied from bits/fcntl.h */
+
+#define O_RDONLY 00000000
+#define O_WRONLY 00000001
+#define O_RDWR 00000002
+#define O_ACCMODE 00000003
+#define O_APPEND 00000010
+#define O_BLKSEEK 00000100 /* HPUX only */
+#define O_CREAT 00000400 /* not fcntl */
+#define O_TRUNC 00001000 /* not fcntl */
+#define O_EXCL 00002000 /* not fcntl */
+#define O_ASYNC 00020000
+#define O_SYNC 00100000
+#define O_NONBLOCK 00200004 /* HPUX has separate NDELAY & NONBLOCK */
+#define O_NDELAY O_NONBLOCK
+#define O_NOCTTY 00400000 /* not fcntl */
+#define O_DIRECTORY 00010000
+
+#define F_DUPFD 0 /* Duplicate file descriptor. */
+#define F_GETFD 1 /* Get file descriptor flags. */
+#define F_SETFD 2 /* Set file descriptor flags. */
+#define F_GETFL 3 /* Get file status flags. */
+#define F_SETFL 4 /* Set file status flags. */
+#define F_GETLK 5 /* Get record locking info. */
+#define F_SETLK 6 /* Set record locking info (non-blocking). */
+#define F_SETLKW 7 /* Set record locking info (blocking). */
+
+#define F_GETLK64 8 /* Get record locking info. */
+#define F_SETLK64 9 /* Set record locking info (non-blocking). */
+#define F_SETLKW64 10 /* Set record locking info (blocking). */
+
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+#define F_RDLCK 1 /* Read lock. */
+#define F_WRLCK 2 /* Write lock. */
+#define F_UNLCK 3 /* Remove lock. */
+
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+struct flock
+{
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+ off_t l_start; /* Offset where the lock begins. */
+ off_t l_len; /* Size of the locked area; zero means until EOF. */
+ pid_t l_pid; /* Process holding the lock. */
+};
+
+struct flock64
+{
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+ off64_t l_start; /* Offset where the lock begins. */
+ off64_t l_len; /* Size of the locked area; zero means until EOF. */
+ pid_t l_pid; /* Process holding the lock. */
+};
+
+#endif
extern int fcntl (int __fd, int __cmd, ...) __THROW;
-extern int open (const char *__file, int __oflag, ...) __THROW;
-extern int open64 (const char *__file, int __oflag, ...) __THROW;
-extern int creat (const char *__file, mode_t __mode) __THROW;
-extern int creat64 (const char *__file, mode_t __mode) __THROW;
extern int lockf (int __fd, int __cmd, off_t __len) __THROW;
extern int lockf64 (int __fd, int __cmd, off64_t __len) __THROW;
@@ -21,4 +557,8 @@ extern int lockf64 (int __fd, int __cmd, off64_t __len) __THROW;
#define F_TLOCK 2 /* Test and lock a region for exclusive use. */
#define F_TEST 3 /* Test a region for other processes locks. */
+#if !defined(O_ASYNC) && defined(FASYNC)
+#define O_ASYNC FASYNC
+#endif
+
#endif
diff --git a/mdk-stage1/dietlibc/include/features.h b/mdk-stage1/dietlibc/include/features.h
index 5b0283f20..d2b92d15c 100644
--- a/mdk-stage1/dietlibc/include/features.h
+++ b/mdk-stage1/dietlibc/include/features.h
@@ -1,3 +1,8 @@
-#warning "someone included features.h, apparently someone is including glibc headers!"
+#ifndef _FEATURES_H
+#define _FEATURES_H
-#define __dietlibc__
+#ifndef __dietlibc__
+#error "not using the diet wrapper?!"
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/float.h b/mdk-stage1/dietlibc/include/float.h
new file mode 100644
index 000000000..9c9c85a3a
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/float.h
@@ -0,0 +1,96 @@
+#ifndef _FLOAT_H
+#define _FLOAT_H
+
+/* blatantly copied from gcc headers for sparc */
+
+ /* Radix of exponent representation */
+#undef FLT_RADIX
+#define FLT_RADIX 2
+ /* Number of base-FLT_RADIX digits in the significand of a float */
+#undef FLT_MANT_DIG
+#define FLT_MANT_DIG 24
+ /* Number of decimal digits of precision in a float */
+#undef FLT_DIG
+#define FLT_DIG 6
+ /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
+#undef FLT_ROUNDS
+#define FLT_ROUNDS 1
+ /* Difference between 1.0 and the minimum float greater than 1.0 */
+#undef FLT_EPSILON
+#define FLT_EPSILON 1.19209290e-07F
+ /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
+#undef FLT_MIN_EXP
+#define FLT_MIN_EXP (-125)
+ /* Minimum normalised float */
+#undef FLT_MIN
+#define FLT_MIN 1.17549435e-38F
+ /* Minimum int x such that 10**x is a normalised float */
+#undef FLT_MIN_10_EXP
+#define FLT_MIN_10_EXP (-37)
+ /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
+#undef FLT_MAX_EXP
+#define FLT_MAX_EXP 128
+ /* Maximum float */
+#undef FLT_MAX
+#define FLT_MAX 3.40282347e+38F
+ /* Maximum int x such that 10**x is a representable float */
+#undef FLT_MAX_10_EXP
+#define FLT_MAX_10_EXP 38
+
+ /* Number of base-FLT_RADIX digits in the significand of a double */
+#undef DBL_MANT_DIG
+#define DBL_MANT_DIG 53
+ /* Number of decimal digits of precision in a double */
+#undef DBL_DIG
+#define DBL_DIG 15
+ /* Difference between 1.0 and the minimum double greater than 1.0 */
+#undef DBL_EPSILON
+#define DBL_EPSILON 2.2204460492503131e-16
+ /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
+#undef DBL_MIN_EXP
+#define DBL_MIN_EXP (-1021)
+ /* Minimum normalised double */
+#undef DBL_MIN
+#define DBL_MIN 2.2250738585072014e-308
+ /* Minimum int x such that 10**x is a normalised double */
+#undef DBL_MIN_10_EXP
+#define DBL_MIN_10_EXP (-307)
+ /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
+#undef DBL_MAX_EXP
+#define DBL_MAX_EXP 1024
+ /* Maximum double */
+#undef DBL_MAX
+#define DBL_MAX 1.7976931348623157e+308
+ /* Maximum int x such that 10**x is a representable double */
+#undef DBL_MAX_10_EXP
+#define DBL_MAX_10_EXP 308
+
+ /* Number of base-FLT_RADIX digits in the significand of a long double */
+#undef LDBL_MANT_DIG
+#define LDBL_MANT_DIG 53
+ /* Number of decimal digits of precision in a long double */
+#undef LDBL_DIG
+#define LDBL_DIG 15
+ /* Difference between 1.0 and the minimum long double greater than 1.0 */
+#undef LDBL_EPSILON
+#define LDBL_EPSILON 2.2204460492503131e-16L
+ /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
+#undef LDBL_MIN_EXP
+#define LDBL_MIN_EXP (-1021)
+ /* Minimum normalised long double */
+#undef LDBL_MIN
+#define LDBL_MIN 2.2250738585072014e-308L
+ /* Minimum int x such that 10**x is a normalised long double */
+#undef LDBL_MIN_10_EXP
+#define LDBL_MIN_10_EXP (-307)
+ /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
+#undef LDBL_MAX_EXP
+#define LDBL_MAX_EXP 1024
+ /* Maximum long double */
+#undef LDBL_MAX
+#define LDBL_MAX 1.7976931348623157e+308L
+ /* Maximum int x such that 10**x is a representable long double */
+#undef LDBL_MAX_10_EXP
+#define LDBL_MAX_10_EXP 308
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/fnmatch.h b/mdk-stage1/dietlibc/include/fnmatch.h
index 762b43ff7..146e700bd 100644
--- a/mdk-stage1/dietlibc/include/fnmatch.h
+++ b/mdk-stage1/dietlibc/include/fnmatch.h
@@ -12,4 +12,6 @@ int fnmatch(const char *pattern, const char *string, int flags) __THROW;
#define FNM_LEADING_DIR 8
#define FNM_CASEFOLD 16
+#define FNM_NOMATCH 1
+
#endif
diff --git a/mdk-stage1/dietlibc/include/ftw.h b/mdk-stage1/dietlibc/include/ftw.h
index c888f0021..e0450518e 100644
--- a/mdk-stage1/dietlibc/include/ftw.h
+++ b/mdk-stage1/dietlibc/include/ftw.h
@@ -32,19 +32,19 @@ enum
# define FTW_SLN FTW_SLN
};
-typedef int (*__ftw_func_t) (__const char *__filename,
- __const struct stat *__status, int __flag) __THROW;
+typedef int (*__ftw_func_t) (const char *__filename,
+ const struct stat *__status, int __flag) __THROW;
-typedef int (*__nftw_func_t) (__const char *__filename,
- __const struct stat *__status, int __flag,
+typedef int (*__nftw_func_t) (const char *__filename,
+ const struct stat *__status, int __flag,
struct FTW *__info) __THROW;
#ifndef __NO_STAT64
-typedef int (*__ftw64_func_t) (__const char *__filename,
- __const struct stat64 *__status, int __flag) __THROW;
+typedef int (*__ftw64_func_t) (const char *__filename,
+ const struct stat64 *__status, int __flag) __THROW;
-typedef int (*__nftw64_func_t) (__const char *__filename,
- __const struct stat64 *__status,
+typedef int (*__nftw64_func_t) (const char *__filename,
+ const struct stat64 *__status,
int __flag, struct FTW *__info) __THROW;
#endif
diff --git a/mdk-stage1/dietlibc/include/getopt.h b/mdk-stage1/dietlibc/include/getopt.h
index ebfc5522d..db1592c52 100644
--- a/mdk-stage1/dietlibc/include/getopt.h
+++ b/mdk-stage1/dietlibc/include/getopt.h
@@ -1,12 +1,8 @@
#ifndef __GETOPT_H__
#define __GETOPT_H__
-extern int optind,opterr;
-extern char *optarg;
-int getopt(int argc, char *argv[], char *options);
+#include <unistd.h>
-/* the following was taken from GNU getopt, it's not actually supported
- * by the diet libc! */
extern int optopt;
struct option {
diff --git a/mdk-stage1/dietlibc/include/glob.h b/mdk-stage1/dietlibc/include/glob.h
index 80febbccf..bc8f779c9 100644
--- a/mdk-stage1/dietlibc/include/glob.h
+++ b/mdk-stage1/dietlibc/include/glob.h
@@ -1,6 +1,8 @@
#ifndef _GLOB_H
#define _GLOB_H
+#include <sys/cdefs.h>
+#include <sys/types.h>
typedef struct {
size_t gl_pathc; /* Count of paths matched so far */
diff --git a/mdk-stage1/dietlibc/include/grp.h b/mdk-stage1/dietlibc/include/grp.h
index 32bf49afc..08b153137 100644
--- a/mdk-stage1/dietlibc/include/grp.h
+++ b/mdk-stage1/dietlibc/include/grp.h
@@ -19,7 +19,17 @@ extern struct group *getgrent(void) __THROW;
extern void setgrent(void) __THROW;
extern void endgrent(void) __THROW;
+int getgrent_r(struct group *res, char *buf, size_t buflen,
+ struct group **res_sig) __THROW;
+int getgrnam_r(const char* name,
+ struct group *res, char *buf, size_t buflen,
+ struct group **res_sig) __THROW;
+int getgrgid_r(uid_t uid,
+ struct group *res, char *buf, size_t buflen,
+ struct group **res_sig) __THROW;
+
extern int setgroups(size_t n, const gid_t *groups) __THROW;
+extern int setgroups32(size_t n, const gid32_t *groups) __THROW;
extern int initgroups(const char *user, gid_t group) __THROW;
#endif
diff --git a/mdk-stage1/dietlibc/include/iconv.h b/mdk-stage1/dietlibc/include/iconv.h
new file mode 100644
index 000000000..1205994ca
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/iconv.h
@@ -0,0 +1,25 @@
+#ifndef _ICONV_H
+#define _ICONV_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+/* Identifier for conversion method from one codeset to another. */
+typedef unsigned int iconv_t;
+
+/* Allocate descriptor for code conversion from codeset FROMCODE to
+ codeset TOCODE. */
+extern iconv_t iconv_open (const char *tocode, const char *fromcode) __THROW;
+
+/* Convert at most *INBYTESLEFT bytes from *INBUF according to the
+ code conversion algorithm specified by CD and place up to
+ *OUTBYTESLEFT bytes in buffer at *OUTBUF. */
+extern size_t iconv (iconv_t cd, const char** inbuf,
+ size_t* inbytesleft,
+ char** outbuf,
+ size_t* outbytesleft) __THROW;
+
+/* Free resources allocated for descriptor CD for code conversion. */
+extern int iconv_close (iconv_t cd) __THROW;
+
+#endif /* iconv.h */
diff --git a/mdk-stage1/dietlibc/include/inttypes.h b/mdk-stage1/dietlibc/include/inttypes.h
index e69de29bb..32637f5f7 100644
--- a/mdk-stage1/dietlibc/include/inttypes.h
+++ b/mdk-stage1/dietlibc/include/inttypes.h
@@ -0,0 +1,247 @@
+#ifndef _INTTYPES_H
+#define _INTTYPES_H
+
+#include <sys/cdefs.h>
+#include <endian.h>
+
+# if __WORDSIZE == 64
+# define __PRI64_PREFIX "l"
+# define __PRIPTR_PREFIX "l"
+# else
+# define __PRI64_PREFIX "ll"
+# define __PRIPTR_PREFIX
+# endif
+
+/* Macros for printing format specifiers. */
+
+/* Decimal notation. */
+# define PRId8 "d"
+# define PRId16 "d"
+# define PRId32 "d"
+# define PRId64 __PRI64_PREFIX "d"
+
+# define PRIdLEAST8 "d"
+# define PRIdLEAST16 "d"
+# define PRIdLEAST32 "d"
+# define PRIdLEAST64 __PRI64_PREFIX "d"
+
+# define PRIdFAST8 "d"
+# define PRIdFAST16 "d"
+# define PRIdFAST32 "d"
+# define PRIdFAST64 __PRI64_PREFIX "d"
+
+
+# define PRIi8 "i"
+# define PRIi16 "i"
+# define PRIi32 "i"
+# define PRIi64 __PRI64_PREFIX "i"
+
+# define PRIiLEAST8 "i"
+# define PRIiLEAST16 "i"
+# define PRIiLEAST32 "i"
+# define PRIiLEAST64 __PRI64_PREFIX "i"
+
+# define PRIiFAST8 "i"
+# define PRIiFAST16 "i"
+# define PRIiFAST32 "i"
+# define PRIiFAST64 __PRI64_PREFIX "i"
+
+/* Octal notation. */
+# define PRIo8 "o"
+# define PRIo16 "o"
+# define PRIo32 "o"
+# define PRIo64 __PRI64_PREFIX "o"
+
+# define PRIoLEAST8 "o"
+# define PRIoLEAST16 "o"
+# define PRIoLEAST32 "o"
+# define PRIoLEAST64 __PRI64_PREFIX "o"
+
+# define PRIoFAST8 "o"
+# define PRIoFAST16 "o"
+# define PRIoFAST32 "o"
+# define PRIoFAST64 __PRI64_PREFIX "o"
+
+/* Unsigned integers. */
+# define PRIu8 "u"
+# define PRIu16 "u"
+# define PRIu32 "u"
+# define PRIu64 __PRI64_PREFIX "u"
+
+# define PRIuLEAST8 "u"
+# define PRIuLEAST16 "u"
+# define PRIuLEAST32 "u"
+# define PRIuLEAST64 __PRI64_PREFIX "u"
+
+# define PRIuFAST8 "u"
+# define PRIuFAST16 "u"
+# define PRIuFAST32 "u"
+# define PRIuFAST64 __PRI64_PREFIX "u"
+
+/* lowercase hexadecimal notation. */
+# define PRIx8 "x"
+# define PRIx16 "x"
+# define PRIx32 "x"
+# define PRIx64 __PRI64_PREFIX "x"
+
+# define PRIxLEAST8 "x"
+# define PRIxLEAST16 "x"
+# define PRIxLEAST32 "x"
+# define PRIxLEAST64 __PRI64_PREFIX "x"
+
+# define PRIxFAST8 "x"
+# define PRIxFAST16 "x"
+# define PRIxFAST32 "x"
+# define PRIxFAST64 __PRI64_PREFIX "x"
+
+/* UPPERCASE hexadecimal notation. */
+# define PRIX8 "X"
+# define PRIX16 "X"
+# define PRIX32 "X"
+# define PRIX64 __PRI64_PREFIX "X"
+
+# define PRIXLEAST8 "X"
+# define PRIXLEAST16 "X"
+# define PRIXLEAST32 "X"
+# define PRIXLEAST64 __PRI64_PREFIX "X"
+
+# define PRIXFAST8 "X"
+# define PRIXFAST16 "X"
+# define PRIXFAST32 "X"
+# define PRIXFAST64 __PRI64_PREFIX "X"
+
+
+/* Macros for printing `intmax_t' and `uintmax_t'. */
+# define PRIdMAX __PRI64_PREFIX "d"
+# define PRIiMAX __PRI64_PREFIX "i"
+# define PRIoMAX __PRI64_PREFIX "o"
+# define PRIuMAX __PRI64_PREFIX "u"
+# define PRIxMAX __PRI64_PREFIX "x"
+# define PRIXMAX __PRI64_PREFIX "X"
+
+
+/* Macros for printing `intptr_t' and `uintptr_t'. */
+# define PRIdPTR __PRIPTR_PREFIX "d"
+# define PRIiPTR __PRIPTR_PREFIX "i"
+# define PRIoPTR __PRIPTR_PREFIX "o"
+# define PRIuPTR __PRIPTR_PREFIX "u"
+# define PRIxPTR __PRIPTR_PREFIX "x"
+# define PRIXPTR __PRIPTR_PREFIX "X"
+
+
+/* Macros for scanning format specifiers. */
+
+/* Signed decimal notation. */
+# define SCNd8 "hhd"
+# define SCNd16 "hd"
+# define SCNd32 "d"
+# define SCNd64 __PRI64_PREFIX "d"
+
+# define SCNdLEAST8 "hhd"
+# define SCNdLEAST16 "hd"
+# define SCNdLEAST32 "d"
+# define SCNdLEAST64 __PRI64_PREFIX "d"
+
+# define SCNdFAST8 "hhd"
+# define SCNdFAST16 __PRIPTR_PREFIX "d"
+# define SCNdFAST32 __PRIPTR_PREFIX "d"
+# define SCNdFAST64 __PRI64_PREFIX "d"
+
+/* Signed decimal notation. */
+# define SCNi8 "hhi"
+# define SCNi16 "hi"
+# define SCNi32 "i"
+# define SCNi64 __PRI64_PREFIX "i"
+
+# define SCNiLEAST8 "hhi"
+# define SCNiLEAST16 "hi"
+# define SCNiLEAST32 "i"
+# define SCNiLEAST64 __PRI64_PREFIX "i"
+
+# define SCNiFAST8 "hhi"
+# define SCNiFAST16 __PRIPTR_PREFIX "i"
+# define SCNiFAST32 __PRIPTR_PREFIX "i"
+# define SCNiFAST64 __PRI64_PREFIX "i"
+
+/* Unsigned decimal notation. */
+# define SCNu8 "hhu"
+# define SCNu16 "hu"
+# define SCNu32 "u"
+# define SCNu64 __PRI64_PREFIX "u"
+
+# define SCNuLEAST8 "hhu"
+# define SCNuLEAST16 "hu"
+# define SCNuLEAST32 "u"
+# define SCNuLEAST64 __PRI64_PREFIX "u"
+
+# define SCNuFAST8 "hhu"
+# define SCNuFAST16 __PRIPTR_PREFIX "u"
+# define SCNuFAST32 __PRIPTR_PREFIX "u"
+# define SCNuFAST64 __PRI64_PREFIX "u"
+
+/* Octal notation. */
+# define SCNo8 "hho"
+# define SCNo16 "ho"
+# define SCNo32 "o"
+# define SCNo64 __PRI64_PREFIX "o"
+
+# define SCNoLEAST8 "hho"
+# define SCNoLEAST16 "ho"
+# define SCNoLEAST32 "o"
+# define SCNoLEAST64 __PRI64_PREFIX "o"
+
+# define SCNoFAST8 "hho"
+# define SCNoFAST16 __PRIPTR_PREFIX "o"
+# define SCNoFAST32 __PRIPTR_PREFIX "o"
+# define SCNoFAST64 __PRI64_PREFIX "o"
+
+/* Hexadecimal notation. */
+# define SCNx8 "hhx"
+# define SCNx16 "hx"
+# define SCNx32 "x"
+# define SCNx64 __PRI64_PREFIX "x"
+
+# define SCNxLEAST8 "hhx"
+# define SCNxLEAST16 "hx"
+# define SCNxLEAST32 "x"
+# define SCNxLEAST64 __PRI64_PREFIX "x"
+
+# define SCNxFAST8 "hhx"
+# define SCNxFAST16 __PRIPTR_PREFIX "x"
+# define SCNxFAST32 __PRIPTR_PREFIX "x"
+# define SCNxFAST64 __PRI64_PREFIX "x"
+
+
+/* Macros for scanning `intmax_t' and `uintmax_t'. */
+# define SCNdMAX __PRI64_PREFIX "d"
+# define SCNiMAX __PRI64_PREFIX "i"
+# define SCNoMAX __PRI64_PREFIX "o"
+# define SCNuMAX __PRI64_PREFIX "u"
+# define SCNxMAX __PRI64_PREFIX "x"
+
+/* Macros for scanning `intptr_t' and `uintptr_t'. */
+# define SCNdPTR __PRIPTR_PREFIX "d"
+# define SCNiPTR __PRIPTR_PREFIX "i"
+# define SCNoPTR __PRIPTR_PREFIX "o"
+# define SCNuPTR __PRIPTR_PREFIX "u"
+# define SCNxPTR __PRIPTR_PREFIX "x"
+
+typedef signed char int8_t;
+typedef signed short int16_t;
+typedef signed int int32_t;
+
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+
+typedef signed long int intptr_t;
+typedef unsigned long int uintptr_t;
+
+#ifndef __STRICT_ANSI__
+__extension__ typedef signed long long int64_t;
+__extension__ typedef unsigned long long uint64_t;
+__extension__ typedef signed long long int intmax_t;
+__extension__ typedef unsigned long long int uintmax_t;
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/libgen.h b/mdk-stage1/dietlibc/include/libgen.h
new file mode 100644
index 000000000..ab13b0a30
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/libgen.h
@@ -0,0 +1,9 @@
+#ifndef _LIBGEN_H
+#define _LIBGEN_H
+
+#include <sys/cdefs.h>
+
+char *dirname(char *path) __THROW;
+char *basename(char *path) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/libintl.h b/mdk-stage1/dietlibc/include/libintl.h
new file mode 100644
index 000000000..20873f55f
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/libintl.h
@@ -0,0 +1,23 @@
+#ifndef _LIBINTL_H
+#define _LIBINTL_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <locale.h>
+
+#define gettext(msgid) dgettext(0,msgid)
+#define dgettext(domainname,msgid) dcgettext(domainname,msgid,LC_MESSAGES)
+
+#define ngettext(msgid1,msgid2,n) dngettext(0,msgid1,msgid2,n)
+#define dngettext(dn,msgid1,msgid2,n) dngettext(dn,msgid1,msgid2,n,LC_MESSAGES)
+
+char* dcgettext(const char *domainname, const char *msgid, int category) __THROW;
+char* dcngettext(const char *domainname,
+ const char *msgid1, const char *msgid2,
+ unsigned long int n, int __category) __THROW;
+
+char* textdomain(const char *domainname) __THROW;
+char* bindtextdomain(const char *domainname, const char *dirname) __THROW;
+char* bind_textdomain_codeset(const char *domainname, const char *codeset) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/limits.h b/mdk-stage1/dietlibc/include/limits.h
index a333debfd..b5577a0bf 100644
--- a/mdk-stage1/dietlibc/include/limits.h
+++ b/mdk-stage1/dietlibc/include/limits.h
@@ -1,18 +1,7 @@
#ifndef _LIMITS_H
#define _LIMITS_H
-#include <linux/limits.h>
-
-#define __WORDSIZE 32
-
-#ifdef __alpha__
-#undef __WORDSIZE
-#define __WORDSIZE 64
-#endif
-
-#ifndef PATH_MAX
-#define PATH_MAX 4096
-#endif
+#include <endian.h>
#define CHAR_BIT 8
@@ -20,6 +9,18 @@
#define SCHAR_MAX 0x7f
#define UCHAR_MAX 0xff
+#ifdef __CHAR_UNSIGNED__
+#undef CHAR_MIN
+#define CHAR_MIN 0
+#undef CHAR_MAX
+#define CHAR_MAX UCHAR_MAX
+#else
+#undef CHAR_MIN
+#define CHAR_MIN SCHAR_MIN
+#undef CHAR_MAX
+#define CHAR_MAX SCHAR_MAX
+#endif
+
#define SHRT_MIN (-SHRT_MAX-1)
#define SHRT_MAX 0x7fff
#define USHRT_MAX 0xffff
@@ -43,6 +44,30 @@
/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */
#define ULLONG_MAX 18446744073709551615ULL
-#define PASS_MAX 256
+#define SSIZE_MIN LONG_MIN
+#define SSIZE_MAX LONG_MAX
+
+#define PASS_MAX 256
+
+#define NR_OPEN 1024
+
+#define NGROUPS_MAX 32 /* supplemental group IDs are available */
+#define ARG_MAX 131072 /* # bytes of args + environ for exec() */
+#define CHILD_MAX 999 /* no limit :-) */
+#define OPEN_MAX 256 /* # open files a process may have */
+#define LINK_MAX 127 /* # links a file may have */
+#define MAX_CANON 255 /* size of the canonical input queue */
+#define MAX_INPUT 255 /* size of the type-ahead buffer */
+#define NAME_MAX 255 /* # chars in a file name */
+#define PATH_MAX 4095 /* # chars in a path name */
+#define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */
+
+#define RTSIG_MAX 32
+
+#define LINE_MAX 2048
+
+/* mutt demanded these */
+#define _POSIX_PATH_MAX PATH_MAX
+#define MB_LEN_MAX 16
#endif
diff --git a/mdk-stage1/dietlibc/include/locale.h b/mdk-stage1/dietlibc/include/locale.h
index acbeec8c1..5cd002019 100644
--- a/mdk-stage1/dietlibc/include/locale.h
+++ b/mdk-stage1/dietlibc/include/locale.h
@@ -1,6 +1,84 @@
-#warning "there is no locale support for diet libc yet"
+#ifndef _LOCALE_H
+#define _LOCALE_H
-#define setlocale(a,b) 0
-#define bindtextdomain
-#define textdomain
+#include <sys/cdefs.h>
+enum {
+ LC_CTYPE = 0,
+ LC_NUMERIC = 1,
+ LC_TIME = 2,
+ LC_COLLATE = 3,
+ LC_MONETARY = 4,
+ LC_MESSAGES = 5,
+ LC_ALL = 6,
+ LC_PAPER = 7,
+ LC_NAME = 8,
+ LC_ADDRESS = 9,
+ LC_TELEPHONE = 10,
+ LC_MEASUREMENT = 11,
+ LC_IDENTIFICATION = 12
+};
+
+/* Structure giving information about numeric and monetary notation. */
+struct lconv {
+ /* Numeric (non-monetary) information. */
+ char *decimal_point;
+ char *thousands_sep;
+ /* Each element is the number of digits in each group;
+ elements with higher indices are farther left.
+ An element with value CHAR_MAX means that no further grouping is done.
+ An element with value 0 means that the previous element is used
+ for all groups farther left. */
+ char *grouping;
+
+ /* Monetary information. */
+
+ /* First three chars are a currency symbol from ISO 4217.
+ Fourth char is the separator. Fifth char is '\0'. */
+ char *int_curr_symbol;
+ char *currency_symbol; /* Local currency symbol. */
+ char *mon_decimal_point; /* Decimal point character. */
+ char *mon_thousands_sep; /* Thousands separator. */
+ char *mon_grouping; /* Like `grouping' element (above). */
+ char *positive_sign; /* Sign for positive values. */
+ char *negative_sign; /* Sign for negative values. */
+ char int_frac_digits; /* Int'l fractional digits. */
+ char frac_digits; /* Local fractional digits. */
+ /* 1 if currency_symbol precedes a positive value, 0 if succeeds. */
+ char p_cs_precedes;
+ /* 1 iff a space separates currency_symbol from a positive value. */
+ char p_sep_by_space;
+ /* 1 if currency_symbol precedes a negative value, 0 if succeeds. */
+ char n_cs_precedes;
+ /* 1 iff a space separates currency_symbol from a negative value. */
+ char n_sep_by_space;
+ /* Positive and negative sign positions:
+ 0 Parentheses surround the quantity and currency_symbol.
+ 1 The sign string precedes the quantity and currency_symbol.
+ 2 The sign string follows the quantity and currency_symbol.
+ 3 The sign string immediately precedes the currency_symbol.
+ 4 The sign string immediately follows the currency_symbol. */
+ char p_sign_posn;
+ char n_sign_posn;
+ /* 1 if int_curr_symbol precedes a positive value, 0 if succeeds. */
+ char int_p_cs_precedes;
+ /* 1 iff a space separates int_curr_symbol from a positive value. */
+ char int_p_sep_by_space;
+ /* 1 if int_curr_symbol precedes a negative value, 0 if succeeds. */
+ char int_n_cs_precedes;
+ /* 1 iff a space separates int_curr_symbol from a negative value. */
+ char int_n_sep_by_space;
+ /* Positive and negative sign positions:
+ 0 Parentheses surround the quantity and int_curr_symbol.
+ 1 The sign string precedes the quantity and int_curr_symbol.
+ 2 The sign string follows the quantity and int_curr_symbol.
+ 3 The sign string immediately precedes the int_curr_symbol.
+ 4 The sign string immediately follows the int_curr_symbol. */
+ char int_p_sign_posn;
+ char int_n_sign_posn;
+};
+
+char *setlocale (int category, const char *locale) __THROW;
+struct lconv *localeconv (void) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/math.h b/mdk-stage1/dietlibc/include/math.h
index 2f4f2e33f..2cb545237 100644
--- a/mdk-stage1/dietlibc/include/math.h
+++ b/mdk-stage1/dietlibc/include/math.h
@@ -48,6 +48,7 @@ double acosh(double d) __THROW __attribute__((__const__));
double atanh(double d) __THROW __attribute__((__const__));
double exp(double d) __THROW __attribute__((__const__));
+double exp10(double d) __THROW __attribute__((__const__));
double log(double d) __THROW __attribute__((__const__));
double log10(double d) __THROW __attribute__((__const__));
@@ -57,5 +58,39 @@ double sqrt(double x) __THROW __attribute__((__const__));
double fabs(double x) __THROW __attribute__((__const__));
double fmod(double x, double y) __THROW __attribute__((__const__));
+double floor(double x) __attribute__((__const__));
+double ceil(double x) __attribute__((__const__));
+
+double expm1(double x) __THROW __attribute__((__const__));
+double hypot(double x, double y) __THROW __attribute__((__const__));
+double atan2(double x, double y) __THROW __attribute__((__const__));
+
+double copysign(double value, double sign) __attribute__((__const__));
+
+# define HUGE_VAL \
+ (__extension__ \
+ ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \
+ { __l: 0x000000007ff00000ULL }).__d)
+
+#ifdef _GNU_SOURCE
+void sincos(double x, double* sinx, double* cosx);
+double ipow (double mant, int expo);
+#endif
+
+int isnan(double d) __attribute__((__const__));
+int isinf(double d) __attribute__((__const__));
+int finite(double d) __attribute__((__const__));
+
+double j0(double x);
+double j1(double x);
+double jn(int n, double x);
+double y0(double x);
+double y1(double x);
+double yn(int n, double x);
+double erf(double x);
+double erfc(double x);
+double lgamma(double x);
+
+double rint(double x);
#endif
diff --git a/mdk-stage1/dietlibc/include/md5.h b/mdk-stage1/dietlibc/include/md5.h
new file mode 100644
index 000000000..7cbc0e8f3
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/md5.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+*/
+
+#ifndef _MD5_H
+#define _MD5_H
+
+#include <sys/types.h>
+
+/*
+ Define the MD5 context structure.
+ Please DO NOT change the order or contents of the structure as
+ various assembler files depend on it !!
+*/
+typedef struct
+{
+ uint32_t state[4]; /* state (ABCD) */
+ uint32_t count[2]; /* number of bits, modulo 2^64 (least sig word first) */
+ uint8_t buffer[64]; /* input buffer for incomplete buffer data */
+}
+MD5_CTX;
+
+void MD5Init (MD5_CTX* ctx);
+void MD5Update (MD5_CTX* ctx, const uint8_t* buf, size_t len);
+void MD5Final (uint8_t digest[16], MD5_CTX* ctx);
+
+char* md5crypt (const char* pw, const char* salt);
+
+#endif
+
diff --git a/mdk-stage1/dietlibc/include/net/if.h b/mdk-stage1/dietlibc/include/net/if.h
index 88f386f46..ac4737db3 100644
--- a/mdk-stage1/dietlibc/include/net/if.h
+++ b/mdk-stage1/dietlibc/include/net/if.h
@@ -2,10 +2,101 @@
#define _NET_IF_H
#include <sys/cdefs.h>
+#include <sys/socket.h>
-#include <linux/if.h>
+/* Standard interface flags. */
+#define IFF_UP 0x1 /* interface is up */
+#define IFF_BROADCAST 0x2 /* broadcast address valid */
+#define IFF_DEBUG 0x4 /* turn on debugging */
+#define IFF_LOOPBACK 0x8 /* is a loopback net */
+#define IFF_POINTOPOINT 0x10 /* interface is has p-p link */
+#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */
+#define IFF_RUNNING 0x40 /* resources allocated */
+#define IFF_NOARP 0x80 /* no ARP protocol */
+#define IFF_PROMISC 0x100 /* receive all packets */
+#define IFF_ALLMULTI 0x200 /* receive all multicast packets*/
+
+#define IFF_MASTER 0x400 /* master of a load balancer */
+#define IFF_SLAVE 0x800 /* slave of a load balancer */
+
+#define IFF_MULTICAST 0x1000 /* Supports multicast */
+
+#define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_MASTER|IFF_SLAVE|IFF_RUNNING)
+
+#define IFF_PORTSEL 0x2000 /* can set media type */
+#define IFF_AUTOMEDIA 0x4000 /* auto media select active */
+#define IFF_DYNAMIC 0x8000 /* dialup device with changing addresses*/
+
+struct ifmap {
+ unsigned long mem_start;
+ unsigned long mem_end;
+ unsigned short base_addr;
+ unsigned char irq;
+ unsigned char dma;
+ unsigned char port;
+ /* 3 bytes spare */
+};
+
+struct ifreq {
+#define IFHWADDRLEN 6
+#define IFNAMSIZ 16
+ union
+ {
+ char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */
+ } ifr_ifrn;
+ union {
+ struct sockaddr ifru_addr;
+ struct sockaddr ifru_dstaddr;
+ struct sockaddr ifru_broadaddr;
+ struct sockaddr ifru_netmask;
+ struct sockaddr ifru_hwaddr;
+ short ifru_flags;
+ int ifru_ivalue;
+ int ifru_mtu;
+ struct ifmap ifru_map;
+ char ifru_slave[IFNAMSIZ]; /* Just fits the size */
+ char ifru_newname[IFNAMSIZ];
+ char* ifru_data;
+ } ifr_ifru;
+};
+
+#define ifr_name ifr_ifrn.ifrn_name /* interface name */
+#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
+#define ifr_addr ifr_ifru.ifru_addr /* address */
+#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
+#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
+#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
+#define ifr_flags ifr_ifru.ifru_flags /* flags */
+#define ifr_metric ifr_ifru.ifru_ivalue /* metric */
+#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
+#define ifr_map ifr_ifru.ifru_map /* device map */
+#define ifr_slave ifr_ifru.ifru_slave /* slave device */
+#define ifr_data ifr_ifru.ifru_data /* for use by interface */
+#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
+#define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */
+#define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */
+#define ifr_newname ifr_ifru.ifru_newname /* New name */
+
+struct ifconf {
+ int ifc_len; /* size of buffer */
+ union {
+ char * ifcu_buf;
+ struct ifreq *ifcu_req;
+ } ifc_ifcu;
+};
+
+#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
+#define ifc_req ifc_ifcu.ifcu_req /* array of structures */
unsigned int if_nametoindex (const char *ifname) __THROW;
char *if_indextoname (unsigned int ifindex, char *ifname) __THROW;
+struct if_nameindex {
+ unsigned int if_index;
+ char *if_name;
+};
+
+struct if_nameindex* if_nameindex(void) __THROW;
+void if_freenameindex(struct if_nameindex* ptr) __THROW;
+
#endif
diff --git a/mdk-stage1/dietlibc/include/net/if_arp.h b/mdk-stage1/dietlibc/include/net/if_arp.h
index fe37a22dc..b1054066a 100644
--- a/mdk-stage1/dietlibc/include/net/if_arp.h
+++ b/mdk-stage1/dietlibc/include/net/if_arp.h
@@ -1,6 +1,113 @@
#ifndef _NET_IF_ARP_H
#define _NET_IF_ARP_H
-#include <linux/if_arp.h>
+#include <sys/socket.h>
+#define MAX_ADDR_LEN 7
+
+/* ARP protocol HARDWARE identifiers. */
+#define ARPHRD_NETROM 0 /* from KA9Q: NET/ROM pseudo */
+#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */
+#define ARPHRD_EETHER 2 /* Experimental Ethernet */
+#define ARPHRD_AX25 3 /* AX.25 Level 2 */
+#define ARPHRD_PRONET 4 /* PROnet token ring */
+#define ARPHRD_CHAOS 5 /* Chaosnet */
+#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */
+#define ARPHRD_ARCNET 7 /* ARCnet */
+#define ARPHRD_APPLETLK 8 /* APPLEtalk */
+#define ARPHRD_DLCI 15 /* Frame Relay DLCI */
+#define ARPHRD_ATM 19 /* ATM */
+#define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id) */
+
+/* Dummy types for non ARP hardware */
+#define ARPHRD_SLIP 256
+#define ARPHRD_CSLIP 257
+#define ARPHRD_SLIP6 258
+#define ARPHRD_CSLIP6 259
+#define ARPHRD_RSRVD 260 /* Notional KISS type */
+#define ARPHRD_ADAPT 264
+#define ARPHRD_ROSE 270
+#define ARPHRD_X25 271 /* CCITT X.25 */
+#define ARPHRD_HWX25 272 /* Boards with X.25 in firmware */
+#define ARPHRD_PPP 512
+#define ARPHRD_CISCO 513 /* Cisco HDLC */
+#define ARPHRD_HDLC ARPHRD_CISCO
+#define ARPHRD_LAPB 516 /* LAPB */
+#define ARPHRD_DDCMP 517 /* Digital's DDCMP protocol */
+#define ARPHRD_RAWHDLC 518 /* Raw HDLC */
+
+#define ARPHRD_TUNNEL 768 /* IPIP tunnel */
+#define ARPHRD_TUNNEL6 769 /* IPIP6 tunnel */
+#define ARPHRD_FRAD 770 /* Frame Relay Access Device */
+#define ARPHRD_SKIP 771 /* SKIP vif */
+#define ARPHRD_LOOPBACK 772 /* Loopback device */
+#define ARPHRD_LOCALTLK 773 /* Localtalk device */
+#define ARPHRD_FDDI 774 /* Fiber Distributed Data Interface */
+#define ARPHRD_BIF 775 /* AP1000 BIF */
+#define ARPHRD_SIT 776 /* sit0 device - IPv6-in-IPv4 */
+#define ARPHRD_IPDDP 777 /* IP over DDP tunneller */
+#define ARPHRD_IPGRE 778 /* GRE over IP */
+#define ARPHRD_PIMREG 779 /* PIMSM register interface */
+#define ARPHRD_HIPPI 780 /* High Performance Parallel Interface */
+#define ARPHRD_ASH 781 /* Nexus 64Mbps Ash */
+#define ARPHRD_ECONET 782 /* Acorn Econet */
+#define ARPHRD_IRDA 783 /* Linux-IrDA */
+/* ARP works differently on different FC media .. so */
+#define ARPHRD_FCPP 784 /* Point to point fibrechannel */
+#define ARPHRD_FCAL 785 /* Fibrechannel arbitrated loop */
+#define ARPHRD_FCPL 786 /* Fibrechannel public loop */
+#define ARPHRD_FCFABRIC 787 /* Fibrechannel fabric */
+ /* 787->799 reserved for fibrechannel media types */
+#define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR */
+#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */
+
+#define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */
+
+/* ARP protocol opcodes. */
+#define ARPOP_REQUEST 1 /* ARP request */
+#define ARPOP_REPLY 2 /* ARP reply */
+#define ARPOP_RREQUEST 3 /* RARP request */
+#define ARPOP_RREPLY 4 /* RARP reply */
+#define ARPOP_InREQUEST 8 /* InARP request */
+#define ARPOP_InREPLY 9 /* InARP reply */
+#define ARPOP_NAK 10 /* (ATM)ARP NAK */
+
+
+/* ARP ioctl request. */
+struct arpreq {
+ struct sockaddr arp_pa; /* protocol address */
+ struct sockaddr arp_ha; /* hardware address */
+ int arp_flags; /* flags */
+ struct sockaddr arp_netmask; /* netmask (only for proxy arps) */
+ char arp_dev[16];
+};
+
+struct arpreq_old {
+ struct sockaddr arp_pa; /* protocol address */
+ struct sockaddr arp_ha; /* hardware address */
+ int arp_flags; /* flags */
+ struct sockaddr arp_netmask; /* netmask (only for proxy arps) */
+};
+
+/* ARP Flag values. */
+#define ATF_COM 0x02 /* completed entry (ha valid) */
+#define ATF_PERM 0x04 /* permanent entry */
+#define ATF_PUBL 0x08 /* publish entry */
+#define ATF_USETRAILERS 0x10 /* has requested trailers */
+#define ATF_NETMASK 0x20 /* want to use a netmask (only
+ for proxy entries) */
+#define ATF_DONTPUB 0x40 /* don't answer this addresses */
+
+/*
+ * This structure defines an ethernet arp header.
+ */
+
+struct arphdr
+{
+ unsigned short ar_hrd; /* format of hardware address */
+ unsigned short ar_pro; /* format of protocol address */
+ unsigned char ar_hln; /* length of hardware address */
+ unsigned char ar_pln; /* length of protocol address */
+ unsigned short ar_op; /* ARP opcode (command) */
+};
#endif
diff --git a/mdk-stage1/dietlibc/include/net/if_ether.h b/mdk-stage1/dietlibc/include/net/if_ether.h
new file mode 100644
index 000000000..7451a6dc6
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/net/if_ether.h
@@ -0,0 +1,74 @@
+#ifndef _NET_IF_ETHER_H
+#define _NET_IF_ETHER_H
+
+/* taken from <linux/if_ether.h> */
+
+#define ETH_ALEN 6 /* Octets in one ethernet addr */
+#define ETH_HLEN 14 /* Total octets in header. */
+#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */
+#define ETH_DATA_LEN 1500 /* Max. octets in payload */
+#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */
+
+/*
+ * These are the defined Ethernet Protocol ID's.
+ */
+
+#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */
+#define ETH_P_PUP 0x0200 /* Xerox PUP packet */
+#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */
+#define ETH_P_IP 0x0800 /* Internet Protocol packet */
+#define ETH_P_X25 0x0805 /* CCITT X.25 */
+#define ETH_P_ARP 0x0806 /* Address Resolution packet */
+#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */
+#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */
+#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */
+#define ETH_P_DEC 0x6000 /* DEC Assigned proto */
+#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */
+#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */
+#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */
+#define ETH_P_LAT 0x6004 /* DEC LAT */
+#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */
+#define ETH_P_CUST 0x6006 /* DEC Customer use */
+#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */
+#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */
+#define ETH_P_ATALK 0x809B /* Appletalk DDP */
+#define ETH_P_AARP 0x80F3 /* Appletalk AARP */
+#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */
+#define ETH_P_IPX 0x8137 /* IPX over DIX */
+#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */
+#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */
+#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */
+#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */
+#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport over Ethernet */
+
+/*
+ * Non DIX types. Won't clash for 1500 types.
+ */
+
+#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */
+#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */
+#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */
+#define ETH_P_802_2 0x0004 /* 802.2 frames */
+#define ETH_P_SNAP 0x0005 /* Internal only */
+#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */
+#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/
+#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */
+#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */
+#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/
+#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */
+#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */
+#define ETH_P_CONTROL 0x0016 /* Card specific control frames */
+#define ETH_P_IRDA 0x0017 /* Linux-IrDA */
+#define ETH_P_ECONET 0x0018 /* Acorn Econet */
+
+/*
+ * This is an Ethernet frame header.
+ */
+
+struct ethhdr {
+ unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
+ unsigned char h_source[ETH_ALEN]; /* source ether addr */
+ unsigned short h_proto; /* packet type ID field */
+};
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/net/route.h b/mdk-stage1/dietlibc/include/net/route.h
index 5e5db7b1a..383bb8370 100644
--- a/mdk-stage1/dietlibc/include/net/route.h
+++ b/mdk-stage1/dietlibc/include/net/route.h
@@ -1,6 +1,52 @@
-#ifndef _NET_IF_ROUTE_H
-#define _NET_IF_ROUTE_H
+#ifndef _NET_ROUTE_H
+#define _NET_ROUTE_H
-#include <linux/route.h>
+#include <inttypes.h>
+#include <netinet/in.h>
+
+/* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */
+struct rtentry {
+ unsigned long rt_pad1;
+ struct sockaddr rt_dst; /* target address */
+ struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
+ struct sockaddr rt_genmask; /* target network mask (IP) */
+ unsigned short rt_flags;
+ short rt_pad2;
+ unsigned long rt_pad3;
+ void *rt_pad4;
+ short rt_metric; /* +1 for binary compatibility! */
+ char *rt_dev; /* forcing the device at add */
+ unsigned long rt_mtu; /* per route MTU/Window */
+#ifndef __KERNEL__
+#define rt_mss rt_mtu /* Compatibility :-( */
+#endif
+ unsigned long rt_window; /* Window clamping */
+ unsigned short rt_irtt; /* Initial RTT */
+};
+
+#define RTF_UP 0x0001 /* route usable */
+#define RTF_GATEWAY 0x0002 /* destination is a gateway */
+#define RTF_HOST 0x0004 /* host entry (net otherwise) */
+#define RTF_REINSTATE 0x0008 /* reinstate route after tmout */
+#define RTF_DYNAMIC 0x0010 /* created dyn. (by redirect) */
+#define RTF_MODIFIED 0x0020 /* modified dyn. (by redirect) */
+#define RTF_MTU 0x0040 /* specific MTU for this route */
+#define RTF_MSS RTF_MTU /* Compatibility :-( */
+#define RTF_WINDOW 0x0080 /* per route window clamping */
+#define RTF_IRTT 0x0100 /* Initial round trip time */
+#define RTF_REJECT 0x0200 /* Reject route */
+
+struct in6_rtmsg {
+ struct in6_addr rtmsg_dst;
+ struct in6_addr rtmsg_src;
+ struct in6_addr rtmsg_gateway;
+ uint32_t rtmsg_type;
+ uint16_t rtmsg_dst_len;
+ uint16_t rtmsg_src_len;
+ uint32_t rtmsg_metric;
+ unsigned long int rtmsg_info;
+ uint32_t rtmsg_flags;
+ int rtmsg_ifindex;
+};
#endif
diff --git a/mdk-stage1/dietlibc/include/netdb.h b/mdk-stage1/dietlibc/include/netdb.h
index e90ea81ac..be64f659f 100644
--- a/mdk-stage1/dietlibc/include/netdb.h
+++ b/mdk-stage1/dietlibc/include/netdb.h
@@ -13,8 +13,7 @@
#define _PATH_SERVICES "/etc/services"
/* Description of data base entry for a single service. */
-struct servent
-{
+struct servent {
char *s_name; /* Official service name. */
char **s_aliases; /* Alias list. */
int s_port; /* Port number. */
@@ -22,14 +21,24 @@ struct servent
};
extern void endservent (void) __THROW;
-extern struct servent *getservent (void) __THROW;
+extern void setservent(int stayopen) __THROW;
+
+extern int getservent_r(struct servent *res, char *buf, size_t buflen,
+ struct servent **res_sig) __THROW;
+extern int getservbyname_r(const char* name,const char* proto,
+ struct servent *res, char *buf, size_t buflen,
+ struct servent **res_sig) __THROW;
+extern int getservbyport_r(int port,const char* proto,
+ struct servent *res, char *buf, size_t buflen,
+ struct servent **res_sig) __THROW;
+
+extern struct servent *getservent(void) __THROW;
extern struct servent *getservbyname (const char *__name,
const char *__proto) __THROW;
extern struct servent *getservbyport (int __port, const char *__proto)
__THROW;
-struct hostent
-{
+struct hostent {
char *h_name; /* Official name of host. */
char **h_aliases; /* Alias list. */
int h_addrtype; /* Host address type. */
@@ -40,6 +49,7 @@ struct hostent
extern void endhostent (void) __THROW;
extern struct hostent *gethostent (void) __THROW;
+extern struct hostent *gethostent_r (char* buf,int len) __THROW;
extern struct hostent *gethostbyaddr (const void *__addr, socklen_t __len,
int __type) __THROW;
extern struct hostent *gethostbyname (const char *__name) __THROW;
@@ -55,11 +65,16 @@ extern int gethostbyname_r(const char* NAME, struct hostent* RESULT_BUF,char* BU
#define TRY_AGAIN 2
#define NO_RECOVERY 3
#define NO_ADDRESS 4
+#define NO_DATA 5
extern int gethostbyaddr_r(const char* addr, size_t length, int format,
struct hostent* result, char *buf, size_t buflen,
struct hostent **RESULT, int *h_errnop) __THROW;
+int gethostbyname2_r(const char* name, int AF, struct hostent* result,
+ char *buf, size_t buflen,
+ struct hostent **RESULT, int *h_errnop) __THROW;
+
struct protoent {
char *p_name; /* official protocol name */
char **p_aliases; /* alias list */
@@ -72,19 +87,38 @@ struct protoent *getprotobynumber(int proto) __THROW;
void setprotoent(int stayopen) __THROW;
void endprotoent(void) __THROW;
+int getprotoent_r(struct protoent *res, char *buf, size_t buflen,
+ struct protoent **res_sig) __THROW;
+int getprotobyname_r(const char* name,
+ struct protoent *res, char *buf, size_t buflen,
+ struct protoent **res_sig) __THROW;
+int getprotobynumber_r(int proto,
+ struct protoent *res, char *buf, size_t buflen,
+ struct protoent **res_sig) __THROW;
+
-/* Description of data base entry for a single network. NOTE: here a
- poor assumption is made. The network number is expected to fit
- into an unsigned long int variable. */
-struct netent
-{
- char *n_name; /* Official name of network. */
- char **n_aliases; /* Alias list. */
- int n_addrtype; /* Net address type. */
- uint32_t n_net; /* Network number. */
+void sethostent(int stayopen) __THROW;
+
+/* dummy */
+extern int h_errno;
+
+struct netent {
+ char *n_name; /* official network name */
+ char **n_aliases; /* alias list */
+ int n_addrtype; /* net address type */
+ unsigned long int n_net; /* network number */
};
-extern struct netent *getnetbyname (__const char *__name) __THROW;
+struct netent *getnetbyaddr(unsigned long net, int type) __THROW;
+void endnetent(void) __THROW;
+void setnetent(int stayopen) __THROW;
+struct netent *getnetbyname(const char *name) __THROW;
+struct netent *getnetent(void) __THROW;
+
+extern const char *hstrerror (int err_num) __THROW;
+void herror(const char *s) __THROW;
+#define NI_MAXHOST 1025
+#define NI_MAXSERV 32
#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/in.h b/mdk-stage1/dietlibc/include/netinet/in.h
index 0569c8289..0b5278759 100644
--- a/mdk-stage1/dietlibc/include/netinet/in.h
+++ b/mdk-stage1/dietlibc/include/netinet/in.h
@@ -1,9 +1,404 @@
#ifndef _NETINET_IN_H
#define _NETINET_IN_H
-#include <linux/in.h>
-#include <linux/in6.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <endian.h>
+
+/* Standard well-defined IP protocols. */
+enum {
+ IPPROTO_IP = 0, /* Dummy protocol for TCP */
+#define IPPROTO_IP IPPROTO_IP
+ IPPROTO_ICMP = 1, /* Internet Control Message Protocol */
+#define IPPROTO_ICMP IPPROTO_ICMP
+ IPPROTO_IGMP = 2, /* Internet Group Management Protocol */
+#define IPPROTO_IGMP IPPROTO_IGMP
+ IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */
+#define IPPROTO_IPIP IPPROTO_IPIP
+ IPPROTO_TCP = 6, /* Transmission Control Protocol */
+#define IPPROTO_TCP IPPROTO_TCP
+ IPPROTO_EGP = 8, /* Exterior Gateway Protocol */
+#define IPPROTO_EGP IPPROTO_EGP
+ IPPROTO_PUP = 12, /* PUP protocol */
+#define IPPROTO_PUP IPPROTO_PUP
+ IPPROTO_UDP = 17, /* User Datagram Protocol */
+#define IPPROTO_UDP IPPROTO_UDP
+ IPPROTO_IDP = 22, /* XNS IDP protocol */
+#define IPPROTO_IDP IPPROTO_IDP
+ IPPROTO_RSVP = 46, /* RSVP protocol */
+#define IPPROTO_RSVP IPPROTO_RSVP
+ IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */
+#define IPPROTO_GRE IPPROTO_GRE
+ IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */
+#define IPPROTO_IPV6 IPPROTO_IPV6
+ IPPROTO_PIM = 103, /* Protocol Independent Multicast */
+#define IPPROTO_PIM IPPROTO_PIM
+ IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */
+#define IPPROTO_ESP IPPROTO_ESP
+ IPPROTO_AH = 51, /* Authentication Header protocol */
+#define IPPROTO_AH IPPROTO_AH
+ IPPROTO_COMP = 108, /* Compression Header protocol */
+#define IPPROTO_COMP IPPROTO_COMP
+ IPPROTO_RAW = 255, /* Raw IP packets */
+#define IPPROTO_RAW IPPROTO_RAW
+ IPPROTO_MAX
+};
+
+#define IP_TOS 1
+#define IP_TTL 2
+#define IP_HDRINCL 3
+#define IP_OPTIONS 4
+#define IP_ROUTER_ALERT 5
+#define IP_RECVOPTS 6
+#define IP_RETOPTS 7
+#define IP_PKTINFO 8
+#define IP_PKTOPTIONS 9
+#define IP_MTU_DISCOVER 10
+#define IP_RECVERR 11
+#define IP_RECVTTL 12
+#define IP_RECVTOS 13
+#define IP_MTU 14
+#define IP_FREEBIND 15
+
+/* BSD compatibility */
+#define IP_RECVRETOPTS IP_RETOPTS
+
+/* IP_MTU_DISCOVER values */
+#define IP_PMTUDISC_DONT 0 /* Never send DF frames */
+#define IP_PMTUDISC_WANT 1 /* Use per route hints */
+#define IP_PMTUDISC_DO 2 /* Always DF */
+
+#define IP_MULTICAST_IF 32
+#define IP_MULTICAST_TTL 33
+#define IP_MULTICAST_LOOP 34
+#define IP_ADD_MEMBERSHIP 35
+#define IP_DROP_MEMBERSHIP 36
+
+/* These need to appear somewhere around here */
+#define IP_DEFAULT_MULTICAST_TTL 1
+#define IP_DEFAULT_MULTICAST_LOOP 1
+
+#define IN6ADDR_ANY_INIT {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}}
+#define IN6ADDR_LOOPBACK_INIT {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }}}
+extern const struct in6_addr in6addr_any;
+extern const struct in6_addr in6addr_loopback;
+
+typedef uint16_t in_port_t;
+typedef uint32_t in_addr_t;
+
+struct in_addr {
+ in_addr_t s_addr;
+};
+
+struct ip_mreq {
+ struct in_addr imr_multiaddr; /* IP multicast address of group */
+ struct in_addr imr_interface; /* local IP address of interface */
+};
+
+struct ip_mreqn {
+ struct in_addr imr_multiaddr; /* IP multicast address of group */
+ struct in_addr imr_address; /* local IP address of interface */
+ int imr_ifindex; /* Interface index */
+};
+
+struct in_pktinfo {
+ int ipi_ifindex;
+ struct in_addr ipi_spec_dst;
+ struct in_addr ipi_addr;
+};
+
+/* Structure describing an Internet (IP) socket address. */
+#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */
+struct sockaddr_in {
+ sa_family_t sin_family; /* Address family */
+ in_port_t sin_port; /* Port number */
+ struct in_addr sin_addr; /* Internet address */
+ /* Pad to size of `struct sockaddr'. */
+ unsigned char sin_zero[__SOCK_SIZE__ - sizeof(short int) -
+ sizeof(unsigned short int) - sizeof(struct in_addr)];
+};
+
+
+/*
+ * Definitions of the bits in an Internet address integer.
+ * On subnets, host and network parts are found according
+ * to the subnet mask, not these masks.
+ */
+#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0)
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
+#define IN_CLASSA_MAX 128
+
+#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000)
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
+#define IN_CLASSB_MAX 65536
+
+#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
+
+#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000)
+#define IN_MULTICAST(a) IN_CLASSD(a)
+#define IN_MULTICAST_NET 0xF0000000
+
+#define IN_EXPERIMENTAL(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000)
+#define IN_BADCLASS(a) IN_EXPERIMENTAL((a))
+
+/* Address to accept any incoming messages. */
+#define INADDR_ANY ((unsigned long int) 0x00000000)
+
+/* Address to send to all hosts. */
+#define INADDR_BROADCAST ((unsigned long int) 0xffffffff)
+
+/* Address indicating an error return. */
+#define INADDR_NONE ((unsigned long int) 0xffffffff)
+
+/* Network number for local host loopback. */
+#define IN_LOOPBACKNET 127
+
+/* Address to loopback in software to local host. */
+#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */
+#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000)
+
+/* Defines for Multicast INADDR */
+#define INADDR_UNSPEC_GROUP 0xe0000000U /* 224.0.0.0 */
+#define INADDR_ALLHOSTS_GROUP 0xe0000001U /* 224.0.0.1 */
+#define INADDR_ALLRTRS_GROUP 0xe0000002U /* 224.0.0.2 */
+#define INADDR_MAX_LOCAL_GROUP 0xe00000ffU /* 224.0.0.255 */
+
+struct in6_addr {
+ union {
+ uint8_t u6_addr8[16];
+ uint16_t u6_addr16[8];
+ uint32_t u6_addr32[4];
+ } in6_u;
+#define s6_addr in6_u.u6_addr8
+#define s6_addr16 in6_u.u6_addr16
+#define s6_addr32 in6_u.u6_addr32
+};
+
+struct sockaddr_in6 {
+ unsigned short int sin6_family; /* AF_INET6 */
+ uint16_t sin6_port; /* Transport layer port # */
+ uint32_t sin6_flowinfo; /* IPv6 flow information */
+ struct in6_addr sin6_addr; /* IPv6 address */
+ uint32_t sin6_scope_id; /* scope id (new in RFC2553) */
+};
+
+struct sockaddr_in_pad {
+ sa_family_t sin_family; /* Address family */
+ in_port_t sin_port; /* Port number */
+ struct in_addr sin_addr; /* Internet address */
+ /* Pad to size of `struct sockaddr_in6'. */
+ unsigned char sin_zero[sizeof(struct sockaddr_in6) - sizeof(short int) -
+ sizeof(unsigned short int) - sizeof(struct in_addr)];
+};
+
+struct ipv6_mreq {
+ /* IPv6 multicast address of group */
+ struct in6_addr ipv6mr_multiaddr;
+ /* local IPv6 address of interface */
+ int ipv6mr_interface;
+};
+
+struct in6_flowlabel_req {
+ struct in6_addr flr_dst;
+ uint32_t flr_label;
+ uint8_t flr_action;
+ uint8_t flr_share;
+ uint16_t flr_flags;
+ uint16_t flr_expires;
+ uint16_t flr_linger;
+ uint32_t __flr_pad;
+ /* Options in format of IPV6_PKTOPTIONS */
+};
+
+#define IPV6_FL_A_GET 0
+#define IPV6_FL_A_PUT 1
+#define IPV6_FL_A_RENEW 2
+
+#define IPV6_FL_F_CREATE 1
+#define IPV6_FL_F_EXCL 2
+
+#define IPV6_FL_S_NONE 0
+#define IPV6_FL_S_EXCL 1
+#define IPV6_FL_S_PROCESS 2
+#define IPV6_FL_S_USER 3
+#define IPV6_FL_S_ANY 255
+
+#define IPV6_FLOWINFO_FLOWLABEL 0x000fffff
+#define IPV6_FLOWINFO_PRIORITY 0x0ff00000
+
+/*
+ * IPV6 extension headers
+ */
+#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */
+#define IPPROTO_ROUTING 43 /* IPv6 routing header */
+#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */
+#define IPPROTO_ICMPV6 58 /* ICMPv6 */
+#define IPPROTO_NONE 59 /* IPv6 no next header */
+#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */
+
+/* IPv6 TLV options. */
+#define IPV6_TLV_PAD0 0
+#define IPV6_TLV_PADN 1
+#define IPV6_TLV_ROUTERALERT 5
+#define IPV6_TLV_JUMBO 194
+
+/* IPV6 socket options. */
+#define IPV6_ADDRFORM 1
+#define IPV6_PKTINFO 2
+#define IPV6_HOPOPTS 3
+#define IPV6_DSTOPTS 4
+#define IPV6_RTHDR 5
+#define IPV6_PKTOPTIONS 6
+#define IPV6_CHECKSUM 7
+#define IPV6_HOPLIMIT 8
+#define IPV6_NEXTHOP 9
+#define IPV6_AUTHHDR 10
+#define IPV6_FLOWINFO 11
+
+#define IPV6_UNICAST_HOPS 16
+#define IPV6_MULTICAST_IF 17
+#define IPV6_MULTICAST_HOPS 18
+#define IPV6_MULTICAST_LOOP 19
+#define IPV6_ADD_MEMBERSHIP 20
+#define IPV6_DROP_MEMBERSHIP 21
+#define IPV6_ROUTER_ALERT 22
+#define IPV6_MTU_DISCOVER 23
+#define IPV6_MTU 24
+#define IPV6_RECVERR 25
+
+/* IPV6_MTU_DISCOVER values */
+#define IPV6_PMTUDISC_DONT 0
+#define IPV6_PMTUDISC_WANT 1
+#define IPV6_PMTUDISC_DO 2
+
+/* Flowlabel */
+#define IPV6_FLOWLABEL_MGR 32
+#define IPV6_FLOWINFO_SEND 33
+
+#define IPV6_MIN_MTU 1280
+
+struct in6_pktinfo {
+ struct in6_addr ipi6_addr;
+ int ipi6_ifindex;
+};
+
+struct in6_ifreq {
+ struct in6_addr ifr6_addr;
+ uint32_t ifr6_prefixlen;
+ int ifr6_ifindex;
+};
+
+#define IPV6_SRCRT_STRICT 0x01 /* this hop must be a neighbor */
+#define IPV6_SRCRT_TYPE_0 0 /* IPv6 type 0 Routing Header */
+
+/* routing header */
+struct ipv6_rt_hdr {
+ uint8_t nexthdr;
+ uint8_t hdrlen;
+ uint8_t type;
+ uint8_t segments_left;
+ /* type specific data, variable length field */
+};
+
+struct ipv6_opt_hdr {
+ uint8_t nexthdr;
+ uint8_t hdrlen;
+ /* TLV encoded option data follows. */
+};
+
+#define ipv6_destopt_hdr ipv6_opt_hdr
+#define ipv6_hopopt_hdr ipv6_opt_hdr
+
+/* routing header type 0 (used in cmsghdr struct) */
+
+#ifndef __STRICT_ANSI__
+struct rt0_hdr {
+ struct ipv6_rt_hdr rt_hdr;
+ uint32_t bitmap; /* strict/loose bit map */
+ struct in6_addr addr[0];
+#define rt0_type rt_hdr.type;
+};
+#endif
+
+struct ipv6hdr {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int flow_lbl:20,
+ priority:8,
+ version:4;
+#else
+ unsigned int version:4,
+ priority:8,
+ flow_lbl:20;
+#endif
+
+ uint16_t payload_len;
+ uint8_t nexthdr;
+ uint8_t hop_limit;
+
+ struct in6_addr saddr;
+ struct in6_addr daddr;
+};
+/* fnord */
#define IPPORT_RESERVED 1024
+#define INET6_ADDRSTRLEN 46
+
+#undef htonl
+#undef htons
+#undef ntohl
+#undef ntohs
+unsigned long int htonl(unsigned long int hostlong);
+unsigned short int htons(unsigned short int hostshort);
+unsigned long int ntohl(unsigned long int netlong);
+unsigned short int ntohs(unsigned short int netshort);
+
+#define IN6_IS_ADDR_UNSPECIFIED(a) \
+ (((__const uint32_t *) (a))[0] == 0 \
+ && ((__const uint32_t *) (a))[1] == 0 \
+ && ((__const uint32_t *) (a))[2] == 0 \
+ && ((__const uint32_t *) (a))[3] == 0)
+
+#define IN6_IS_ADDR_LOOPBACK(a) \
+ (((__const uint32_t *) (a))[0] == 0 \
+ && ((__const uint32_t *) (a))[1] == 0 \
+ && ((__const uint32_t *) (a))[2] == 0 \
+ && ((__const uint32_t *) (a))[3] == htonl (1))
+
+#define IN6_IS_ADDR_MULTICAST(a) (((__const uint8_t *) (a))[0] == 0xff)
+
+#define IN6_IS_ADDR_LINKLOCAL(a) \
+ ((((__const uint32_t *) (a))[0] & htonl (0xffc00000)) \
+ == htonl (0xfe800000))
+
+#define IN6_IS_ADDR_SITELOCAL(a) \
+ ((((__const uint32_t *) (a))[0] & htonl (0xffc00000)) \
+ == htonl (0xfec00000))
+
+#define IN6_IS_ADDR_V4MAPPED(a) \
+ ((((__const uint32_t *) (a))[0] == 0) \
+ && (((__const uint32_t *) (a))[1] == 0) \
+ && (((__const uint32_t *) (a))[2] == htonl (0xffff)))
+
+#define IN6_IS_ADDR_V4COMPAT(a) \
+ ((((__const uint32_t *) (a))[0] == 0) \
+ && (((__const uint32_t *) (a))[1] == 0) \
+ && (((__const uint32_t *) (a))[2] == 0) \
+ && (ntohl (((__const uint32_t *) (a))[3]) > 1))
+
+#define IN6_ARE_ADDR_EQUAL(a,b) \
+ ((((__const uint32_t *) (a))[0] == ((__const uint32_t *) (b))[0]) \
+ && (((__const uint32_t *) (a))[1] == ((__const uint32_t *) (b))[1]) \
+ && (((__const uint32_t *) (a))[2] == ((__const uint32_t *) (b))[2]) \
+ && (((__const uint32_t *) (a))[3] == ((__const uint32_t *) (b))[3]))
+
+/* old legacy bullshit */
+int bindresvport(int sd, struct sockaddr_in* sin);
#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/ip.h b/mdk-stage1/dietlibc/include/netinet/ip.h
index 35bf9cc42..4ebf21706 100644
--- a/mdk-stage1/dietlibc/include/netinet/ip.h
+++ b/mdk-stage1/dietlibc/include/netinet/ip.h
@@ -1,6 +1,121 @@
#ifndef _NETINET_IP_H
#define _NETINET_IP_H
-#include <linux/ip.h>
+#include <inttypes.h>
+#include <endian.h>
+#include <netinet/in.h>
+
+#define IPVERSION 4 /* IP version number */
+#define IP_MAXPACKET 65535 /* maximum packet size */
+
+#define IPTOS_TOS_MASK 0x1E
+#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK)
+#define IPTOS_LOWDELAY 0x10
+#define IPTOS_THROUGHPUT 0x08
+#define IPTOS_RELIABILITY 0x04
+#define IPTOS_MINCOST 0x02
+#define IPTOS_LOWCOST IPTOS_MINCOST
+
+#define IPTOS_PREC_MASK 0xE0
+#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK)
+#define IPTOS_PREC_NETCONTROL 0xe0
+#define IPTOS_PREC_INTERNETCONTROL 0xc0
+#define IPTOS_PREC_CRITIC_ECP 0xa0
+#define IPTOS_PREC_FLASHOVERRIDE 0x80
+#define IPTOS_PREC_FLASH 0x60
+#define IPTOS_PREC_IMMEDIATE 0x40
+#define IPTOS_PREC_PRIORITY 0x20
+#define IPTOS_PREC_ROUTINE 0x00
+
+
+/* IP options */
+#define IPOPT_COPY 0x80
+#define IPOPT_CLASS_MASK 0x60
+#define IPOPT_NUMBER_MASK 0x1f
+
+#define IPOPT_COPIED(o) ((o)&IPOPT_COPY)
+#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK)
+#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK)
+
+#define IPOPT_CONTROL 0x00
+#define IPOPT_RESERVED1 0x20
+#define IPOPT_MEASUREMENT 0x40
+#define IPOPT_RESERVED2 0x60
+
+#define IPOPT_END (0 |IPOPT_CONTROL)
+#define IPOPT_NOOP (1 |IPOPT_CONTROL)
+#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT)
+#define IPOPT_RR (7 |IPOPT_CONTROL)
+#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY)
+
+#define IPVERSION 4
+#define MAXTTL 255
+#define IPDEFTTL 64
+
+/* struct timestamp, struct route and MAX_ROUTES are removed.
+
+ REASONS: it is clear that nobody used them because:
+ - MAX_ROUTES value was wrong.
+ - "struct route" was wrong.
+ - "struct timestamp" had fatally misaligned bitfields and was completely unusable.
+ */
+
+#define IPOPT_OPTVAL 0
+#define IPOPT_OLEN 1
+#define IPOPT_OFFSET 2
+#define IPOPT_MINOFF 4
+#define MAX_IPOPTLEN 40
+#define IPOPT_NOP IPOPT_NOOP
+#define IPOPT_EOL IPOPT_END
+#define IPOPT_TS IPOPT_TIMESTAMP
+
+#define IPOPT_TS_TSONLY 0 /* timestamps only */
+#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
+#define IPOPT_TS_PRESPEC 3 /* specified modules only */
+
+struct iphdr { /* size 20/0x14 */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int ihl:4, version:4; /* offset 0; version=ip version (4) */
+#else
+ unsigned int version:4, ihl:4; /* offset 0; ihl=ip header length, measured in words (5) */
+#endif
+ unsigned char tos; /* offset 1 */
+ unsigned short tot_len; /* offset 2; total bytes in packet in network byte order */
+ unsigned short id; /* offset 4 */
+ unsigned short frag_off; /* offset 6 */
+ unsigned char ttl; /* offset 8 */
+ unsigned char protocol; /* offset 9; 1=ICMP, 6=TCP, 17=UDP (see netinet/in.h) */
+ unsigned short check; /* offset 10/0xa */
+ unsigned int saddr; /* offset 12/0xc */
+ unsigned int daddr; /* offset 16/0x10 */
+ /*The options start here. */
+};
+
+struct ip {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int ip_hl:4; /* header length */
+ unsigned int ip_v:4; /* version */
+#endif
+#if __BYTE_ORDER == __BIG_ENDIAN
+ unsigned int ip_v:4; /* version */
+ unsigned int ip_hl:4; /* header length */
+#endif
+ unsigned char ip_tos; /* type of service */
+ unsigned short ip_len; /* total length */
+ unsigned short ip_id; /* identification */
+ unsigned short ip_off; /* fragment offset field */
+#define IP_RF 0x8000 /* reserved fragment flag */
+#define IP_DF 0x4000 /* dont fragment flag */
+#define IP_MF 0x2000 /* more fragments flag */
+#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
+ unsigned char ip_ttl; /* time to live */
+ unsigned char ip_p; /* protocol */
+ unsigned short ip_sum; /* checksum */
+ struct in_addr ip_src, ip_dst; /* source and dest address */
+};
#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/ip_icmp.h b/mdk-stage1/dietlibc/include/netinet/ip_icmp.h
new file mode 100644
index 000000000..cf8e016f7
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/netinet/ip_icmp.h
@@ -0,0 +1,145 @@
+#ifndef NETINET_IP_ICMP_H
+#define NETINET_IP_ICMP_H
+
+#include <sys/cdefs.h>
+#include <inttypes.h>
+#include <netinet/ip.h>
+
+struct icmphdr {
+ uint8_t type; /* message type */
+ uint8_t code; /* type sub-code */
+ uint16_t checksum;
+ union {
+ struct {
+ uint16_t id;
+ uint16_t sequence;
+ } echo; /* echo datagram */
+ uint32_t gateway; /* gateway address */
+ struct {
+ uint16_t __unused;
+ uint16_t mtu;
+ } frag; /* path mtu discovery */
+ } un;
+};
+
+#define ICMP_ECHOREPLY 0 /* Echo Reply */
+#define ICMP_DEST_UNREACH 3 /* Destination Unreachable */
+#define ICMP_SOURCE_QUENCH 4 /* Source Quench */
+#define ICMP_REDIRECT 5 /* Redirect (change route) */
+#define ICMP_ECHO 8 /* Echo Request */
+#define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */
+#define ICMP_PARAMETERPROB 12 /* Parameter Problem */
+#define ICMP_TIMESTAMP 13 /* Timestamp Request */
+#define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */
+#define ICMP_INFO_REQUEST 15 /* Information Request */
+#define ICMP_INFO_REPLY 16 /* Information Reply */
+#define ICMP_ADDRESS 17 /* Address Mask Request */
+#define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */
+#define NR_ICMP_TYPES 18
+
+
+/* Codes for UNREACH. */
+#define ICMP_NET_UNREACH 0 /* Network Unreachable */
+#define ICMP_HOST_UNREACH 1 /* Host Unreachable */
+#define ICMP_PROT_UNREACH 2 /* Protocol Unreachable */
+#define ICMP_PORT_UNREACH 3 /* Port Unreachable */
+#define ICMP_FRAG_NEEDED 4 /* Fragmentation Needed/DF set */
+#define ICMP_SR_FAILED 5 /* Source Route failed */
+#define ICMP_NET_UNKNOWN 6
+#define ICMP_HOST_UNKNOWN 7
+#define ICMP_HOST_ISOLATED 8
+#define ICMP_NET_ANO 9
+#define ICMP_HOST_ANO 10
+#define ICMP_NET_UNR_TOS 11
+#define ICMP_HOST_UNR_TOS 12
+#define ICMP_PKT_FILTERED 13 /* Packet filtered */
+#define ICMP_PREC_VIOLATION 14 /* Precedence violation */
+#define ICMP_PREC_CUTOFF 15 /* Precedence cut off */
+#define NR_ICMP_UNREACH 15 /* instead of hardcoding immediate value */
+
+/* Codes for REDIRECT. */
+#define ICMP_REDIR_NET 0 /* Redirect Net */
+#define ICMP_REDIR_HOST 1 /* Redirect Host */
+#define ICMP_REDIR_NETTOS 2 /* Redirect Net for TOS */
+#define ICMP_REDIR_HOSTTOS 3 /* Redirect Host for TOS */
+
+/* Codes for TIME_EXCEEDED. */
+#define ICMP_EXC_TTL 0 /* TTL count exceeded */
+#define ICMP_EXC_FRAGTIME 1 /* Fragment Reass time exceeded */
+
+/*
+ * Lower bounds on packet lengths for various types.
+ * For the error advice packets must first insure that the
+ * packet is large enough to contain the returned ip header.
+ * Only then can we do the check to see if 64 bits of packet
+ * data have been returned, since we need to check the returned
+ * ip header length.
+ */
+#define ICMP_MINLEN 8 /* abs minimum */
+#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */
+#define ICMP_MASKLEN 12 /* address mask */
+#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */
+#ifndef _IP_VHL
+#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
+ /* N.B.: must separately check that ip_hl >= 5 */
+#else
+#define ICMP_ADVLEN(p) (8 + (IP_VHL_HL((p)->icmp_ip.ip_vhl) << 2) + 8)
+ /* N.B.: must separately check that header length >= 5 */
+#endif
+
+/* Definition of type and code fields. */
+/* defined above: ICMP_ECHOREPLY, ICMP_REDIRECT, ICMP_ECHO */
+#define ICMP_UNREACH 3 /* dest unreachable, codes: */
+#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */
+#define ICMP_ROUTERADVERT 9 /* router advertisement */
+#define ICMP_ROUTERSOLICIT 10 /* router solicitation */
+#define ICMP_TIMXCEED 11 /* time exceeded, code: */
+#define ICMP_PARAMPROB 12 /* ip header bad */
+#define ICMP_TSTAMP 13 /* timestamp request */
+#define ICMP_TSTAMPREPLY 14 /* timestamp reply */
+#define ICMP_IREQ 15 /* information request */
+#define ICMP_IREQREPLY 16 /* information reply */
+#define ICMP_MASKREQ 17 /* address mask request */
+#define ICMP_MASKREPLY 18 /* address mask reply */
+
+#define ICMP_MAXTYPE 18
+
+/* UNREACH codes */
+#define ICMP_UNREACH_NET 0 /* bad net */
+#define ICMP_UNREACH_HOST 1 /* bad host */
+#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */
+#define ICMP_UNREACH_PORT 3 /* bad port */
+#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */
+#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */
+#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */
+#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */
+#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */
+#define ICMP_UNREACH_NET_PROHIB 9 /* net denied */
+#define ICMP_UNREACH_HOST_PROHIB 10 /* host denied */
+#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
+#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
+#define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohib */
+#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host prec vio. */
+#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* prec cutoff */
+
+/* REDIRECT codes */
+#define ICMP_REDIRECT_NET 0 /* for network */
+#define ICMP_REDIRECT_HOST 1 /* for host */
+#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */
+#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */
+
+/* TIMEXCEED codes */
+#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */
+#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */
+
+/* PARAMPROB code */
+#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */
+
+#define ICMP_INFOTYPE(type) \
+ ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
+ (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
+ (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
+ (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
+ (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/tcp.h b/mdk-stage1/dietlibc/include/netinet/tcp.h
new file mode 100644
index 000000000..e47f24dff
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/netinet/tcp.h
@@ -0,0 +1,164 @@
+#ifndef _NETINET_TCP_H
+#define _NETINET_TCP_H
+
+#include <inttypes.h>
+#include <endian.h>
+
+struct tcphdr { /* size 20/0x14 40/0x28 with IP header */
+ uint16_t source; /* offset 0 20/0x14 */
+ uint16_t dest; /* offset 2 22/0x16 */
+ uint32_t seq; /* offset 4 24/0x18 */
+ uint32_t ack_seq; /* offset 8 28/0x1c */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ uint16_t res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1;
+#else
+ uint16_t doff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1;
+#endif
+ /* offset 12/0xc 32/0x20 */
+ uint16_t window; /* offset 14/0xe 34/0x22 */
+ uint16_t check; /* offset 16/0x10 36/0x24 */
+ uint16_t urg_ptr; /* offset 18/0x12 38/0x26 */
+};
+
+
+enum {
+ TCP_ESTABLISHED = 1,
+ TCP_SYN_SENT,
+ TCP_SYN_RECV,
+ TCP_FIN_WAIT1,
+ TCP_FIN_WAIT2,
+ TCP_TIME_WAIT,
+ TCP_CLOSE,
+ TCP_CLOSE_WAIT,
+ TCP_LAST_ACK,
+ TCP_LISTEN,
+ TCP_CLOSING, /* now a valid state */
+
+ TCP_MAX_STATES /* Leave at the end! */
+};
+
+#define TCP_STATE_MASK 0xF
+#define TCP_ACTION_FIN (1 << 7)
+
+enum {
+ TCPF_ESTABLISHED = (1 << 1),
+ TCPF_SYN_SENT = (1 << 2),
+ TCPF_SYN_RECV = (1 << 3),
+ TCPF_FIN_WAIT1 = (1 << 4),
+ TCPF_FIN_WAIT2 = (1 << 5),
+ TCPF_TIME_WAIT = (1 << 6),
+ TCPF_CLOSE = (1 << 7),
+ TCPF_CLOSE_WAIT = (1 << 8),
+ TCPF_LAST_ACK = (1 << 9),
+ TCPF_LISTEN = (1 << 10),
+ TCPF_CLOSING = (1 << 11)
+};
+
+/*
+ * The union cast uses a gcc extension to avoid aliasing problems
+ * (union is compatible to any of its members)
+ * This means this part of the code is -fstrict-aliasing safe now.
+ */
+union tcp_word_hdr {
+ struct tcphdr hdr;
+ uint32_t words[5];
+};
+
+#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3])
+
+enum {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ TCP_FLAG_CWR = 0x00008000,
+ TCP_FLAG_ECE = 0x00004000,
+ TCP_FLAG_URG = 0x00002000,
+ TCP_FLAG_ACK = 0x00001000,
+ TCP_FLAG_PSH = 0x00000800,
+ TCP_FLAG_RST = 0x00000400,
+ TCP_FLAG_SYN = 0x00000200,
+ TCP_FLAG_FIN = 0x00000100,
+ TCP_RESERVED_BITS = 0x0000C00F,
+ TCP_DATA_OFFSET = 0x000000F0
+#else
+ TCP_FLAG_CWR = 0x00800000,
+ TCP_FLAG_ECE = 0x00400000,
+ TCP_FLAG_URG = 0x00200000,
+ TCP_FLAG_ACK = 0x00100000,
+ TCP_FLAG_PSH = 0x00080000,
+ TCP_FLAG_RST = 0x00040000,
+ TCP_FLAG_SYN = 0x00020000,
+ TCP_FLAG_FIN = 0x00010000,
+ TCP_RESERVED_BITS = 0x0FC00000,
+ TCP_DATA_OFFSET = 0xF0000000
+#endif
+};
+
+/* TCP socket options */
+#define TCP_NODELAY 1 /* Turn off Nagle's algorithm. */
+#define TCP_MAXSEG 2 /* Limit MSS */
+#define TCP_CORK 3 /* Never send partially complete segments */
+#define TCP_KEEPIDLE 4 /* Start keeplives after this period */
+#define TCP_KEEPINTVL 5 /* Interval between keepalives */
+#define TCP_KEEPCNT 6 /* Number of keepalives before death */
+#define TCP_SYNCNT 7 /* Number of SYN retransmits */
+#define TCP_LINGER2 8 /* Life time of orphaned FIN-WAIT-2 state */
+#define TCP_DEFER_ACCEPT 9 /* Wake up listener only when data arrive */
+#define TCP_WINDOW_CLAMP 10 /* Bound advertised window */
+#define TCP_INFO 11 /* Information about this connection. */
+#define TCP_QUICKACK 12 /* Block/reenable quick acks */
+
+#define TCPI_OPT_TIMESTAMPS 1
+#define TCPI_OPT_SACK 2
+#define TCPI_OPT_WSCALE 4
+#define TCPI_OPT_ECN 8
+
+enum tcp_ca_state {
+ TCP_CA_Open = 0,
+#define TCPF_CA_Open (1<<TCP_CA_Open)
+ TCP_CA_Disorder = 1,
+#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
+ TCP_CA_CWR = 2,
+#define TCPF_CA_CWR (1<<TCP_CA_CWR)
+ TCP_CA_Recovery = 3,
+#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
+ TCP_CA_Loss = 4
+#define TCPF_CA_Loss (1<<TCP_CA_Loss)
+};
+
+struct tcp_info {
+ uint8_t tcpi_state;
+ uint8_t tcpi_ca_state;
+ uint8_t tcpi_retransmits;
+ uint8_t tcpi_probes;
+ uint8_t tcpi_backoff;
+ uint8_t tcpi_options;
+ uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
+
+ uint32_t tcpi_rto;
+ uint32_t tcpi_ato;
+ uint32_t tcpi_snd_mss;
+ uint32_t tcpi_rcv_mss;
+
+ uint32_t tcpi_unacked;
+ uint32_t tcpi_sacked;
+ uint32_t tcpi_lost;
+ uint32_t tcpi_retrans;
+ uint32_t tcpi_fackets;
+
+ /* Times. */
+ uint32_t tcpi_last_data_sent;
+ uint32_t tcpi_last_ack_sent; /* Not remembered, sorry. */
+ uint32_t tcpi_last_data_recv;
+ uint32_t tcpi_last_ack_recv;
+
+ /* Metrics. */
+ uint32_t tcpi_pmtu;
+ uint32_t tcpi_rcv_ssthresh;
+ uint32_t tcpi_rtt;
+ uint32_t tcpi_rttvar;
+ uint32_t tcpi_snd_ssthresh;
+ uint32_t tcpi_snd_cwnd;
+ uint32_t tcpi_advmss;
+ uint32_t tcpi_reordering;
+};
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/udp.h b/mdk-stage1/dietlibc/include/netinet/udp.h
new file mode 100644
index 000000000..3c5e9524e
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/netinet/udp.h
@@ -0,0 +1,16 @@
+#ifndef _NETINET_UDP_H
+#define _NETINET_UDP_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+struct udphdr { /* size 8 28/0x1c with IP header */
+ uint16_t source; /* offset 0 20/0x14 */
+ uint16_t dest; /* offset 2 22/0x16 */
+ uint16_t len; /* offset 4 24/0x18 */
+ uint16_t check; /* offset 6 26/0x1a */
+};
+
+#define SOL_UDP 17 /* sockopt level for UDP */
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/paths.h b/mdk-stage1/dietlibc/include/paths.h
index 0e36bb10e..9073d267a 100644
--- a/mdk-stage1/dietlibc/include/paths.h
+++ b/mdk-stage1/dietlibc/include/paths.h
@@ -13,4 +13,11 @@
#define _PATH_GROUP "/etc/group"
#define _PATH_SHADOW "/etc/shadow"
+#define _PATH_SHELLS "/etc/shells"
+
+#define _PATH_VARRUN "/var/run/"
+
+/* puke */
+#define _PATH_MAILDIR "/var/mail"
+
#endif
diff --git a/mdk-stage1/dietlibc/include/pthread.h b/mdk-stage1/dietlibc/include/pthread.h
index e922ab28b..e243c0281 100644
--- a/mdk-stage1/dietlibc/include/pthread.h
+++ b/mdk-stage1/dietlibc/include/pthread.h
@@ -5,9 +5,6 @@
#include <signal.h>
#include <setjmp.h>
-/* arg... kernel haeder... */
-#define ENOTSUP 524 /* Operation is not supported */
-
#define PTHREAD_STACK_SIZE 16384
#define PTHREAD_THREADS_MAX 128
@@ -19,9 +16,16 @@
#define PTHREAD_DESTRUCTOR_ITERATIONS 10
typedef struct _pthread_descr_struct *_pthread_descr;
-typedef unsigned long int pthread_t;
+typedef int pthread_t;
/* Fast locks */
+#ifdef __parisc__
+#define PTHREAD_SPIN_LOCKED 0
+#define PTHREAD_SPIN_UNLOCKED 1
+#else
+#define PTHREAD_SPIN_LOCKED 1
+#define PTHREAD_SPIN_UNLOCKED 0
+#endif
struct _pthread_fastlock {
int __spinlock;
};
@@ -49,18 +53,24 @@ enum
};
#define PTHREAD_MUTEX_INITIALIZER \
-{{0}, 0, PTHREAD_MUTEX_FAST_NP, 0}
+{{PTHREAD_SPIN_UNLOCKED}, 0, PTHREAD_MUTEX_FAST_NP, 0}
#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
-{{0}, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0}
+{{PTHREAD_SPIN_UNLOCKED}, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0}
#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
-{{0}, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0}
+{{PTHREAD_SPIN_UNLOCKED}, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0}
typedef struct {
int __mutexkind;
} pthread_mutexattr_t;
+int pthread_mutexattr_init(pthread_mutexattr_t *attr);
+int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
+
+int pthread_mutexattr_getkind_np(const pthread_mutexattr_t *attr, int *kind);
+int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
+
int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
@@ -77,7 +87,7 @@ typedef struct {
} pthread_cond_t;
#define PTHREAD_COND_INITIALIZER \
-{{0},0}
+{{PTHREAD_SPIN_UNLOCKED},0}
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
int pthread_cond_destroy(pthread_cond_t *cond);
@@ -164,9 +174,14 @@ int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stack);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
+int pthread_setschedparam(pthread_t target_thread, int policy,
+ const struct sched_param *param);
+int pthread_getschedparam(pthread_t target_thread, int *policy,
+ struct sched_param *param);
+
/* ONCE */
typedef int pthread_once_t;
-#define PTHREAD_ONCE_INIT 0
+#define PTHREAD_ONCE_INIT PTHREAD_SPIN_UNLOCKED
int __pthread_once(pthread_once_t* once_control, void (*init_routine)(void));
int pthread_once(pthread_once_t* once_control, void (*init_routine)(void));
@@ -210,7 +225,7 @@ pid_t pthread_atfork(void (*prepare)(void), void (*parent)(void),
void (*child)(void));
/* THREADS */
-int pthread_create (pthread_t *__thread,
+int pthread_create (pthread_t *__threadarg,
const pthread_attr_t *__attr,
void *(*__start_routine) (void *),
void *__arg);
@@ -224,4 +239,6 @@ int pthread_detach (pthread_t __th);
pthread_t pthread_self (void);
int pthread_equal (pthread_t __thread1, pthread_t __thread2);
+int pthread_sigmask(int how, const sigset_t*newset, sigset_t *oldset);
+
#endif
diff --git a/mdk-stage1/dietlibc/include/pty.h b/mdk-stage1/dietlibc/include/pty.h
new file mode 100644
index 000000000..fa53d9934
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/pty.h
@@ -0,0 +1,13 @@
+#ifndef _PTY_H
+#define _PTY_H
+
+#include <sys/cdefs.h>
+#include <termios.h>
+
+/* Create pseudo tty master slave pair with NAME and set terminal
+ * attributes according to TERMP and WINP and return handles for both
+ * ends in AMASTER and ASLAVE. */
+extern int openpty (int *__amaster, int *__aslave, char *__name, struct
+ termios *__termp, struct winsize *__winp) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/pwd.h b/mdk-stage1/dietlibc/include/pwd.h
index e6fb5d0be..8901a2d7f 100644
--- a/mdk-stage1/dietlibc/include/pwd.h
+++ b/mdk-stage1/dietlibc/include/pwd.h
@@ -3,6 +3,7 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <stdio.h>
struct passwd {
char *pw_name; /* Username. */
@@ -14,11 +15,21 @@ struct passwd {
char *pw_shell; /* Shell program. */
};
-extern struct passwd *getpwuid (uid_t __uid) __THROW;
-extern struct passwd *getpwnam (const char *__name) __THROW;
+extern struct passwd *getpwuid (uid_t uid) __THROW;
+extern struct passwd *getpwnam (const char *name) __THROW;
extern struct passwd *getpwent(void) __THROW;
extern void setpwent(void) __THROW;
extern void endpwent(void) __THROW;
+extern int putpwent(const struct passwd *p, FILE *stream) __THROW;
+
+int getpwent_r(struct passwd *res, char *buf, size_t buflen,
+ struct passwd **res_sig) __THROW;
+int getpwnam_r(const char* name,
+ struct passwd *res, char *buf, size_t buflen,
+ struct passwd **res_sig) __THROW;
+int getpwuid_r(uid_t uid,
+ struct passwd *res, char *buf, size_t buflen,
+ struct passwd **res_sig) __THROW;
#endif
diff --git a/mdk-stage1/dietlibc/include/regex.h b/mdk-stage1/dietlibc/include/regex.h
index be609d9db..abc9ab57b 100644
--- a/mdk-stage1/dietlibc/include/regex.h
+++ b/mdk-stage1/dietlibc/include/regex.h
@@ -38,6 +38,7 @@ typedef struct __regex_t {
int brackets,cflags;
regmatch_t *l;
} regex_t;
+#define re_nsub r.pieces
int regcomp(regex_t *preg, const char *regex, int cflags) __THROW;
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags) __THROW;
@@ -61,7 +62,10 @@ enum __regex_errors {
REG_BADPAT, /* Invalid use of pattern operators such as group or list. */
REG_ESIZE, /* Compiled regular expression requires a pattern buffer
larger than 64Kb. This is not defined by POSIX.2. */
- REG_ESPACE, /* regcomp ran out of space */
+ REG_ESPACE /* regcomp ran out of space */
};
+char * re_comp(char * regex);
+int re_exec(char * string);
+
#endif
diff --git a/mdk-stage1/dietlibc/include/resolv.h b/mdk-stage1/dietlibc/include/resolv.h
index 4e90799c2..dae226582 100644
--- a/mdk-stage1/dietlibc/include/resolv.h
+++ b/mdk-stage1/dietlibc/include/resolv.h
@@ -1 +1,124 @@
-void res_init(void);
+#ifndef _RESOLV_H
+#define _RESOLV_H
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <netinet/in.h>
+
+#ifndef _PATH_RESCONF
+#define _PATH_RESCONF "/etc/resolv.conf"
+#endif
+
+/*
+ * Global defines and variables for resolver stub.
+ */
+#define MAXNS 8 /* max # name servers we'll track */
+#define MAXDFLSRCH 3 /* # default domain levels to try */
+#define MAXDNSRCH 6 /* max # domains in search path */
+#define LOCALDOMAINPARTS 2 /* min levels in name that is "local" */
+
+#define RES_TIMEOUT 5 /* min. seconds between retries */
+#define MAXRESOLVSORT 10 /* number of net to sort on */
+#define RES_MAXNDOTS 15 /* should reflect bit field size */
+
+struct res_state {
+ int retrans; /* retransmission time interval */
+ int retry; /* number of times to retransmit */
+ unsigned long options; /* option flags - see below. */
+ int nscount; /* number of name servers */
+ struct sockaddr_in_pad
+ nsaddr_list[MAXNS]; /* address of name server */
+#define nsaddr nsaddr_list[0] /* for backward compatibility */
+ unsigned short id; /* current message id */
+ char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */
+ char defdname[256]; /* default domain (deprecated) */
+ unsigned long pfcode; /* RES_PRF_ flags - see below. */
+ unsigned ndots:4; /* threshold for initial abs. query */
+ unsigned nsort:4; /* number of elements in sort_list[] */
+ char unused[3];
+ struct {
+ struct in_addr addr;
+ uint32_t mask;
+ } sort_list[MAXRESOLVSORT];
+ char pad[72]; /* on an i386 this means 512b total */
+};
+
+/*
+ * Resolver options (keep these in synch with res_debug.c, please)
+ */
+#define RES_INIT 0x00000001 /* address initialized */
+#define RES_DEBUG 0x00000002 /* print debug messages */
+#define RES_AAONLY 0x00000004 /* authoritative answers only (!IMPL)*/
+#define RES_USEVC 0x00000008 /* use virtual circuit */
+#define RES_PRIMARY 0x00000010 /* query primary server only (!IMPL) */
+#define RES_IGNTC 0x00000020 /* ignore trucation errors */
+#define RES_RECURSE 0x00000040 /* recursion desired */
+#define RES_DEFNAMES 0x00000080 /* use default domain name */
+#define RES_STAYOPEN 0x00000100 /* Keep TCP socket open */
+#define RES_DNSRCH 0x00000200 /* search up local domain tree */
+#define RES_INSECURE1 0x00000400 /* type 1 security disabled */
+#define RES_INSECURE2 0x00000800 /* type 2 security disabled */
+#define RES_NOALIASES 0x00001000 /* shuts off HOSTALIASES feature */
+#define RES_USE_INET6 0x00002000 /* use/map IPv6 in gethostbyname() */
+
+#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH)
+
+/*
+ * Resolver "pfcode" values. Used by dig.
+ */
+#define RES_PRF_STATS 0x00000001
+/* 0x00000002 */
+#define RES_PRF_CLASS 0x00000004
+#define RES_PRF_CMD 0x00000008
+#define RES_PRF_QUES 0x00000010
+#define RES_PRF_ANS 0x00000020
+#define RES_PRF_AUTH 0x00000040
+#define RES_PRF_ADD 0x00000080
+#define RES_PRF_HEAD1 0x00000100
+#define RES_PRF_HEAD2 0x00000200
+#define RES_PRF_TTLID 0x00000400
+#define RES_PRF_HEADX 0x00000800
+#define RES_PRF_QUERY 0x00001000
+#define RES_PRF_REPLY 0x00002000
+#define RES_PRF_INIT 0x00004000
+/* 0x00008000 */
+
+struct res_sym {
+ int number; /* Identifying number, like T_MX */
+ char * name; /* Its symbolic name, like "MX" */
+ char * humanname; /* Its fun name, like "mail exchanger" */
+};
+
+extern struct res_state _res;
+extern const struct res_sym __p_class_syms[];
+extern const struct res_sym __p_type_syms[];
+
+int res_init(void) __THROW;
+
+int res_query(const char *dname, int class, int type,
+ unsigned char *answer, int anslen) __THROW;
+
+int res_search(const char *dname, int class, int type,
+ unsigned char *answer, int anslen) __THROW;
+
+int res_querydomain(const char *name, const char *domain,
+ int class, int type, unsigned char *answer,
+ int anslen) __THROW;
+
+int res_mkquery(int op, const char *dname, int class,
+ int type, char *data, int datalen, const unsigned char* newrr,
+ char *buf, int buflen) __THROW;
+
+int res_send(const char *msg, int msglen, char *answer,
+ int anslen) __THROW;
+
+int dn_comp(unsigned char *msg, unsigned char *comp_dn,
+ int length, unsigned char **dnptrs, unsigned char *exp_dn,
+ unsigned char **lastdnptr) __THROW;
+
+int dn_expand(unsigned char *msg, unsigned char *eomorig,
+ unsigned char *comp_dn, unsigned char *exp_dn,
+ int length) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/rpc/auth.h b/mdk-stage1/dietlibc/include/rpc/auth.h
index 4aa7d21ce..6e0ae0675 100644
--- a/mdk-stage1/dietlibc/include/rpc/auth.h
+++ b/mdk-stage1/dietlibc/include/rpc/auth.h
@@ -42,6 +42,7 @@
#define _RPC_AUTH_H 1
#include <sys/cdefs.h>
+#include <sys/socket.h>
#include <rpc/xdr.h>
__BEGIN_DECLS
@@ -71,8 +72,8 @@ enum auth_stat {
union des_block {
struct {
- u_int32_t high;
- u_int32_t low;
+ uint32_t high;
+ uint32_t low;
} key;
char c[8];
};
@@ -84,8 +85,8 @@ extern bool_t xdr_des_block (XDR *__xdrs, des_block *__blkp) __THROW;
*/
struct opaque_auth {
enum_t oa_flavor; /* flavor of auth */
- caddr_t oa_base; /* address of more auth stuff */
- u_int oa_length; /* not to exceed MAX_AUTH_BYTES */
+ char* oa_base; /* address of more auth stuff */
+ unsigned int oa_length; /* not to exceed MAX_AUTH_BYTES */
};
/*
@@ -104,7 +105,7 @@ struct AUTH {
int (*ah_refresh) (AUTH *); /* refresh credentials */
void (*ah_destroy) (AUTH *); /* destroy this structure */
} *ah_ops;
- caddr_t ah_private;
+ char* ah_private;
};
@@ -162,10 +163,10 @@ extern AUTH *authunix_create (char *__machname,uid_t __uid, gid_t __gid,
int __len, gid_t *__aup_gids) __THROW;
extern AUTH *authunix_create_default (void) __THROW;
extern AUTH *authnone_create (void) __THROW;
-extern AUTH *authdes_create (const char *__servername, u_int __window,
+extern AUTH *authdes_create (const char *__servername, unsigned int __window,
struct sockaddr *__syncaddr, des_block *__ckey)
__THROW;
-extern AUTH *authdes_pk_create (const char *, netobj *, u_int,
+extern AUTH *authdes_pk_create (const char *, netobj *, unsigned int,
struct sockaddr *, des_block *) __THROW;
@@ -183,11 +184,11 @@ extern AUTH *authdes_pk_create (const char *, netobj *, u_int,
*
*/
extern int getnetname (char *) __THROW;
-extern int host2netname (char *, __const char *, __const char *) __THROW;
-extern int user2netname (char *, __const uid_t, __const char *) __THROW;
-extern int netname2user (__const char *, uid_t *, gid_t *, int *, gid_t *)
+extern int host2netname (char *, const char *, const char *) __THROW;
+extern int user2netname (char *, const uid_t, const char *) __THROW;
+extern int netname2user (const char *, uid_t *, gid_t *, int *, gid_t *)
__THROW;
-extern int netname2host (__const char *, char *, __const int) __THROW;
+extern int netname2host (const char *, char *, const int) __THROW;
/*
*
diff --git a/mdk-stage1/dietlibc/include/rpc/auth_des.h b/mdk-stage1/dietlibc/include/rpc/auth_des.h
index 198b299e7..8accd3779 100644
--- a/mdk-stage1/dietlibc/include/rpc/auth_des.h
+++ b/mdk-stage1/dietlibc/include/rpc/auth_des.h
@@ -86,22 +86,22 @@ struct authdes_verf
#define adv_nickname adv_int_u
/* Map a des credential into a unix cred. */
-extern int authdes_getucred (__const struct authdes_cred * __adc,
+extern int authdes_getucred (const struct authdes_cred * __adc,
uid_t * __uid, gid_t * __gid,
short *__grouplen, gid_t * __groups) __THROW;
/* Get the public key for NAME and place it in KEY. NAME can only be
up to MAXNETNAMELEN bytes long and the destination buffer KEY should
have HEXKEYBYTES + 1 bytes long to fit all characters from the key. */
-extern int getpublickey (__const char *__name, char *__key) __THROW;
+extern int getpublickey (const char *__name, char *__key) __THROW;
/* Get the secret key for NAME and place it in KEY. PASSWD is used to
decrypt the encrypted key stored in the database. NAME can only be
up to MAXNETNAMELEN bytes long and the destination buffer KEY
should have HEXKEYBYTES + 1 bytes long to fit all characters from
the key. */
-extern int getsecretkey (__const char *__name, char *__key,
- __const char *__passwd) __THROW;
+extern int getsecretkey (const char *__name, char *__key,
+ const char *__passwd) __THROW;
extern int rtime (struct sockaddr_in *__addrp, struct rpc_timeval *__timep,
struct rpc_timeval *__timeout) __THROW;
diff --git a/mdk-stage1/dietlibc/include/rpc/auth_unix.h b/mdk-stage1/dietlibc/include/rpc/auth_unix.h
index 7a1bfa9f0..9dd8142f1 100644
--- a/mdk-stage1/dietlibc/include/rpc/auth_unix.h
+++ b/mdk-stage1/dietlibc/include/rpc/auth_unix.h
@@ -64,11 +64,11 @@ __BEGIN_DECLS
*/
struct authunix_parms
{
- u_long aup_time;
+ unsigned long aup_time;
char *aup_machname;
uid_t aup_uid;
gid_t aup_gid;
- u_int aup_len;
+ unsigned int aup_len;
gid_t *aup_gids;
};
diff --git a/mdk-stage1/dietlibc/include/rpc/clnt.h b/mdk-stage1/dietlibc/include/rpc/clnt.h
index 60b0fafdf..9b100556c 100644
--- a/mdk-stage1/dietlibc/include/rpc/clnt.h
+++ b/mdk-stage1/dietlibc/include/rpc/clnt.h
@@ -109,8 +109,8 @@ struct rpc_err {
int RE_errno; /* related system error */
enum auth_stat RE_why; /* why the auth error occurred */
struct {
- u_long low; /* lowest verion supported */
- u_long high; /* highest verion supported */
+ unsigned long low; /* lowest verion supported */
+ unsigned long high; /* highest verion supported */
} RE_vers;
struct { /* maybe meaningful if RPC_FAILED */
long s1;
@@ -133,19 +133,19 @@ typedef struct CLIENT CLIENT;
struct CLIENT {
AUTH *cl_auth; /* authenticator */
struct clnt_ops {
- enum clnt_stat (*cl_call) (CLIENT *, u_long, xdrproc_t, caddr_t, xdrproc_t,
- caddr_t, struct timeval);
+ enum clnt_stat (*cl_call) (CLIENT *, unsigned long, xdrproc_t, char*, xdrproc_t,
+ char*, struct timeval);
/* call remote procedure */
void (*cl_abort) (void); /* abort a call */
void (*cl_geterr) (CLIENT *, struct rpc_err *);
/* get specific error code */
- bool_t (*cl_freeres) (CLIENT *, xdrproc_t, caddr_t);
+ bool_t (*cl_freeres) (CLIENT *, xdrproc_t, char*);
/* frees results */
void (*cl_destroy) (CLIENT *); /* destroy this structure */
bool_t (*cl_control) (CLIENT *, int, char *);
/* the ioctl() of rpc */
} *cl_ops;
- caddr_t cl_private; /* private stuff */
+ char* cl_private; /* private stuff */
};
@@ -160,11 +160,11 @@ struct CLIENT {
* enum clnt_stat
* CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout)
* CLIENT *rh;
- * u_long proc;
+ * unsigned long proc;
* xdrproc_t xargs;
- * caddr_t argsp;
+ * char* argsp;
* xdrproc_t xres;
- * caddr_t resp;
+ * char* resp;
* struct timeval timeout;
*/
#define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \
@@ -194,7 +194,7 @@ struct CLIENT {
* CLNT_FREERES(rh, xres, resp);
* CLIENT *rh;
* xdrproc_t xres;
- * caddr_t resp;
+ * char* resp;
*/
#define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
#define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
@@ -203,7 +203,7 @@ struct CLIENT {
* bool_t
* CLNT_CONTROL(cl, request, info)
* CLIENT *cl;
- * u_int request;
+ * unsigned int request;
* char *info;
*/
#define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
@@ -253,16 +253,16 @@ struct CLIENT {
* and network administration.
*/
-#define RPCTEST_PROGRAM ((u_long)1)
-#define RPCTEST_VERSION ((u_long)1)
-#define RPCTEST_NULL_PROC ((u_long)2)
-#define RPCTEST_NULL_BATCH_PROC ((u_long)3)
+#define RPCTEST_PROGRAM ((unsigned long)1)
+#define RPCTEST_VERSION ((unsigned long)1)
+#define RPCTEST_NULL_PROC ((unsigned long)2)
+#define RPCTEST_NULL_BATCH_PROC ((unsigned long)3)
/*
* By convention, procedure 0 takes null arguments and returns them
*/
-#define NULLPROC ((u_long)0)
+#define NULLPROC ((unsigned long)0)
/*
* Below are the client handle creation routines for the various
@@ -274,10 +274,10 @@ struct CLIENT {
* Memory based rpc (for speed check and testing)
* CLIENT *
* clntraw_create(prog, vers)
- * u_long prog;
- * u_long vers;
+ * unsigned long prog;
+ * unsigned long vers;
*/
-extern CLIENT *clntraw_create (__const u_long __prog, __const u_long __vers)
+extern CLIENT *clntraw_create (const unsigned long __prog, const unsigned long __vers)
__THROW;
@@ -287,12 +287,12 @@ extern CLIENT *clntraw_create (__const u_long __prog, __const u_long __vers)
* CLIENT *
* clnt_create(host, prog, vers, prot)
* char *host; -- hostname
- * u_long prog; -- program number
+ * unsigned long prog; -- program number
* u_ong vers; -- version number
* char *prot; -- protocol
*/
-extern CLIENT *clnt_create (__const char *__host, __const u_long __prog,
- __const u_long __vers, __const char *__prot)
+extern CLIENT *clnt_create (const char *__host, const unsigned long __prog,
+ const unsigned long __vers, const char *__prot)
__THROW;
@@ -301,23 +301,23 @@ extern CLIENT *clnt_create (__const char *__host, __const u_long __prog,
* CLIENT *
* clnttcp_create(raddr, prog, vers, sockp, sendsz, recvsz)
* struct sockaddr_in *raddr;
- * u_long prog;
- * u_long version;
+ * unsigned long prog;
+ * unsigned long version;
* register int *sockp;
- * u_int sendsz;
- * u_int recvsz;
+ * unsigned int sendsz;
+ * unsigned int recvsz;
*/
-extern CLIENT *clnttcp_create (struct sockaddr_in *__raddr, u_long __prog,
- u_long __version, int *__sockp, u_int __sendsz,
- u_int __recvsz) __THROW;
+extern CLIENT *clnttcp_create (struct sockaddr_in *__raddr, unsigned long __prog,
+ unsigned long __version, int *__sockp, unsigned int __sendsz,
+ unsigned int __recvsz) __THROW;
/*
* UDP based rpc.
* CLIENT *
* clntudp_create(raddr, program, version, wait, sockp)
* struct sockaddr_in *raddr;
- * u_long program;
- * u_long version;
+ * unsigned long program;
+ * unsigned long version;
* struct timeval wait_resend;
* int *sockp;
*
@@ -325,20 +325,20 @@ extern CLIENT *clnttcp_create (struct sockaddr_in *__raddr, u_long __prog,
* CLIENT *
* clntudp_bufcreate(raddr, program, version, wait, sockp, sendsz, recvsz)
* struct sockaddr_in *raddr;
- * u_long program;
- * u_long version;
+ * unsigned long program;
+ * unsigned long version;
* struct timeval wait_resend;
* int *sockp;
- * u_int sendsz;
- * u_int recvsz;
+ * unsigned int sendsz;
+ * unsigned int recvsz;
*/
-extern CLIENT *clntudp_create (struct sockaddr_in *__raddr, u_long __program,
- u_long __version, struct timeval __wait_resend,
+extern CLIENT *clntudp_create (struct sockaddr_in *__raddr, unsigned long __program,
+ unsigned long __version, struct timeval __wait_resend,
int *__sockp) __THROW;
extern CLIENT *clntudp_bufcreate (struct sockaddr_in *__raddr,
- u_long __program, u_long __version,
+ unsigned long __program, unsigned long __version,
struct timeval __wait_resend, int *__sockp,
- u_int __sendsz, u_int __recvsz) __THROW;
+ unsigned int __sendsz, unsigned int __recvsz) __THROW;
@@ -348,28 +348,28 @@ extern CLIENT *clntudp_bufcreate (struct sockaddr_in *__raddr,
* CLIENT *
* clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz)
* struct sockaddr_un *raddr;
- * u_long prog;
- * u_long version;
+ * unsigned long prog;
+ * unsigned long version;
* register int *sockp;
- * u_int sendsz;
- * u_int recvsz;
+ * unsigned int sendsz;
+ * unsigned int recvsz;
*/
-extern CLIENT *clntunix_create (struct sockaddr_un *__raddr, u_long __program,
- u_long __version, int *__sockp,
- u_int __sendsz, u_int __recvsz) __THROW;
+extern CLIENT *clntunix_create (struct sockaddr_un *__raddr, unsigned long __program,
+ unsigned long __version, int *__sockp,
+ unsigned int __sendsz, unsigned int __recvsz) __THROW;
-extern int callrpc (__const char *__host, __const u_long __prognum,
- __const u_long __versnum, __const u_long __procnum,
- __const xdrproc_t __inproc, __const char *__in,
- __const xdrproc_t __outproc, char *__out) __THROW;
+extern int callrpc (const char *__host, const unsigned long __prognum,
+ const unsigned long __versnum, const unsigned long __procnum,
+ const xdrproc_t __inproc, const char *__in,
+ const xdrproc_t __outproc, char *__out) __THROW;
extern int _rpc_dtablesize (void) __THROW;
/*
* Print why creation failed
*/
-extern void clnt_pcreateerror (__const char *__msg) __THROW; /* stderr */
-extern char *clnt_spcreateerror(__const char *__msg) __THROW; /* string */
+extern void clnt_pcreateerror (const char *__msg) __THROW; /* stderr */
+extern char *clnt_spcreateerror(const char *__msg) __THROW; /* string */
/*
* Like clnt_perror(), but is more verbose in its output
@@ -379,9 +379,9 @@ extern void clnt_perrno (enum clnt_stat __num) __THROW; /* stderr */
/*
* Print an English error message, given the client error code
*/
-extern void clnt_perror (CLIENT *__clnt, __const char *__msg) __THROW;
+extern void clnt_perror (CLIENT *__clnt, const char *__msg) __THROW;
/* stderr */
-extern char *clnt_sperror (CLIENT *__clnt, __const char *__msg) __THROW;
+extern char *clnt_sperror (CLIENT *__clnt, const char *__msg) __THROW;
/* string */
/*
@@ -404,8 +404,8 @@ extern char *clnt_sperrno (enum clnt_stat __num) __THROW; /* string */
/*
* get the port number on the host for the rpc program,version and proto
*/
-extern int getrpcport (__const char * __host, u_long __prognum,
- u_long __versnum, u_int proto) __THROW;
+extern int getrpcport (const char * __host, unsigned long __prognum,
+ unsigned long __versnum, unsigned int proto) __THROW;
/*
* get the local host's IP address without consulting
diff --git a/mdk-stage1/dietlibc/include/rpc/key_prot.h b/mdk-stage1/dietlibc/include/rpc/key_prot.h
index 3e2eb7208..c398b82f8 100644
--- a/mdk-stage1/dietlibc/include/rpc/key_prot.h
+++ b/mdk-stage1/dietlibc/include/rpc/key_prot.h
@@ -136,11 +136,11 @@ bool_t xdr_cryptkeyres();
#define MAXGIDS 16
struct unixcred {
- u_int uid;
- u_int gid;
+ unsigned int uid;
+ unsigned int gid;
struct {
- u_int gids_len;
- u_int *gids_val;
+ unsigned int gids_len;
+ unsigned int *gids_val;
} gids;
};
typedef struct unixcred unixcred;
@@ -205,61 +205,61 @@ bool_t xdr_key_netstres();
#endif
-#define KEY_PROG ((u_long)100029)
-#define KEY_VERS ((u_long)1)
+#define KEY_PROG ((unsigned long)100029)
+#define KEY_VERS ((unsigned long)1)
#ifdef __cplusplus
-#define KEY_SET ((u_long)1)
+#define KEY_SET ((unsigned long)1)
extern "C" keystatus * key_set_1(opaque *, CLIENT *);
extern "C" keystatus * key_set_1_svc(opaque *, struct svc_req *);
-#define KEY_ENCRYPT ((u_long)2)
+#define KEY_ENCRYPT ((unsigned long)2)
extern "C" cryptkeyres * key_encrypt_1(cryptkeyarg *, CLIENT *);
extern "C" cryptkeyres * key_encrypt_1_svc(cryptkeyarg *, struct svc_req *);
-#define KEY_DECRYPT ((u_long)3)
+#define KEY_DECRYPT ((unsigned long)3)
extern "C" cryptkeyres * key_decrypt_1(cryptkeyarg *, CLIENT *);
extern "C" cryptkeyres * key_decrypt_1_svc(cryptkeyarg *, struct svc_req *);
-#define KEY_GEN ((u_long)4)
+#define KEY_GEN ((unsigned long)4)
extern "C" des_block * key_gen_1(void *, CLIENT *);
extern "C" des_block * key_gen_1_svc(void *, struct svc_req *);
-#define KEY_GETCRED ((u_long)5)
+#define KEY_GETCRED ((unsigned long)5)
extern "C" getcredres * key_getcred_1(netnamestr *, CLIENT *);
extern "C" getcredres * key_getcred_1_svc(netnamestr *, struct svc_req *);
#elif __STDC__
-#define KEY_SET ((u_long)1)
+#define KEY_SET ((unsigned long)1)
extern keystatus * key_set_1(opaque *, CLIENT *);
extern keystatus * key_set_1_svc(opaque *, struct svc_req *);
-#define KEY_ENCRYPT ((u_long)2)
+#define KEY_ENCRYPT ((unsigned long)2)
extern cryptkeyres * key_encrypt_1(cryptkeyarg *, CLIENT *);
extern cryptkeyres * key_encrypt_1_svc(cryptkeyarg *, struct svc_req *);
-#define KEY_DECRYPT ((u_long)3)
+#define KEY_DECRYPT ((unsigned long)3)
extern cryptkeyres * key_decrypt_1(cryptkeyarg *, CLIENT *);
extern cryptkeyres * key_decrypt_1_svc(cryptkeyarg *, struct svc_req *);
-#define KEY_GEN ((u_long)4)
+#define KEY_GEN ((unsigned long)4)
extern des_block * key_gen_1(void *, CLIENT *);
extern des_block * key_gen_1_svc(void *, struct svc_req *);
-#define KEY_GETCRED ((u_long)5)
+#define KEY_GETCRED ((unsigned long)5)
extern getcredres * key_getcred_1(netnamestr *, CLIENT *);
extern getcredres * key_getcred_1_svc(netnamestr *, struct svc_req *);
#else /* Old Style C */
-#define KEY_SET ((u_long)1)
+#define KEY_SET ((unsigned long)1)
extern keystatus * key_set_1();
extern keystatus * key_set_1_svc();
-#define KEY_ENCRYPT ((u_long)2)
+#define KEY_ENCRYPT ((unsigned long)2)
extern cryptkeyres * key_encrypt_1();
extern cryptkeyres * key_encrypt_1_svc();
-#define KEY_DECRYPT ((u_long)3)
+#define KEY_DECRYPT ((unsigned long)3)
extern cryptkeyres * key_decrypt_1();
extern cryptkeyres * key_decrypt_1_svc();
-#define KEY_GEN ((u_long)4)
+#define KEY_GEN ((unsigned long)4)
extern des_block * key_gen_1();
extern des_block * key_gen_1_svc();
-#define KEY_GETCRED ((u_long)5)
+#define KEY_GETCRED ((unsigned long)5)
extern getcredres * key_getcred_1();
extern getcredres * key_getcred_1_svc();
#endif /* Old Style C */
-#define KEY_VERS2 ((u_long)2)
+#define KEY_VERS2 ((unsigned long)2)
#ifdef __cplusplus
extern "C" keystatus * key_set_2(opaque *, CLIENT *);
@@ -272,19 +272,19 @@ extern "C" des_block * key_gen_2(void *, CLIENT *);
extern "C" des_block * key_gen_2_svc(void *, struct svc_req *);
extern "C" getcredres * key_getcred_2(netnamestr *, CLIENT *);
extern "C" getcredres * key_getcred_2_svc(netnamestr *, struct svc_req *);
-#define KEY_ENCRYPT_PK ((u_long)6)
+#define KEY_ENCRYPT_PK ((unsigned long)6)
extern "C" cryptkeyres * key_encrypt_pk_2(cryptkeyarg2 *, CLIENT *);
extern "C" cryptkeyres * key_encrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *);
-#define KEY_DECRYPT_PK ((u_long)7)
+#define KEY_DECRYPT_PK ((unsigned long)7)
extern "C" cryptkeyres * key_decrypt_pk_2(cryptkeyarg2 *, CLIENT *);
extern "C" cryptkeyres * key_decrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *);
-#define KEY_NET_PUT ((u_long)8)
+#define KEY_NET_PUT ((unsigned long)8)
extern "C" keystatus * key_net_put_2(key_netstarg *, CLIENT *);
extern "C" keystatus * key_net_put_2_svc(key_netstarg *, struct svc_req *);
-#define KEY_NET_GET ((u_long)9)
+#define KEY_NET_GET ((unsigned long)9)
extern "C" key_netstres * key_net_get_2(void *, CLIENT *);
extern "C" key_netstres * key_net_get_2_svc(void *, struct svc_req *);
-#define KEY_GET_CONV ((u_long)10)
+#define KEY_GET_CONV ((unsigned long)10)
extern "C" cryptkeyres * key_get_conv_2(opaque *, CLIENT *);
extern "C" cryptkeyres * key_get_conv_2_svc(opaque *, struct svc_req *);
@@ -299,19 +299,19 @@ extern des_block * key_gen_2(void *, CLIENT *);
extern des_block * key_gen_2_svc(void *, struct svc_req *);
extern getcredres * key_getcred_2(netnamestr *, CLIENT *);
extern getcredres * key_getcred_2_svc(netnamestr *, struct svc_req *);
-#define KEY_ENCRYPT_PK ((u_long)6)
+#define KEY_ENCRYPT_PK ((unsigned long)6)
extern cryptkeyres * key_encrypt_pk_2(cryptkeyarg2 *, CLIENT *);
extern cryptkeyres * key_encrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *);
-#define KEY_DECRYPT_PK ((u_long)7)
+#define KEY_DECRYPT_PK ((unsigned long)7)
extern cryptkeyres * key_decrypt_pk_2(cryptkeyarg2 *, CLIENT *);
extern cryptkeyres * key_decrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *);
-#define KEY_NET_PUT ((u_long)8)
+#define KEY_NET_PUT ((unsigned long)8)
extern keystatus * key_net_put_2(key_netstarg *, CLIENT *);
extern keystatus * key_net_put_2_svc(key_netstarg *, struct svc_req *);
-#define KEY_NET_GET ((u_long)9)
+#define KEY_NET_GET ((unsigned long)9)
extern key_netstres * key_net_get_2(void *, CLIENT *);
extern key_netstres * key_net_get_2_svc(void *, struct svc_req *);
-#define KEY_GET_CONV ((u_long)10)
+#define KEY_GET_CONV ((unsigned long)10)
extern cryptkeyres * key_get_conv_2(opaque *, CLIENT *);
extern cryptkeyres * key_get_conv_2_svc(opaque *, struct svc_req *);
@@ -326,19 +326,19 @@ extern des_block * key_gen_2();
extern des_block * key_gen_2_svc();
extern getcredres * key_getcred_2();
extern getcredres * key_getcred_2_svc();
-#define KEY_ENCRYPT_PK ((u_long)6)
+#define KEY_ENCRYPT_PK ((unsigned long)6)
extern cryptkeyres * key_encrypt_pk_2();
extern cryptkeyres * key_encrypt_pk_2_svc();
-#define KEY_DECRYPT_PK ((u_long)7)
+#define KEY_DECRYPT_PK ((unsigned long)7)
extern cryptkeyres * key_decrypt_pk_2();
extern cryptkeyres * key_decrypt_pk_2_svc();
-#define KEY_NET_PUT ((u_long)8)
+#define KEY_NET_PUT ((unsigned long)8)
extern keystatus * key_net_put_2();
extern keystatus * key_net_put_2_svc();
-#define KEY_NET_GET ((u_long)9)
+#define KEY_NET_GET ((unsigned long)9)
extern key_netstres * key_net_get_2();
extern key_netstres * key_net_get_2_svc();
-#define KEY_GET_CONV ((u_long)10)
+#define KEY_GET_CONV ((unsigned long)10)
extern cryptkeyres * key_get_conv_2();
extern cryptkeyres * key_get_conv_2_svc();
#endif /* Old Style C */
diff --git a/mdk-stage1/dietlibc/include/rpc/netdb.h b/mdk-stage1/dietlibc/include/rpc/netdb.h
index da4bddfc4..a991d3a95 100644
--- a/mdk-stage1/dietlibc/include/rpc/netdb.h
+++ b/mdk-stage1/dietlibc/include/rpc/netdb.h
@@ -52,12 +52,12 @@ struct rpcent
extern void setrpcent (int __stayopen) __THROW;
extern void endrpcent (void) __THROW;
-extern struct rpcent *getrpcbyname (__const char *__name) __THROW;
+extern struct rpcent *getrpcbyname (const char *__name) __THROW;
extern struct rpcent *getrpcbynumber (int __number) __THROW;
extern struct rpcent *getrpcent (void) __THROW;
#ifdef __USE_MISC
-extern int getrpcbyname_r (__const char *__name, struct rpcent *__result_buf,
+extern int getrpcbyname_r (const char *__name, struct rpcent *__result_buf,
char *__buffer, size_t __buflen,
struct rpcent **__result) __THROW;
diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h b/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h
index 68bc8d8ec..c63922772 100644
--- a/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h
+++ b/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h
@@ -45,7 +45,7 @@
__BEGIN_DECLS
-typedef bool_t (*resultproc_t) (caddr_t resp, struct sockaddr_in *raddr);
+typedef bool_t (*resultproc_t) (char* resp, struct sockaddr_in *raddr);
/*
* Usage:
@@ -63,34 +63,34 @@ typedef bool_t (*resultproc_t) (caddr_t resp, struct sockaddr_in *raddr);
* the procedure eachresult is called. Its form is:
* done = eachresult(resp, raddr)
* bool_t done;
- * caddr_t resp;
+ * char* resp;
* struct sockaddr_in raddr;
* where resp points to the results of the call and raddr is the
* address if the responder to the broadcast.
*/
-extern bool_t pmap_set (__const u_long __program, __const u_long __vers,
- int __protocol, u_short __port) __THROW;
-extern bool_t pmap_unset (__const u_long __program, __const u_long __vers)
+extern bool_t pmap_set (const unsigned long __program, const unsigned long __vers,
+ int __protocol, unsigned short __port) __THROW;
+extern bool_t pmap_unset (const unsigned long __program, const unsigned long __vers)
__THROW;
extern struct pmaplist *pmap_getmaps (struct sockaddr_in *__address) __THROW;
extern enum clnt_stat pmap_rmtcall (struct sockaddr_in *__addr,
- __const u_long __prog,
- __const u_long __vers,
- __const u_long __proc,
+ const unsigned long __prog,
+ const unsigned long __vers,
+ const unsigned long __proc,
xdrproc_t __xdrargs,
- caddr_t __argsp, xdrproc_t __xdrres,
- caddr_t __resp, struct timeval __tout,
- u_long *__port_ptr) __THROW;
-extern enum clnt_stat clnt_broadcast (__const u_long __prog,
- __const u_long __vers,
- __const u_long __proc, xdrproc_t __xargs,
- caddr_t __argsp, xdrproc_t __xresults,
- caddr_t __resultsp,
+ char* __argsp, xdrproc_t __xdrres,
+ char* __resp, struct timeval __tout,
+ unsigned long *__port_ptr) __THROW;
+extern enum clnt_stat clnt_broadcast (const unsigned long __prog,
+ const unsigned long __vers,
+ const unsigned long __proc, xdrproc_t __xargs,
+ char* __argsp, xdrproc_t __xresults,
+ char* __resultsp,
resultproc_t __eachresult) __THROW;
-extern u_short pmap_getport (struct sockaddr_in *__address,
- __const u_long __program,
- __const u_long __version, u_int __protocol)
+extern unsigned short pmap_getport (struct sockaddr_in *__address,
+ const unsigned long __program,
+ const unsigned long __version, unsigned int __protocol)
__THROW;
__END_DECLS
diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_prot.h b/mdk-stage1/dietlibc/include/rpc/pmap_prot.h
index fd7fb8e7e..da06d34c1 100644
--- a/mdk-stage1/dietlibc/include/rpc/pmap_prot.h
+++ b/mdk-stage1/dietlibc/include/rpc/pmap_prot.h
@@ -75,17 +75,17 @@ __BEGIN_DECLS
* The service supports remote procedure calls on udp/ip or tcp/ip socket 111.
*/
-#define PMAPPORT ((u_short)111)
-#define PMAPPROG ((u_long)100000)
-#define PMAPVERS ((u_long)2)
-#define PMAPVERS_PROTO ((u_long)2)
-#define PMAPVERS_ORIG ((u_long)1)
-#define PMAPPROC_NULL ((u_long)0)
-#define PMAPPROC_SET ((u_long)1)
-#define PMAPPROC_UNSET ((u_long)2)
-#define PMAPPROC_GETPORT ((u_long)3)
-#define PMAPPROC_DUMP ((u_long)4)
-#define PMAPPROC_CALLIT ((u_long)5)
+#define PMAPPORT ((unsigned short)111)
+#define PMAPPROG ((unsigned long)100000)
+#define PMAPVERS ((unsigned long)2)
+#define PMAPVERS_PROTO ((unsigned long)2)
+#define PMAPVERS_ORIG ((unsigned long)1)
+#define PMAPPROC_NULL ((unsigned long)0)
+#define PMAPPROC_SET ((unsigned long)1)
+#define PMAPPROC_UNSET ((unsigned long)2)
+#define PMAPPROC_GETPORT ((unsigned long)3)
+#define PMAPPROC_DUMP ((unsigned long)4)
+#define PMAPPROC_CALLIT ((unsigned long)5)
struct pmap {
long unsigned pm_prog;
diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h b/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h
index 160f998ca..3b975d0fb 100644
--- a/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h
+++ b/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h
@@ -46,8 +46,8 @@
__BEGIN_DECLS
struct rmtcallargs {
- u_long prog, vers, proc, arglen;
- caddr_t args_ptr;
+ unsigned long prog, vers, proc, arglen;
+ char* args_ptr;
xdrproc_t xdr_args;
};
@@ -55,9 +55,9 @@ extern bool_t xdr_rmtcall_args (XDR *__xdrs, struct rmtcallargs *__crp)
__THROW;
struct rmtcallres {
- u_long *port_ptr;
- u_long resultslen;
- caddr_t results_ptr;
+ unsigned long *port_ptr;
+ unsigned long resultslen;
+ char* results_ptr;
xdrproc_t xdr_results;
};
diff --git a/mdk-stage1/dietlibc/include/rpc/rpc.h b/mdk-stage1/dietlibc/include/rpc/rpc.h
index 20b341d74..a966d2e23 100644
--- a/mdk-stage1/dietlibc/include/rpc/rpc.h
+++ b/mdk-stage1/dietlibc/include/rpc/rpc.h
@@ -67,6 +67,4 @@
/* routines for parsing /etc/rpc */
#include <rpc/netdb.h> /* structures and routines to parse /etc/rpc */
-int bindresvport(int sd, struct sockaddr_in* sin) __THROW;
-
#endif /* rpc/rpc.h */
diff --git a/mdk-stage1/dietlibc/include/rpc/rpc_msg.h b/mdk-stage1/dietlibc/include/rpc/rpc_msg.h
index 636d60ea9..d597608ab 100644
--- a/mdk-stage1/dietlibc/include/rpc/rpc_msg.h
+++ b/mdk-stage1/dietlibc/include/rpc/rpc_msg.h
@@ -44,8 +44,8 @@
* Copyright (C) 1984, Sun Microsystems, Inc.
*/
-#define RPC_MSG_VERSION ((u_long) 2)
-#define RPC_SERVICE_PORT ((u_short) 2048)
+#define RPC_MSG_VERSION ((unsigned long) 2)
+#define RPC_SERVICE_PORT ((unsigned short) 2048)
__BEGIN_DECLS
@@ -93,11 +93,11 @@ struct accepted_reply {
enum accept_stat ar_stat;
union {
struct {
- u_long low;
- u_long high;
+ unsigned long low;
+ unsigned long high;
} AR_versions;
struct {
- caddr_t where;
+ char* where;
xdrproc_t proc;
} AR_results;
/* and many other null cases */
@@ -113,8 +113,8 @@ struct rejected_reply {
enum reject_stat rj_stat;
union {
struct {
- u_long low;
- u_long high;
+ unsigned long low;
+ unsigned long high;
} RJ_versions;
enum auth_stat RJ_why; /* why authentication did not work */
} ru;
@@ -139,10 +139,10 @@ struct reply_body {
* Body of an rpc request call.
*/
struct call_body {
- u_long cb_rpcvers; /* must be equal to two */
- u_long cb_prog;
- u_long cb_vers;
- u_long cb_proc;
+ unsigned long cb_rpcvers; /* must be equal to two */
+ unsigned long cb_prog;
+ unsigned long cb_vers;
+ unsigned long cb_proc;
struct opaque_auth cb_cred;
struct opaque_auth cb_verf; /* protocol specific - provided by client */
};
@@ -151,7 +151,7 @@ struct call_body {
* The rpc message
*/
struct rpc_msg {
- u_long rm_xid;
+ unsigned long rm_xid;
enum msg_type rm_direction;
union {
struct call_body RM_cmb;
diff --git a/mdk-stage1/dietlibc/include/rpc/svc.h b/mdk-stage1/dietlibc/include/rpc/svc.h
index 27c997dde..ec598ba79 100644
--- a/mdk-stage1/dietlibc/include/rpc/svc.h
+++ b/mdk-stage1/dietlibc/include/rpc/svc.h
@@ -75,18 +75,18 @@ enum xprt_stat {
typedef struct SVCXPRT SVCXPRT;
struct SVCXPRT {
int xp_sock;
- u_short xp_port; /* associated port number */
+ unsigned short xp_port; /* associated port number */
const struct xp_ops {
bool_t (*xp_recv) (SVCXPRT *__xprt, struct rpc_msg *__msg);
/* receive incoming requests */
enum xprt_stat (*xp_stat) (SVCXPRT *__xprt);
/* get transport status */
bool_t (*xp_getargs) (SVCXPRT *__xprt, xdrproc_t __xdr_args,
- caddr_t args_ptr); /* get arguments */
+ char* args_ptr); /* get arguments */
bool_t (*xp_reply) (SVCXPRT *__xprt, struct rpc_msg *__msg);
/* send reply */
bool_t (*xp_freeargs) (SVCXPRT *__xprt, xdrproc_t __xdr_args,
- caddr_t args_ptr);
+ char* args_ptr);
/* free mem allocated for args */
void (*xp_destroy) (SVCXPRT *__xprt);
/* destroy this struct */
@@ -94,8 +94,8 @@ struct SVCXPRT {
int xp_addrlen; /* length of remote address */
struct sockaddr_in xp_raddr; /* remote address */
struct opaque_auth xp_verf; /* raw response verifier */
- caddr_t xp_p1; /* private */
- caddr_t xp_p2; /* private */
+ char* xp_p1; /* private */
+ char* xp_p2; /* private */
char xp_pad [256]; /* padding, internal use */
};
@@ -110,7 +110,7 @@ struct SVCXPRT {
* SVCXPRT *xprt;
* struct rpc_msg *msg;
* xdrproc_t xargs;
- * caddr_t argsp;
+ * char* argsp;
*/
#define SVC_RECV(xprt, msg) \
(*(xprt)->xp_ops->xp_recv)((xprt), (msg))
@@ -151,7 +151,7 @@ struct svc_req {
rpcvers_t rq_vers; /* service protocol version */
rpcproc_t rq_proc; /* the desired procedure */
struct opaque_auth rq_cred; /* raw creds from the wire */
- caddr_t rq_clntcred; /* read only cooked cred */
+ char* rq_clntcred; /* read only cooked cred */
SVCXPRT *rq_xprt; /* associated transport */
};
@@ -227,7 +227,7 @@ extern void xprt_unregister (SVCXPRT *__xprt) __THROW;
*/
extern bool_t svc_sendreply (SVCXPRT *xprt, xdrproc_t __xdr_results,
- caddr_t __xdr_location) __THROW;
+ char* __xdr_location) __THROW;
extern void svcerr_decode (SVCXPRT *__xprt) __THROW;
@@ -294,20 +294,20 @@ extern SVCXPRT *svcraw_create (void) __THROW;
* Udp based rpc.
*/
extern SVCXPRT *svcudp_create (int __sock) __THROW;
-extern SVCXPRT *svcudp_bufcreate (int __sock, u_int __sendsz, u_int __recvsz)
+extern SVCXPRT *svcudp_bufcreate (int __sock, unsigned int __sendsz, unsigned int __recvsz)
__THROW;
/*
* Tcp based rpc.
*/
-extern SVCXPRT *svctcp_create (int __sock, u_int __sendsize, u_int __recvsize)
+extern SVCXPRT *svctcp_create (int __sock, unsigned int __sendsize, unsigned int __recvsize)
__THROW;
/*
* Unix based rpc.
*/
-extern SVCXPRT *svcunix_create (int __sock, u_int __sendsize, u_int __recvsize,
+extern SVCXPRT *svcunix_create (int __sock, unsigned int __sendsize, unsigned int __recvsize,
char *__path) __THROW;
diff --git a/mdk-stage1/dietlibc/include/rpc/types.h b/mdk-stage1/dietlibc/include/rpc/types.h
index e2e8402be..0e4f0b0e7 100644
--- a/mdk-stage1/dietlibc/include/rpc/types.h
+++ b/mdk-stage1/dietlibc/include/rpc/types.h
@@ -52,10 +52,6 @@ typedef unsigned long rpcport_t;
# define TRUE (1)
#endif
-#ifndef NULL
-# define NULL 0
-#endif
-
#include <stdlib.h> /* For malloc decl. */
#define mem_alloc(bsize) malloc(bsize)
#define mem_free(ptr, bsize) free(ptr)
@@ -69,7 +65,7 @@ typedef unsigned long rpcport_t;
#include <netinet/in.h>
#ifndef INADDR_LOOPBACK
-#define INADDR_LOOPBACK (u_long)0x7F000001
+#define INADDR_LOOPBACK 0x7F000001UL
#endif
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 64
diff --git a/mdk-stage1/dietlibc/include/rpc/xdr.h b/mdk-stage1/dietlibc/include/rpc/xdr.h
index ce092f085..590392070 100644
--- a/mdk-stage1/dietlibc/include/rpc/xdr.h
+++ b/mdk-stage1/dietlibc/include/rpc/xdr.h
@@ -118,13 +118,13 @@ struct XDR
/* get a long from underlying stream */
bool_t (*x_putlong) (XDR *__xdrs, const long *__lp);
/* put a long to " */
- bool_t (*x_getbytes) (XDR *__xdrs, caddr_t __addr, u_int __len);
+ bool_t (*x_getbytes) (XDR *__xdrs, char* __addr, unsigned int __len);
/* get some bytes from " */
- bool_t (*x_putbytes) (XDR *__xdrs, const char *__addr, u_int __len);
+ bool_t (*x_putbytes) (XDR *__xdrs, const char *__addr, unsigned int __len);
/* put some bytes to " */
- u_int (*x_getpostn) (const XDR *__xdrs);
+ unsigned int (*x_getpostn) (const XDR *__xdrs);
/* returns bytes off from beginning */
- bool_t (*x_setpostn) (XDR *__xdrs, u_int __pos);
+ bool_t (*x_setpostn) (XDR *__xdrs, unsigned int __pos);
/* lets you reposition the stream */
int32_t *(*x_inline) (XDR *__xdrs, int __len);
/* buf quick ptr to buffered data */
@@ -136,9 +136,9 @@ struct XDR
/* put a int to " */
}
*x_ops;
- caddr_t x_public; /* users' data */
- caddr_t x_private; /* pointer to private data */
- caddr_t x_base; /* private used for position info */
+ char* x_public; /* users' data */
+ char* x_private; /* pointer to private data */
+ char* x_base; /* private used for position info */
int x_handy; /* extra private word */
};
@@ -149,7 +149,7 @@ struct XDR
* The opaque pointer generally points to a structure of the data type
* to be decoded. If this pointer is 0, then the type routines should
* allocate dynamic storage of the appropriate size and return it.
- * bool_t (*xdrproc_t)(XDR *, caddr_t *);
+ * bool_t (*xdrproc_t)(XDR *, char* *);
*/
typedef bool_t (*xdrproc_t) (XDR *, void *,...);
@@ -160,9 +160,9 @@ typedef bool_t (*xdrproc_t) (XDR *, void *,...);
* XDR *xdrs;
* int32_t *int32p;
* long *longp;
- * caddr_t addr;
- * u_int len;
- * u_int pos;
+ * char* addr;
+ * unsigned int len;
+ * unsigned int pos;
*/
#define XDR_GETINT32(xdrs, int32p) \
(*(xdrs)->x_ops->x_getint32)(xdrs, int32p)
@@ -263,17 +263,17 @@ struct xdr_discrim
* in the RPC code will not work on 64bit Solaris platforms !
*/
#define IXDR_GET_LONG(buf) \
- ((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++))
+ ((long)ntohl((unsigned long)*__extension__((uint32_t*)(buf))++))
#define IXDR_PUT_LONG(buf, v) \
- (*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v)))
-#define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf))
+ (*__extension__((uint32_t*)(buf))++ = (long)htonl((unsigned long)(v)))
+#define IXDR_GET_U_LONG(buf) ((unsigned long)IXDR_GET_LONG(buf))
#define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG(buf, (long)(v))
#define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_LONG(buf))
#define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_LONG(buf))
#define IXDR_GET_SHORT(buf) ((short)IXDR_GET_LONG(buf))
-#define IXDR_GET_U_SHORT(buf) ((u_short)IXDR_GET_LONG(buf))
+#define IXDR_GET_U_SHORT(buf) ((unsigned short)IXDR_GET_LONG(buf))
#define IXDR_PUT_BOOL(buf, v) IXDR_PUT_LONG(buf, (long)(v))
#define IXDR_PUT_ENUM(buf, v) IXDR_PUT_LONG(buf, (long)(v))
@@ -288,15 +288,15 @@ struct xdr_discrim
*/
extern bool_t xdr_void (void) __THROW;
extern bool_t xdr_short (XDR *__xdrs, short *__sp) __THROW;
-extern bool_t xdr_u_short (XDR *__xdrs, u_short *__usp) __THROW;
+extern bool_t xdr_u_short (XDR *__xdrs, unsigned short *__usp) __THROW;
extern bool_t xdr_int (XDR *__xdrs, int *__ip) __THROW;
-extern bool_t xdr_u_int (XDR *__xdrs, u_int *__up) __THROW;
+extern bool_t xdr_u_int (XDR *__xdrs, unsigned int *__up) __THROW;
extern bool_t xdr_long (XDR *__xdrs, long *__lp) __THROW;
-extern bool_t xdr_u_long (XDR *__xdrs, u_long *__ulp) __THROW;
-extern bool_t xdr_hyper (XDR *__xdrs, __quad_t *__llp) __THROW;
-extern bool_t xdr_u_hyper (XDR *__xdrs, __u_quad_t *__ullp) __THROW;
-extern bool_t xdr_longlong_t (XDR *__xdrs, __quad_t *__llp) __THROW;
-extern bool_t xdr_u_longlong_t (XDR *__xdrs, __u_quad_t *__ullp) __THROW;
+extern bool_t xdr_u_long (XDR *__xdrs, unsigned long *__ulp) __THROW;
+extern bool_t xdr_hyper (XDR *__xdrs, int64_t *__llp) __THROW;
+extern bool_t xdr_u_hyper (XDR *__xdrs, uint64_t *__ullp) __THROW;
+extern bool_t xdr_longlong_t (XDR *__xdrs, int64_t *__llp) __THROW;
+extern bool_t xdr_u_longlong_t (XDR *__xdrs, uint64_t *__ullp) __THROW;
extern bool_t xdr_int8_t (XDR *__xdrs, int8_t *__ip) __THROW;
extern bool_t xdr_uint8_t (XDR *__xdrs, uint8_t *__up) __THROW;
extern bool_t xdr_int16_t (XDR *__xdrs, int16_t *__ip) __THROW;
@@ -307,28 +307,28 @@ extern bool_t xdr_int64_t (XDR *__xdrs, int64_t *__ip) __THROW;
extern bool_t xdr_uint64_t (XDR *__xdrs, uint64_t *__up) __THROW;
extern bool_t xdr_bool (XDR *__xdrs, bool_t *__bp) __THROW;
extern bool_t xdr_enum (XDR *__xdrs, enum_t *__ep) __THROW;
-extern bool_t xdr_array (XDR * _xdrs, caddr_t *__addrp, u_int *__sizep,
- u_int __maxsize, u_int __elsize, xdrproc_t __elproc)
+extern bool_t xdr_array (XDR * _xdrs, char* *__addrp, unsigned int *__sizep,
+ unsigned int __maxsize, unsigned int __elsize, xdrproc_t __elproc)
__THROW;
-extern bool_t xdr_bytes (XDR *__xdrs, char **__cpp, u_int *__sizep,
- u_int __maxsize) __THROW;
-extern bool_t xdr_opaque (XDR *__xdrs, caddr_t __cp, u_int __cnt) __THROW;
-extern bool_t xdr_string (XDR *__xdrs, char **__cpp, u_int __maxsize) __THROW;
+extern bool_t xdr_bytes (XDR *__xdrs, char **__cpp, unsigned int *__sizep,
+ unsigned int __maxsize) __THROW;
+extern bool_t xdr_opaque (XDR *__xdrs, char* __cp, unsigned int __cnt) __THROW;
+extern bool_t xdr_string (XDR *__xdrs, char **__cpp, unsigned int __maxsize) __THROW;
extern bool_t xdr_union (XDR *__xdrs, enum_t *__dscmp, char *__unp,
const struct xdr_discrim *__choices,
xdrproc_t dfault) __THROW;
extern bool_t xdr_char (XDR *__xdrs, char *__cp) __THROW;
-extern bool_t xdr_u_char (XDR *__xdrs, u_char *__cp) __THROW;
-extern bool_t xdr_vector (XDR *__xdrs, char *__basep, u_int __nelem,
- u_int __elemsize, xdrproc_t __xdr_elem) __THROW;
+extern bool_t xdr_u_char (XDR *__xdrs, unsigned char *__cp) __THROW;
+extern bool_t xdr_vector (XDR *__xdrs, char *__basep, unsigned int __nelem,
+ unsigned int __elemsize, xdrproc_t __xdr_elem) __THROW;
extern bool_t xdr_float (XDR *__xdrs, float *__fp) __THROW;
extern bool_t xdr_double (XDR *__xdrs, double *__dp) __THROW;
-extern bool_t xdr_reference (XDR *__xdrs, caddr_t *__xpp, u_int __size,
+extern bool_t xdr_reference (XDR *__xdrs, char* *__xpp, unsigned int __size,
xdrproc_t __proc) __THROW;
extern bool_t xdr_pointer (XDR *__xdrs, char **__objpp,
- u_int __obj_size, xdrproc_t __xdr_obj) __THROW;
+ unsigned int __obj_size, xdrproc_t __xdr_obj) __THROW;
extern bool_t xdr_wrapstring (XDR *__xdrs, char **__cpp) __THROW;
-extern u_long xdr_sizeof (xdrproc_t, void *) __THROW;
+extern unsigned long xdr_sizeof (xdrproc_t, void *) __THROW;
/*
* Common opaque bytes objects used by many rpc protocols;
@@ -337,7 +337,7 @@ extern u_long xdr_sizeof (xdrproc_t, void *) __THROW;
#define MAX_NETOBJ_SZ 1024
struct netobj
{
- u_int n_len;
+ unsigned int n_len;
char *n_bytes;
};
typedef struct netobj netobj;
@@ -349,16 +349,16 @@ extern bool_t xdr_netobj (XDR *__xdrs, struct netobj *__np) __THROW;
*/
/* XDR using memory buffers */
-extern void xdrmem_create (XDR *__xdrs, const caddr_t __addr,
- u_int __size, enum xdr_op __xop) __THROW;
+extern void xdrmem_create (XDR *__xdrs, const char* __addr,
+ unsigned int __size, enum xdr_op __xop) __THROW;
/* XDR using stdio library */
extern void xdrstdio_create (XDR *__xdrs, FILE *__file, enum xdr_op __xop)
__THROW;
/* XDR pseudo records for tcp */
-extern void xdrrec_create (XDR *__xdrs, u_int __sendsize,
- u_int __recvsize, caddr_t __tcp_handle,
+extern void xdrrec_create (XDR *__xdrs, unsigned int __sendsize,
+ unsigned int __recvsize, char* __tcp_handle,
int (*__readit) (char *, char *, int),
int (*__writeit) (char *, char *, int)) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sched.h b/mdk-stage1/dietlibc/include/sched.h
index 5e4430d29..b6442c73b 100644
--- a/mdk-stage1/dietlibc/include/sched.h
+++ b/mdk-stage1/dietlibc/include/sched.h
@@ -4,13 +4,6 @@
#include <time.h>
#include <sys/types.h>
-#ifndef u16
-#define u16 __u16
-#endif
-
-/* till those F**KIN' kernel headers are sane: A COPY !
- * #include <linux/sched.h>
- * A COPY OF THE STUFF WE NEED.... *GRUMBLE* */
/*
* cloning flags:
@@ -26,7 +19,9 @@
#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
#define CLONE_THREAD 0x00010000 /* Same thread group? */
-#define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREA)
+#define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD)
+
+int clone(void*(*fn)(void*),void*stack,int flags,void*arg);
/*
* Scheduling policies
@@ -42,7 +37,7 @@
#define SCHED_YIELD 0x10
struct sched_param {
- int sched_priority;
+ int sched_priority;
};
/* END OF COPY form kernel-header */
diff --git a/mdk-stage1/dietlibc/include/setjmp.h b/mdk-stage1/dietlibc/include/setjmp.h
index 66fc288f4..b591936ac 100644
--- a/mdk-stage1/dietlibc/include/setjmp.h
+++ b/mdk-stage1/dietlibc/include/setjmp.h
@@ -16,6 +16,42 @@ typedef int __jmp_buf[6];
# define JB_SIZE 24
#endif
+#ifdef __x86_64__
+#ifndef __ASSEMBLER__
+typedef long __jmp_buf[8];
+#endif
+# define JB_RBX 0
+# define JB_RBP 1
+# define JB_R12 2
+# define JB_R13 3
+# define JB_R14 4
+# define JB_R15 5
+# define JB_RSP 6
+# define JB_PC 7
+# define JB_SIZE 64
+#endif
+
+#ifdef __s390__
+#ifndef __ASSEMBLER__
+typedef struct {
+ long int gregs[10];
+ long fpregs[4];
+} __jmp_buf[1];
+#endif
+#define __JB_GPR6 0
+#define __JB_GPR7 1
+#define __JB_GPR8 2
+#define __JB_GPR9 3
+#define __JB_GPR10 4
+#define __JB_GPR11 5
+#define __JB_GPR12 6
+#define __JB_GPR13 7
+#define __JB_GPR14 8
+#define __JB_GPR15 9
+
+#define _JMPBUF_UNWINDS(jmpbuf, address) ((int) (address) < (jmpbuf)->gregs[__JB_GPR15])
+#endif
+
#ifdef __alpha__
#define JB_S0 0
#define JB_S1 1
@@ -55,18 +91,80 @@ typedef struct
#endif
#ifdef __sparc__
+#ifdef __arch64__
+
+#define MC_TSTATE 0
+#define MC_PC 1
+#define MC_NPC 2
+#define MC_Y 3
+#define MC_G1 4
+#define MC_G2 5
+#define MC_G3 6
+#define MC_G4 7
+#define MC_G5 8
+#define MC_G6 9
+#define MC_G7 10
+#define MC_O0 11
+#define MC_O1 12
+#define MC_O2 13
+#define MC_O3 14
+#define MC_O4 15
+#define MC_O5 16
+#define MC_O6 17
+#define MC_O7 18
+#define MC_NGREG 19
+
+#define FLAG_SAVEMASK 512
+#ifndef __ASSEMBLER__
+#include <signal.h>
+
+/* this equal to ucontext from "include/asm-sparc64/uctx.h" */
+typedef struct __sparc64_jmp_buf {
+ struct __sparc64_jmp_buf *uc_link;
+ unsigned long uc_flags;
+ sigset_t uc_sigmask;
+ struct {
+ unsigned long mc_gregs[MC_NGREG];
+ unsigned long mc_fp;
+ unsigned long mc_i7;
+ struct {
+ union {
+ unsigned int sregs[32];
+ unsigned long dregs[32];
+ long double qregs[16];
+ } mcfpu_fregs;
+ unsigned long mcfpu_fsr;
+ unsigned long mcfpu_fprs;
+ unsigned long mcfpu_gsr;
+ struct {
+ unsigned long *mcfq_addr;
+ unsigned int mcfq_insn;
+ } *mcfpu_fq;
+ unsigned char mcfpu_qcnt;
+ unsigned char mcfpu_qentsz;
+ unsigned char mcfpu_enab;
+ } mc_fpregs;
+ } uc_mcontext;
+} __jmp_buf[1];
+
+#endif
+
+#else
+
#define JB_SP 0
#define JB_FP 1
#define JB_PC 2
#ifndef __ASSEMBLER__
typedef int __jmp_buf[3];
#endif
+
+#endif
#endif
#ifdef __arm__
#define __JMP_BUF_SP 8
#ifndef __ASSEMBLER__
-typedef int __jmp_buf[10];
+typedef int __jmp_buf[24];
#endif
#endif
@@ -83,39 +181,49 @@ typedef long int __jmp_buf[58];
#endif
#endif
+#ifdef __hppa__
#ifndef __ASSEMBLER__
+typedef double __jmp_buf[21];
+#endif
+#endif
-typedef int sig_atomic_t;
-#define __sig_atomic_t sig_atomic_t
+#ifdef __ia64__
+#ifndef __ASSEMBLER__
+typedef long __jmp_buf[70] __attribute__ ((aligned(16)));
+#endif
+#endif
-# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
-typedef struct
- {
- unsigned long int __val[_SIGSET_NWORDS];
- } __sigset_t;
+#ifndef __ASSEMBLER__
+#include <signal.h>
+
+/* typedef int sig_atomic_t; */
+#define __sig_atomic_t sig_atomic_t
/* Calling environment, plus possibly a saved signal mask. */
-typedef struct __jmp_buf_tag /* C++ doesn't like tagless structs. */
- {
- /* NOTE: The machine-dependent definitions of `__sigsetjmp'
- assume that a `jmp_buf' begins with a `__jmp_buf'.
- Do not move this member or add others before it. */
- __jmp_buf __jmpbuf; /* Calling environment. */
- int __mask_was_saved; /* Saved the signal mask? */
- __sigset_t __saved_mask; /* Saved signal mask. */
- } jmp_buf[1];
+typedef struct __jmp_buf_tag { /* C++ doesn't like tagless structs. */
+/* NOTE: The machine-dependent definitions of `__sigsetjmp'
+ * assume that a `jmp_buf' begins with a `__jmp_buf'.
+ * Do not move this member or add others before it. */
+ __jmp_buf __jmpbuf; /* Calling environment. */
+ int __mask_was_saved; /* Saved the signal mask? */
+ sigset_t __saved_mask; /* Saved signal mask. */
+} jmp_buf[1];
-extern int __sigsetjmp (jmp_buf __env, int __savemask) __THROW;
+extern int __sigsetjmp(jmp_buf __env,int __savemask) __THROW;
-extern void longjmp (jmp_buf __env, int __val)
- __THROW __attribute__ ((__noreturn__));
+extern void longjmp(jmp_buf __env,int __val)
+ __THROW __attribute__((__noreturn__));
typedef jmp_buf sigjmp_buf;
-extern void siglongjmp (sigjmp_buf __env, int __val)
- __THROW __attribute__ ((__noreturn__));
+extern void siglongjmp(sigjmp_buf __env,int __val)
+ __THROW __attribute__((__noreturn__));
+#ifdef _BSD_SOURCE
+#define setjmp(env) __sigsetjmp(env,1)
+#else
#define setjmp(env) __sigsetjmp(env,0)
+#endif
#define sigsetjmp(a,b) __sigsetjmp(a,b)
#endif
diff --git a/mdk-stage1/dietlibc/include/shadow.h b/mdk-stage1/dietlibc/include/shadow.h
index 4d6341af1..1c84de9e6 100644
--- a/mdk-stage1/dietlibc/include/shadow.h
+++ b/mdk-stage1/dietlibc/include/shadow.h
@@ -19,6 +19,12 @@ struct spwd {
extern struct spwd *getspent(void) __THROW;
extern void setspent(void) __THROW;
extern void endspent(void) __THROW;
-extern struct spwd *getspnam (__const char *__name) __THROW;
+extern struct spwd *getspnam (const char *__name) __THROW;
+
+int getspent_r(struct spwd *res, char *buf, size_t buflen,
+ struct spwd **res_sig) __THROW;
+int getspnam_r(const char* name,
+ struct spwd *res, char *buf, size_t buflen,
+ struct spwd **res_sig) __THROW;
#endif /* _SHADOW_H */
diff --git a/mdk-stage1/dietlibc/include/signal.h b/mdk-stage1/dietlibc/include/signal.h
index 9ed93fe83..65f968755 100644
--- a/mdk-stage1/dietlibc/include/signal.h
+++ b/mdk-stage1/dietlibc/include/signal.h
@@ -5,31 +5,496 @@
#define __WANT_POSIX1B_SIGNALS__
-#include <linux/types.h>
-#include <linux/signal.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#define NSIG 32
+
+#ifdef __mips__
+#define _NSIG 128
+#else
+#define _NSIG 64
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT 6
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGSEGV 11
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGUNUSED 31
+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__arm__) \
+ || defined(__s390__) || defined(__ia64__)
+#define SIGBUS 7
+#define SIGUSR1 10
+#define SIGUSR2 12
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPWR 30
+#define SIGSYS 31
+#elif defined(__alpha__) || defined(__sparc__)
+#define SIGEMT 7
+#define SIGBUS 10
+#define SIGSYS 12
+#define SIGURG 16
+#define SIGSTOP 17
+#define SIGTSTP 18
+#define SIGCONT 19
+#define SIGCHLD 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGIO 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGPWR 29
+#define SIGUSR1 30
+#define SIGUSR2 31
+#if defined(__alpha__)
+#define SIGINFO SIGPWR
+#endif
+#elif defined(__mips__)
+#define SIGEMT 7
+#define SIGBUS 10
+#define SIGSYS 12
+#define SIGUSR1 16
+#define SIGUSR2 17
+#define SIGCHLD 18
+#define SIGPWR 19
+#define SIGWINCH 20
+#define SIGURG 21
+#define SIGIO 22
+#define SIGSTOP 23
+#define SIGTSTP 24
+#define SIGCONT 25
+#define SIGTTIN 26
+#define SIGTTOU 27
+#define SIGVTALRM 28
+#define SIGPROF 29
+#define SIGXCPU 30
+#define SIGXFSZ 31
+#elif defined(__hppa__)
+#define SIGEMT 7
+#define SIGBUS 10
+#define SIGSYS 12
+#define SIGUSR1 16
+#define SIGUSR2 17
+#define SIGCHLD 18
+#define SIGPWR 19
+#define SIGVTALRM 20
+#define SIGPROF 21
+#define SIGIO 22
+#define SIGWINCH 23
+#define SIGSTOP 24
+#define SIGTSTP 25
+#define SIGCONT 26
+#define SIGTTIN 27
+#define SIGTTOU 28
+#define SIGURG 29
+#define SIGLOST 30
+#define SIGUNUSED 31
+#define SIGRESERVE SIGUNUSE
+#define SIGXCPU 33
+#define SIGXFSZ 34
+#define SIGSTKFLT 36
+
+#else
+#error signal layout not yet known
+#endif
+
+#define SIGCLD SIGCHLD
+#define SIGLOST SIGPWR
+#define SIGPOLL SIGIO
+
+/* These should not be considered constants from userland. */
+#ifdef __hppa__
+#define SIGRTMIN 37
+#else
+#define SIGRTMIN 32
+#endif
+#define SIGRTMAX (_NSIG-1)
+
+/* SA_FLAGS values: */
+#if defined(__alpha__)
+#define SA_ONSTACK 0x00000001
+#define SA_RESTART 0x00000002
+#define SA_NOCLDSTOP 0x00000004
+#define SA_NODEFER 0x00000008
+#define SA_RESETHAND 0x00000010
+#define SA_NOCLDWAIT 0x00000020 /* not supported yet */
+#define SA_SIGINFO 0x00000040
+#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */
+#elif defined(__hppa__)
+#define SA_ONSTACK 0x00000001
+#define SA_RESETHAND 0x00000004
+#define SA_NOCLDSTOP 0x00000008
+#define SA_SIGINFO 0x00000010
+#define SA_NODEFER 0x00000020
+#define SA_RESTART 0x00000040
+#define SA_NOCLDWAIT 0x00000080 /* not supported yet */
+#define _SA_SIGGFAULT 0x00000100 /* HPUX */
+#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */
+#define SA_RESTORER 0x04000000 /* obsolete -- ignored */
+#elif defined (__sparc__)
+#define SV_SSTACK 1 /* This signal handler should use sig-stack */
+#define SV_INTR 2 /* Sig return should not restart system call */
+#define SV_RESET 4 /* Set handler to SIG_DFL upon taken signal */
+#define SV_IGNCHILD 8 /* Do not send SIGCHLD */
+
+#define SA_NOCLDSTOP SV_IGNCHILD
+#define SA_STACK SV_SSTACK
+#define SA_ONSTACK SV_SSTACK
+#define SA_RESTART SV_INTR
+#define SA_RESETHAND SV_RESET
+#define SA_INTERRUPT 0x10
+#define SA_DEFER 0x20
+#define SA_SHIRQ 0x40
+#define SA_NOCLDWAIT 0x100 /* not supported yet */
+#define SA_SIGINFO 0x200
+#else
+#if defined (__mips__)
+#define SA_NOCLDSTOP 0x00000001
+#define SA_SIGINFO 0x00000008
+#define SA_NOCLDWAIT 0x00010000 /* Not supported yet */
+#else
+#define SA_NOCLDSTOP 0x00000001
+#define SA_NOCLDWAIT 0x00000002 /* not supported yet */
+#define SA_SIGINFO 0x00000004
+#endif
+#if defined(__arm__)
+#define SA_THIRTYTWO 0x02000000
+#endif
+#define SA_RESTORER 0x04000000
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#endif
+
+/* ugh, historic Linux legacy, for gpm :-( */
+#define SA_NOMASK SA_NODEFER
+#define SA_ONESHOT SA_RESETHAND
+
+/* sigaltstack controls */
+#define SS_ONSTACK 1
+#define SS_DISABLE 2
+
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+
+#if defined(__alpha__) || defined(__mips__)
+#define SIG_BLOCK 1 /* for blocking signals */
+#define SIG_UNBLOCK 2 /* for unblocking signals */
+#define SIG_SETMASK 3 /* for setting the signal mask */
+#else
+#define SIG_BLOCK 0 /* for blocking signals */
+#define SIG_UNBLOCK 1 /* for unblocking signals */
+#define SIG_SETMASK 2 /* for setting the signal mask */
+#endif
+
+typedef int sig_atomic_t;
typedef void (*sighandler_t)(int);
+#ifdef _BSD_SOURCE
+typedef sighandler_t sig_t;
+#endif
+
+#define SIG_DFL ((sighandler_t)0) /* default signal handling */
+#define SIG_IGN ((sighandler_t)1) /* ignore signal */
+#define SIG_ERR ((sighandler_t)-1) /* error return from signal */
+
+typedef union sigval {
+ int sival_int;
+ void *sival_ptr;
+} sigval_t;
+
+#define SI_MAX_SIZE 128
+#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3)
+
+typedef struct siginfo {
+ int si_signo;
+ int si_errno;
+ int si_code;
+ union {
+ int _pad[SI_PAD_SIZE];
+ /* kill() */
+ struct {
+ pid_t _pid; /* sender's pid */
+ uid_t _uid; /* sender's uid */
+ } _kill;
+ /* POSIX.1b timers */
+ struct {
+ unsigned int _timer1;
+ unsigned int _timer2;
+ } _timer;
+ /* POSIX.1b signals */
+ struct {
+ pid_t _pid; /* sender's pid */
+ uid_t _uid; /* sender's uid */
+ sigval_t _sigval;
+ } _rt;
+ /* SIGCHLD */
+ struct {
+ pid_t _pid; /* which child */
+ uid_t _uid; /* sender's uid */
+ int _status; /* exit code */
+ clock_t _utime;
+ clock_t _stime;
+ } _sigchld;
+ /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
+ struct {
+ void *_addr; /* faulting insn/memory ref. */
+ } _sigfault;
+ /* SIGPOLL */
+ struct {
+ int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
+ int _fd;
+ } _sigpoll;
+ } _sifields;
+} siginfo_t;
+
+/*
+ * How these fields are to be accessed.
+ */
+#define si_pid _sifields._kill._pid
+#define si_uid _sifields._kill._uid
+#define si_status _sifields._sigchld._status
+#define si_utime _sifields._sigchld._utime
+#define si_stime _sifields._sigchld._stime
+#define si_value _sifields._rt._sigval
+#define si_int _sifields._rt._sigval.sival_int
+#define si_ptr _sifields._rt._sigval.sival_ptr
+#define si_addr _sifields._sigfault._addr
+#define si_band _sifields._sigpoll._band
+#define si_fd _sifields._sigpoll._fd
+
+/* Values for `si_code'. Positive values are reserved for kernel-generated
+ signals. */
+enum {
+ SI_ASYNCNL = -6, /* Sent by asynch name lookup completion. */
+# define SI_ASYNCNL SI_ASYNCNL
+ SI_SIGIO, /* Sent by queued SIGIO. */
+# define SI_SIGIO SI_SIGIO
+ SI_ASYNCIO, /* Sent by AIO completion. */
+# define SI_ASYNCIO SI_ASYNCIO
+ SI_MESGQ, /* Sent by real time mesq state change. */
+# define SI_MESGQ SI_MESGQ
+ SI_TIMER, /* Sent by timer expiration. */
+# define SI_TIMER SI_TIMER
+ SI_QUEUE, /* Sent by sigqueue. */
+# define SI_QUEUE SI_QUEUE
+ SI_USER, /* Sent by kill, sigsend, raise. */
+# define SI_USER SI_USER
+ SI_KERNEL = 0x80 /* Send by kernel. */
+#define SI_KERNEL SI_KERNEL
+};
+
+
+/* `si_code' values for SIGILL signal. */
+enum {
+ ILL_ILLOPC = 1, /* Illegal opcode. */
+# define ILL_ILLOPC ILL_ILLOPC
+ ILL_ILLOPN, /* Illegal operand. */
+# define ILL_ILLOPN ILL_ILLOPN
+ ILL_ILLADR, /* Illegal addressing mode. */
+# define ILL_ILLADR ILL_ILLADR
+ ILL_ILLTRP, /* Illegal trap. */
+# define ILL_ILLTRP ILL_ILLTRP
+ ILL_PRVOPC, /* Privileged opcode. */
+# define ILL_PRVOPC ILL_PRVOPC
+ ILL_PRVREG, /* Privileged register. */
+# define ILL_PRVREG ILL_PRVREG
+ ILL_COPROC, /* Coprocessor error. */
+# define ILL_COPROC ILL_COPROC
+ ILL_BADSTK /* Internal stack error. */
+# define ILL_BADSTK ILL_BADSTK
+};
+
+/* `si_code' values for SIGFPE signal. */
+enum {
+ FPE_INTDIV = 1, /* Integer divide by zero. */
+# define FPE_INTDIV FPE_INTDIV
+ FPE_INTOVF, /* Integer overflow. */
+# define FPE_INTOVF FPE_INTOVF
+ FPE_FLTDIV, /* Floating point divide by zero. */
+# define FPE_FLTDIV FPE_FLTDIV
+ FPE_FLTOVF, /* Floating point overflow. */
+# define FPE_FLTOVF FPE_FLTOVF
+ FPE_FLTUND, /* Floating point underflow. */
+# define FPE_FLTUND FPE_FLTUND
+ FPE_FLTRES, /* Floating point inexact result. */
+# define FPE_FLTRES FPE_FLTRES
+ FPE_FLTINV, /* Floating point invalid operation. */
+# define FPE_FLTINV FPE_FLTINV
+ FPE_FLTSUB /* Subscript out of range. */
+# define FPE_FLTSUB FPE_FLTSUB
+};
+
+/* `si_code' values for SIGSEGV signal. */
+enum {
+ SEGV_MAPERR = 1, /* Address not mapped to object. */
+# define SEGV_MAPERR SEGV_MAPERR
+ SEGV_ACCERR /* Invalid permissions for mapped object. */
+# define SEGV_ACCERR SEGV_ACCERR
+};
+
+/* `si_code' values for SIGBUS signal. */
+enum {
+ BUS_ADRALN = 1, /* Invalid address alignment. */
+# define BUS_ADRALN BUS_ADRALN
+ BUS_ADRERR, /* Non-existant physical address. */
+# define BUS_ADRERR BUS_ADRERR
+ BUS_OBJERR /* Object specific hardware error. */
+# define BUS_OBJERR BUS_OBJERR
+};
+
+/* `si_code' values for SIGTRAP signal. */
+enum {
+ TRAP_BRKPT = 1, /* Process breakpoint. */
+# define TRAP_BRKPT TRAP_BRKPT
+ TRAP_TRACE /* Process trace trap. */
+# define TRAP_TRACE TRAP_TRACE
+};
+
+/* `si_code' values for SIGCHLD signal. */
+enum {
+ CLD_EXITED = 1, /* Child has exited. */
+# define CLD_EXITED CLD_EXITED
+ CLD_KILLED, /* Child was killed. */
+# define CLD_KILLED CLD_KILLED
+ CLD_DUMPED, /* Child terminated abnormally. */
+# define CLD_DUMPED CLD_DUMPED
+ CLD_TRAPPED, /* Traced child has trapped. */
+# define CLD_TRAPPED CLD_TRAPPED
+ CLD_STOPPED, /* Child has stopped. */
+# define CLD_STOPPED CLD_STOPPED
+ CLD_CONTINUED /* Stopped child has continued. */
+# define CLD_CONTINUED CLD_CONTINUED
+};
+
+/* `si_code' values for SIGPOLL signal. */
+enum {
+ POLL_IN = 1, /* Data input available. */
+# define POLL_IN POLL_IN
+ POLL_OUT, /* Output buffers available. */
+# define POLL_OUT POLL_OUT
+ POLL_MSG, /* Input message available. */
+# define POLL_MSG POLL_MSG
+ POLL_ERR, /* I/O error. */
+# define POLL_ERR POLL_ERR
+ POLL_PRI, /* High priority input available. */
+# define POLL_PRI POLL_PRI
+ POLL_HUP /* Device disconnected. */
+# define POLL_HUP POLL_HUP
+};
+
+#define _NSIG_WORDS ((_NSIG/sizeof(long))>>3)
+
+typedef struct {
+ unsigned long sig[_NSIG_WORDS];
+} sigset_t;
+
+struct sigaction {
+#if defined(__alpha__)
+ union {
+ sighandler_t _sa_handler;
+ void (*_sa_sigaction)(int, siginfo_t*, void*);
+ } _u;
+ sigset_t sa_mask;
+ unsigned long sa_flags;
+#elif defined(__ia64__) || defined(__hppa__)
+ union {
+ sighandler_t _sa_handler;
+ void (*_sa_sigaction)(int, siginfo_t*, void*);
+ } _u;
+ unsigned long sa_flags;
+ sigset_t sa_mask;
+#elif defined(__mips__)
+ unsigned long sa_flags;
+ union {
+ sighandler_t _sa_handler;
+ void (*_sa_sigaction)(int, siginfo_t*, void*);
+ } _u;
+ sigset_t sa_mask;
+ void (*sa_restorer)(void);
+ int sa_resv[1];
+#else /* arm, i386, ppc, s390, sparc, saprc64, x86_64 */
+ union {
+ sighandler_t _sa_handler;
+ void (*_sa_sigaction)(int, siginfo_t*, void*);
+ } _u;
+ unsigned long sa_flags;
+ void (*sa_restorer)(void);
+ sigset_t sa_mask;
+#endif
+};
+
+#define sa_handler _u._sa_handler
+#define sa_sigaction _u._sa_sigaction
+
+typedef struct sigaltstack {
+#if defined(__mips__)
+ void *ss_sp;
+ size_t ss_size;
+ int ss_flags;
+#else
+ void *ss_sp;
+ int ss_flags;
+ size_t ss_size;
+#endif
+} stack_t;
+
+int sigaltstack(const struct sigaltstack *newstack, struct sigaltstack *oldstack) __THROW;
+
int sigemptyset(sigset_t *set) __THROW;
int sigfillset(sigset_t *set) __THROW;
int sigaddset(sigset_t *set, int signum) __THROW;
int sigdelset(sigset_t *set, int signum) __THROW;
+int sigismember(const sigset_t *set, int signo) __THROW;
+int sigsuspend(const sigset_t *mask) __THROW;
+int sigpending(sigset_t *set) __THROW;
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) __THROW;
+
+
sighandler_t signal(int signum, sighandler_t action);
+
int raise (int sig) __THROW;
+int kill(pid_t pid, int sig) __THROW;
+
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) __THROW;
-int sigaltstack(const struct sigaltstack *newstack, struct sigaltstack *oldstack) __THROW;
-#ifndef SIGCLD
-#define SIGCLD SIGCHLD
-#endif
+int sigtimedwait(const sigset_t *mask, siginfo_t *info, const struct timespec *ts) __THROW;
+int sigqueueinfo(int pid, int sig, siginfo_t *info) __THROW;
+int siginterrupt(int sig, int flag) __THROW;
-extern const char *const sys_siglist[];
+int killpg(int pgrp, int sig) __THROW;
-typedef __sighandler_t sig_t;
+/* 0 is OK ! kernel puts in MAX_THREAD_TIMEOUT :) */
+#define sigwaitinfo(m, i) sigtimedwait((m),(i),0)
-#ifndef NSIG
-#define NSIG _NSIG
-#endif
+extern const char *const sys_siglist[];
#endif
diff --git a/mdk-stage1/dietlibc/include/stdarg-cruft.h b/mdk-stage1/dietlibc/include/stdarg-cruft.h
new file mode 100644
index 000000000..c25973fe8
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/stdarg-cruft.h
@@ -0,0 +1,299 @@
+#if defined(__sparc__) || defined(__alpha__)
+enum {
+ __no_type_class = -1,
+ __void_type_class,
+ __integer_type_class,
+ __char_type_class,
+ __enumeral_type_class,
+ __boolean_type_class,
+ __pointer_type_class,
+ __reference_type_class,
+ __offset_type_class,
+ __real_type_class,
+ __complex_type_class,
+ __function_type_class,
+ __method_type_class,
+ __record_type_class,
+ __union_type_class,
+ __array_type_class,
+ __string_type_class,
+ __set_type_class,
+ __file_type_class,
+ __lang_type_class
+};
+#endif
+
+#if defined(__sparc__)
+
+typedef char* va_list;
+#define va_end(ap) ap=0
+
+#define va_start(AP, LASTARG) \
+ (__builtin_next_arg (LASTARG), AP = (char *) __builtin_saveregs ())
+
+#define __va_rounded_size(TYPE) \
+ (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
+
+/* We don't declare the union member `d' to have type TYPE
+ because that would lose in C++ if TYPE has a constructor. */
+/* We cast to void * and then to TYPE * because this avoids
+ a warning about increasing the alignment requirement.
+ The casts to char * avoid warnings about invalid pointer arithmetic. */
+#define va_arg(pvar,TYPE) \
+__extension__ \
+(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \
+ || (__builtin_classify_type (*(TYPE*) 0) == __real_type_class \
+ && sizeof (TYPE) == 16)) \
+ ? ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE *), \
+ *(TYPE **) (void *) ((char *)(pvar) - __va_rounded_size (TYPE *))) \
+ : __va_rounded_size (TYPE) == 8 \
+ ? ({ union {char __d[sizeof (TYPE)]; int __i[2];} __u; \
+ __u.__i[0] = ((int *) (void *) (pvar))[0]; \
+ __u.__i[1] = ((int *) (void *) (pvar))[1]; \
+ (pvar) = (char *)(pvar) + 8; \
+ (TYPE *) (void *) __u.__d; }) \
+ : ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE), \
+ ((TYPE *) (void *) ((char *)(pvar) - __va_rounded_size (TYPE)))));}))
+
+
+#elif defined(__mips__)
+
+typedef char * va_list;
+
+#ifdef __mips64
+#define __va_rounded_size(__TYPE) \
+ (((sizeof (__TYPE) + 8 - 1) / 8) * 8)
+#else
+#define __va_rounded_size(__TYPE) \
+ (((sizeof (__TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
+#endif
+#ifdef __mips64
+#define __va_reg_size 8
+#else
+#define __va_reg_size 4
+#endif
+
+#define va_start(__AP, __LASTARG) \
+ (__AP = (va_list) __builtin_next_arg (__LASTARG))
+
+#ifdef __mips64
+#ifdef __MIPSEB__
+#define va_arg(__AP, __type) \
+ ((__type *) (void *) (__AP = (char *) \
+ ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \
+ + __va_rounded_size (__type))))[-1]
+#else
+#define va_arg(__AP, __type) \
+ ((__AP = (char *) ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \
+ + __va_rounded_size (__type))), \
+ *(__type *) (void *) (__AP - __va_rounded_size (__type)))
+#endif
+
+#else /* not __mips64 */
+
+#ifdef __MIPSEB__
+/* For big-endian machines. */
+#define va_arg(__AP, __type) \
+ ((__AP = (char *) ((__alignof__ (__type) > 4 \
+ ? ((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8 \
+ : ((__PTRDIFF_TYPE__)__AP + 4 - 1) & -4) \
+ + __va_rounded_size (__type))), \
+ *(__type *) (void *) (__AP - __va_rounded_size (__type)))
+#else
+/* For little-endian machines. */
+#define va_arg(__AP, __type) \
+ ((__type *) (void *) (__AP = (char *) ((__alignof__(__type) > 4 \
+ ? ((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8 \
+ : ((__PTRDIFF_TYPE__)__AP + 4 - 1) & -4) \
+ + __va_rounded_size(__type))))[-1]
+#endif
+#endif
+
+#elif defined(__powerpc__)
+
+typedef struct __va_list_tag {
+ unsigned char gpr; /* index into the array of 8 GPRs stored in the
+ register save area gpr=0 corresponds to r3,
+ gpr=1 to r4, etc. */
+ unsigned char fpr; /* index into the array of 8 FPRs stored in the
+ register save area fpr=0 corresponds to f1,
+ fpr=1 to f2, etc. */
+ char *overflow_arg_area; /* location on stack that holds the next
+ overflow argument */
+ char *reg_save_area; /* where r3:r10 and f1:f8, if saved are stored */
+} va_list[1];
+
+#define __va_overflow(AP) (AP)->overflow_arg_area
+#ifdef __OPTIMIZE__
+extern void __va_arg_type_violation(void) __attribute__((__noreturn__));
+#else
+#define __va_arg_type_violation()
+#endif
+
+typedef struct {
+ long __gp_save[8]; /* save area for GP registers */
+ double __fp_save[8]; /* save area for FP registers */
+} __va_regsave_t;
+
+/* Macros to access the register save area */
+/* We cast to void * and then to TYPE * because this avoids
+ a warning about increasing the alignment requirement. */
+#define __VA_FP_REGSAVE(AP,OFS,TYPE) \
+ ((TYPE *) (void *) (&(((__va_regsave_t *) \
+ (AP)->reg_save_area)->__fp_save[OFS])))
+
+#define __VA_GP_REGSAVE(AP,OFS,TYPE) \
+ ((TYPE *) (void *) (&(((__va_regsave_t *) \
+ (AP)->reg_save_area)->__gp_save[OFS])))
+
+#define __va_start_common(AP, FAKE) \
+ __builtin_memcpy ((AP), __builtin_saveregs (), sizeof(va_list))
+
+#define va_start(AP,LASTARG) \
+ (__builtin_next_arg (LASTARG), __va_start_common (AP, 0))
+
+#ifdef _SOFT_FLOAT
+#define __va_float_p(TYPE) 0
+#else
+#define __va_float_p(TYPE) (__builtin_classify_type(*(TYPE *)0) == 8)
+#endif
+
+#define __va_aggregate_p(TYPE) (__builtin_classify_type(*(TYPE *)0) >= 12)
+#define __va_size(TYPE) ((sizeof(TYPE) + sizeof (long) - 1) / sizeof (long))
+
+#define va_arg(AP,TYPE) \
+__extension__ (*({ \
+ register TYPE *__ptr; \
+ \
+ if (__va_float_p (TYPE) && sizeof (TYPE) < 16) \
+ { \
+ unsigned char __fpr = (AP)->fpr; \
+ if (__fpr < 8) \
+ { \
+ __ptr = __VA_FP_REGSAVE (AP, __fpr, TYPE); \
+ (AP)->fpr = __fpr + 1; \
+ } \
+ else if (sizeof (TYPE) == 8) \
+ { \
+ unsigned long __addr = (unsigned long) (__va_overflow (AP)); \
+ __ptr = (TYPE *)((__addr + 7) & -8); \
+ __va_overflow (AP) = (char *)(__ptr + 1); \
+ } \
+ else \
+ { \
+ /* float is promoted to double. */ \
+ __va_arg_type_violation (); \
+ } \
+ } \
+ \
+ /* Aggregates and long doubles are passed by reference. */ \
+ else if (__va_aggregate_p (TYPE) || __va_float_p (TYPE)) \
+ { \
+ unsigned char __gpr = (AP)->gpr; \
+ if (__gpr < 8) \
+ { \
+ __ptr = * __VA_GP_REGSAVE (AP, __gpr, TYPE *); \
+ (AP)->gpr = __gpr + 1; \
+ } \
+ else \
+ { \
+ TYPE **__pptr = (TYPE **) (__va_overflow (AP)); \
+ __ptr = * __pptr; \
+ __va_overflow (AP) = (char *) (__pptr + 1); \
+ } \
+ } \
+ \
+ /* Only integrals remaining. */ \
+ else \
+ { \
+ /* longlong is aligned. */ \
+ if (sizeof (TYPE) == 8) \
+ { \
+ unsigned char __gpr = (AP)->gpr; \
+ if (__gpr < 7) \
+ { \
+ __gpr += __gpr & 1; \
+ __ptr = __VA_GP_REGSAVE (AP, __gpr, TYPE); \
+ (AP)->gpr = __gpr + 2; \
+ } \
+ else \
+ { \
+ unsigned long __addr = (unsigned long) (__va_overflow (AP)); \
+ __ptr = (TYPE *)((__addr + 7) & -8); \
+ (AP)->gpr = 8; \
+ __va_overflow (AP) = (char *)(__ptr + 1); \
+ } \
+ } \
+ else if (sizeof (TYPE) == 4) \
+ { \
+ unsigned char __gpr = (AP)->gpr; \
+ if (__gpr < 8) \
+ { \
+ __ptr = __VA_GP_REGSAVE (AP, __gpr, TYPE); \
+ (AP)->gpr = __gpr + 1; \
+ } \
+ else \
+ { \
+ __ptr = (TYPE *) __va_overflow (AP); \
+ __va_overflow (AP) = (char *)(__ptr + 1); \
+ } \
+ } \
+ else \
+ { \
+ /* Everything else was promoted to int. */ \
+ __va_arg_type_violation (); \
+ } \
+ } \
+ __ptr; \
+}))
+
+#define va_end(AP) ((void)0)
+
+/* Copy va_list into another variable of this type. */
+#define __va_copy(dest, src) *(dest) = *(src)
+
+#elif defined(__alpha__)
+
+typedef struct {
+ char *__base; /* Pointer to first integer register. */
+ int __offset; /* Byte offset of args so far. */
+} va_list;
+
+#define va_start(pvar, firstarg) \
+ (__builtin_next_arg (firstarg), \
+ (pvar) = *(va_list *) __builtin_saveregs ())
+#define va_end(__va) ((void) 0)
+
+#define __va_tsize(__type) \
+ (((sizeof (__type) + __extension__ sizeof (long long) - 1) \
+ / __extension__ sizeof (long long)) * __extension__ sizeof (long long))
+
+#define va_arg(__va, __type) \
+(*(((__va).__offset += __va_tsize (__type)), \
+ (__type *)(void *)((__va).__base + (__va).__offset \
+ - (((__builtin_classify_type (* (__type *) 0) \
+ == __real_type_class) && (__va).__offset <= (6 * 8)) \
+ ? (6 * 8) + 8 : __va_tsize (__type)))))
+
+#else /* !__sparc__ && !__powerpc__ && !__mips__ && !__alpha__*/
+
+typedef char* va_list;
+
+/* this only works when everything is passed on the stack (i.e. x86) */
+#if __WORDSIZE == 64
+#define va_start(ap,argn) ap=((char*)&argn)+8
+#else
+#define va_start(ap,argn) ap=((char*)&argn)+4
+#endif
+#define va_arg(ap,type) (ap+=sizeof(type), *(type*)((void*)ap-sizeof(type)))
+
+#endif
+
+#ifndef __va_copy
+#define __va_copy(x,y) x=y
+#endif
+
+#ifndef va_end
+#define va_end(ap) ((void)0)
+#endif
+
diff --git a/mdk-stage1/dietlibc/include/stdarg.h b/mdk-stage1/dietlibc/include/stdarg.h
new file mode 100644
index 000000000..3a21bdb56
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/stdarg.h
@@ -0,0 +1,24 @@
+#ifndef _STDARG_H
+#define _STDARG_H
+
+#include <endian.h>
+
+#if (__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 96))
+
+typedef __builtin_va_list va_list;
+#define va_start(v,l) __builtin_stdarg_start((v),l)
+#define va_end __builtin_va_end
+#define va_arg __builtin_va_arg
+#define __va_copy(d,s) __builtin_va_copy((d),(s))
+
+#endif
+
+#ifndef va_end
+#include <stdarg-cruft.h>
+#endif
+
+#if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L
+#define va_copy(d,s) __va_copy(d,s)
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/stddef.h b/mdk-stage1/dietlibc/include/stddef.h
new file mode 100644
index 000000000..cdf54ec1e
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/stddef.h
@@ -0,0 +1,23 @@
+#ifndef _STDDEF_H
+#define _STDDEF_H
+
+/* ugh. This is normally provided by gcc. */
+
+#ifdef __GNUC__
+typedef __PTRDIFF_TYPE__ ptrdiff_t;
+typedef __SIZE_TYPE__ size_t;
+typedef __WCHAR_TYPE__ wchar_t;
+#else
+typedef signed long ptrdiff_t;
+typedef unsigned long size_t;
+typedef int wchar_t;
+#endif
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+#undef offsetof
+#define offsetof(type,member) ((size_t) &((type*)0)->member)
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/stdint.h b/mdk-stage1/dietlibc/include/stdint.h
index d287e6794..bbc7ddf0c 100644
--- a/mdk-stage1/dietlibc/include/stdint.h
+++ b/mdk-stage1/dietlibc/include/stdint.h
@@ -1,6 +1,30 @@
#ifndef _STDINT_H
#define _STDINT_H
-#include <sys/types.h>
+#include <inttypes.h>
+
+typedef int8_t int_least8_t;
+typedef int16_t int_least16_t;
+typedef int32_t int_least32_t;
+typedef uint8_t uint_least8_t;
+typedef uint16_t uint_least16_t;
+typedef uint32_t uint_least32_t;
+
+#ifndef __STRICT_ANSI__
+typedef int64_t int_least64_t;
+typedef uint64_t uint_least64_t;
+#endif
+
+typedef signed char int_fast8_t;
+typedef signed long int int_fast16_t;
+typedef signed long int int_fast32_t;
+typedef signed long long int int_fast64_t;
+
+typedef unsigned char uint_fast8_t;
+typedef unsigned long int uint_fast16_t;
+typedef unsigned long int uint_fast32_t;
+typedef unsigned long long int uint_fast64_t;
+
+#include <endian.h>
#endif
diff --git a/mdk-stage1/dietlibc/include/stdio.h b/mdk-stage1/dietlibc/include/stdio.h
index 92d9dc0cb..04783c3b8 100644
--- a/mdk-stage1/dietlibc/include/stdio.h
+++ b/mdk-stage1/dietlibc/include/stdio.h
@@ -3,6 +3,7 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <sys/stat.h>
typedef struct __stdio_file FILE;
@@ -10,28 +11,32 @@ FILE *fopen (const char *path, const char *mode) __THROW;
FILE *fdopen (int fildes, const char *mode) __THROW;
FILE *freopen (const char *path, const char *mode, FILE *stream) __THROW;
-int printf(const char *format, ...) __THROW;
-int fprintf(FILE *stream, const char *format, ...) __THROW;
-int sprintf(char *str, const char *format, ...) __THROW;
-int snprintf(char *str, size_t size, const char *format, ...) __THROW;
-int asprintf(char **ptr, const char* format, ...) __THROW;
+int printf(const char *format, ...) __THROW __attribute__((format(printf,1,2)));
+int fprintf(FILE *stream, const char *format, ...) __THROW __attribute__((format(printf,2,3)));
+int sprintf(char *str, const char *format, ...) __THROW __attribute__((format(printf,2,3)));
+int snprintf(char *str, size_t size, const char *format, ...) __THROW __attribute__((format(printf,3,4)));
+int asprintf(char **ptr, const char* format, ...) __THROW __attribute_malloc__ __attribute__((format(printf,2,3)));
-int scanf( const char *format, ...) __THROW;
-int fscanf( FILE *stream, const char *format, ...) __THROW;
-int sscanf( const char *str, const char *format, ...) __THROW;
+int scanf(const char *format, ...) __THROW __attribute__((format(scanf,1,2)));
+int fscanf(FILE *stream, const char *format, ...) __THROW __attribute__((format(scanf,2,3)));
+int sscanf(const char *str, const char *format, ...) __THROW __attribute__((format(scanf,2,3)));
#include <stdarg.h>
-int vprintf(const char *format, va_list ap) __THROW;
-int vfprintf(FILE *stream, const char *format, va_list ap) __THROW;
-int vsprintf(char *str, const char *format, va_list ap) __THROW;
-int vsnprintf(char *str, size_t size, const char *format, va_list ap) __THROW;
+int vprintf(const char *format, va_list ap) __THROW __attribute__((format(printf,1,0)));
+int vfprintf(FILE *stream, const char *format, va_list ap) __THROW __attribute__((format(printf,2,0)));
+int vsprintf(char *str, const char *format, va_list ap) __THROW __attribute__((format(printf,2,0)));
+int vsnprintf(char *str, size_t size, const char *format, va_list ap) __THROW __attribute__((format(printf,3,0)));
-int vscanf( const char *format, va_list ap) __THROW;
-int vsscanf( const char *str, const char *format, va_list ap) __THROW;
-int vfscanf( FILE *stream, const char *format, va_list ap) __THROW;
+int fdprintf(int fd, const char *format, ...) __THROW __attribute__((format(printf,2,3)));
+int vfdprintf(int fd, const char *format, va_list ap) __THROW __attribute__((format(printf,2,0)));
+
+int vscanf(const char *format, va_list ap) __THROW __attribute__((format(scanf,1,0)));
+int vsscanf(const char *str, const char *format, va_list ap) __THROW __attribute__((format(scanf,2,0)));
+int vfscanf(FILE *stream, const char *format, va_list ap) __THROW __attribute__((format(scanf,2,0)));
int fgetc(FILE *stream) __THROW;
+int fgetc_unlocked(FILE *stream) __THROW;
char *fgets(char *s, int size, FILE *stream) __THROW;
int getc(FILE *stream) __THROW;
int getchar(void) __THROW;
@@ -39,34 +44,53 @@ char *gets(char *s) __THROW;
int ungetc(int c, FILE *stream) __THROW;
int fputc(int c, FILE *stream) __THROW;
+int fputc_unlocked(int c, FILE *stream) __THROW;
int fputs(const char *s, FILE *stream) __THROW;
+int putchar(int c) __THROW;
+
#define putc(c,stream) fputc(c,stream)
#define putchar(c) fputc(c,stdout)
#define getchar() fgetc(stdin)
#define getc(stream) fgetc(stream)
+#define getc_unlocked(stream) fgetc_unlocked(stream)
int puts(const char *s) __THROW;
-long fseek( FILE *stream, long offset, int whence) __THROW;
-long ftell( FILE *stream) __THROW;
-void rewind( FILE *stream) __THROW;
-int fgetpos( FILE *stream, fpos_t *pos) __THROW;
-int fsetpos( FILE *stream, fpos_t *pos) __THROW;
+int fseek(FILE *stream, long offset, int whence) __THROW;
+long ftell(FILE *stream) __THROW;
+int fseeko(FILE *stream, off_t offset, int whence) __THROW;
+off_t ftello(FILE *stream) __THROW;
-size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW;
+#ifndef __NO_STAT64
+int fseeko64(FILE *stream, loff_t offset, int whence) __THROW;
+loff_t ftello64(FILE *stream) __THROW;
-size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW;
+#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
+#define off_t loff_t
+#define fseeko(foo,bar,baz) fseeko64(foo,bar,baz)
+#define ftello(foo) ftello64(foo)
+#endif
+
+#endif
+
+void rewind(FILE *stream) __THROW;
+int fgetpos(FILE *stream, fpos_t *pos) __THROW;
+int fsetpos(FILE *stream, fpos_t *pos) __THROW;
+
+size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW;
+
+size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW;
int fflush(FILE *stream) __THROW;
int fclose(FILE *stream) __THROW;
-void clearerr(FILE *stream) __THROW;
int feof (FILE *stream) __THROW;
-int ferror( FILE *stream) __THROW;
-int fileno( FILE *stream) __THROW;
+int ferror(FILE *stream) __THROW;
+int fileno(FILE *stream) __THROW;
+void clearerr(FILE *stream) __THROW;
int remove(const char *pathname) __THROW;
@@ -74,7 +98,7 @@ void perror(const char *s) __THROW;
extern FILE *stdin, *stdout, *stderr;
-#define EOF (int)(-1)
+#define EOF (-1)
#define BUFSIZ 128
@@ -91,7 +115,33 @@ int setvbuf(FILE *stream, char *buf, int mode , size_t size) __THROW;
FILE *popen(const char *command, const char *type) __THROW;
int pclose(FILE *stream) __THROW;
-#define getc_unlocked(stream) getc(stream)
-#define putc_unlocked(c,stream) putc(c,stream)
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+#endif
+
+#define L_tmpnam 128
+#define P_tmpdir "/tmp"
+char* tmpnam(char *s) __THROW; /* DO NOT USE!!! Use mkstemp instead! */
+char* tempnam(char* dir,char* _template); /* dito */
+FILE* tmpfile(void) __THROW;
+
+#define FILENAME_MAX 4095
+#define FOPEN_MAX 16
+
+#ifdef _POSIX_SOURCE
+#define L_ctermid 9
+#define L_cuserid 9
+#endif
+
+void flockfile(FILE* f) __THROW;
+void funlockfile(FILE* f) __THROW;
+
+#ifdef _GNU_SOURCE
+ssize_t getline(char **lineptr, size_t *n, FILE *stream);
+ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
+#define getline(lineptr,n,stream) getdelim(lineptr,n,'\n',stream)
+#endif
#endif
diff --git a/mdk-stage1/dietlibc/include/stdlib.h b/mdk-stage1/dietlibc/include/stdlib.h
index 6a13a48ff..5824a6ffa 100644
--- a/mdk-stage1/dietlibc/include/stdlib.h
+++ b/mdk-stage1/dietlibc/include/stdlib.h
@@ -1,32 +1,38 @@
#ifndef _STDLIB_H
#define _STDLIB_H
+#ifndef __ASSEMBLER__
+
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <alloca.h>
-#define __LIBC_DIETLIBC__
-
-void *calloc(size_t nmemb, size_t size) __THROW;
-void *malloc(size_t size) __THROW;
+void *calloc(size_t nmemb, size_t size) __attribute_malloc__ __THROW;
+void *malloc(size_t size) __attribute_malloc__ __THROW;
void free(void *ptr) __THROW;
-void *realloc(void *ptr, size_t size) __THROW;
+void *realloc(void *ptr, size_t size) __attribute_malloc__ __THROW;
char *getenv(const char *name) __THROW __pure__;
int putenv(const char *string) __THROW;
int setenv(const char *name, const char *value, int overwrite) __THROW;
void unsetenv(const char *name) __THROW;
+int system (const char * string) __THROW;
int atexit(void (*function)(void)) __THROW;
+float strtof(const char *nptr, char **endptr) __THROW;
double strtod(const char *nptr, char **endptr) __THROW;
+long double strtold(const char *nptr, char **endptr) __THROW;
long int strtol(const char *nptr, char **endptr, int base) __THROW;
unsigned long int strtoul(const char *nptr, char **endptr, int base) __THROW;
-int __ltostr(char *s, int size, unsigned long i, int base, char UpCase) __THROW;
-#ifdef __GNUC__
-long long int strtoll(const char *nptr, char **endptr, int base) __THROW;
-unsigned long long int strtoull(const char *nptr, char **endptr, int base) __THROW;
-int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase) __THROW;
+extern int __ltostr(char *s, unsigned int size, unsigned long i, unsigned int base, int UpCase) __THROW;
+extern int __dtostr(double d,char *buf,unsigned int maxlen,unsigned int prec,unsigned int prec2) __THROW;
+
+#ifndef __STRICT_ANSI__
+__extension__ long long int strtoll(const char *nptr, char **endptr, int base) __THROW;
+__extension__ unsigned long long int strtoull(const char *nptr, char **endptr, int base) __THROW;
+__extension__ int __lltostr(char *s, unsigned int size, unsigned long long i, unsigned int base, int UpCase) __THROW;
#endif
int atoi(const char *nptr) __THROW;
@@ -36,32 +42,59 @@ double atof(const char *nptr) __THROW;
void exit(int status) __THROW __attribute__((noreturn));
void abort(void) __THROW;
-/* warning: the rand() implementation of the diet libc really sucks. */
-#define RAND_MAX 32767
-
extern int rand(void) __THROW;
+extern int rand_r(unsigned int *seed) __THROW;
extern void srand(unsigned int seed) __THROW;
+#ifdef _BSD_SOURCE
+extern int random(void) __THROW;
+extern void srandom(unsigned int seed) __THROW;
+#endif
+
+typedef unsigned short randbuf[3];
+double drand48(void) __THROW;
+long lrand48(void) __THROW;
+long mrand48(void) __THROW;
+void srand48(long seed) __THROW;
+unsigned short *seed48(randbuf buf) __THROW;
+void lcong48(unsigned short param[7]) __THROW;
+long jrand48(randbuf buf) __THROW;
+long nrand48(randbuf buf) __THROW;
+double erand48(randbuf buf) __THROW;
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) __THROW;
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) __THROW;
extern char **environ;
-#define EXIT_SUCCESS 0
-#define EXIT_FAILURE 1
-
/* now this function is the greatest bullshit I have ever seen.
* The ISO people must be out of their minds. */
typedef struct { int quot,rem; } div_t;
div_t div(int numer, int denom) __THROW __attribute__((const));
-void *alloca(size_t size) __THROW; /* gcc built-in */
-
char *realpath(const char *path, char *resolved_path) __THROW;
-int abs(int j) __THROW;
+int mkstemp(char *_template);
+char* mkdtemp(char *_template);
+
+char* mktemp(char *_template);
+
+int abs(int i) __THROW __attribute__((const));
+long int labs(long int i) __THROW __attribute__((const));
+__extension__ long long int llabs(long long int i) __THROW __attribute__((const));
+
+#ifdef _XOPEN_SOURCE
+int grantpt (int fd) __THROW;
+int unlockpt (int fd) __THROW;
+char *ptsname (int fd) __THROW;
+#endif
+
+#endif
+
+#define EXIT_FAILURE 1
+#define EXIT_SUCCESS 0
+
+#define RAND_MAX ((1<<31) -2)
-long int random(void) __THROW;
-void srandom(unsigned int seed) __THROW;
+#define MB_CUR_MAX 1
#endif
diff --git a/mdk-stage1/dietlibc/include/string.h b/mdk-stage1/dietlibc/include/string.h
index 1ef78ae54..bc81f2ac3 100644
--- a/mdk-stage1/dietlibc/include/string.h
+++ b/mdk-stage1/dietlibc/include/string.h
@@ -5,53 +5,78 @@
#include <sys/types.h>
char *strcpy(char *dest, const char *src) __THROW;
-char *strncpy(char *dest, const char *src, size_t n) __THROW;
void *memccpy(void *dest, const void *src, int c, size_t n) __THROW;
-void *memcpy(void *dest, const void *src, size_t n) __THROW;
void *memmove(void *dest, const void *src, size_t n) __THROW;
int memccmp(const void *s1, const void *s2, int c, size_t n) __THROW __pure__;
+
+/* gcc unfortunately has some internal prototypes that are not compliant
+ * to the single unix specification and if we define the correct
+ * prototypes here, gcc emits warnings. */
+#if __GNUC__ > 2 || defined(__mips__) || defined(__alpha__) || defined(__arm__) || defined(__x86_64__)
+void* memset(void *s, int c, size_t n) __THROW;
int memcmp(const void *s1, const void *s2, size_t n) __THROW __pure__;
-int strcmp(const char *s1, const char *s2) __THROW __pure__;
+void* memcpy(void *dest, const void *src, size_t n) __THROW;
+#endif
+
+#if __GNUC__ < 3 || defined(__x86_64__)
+/* gcc 3 unfortunately has internal prototypes for these functions that
+ * differ from ours. Unfortunately, gcc will complain whether we have
+ * the correct prototypes or whether we don't have prototypes :-( */
+char *strncpy(char *dest, const char *src, size_t n) __THROW;
int strncmp(const char *s1, const char *s2, size_t n) __THROW __pure__;
+char *strncat(char *dest, const char *src, size_t n) __THROW;
+#endif
-int strcasecmp(const char *s1, const char *s2) __THROW __pure__;
-int strncasecmp(const char *s1, const char *s2, size_t n) __THROW __pure__;
+int strcmp(const char *s1, const char *s2) __THROW __pure__;
size_t strlen(const char *s) __THROW __pure__;
char *strstr(const char *haystack, const char *needle) __THROW __pure__;
-char *strdup(const char *s) __THROW;
+char *strdup(const char *s) __attribute_malloc__ __THROW;
char *strchr(const char *s, int c) __THROW __pure__;
char *strrchr(const char *s, int c) __THROW __pure__;
char *strcat(char *dest, const char *src) __THROW;
-char *strncat(char *dest, const char *src, size_t n) __THROW;
-size_t strspn(const char *s, const char *accept) __THROW;
+size_t strspn(const char *s, const char *_accept) __THROW;
size_t strcspn(const char *s, const char *reject) __THROW;
-char *strpbrk(const char *s, const char *accept) __THROW;
+char *strpbrk(const char *s, const char *_accept) __THROW;
char *strsep(char **stringp, const char *delim) __THROW;
-void* memset(void *s, int c, size_t n) __THROW;
-
-#undef NULL
-#define NULL (void*)0
-
-#define bzero(s,n) memset(s,0,n)
-#define bcopy(src,dest,n) memmove(dest,src,n)
-#define bcmp(a,b,n) memcmp(a,b,n)
+void* memchr(const void *s, int c, size_t n) __THROW __pure__;
+#ifdef _GNU_SOURCE
+void* memrchr(const void *s, int c, size_t n) __THROW __pure__;
+#endif
+/* I would like to make this const, but Paul Jarc points out it has to
+ * be char* :-( */
char *strerror(int errnum) __THROW;
-char *strsignal(int signum) __THROW;
+/* work around b0rken GNU crapware like tar 1.13.19 */
+#define strerror strerror
+
+#ifdef _GNU_SOURCE
+const char *strsignal(int signum) __THROW;
+void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) __THROW;
+#endif
char *strtok(char *s, const char *delim) __THROW;
char *strtok_r(char *s, const char *delim, char **ptrptr) __THROW;
-int ffs(int i) __THROW __attribute__((__const__));
+size_t strlcpy(char *dst, const char *src, size_t size) __THROW;
+size_t strlcat(char *dst, const char *src, size_t size) __THROW;
+
+int strcoll(const char *s1, const char *s2) __THROW;
+size_t strxfrm(char *dest, const char *src, size_t n) __THROW;
+
+#ifdef _BSD_SOURCE
+#include <strings.h>
+#endif
+
+char *stpcpy(char *dest, const char *src);
#endif
diff --git a/mdk-stage1/dietlibc/include/strings.h b/mdk-stage1/dietlibc/include/strings.h
index ec947a9b9..fd2616465 100644
--- a/mdk-stage1/dietlibc/include/strings.h
+++ b/mdk-stage1/dietlibc/include/strings.h
@@ -1,2 +1,23 @@
-#warning "your code included obsolescent <strings.h>. Please change that to <string.h>!"
-#include <string.h>
+#ifndef _STRINGS_H
+#define _STRINGS_H
+
+#include <stddef.h>
+#include <sys/cdefs.h>
+
+int strcasecmp(const char *s1, const char *s2) __THROW __pure__;
+int strncasecmp(const char *s1, const char *s2, size_t n) __THROW __pure__;
+int ffs(int i) __THROW __attribute__((__const__));
+
+int bcmp(const void *, const void *, size_t) __THROW __pure__;
+void bcopy(const void *, void *, size_t) __THROW;
+void bzero(void *, size_t) __THROW;
+char *index(const char *, int) __THROW __pure__;
+char *rindex(const char *, int) __THROW __pure__;
+
+#define bzero(s,n) memset(s,0,n)
+#define bcopy(src,dest,n) memmove(dest,src,n)
+#define bcmp(a,b,n) memcmp(a,b,n)
+#define index(a,b) strchr(a,b)
+#define rindex(a,b) strrchr(a,b)
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/alpha-ioctl.h b/mdk-stage1/dietlibc/include/sys/alpha-ioctl.h
new file mode 100644
index 000000000..f1bde3bbb
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/alpha-ioctl.h
@@ -0,0 +1,168 @@
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+#define _IOC_SIZEBITS 13
+#define _IOC_DIRBITS 3
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit.
+ * And this turns out useful to catch old ioctl numbers in header
+ * files for us.
+ */
+#define _IOC_NONE 1U
+#define _IOC_READ 2U
+#define _IOC_WRITE 4U
+
+#define _IOC(dir,type,nr,size) \
+ ((unsigned int) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT)))
+
+/* used to create numbers */
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode them.. */
+#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the drivers/sound files... */
+
+#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
+
+#define FIOCLEX _IO('f', 1)
+#define FIONCLEX _IO('f', 2)
+#define FIOASYNC _IOW('f', 125, int)
+#define FIONBIO _IOW('f', 126, int)
+#define FIONREAD _IOR('f', 127, int)
+#define TIOCINQ FIONREAD
+#define FIOQSIZE _IOR('f', 128, loff_t)
+
+#define TIOCGETP _IOR('t', 8, struct sgttyb)
+#define TIOCSETP _IOW('t', 9, struct sgttyb)
+#define TIOCSETN _IOW('t', 10, struct sgttyb) /* TIOCSETP wo flush */
+
+#define TIOCSETC _IOW('t', 17, struct tchars)
+#define TIOCGETC _IOR('t', 18, struct tchars)
+#define TCGETS _IOR('t', 19, struct termios)
+#define TCSETS _IOW('t', 20, struct termios)
+#define TCSETSW _IOW('t', 21, struct termios)
+#define TCSETSF _IOW('t', 22, struct termios)
+
+#define TCGETA _IOR('t', 23, struct termio)
+#define TCSETA _IOW('t', 24, struct termio)
+#define TCSETAW _IOW('t', 25, struct termio)
+#define TCSETAF _IOW('t', 28, struct termio)
+
+#define TCSBRK _IO('t', 29)
+#define TCXONC _IO('t', 30)
+#define TCFLSH _IO('t', 31)
+
+#define TIOCSWINSZ _IOW('t', 103, struct winsize)
+#define TIOCGWINSZ _IOR('t', 104, struct winsize)
+#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
+#define TIOCSTOP _IO('t', 111) /* stop output, like ^S */
+#define TIOCOUTQ _IOR('t', 115, int) /* output queue size */
+
+#define TIOCGLTC _IOR('t', 116, struct ltchars)
+#define TIOCSLTC _IOW('t', 117, struct ltchars)
+#define TIOCSPGRP _IOW('t', 118, int)
+#define TIOCGPGRP _IOR('t', 119, int)
+
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+
+#define TIOCSTI 0x5412
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+# define TIOCM_LE 0x001
+# define TIOCM_DTR 0x002
+# define TIOCM_RTS 0x004
+# define TIOCM_ST 0x008
+# define TIOCM_SR 0x010
+# define TIOCM_CTS 0x020
+# define TIOCM_CAR 0x040
+# define TIOCM_RNG 0x080
+# define TIOCM_DSR 0x100
+# define TIOCM_CD TIOCM_CAR
+# define TIOCM_RI TIOCM_RNG
+# define TIOCM_OUT1 0x2000
+# define TIOCM_OUT2 0x4000
+# define TIOCM_LOOP 0x8000
+
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+# define TIOCPKT_DATA 0
+# define TIOCPKT_FLUSHREAD 1
+# define TIOCPKT_FLUSHWRITE 2
+# define TIOCPKT_STOP 4
+# define TIOCPKT_START 8
+# define TIOCPKT_NOSTOP 16
+# define TIOCPKT_DOSTOP 32
+
+
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
+#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */
+#define TIOCSBRK 0x5427 /* BSD compatibility */
+#define TIOCCBRK 0x5428 /* BSD compatibility */
+#define TIOCGSID 0x5429 /* Return the session ID of FD */
+#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
+
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
+#define TIOCSERGETLSR 0x5459 /* Get line status register */
+ /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
+# define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
+#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
+#define TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */
+#define TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */
+
+/* Socket-level I/O control calls. */
+
+#define FIOGETOWN _IOR('f', 123, int)
+#define FIOSETOWN _IOW('f', 124, int)
+
+#define SIOCATMARK _IOR('s', 7, int)
+#define SIOCSPGRP _IOW('s', 8, pid_t)
+#define SIOCGPGRP _IOR('s', 9, pid_t)
+
+#define SIOCGSTAMP 0x8906 /* Get stamp - linux-specific */
diff --git a/mdk-stage1/dietlibc/include/sys/arm-ioctl.h b/mdk-stage1/dietlibc/include/sys/arm-ioctl.h
new file mode 100644
index 000000000..ab8b844a5
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/arm-ioctl.h
@@ -0,0 +1,149 @@
+
+/* ioctl command encoding: 32 bits total, command in lower 16 bits,
+ * size of the parameter structure in the lower 14 bits of the
+ * upper 16 bits.
+ * Encoding the size of the parameter structure in the ioctl request
+ * is useful for catching programs compiled with old versions
+ * and to avoid overwriting user space outside the user buffer area.
+ * The highest 2 bits are reserved for indicating the ``access mode''.
+ * NOTE: This limits the max parameter size to 16kB -1 !
+ */
+
+/*
+ * The following is for compatibility across the various Linux
+ * platforms. The i386 ioctl numbering scheme doesn't really enforce
+ * a type field. De facto, however, the top 8 bits of the lower 16
+ * bits are indeed used as a type field, so we might just as well make
+ * this explicit here. Please be sure to use the decoding macros
+ * below from now on.
+ */
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+#define _IOC_SIZEBITS 14
+#define _IOC_DIRBITS 2
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits.
+ */
+#define _IOC_NONE 0U
+#define _IOC_WRITE 1U
+#define _IOC_READ 2U
+
+#define _IOC(dir,type,nr,size) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
+/* used to create numbers */
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode ioctl numbers.. */
+#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the drivers/sound files... */
+
+#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
+
+/* 0x54 is just a magic number to make these relatively unique ('T') */
+
+#define TCGETS 0x5401
+#define TCSETS 0x5402
+#define TCSETSW 0x5403
+#define TCSETSF 0x5404
+#define TCGETA 0x5405
+#define TCSETA 0x5406
+#define TCSETAW 0x5407
+#define TCSETAF 0x5408
+#define TCSBRK 0x5409
+#define TCXONC 0x540A
+#define TCFLSH 0x540B
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+#define TIOCGPGRP 0x540F
+#define TIOCSPGRP 0x5410
+#define TIOCOUTQ 0x5411
+#define TIOCSTI 0x5412
+#define TIOCGWINSZ 0x5413
+#define TIOCSWINSZ 0x5414
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define FIONREAD 0x541B
+#define TIOCINQ FIONREAD
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+#define FIONBIO 0x5421
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
+#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */
+#define TIOCSBRK 0x5427 /* BSD compatibility */
+#define TIOCCBRK 0x5428 /* BSD compatibility */
+#define TIOCGSID 0x5429 /* Return the session ID of FD */
+#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
+
+#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */
+#define FIOCLEX 0x5451
+#define FIOASYNC 0x5452
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
+#define TIOCSERGETLSR 0x5459 /* Get line status register */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
+#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
+#define FIOQSIZE 0x545E
+
+/* Used for packet mode */
+#define TIOCPKT_DATA 0
+#define TIOCPKT_FLUSHREAD 1
+#define TIOCPKT_FLUSHWRITE 2
+#define TIOCPKT_STOP 4
+#define TIOCPKT_START 8
+#define TIOCPKT_NOSTOP 16
+#define TIOCPKT_DOSTOP 32
+
+#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
+
+/* Socket-level I/O control calls. */
+#define FIOSETOWN 0x8901
+#define SIOCSPGRP 0x8902
+#define FIOGETOWN 0x8903
+#define SIOCGPGRP 0x8904
+#define SIOCATMARK 0x8905
+#define SIOCGSTAMP 0x8906 /* Get stamp */
diff --git a/mdk-stage1/dietlibc/include/sys/cdefs.h b/mdk-stage1/dietlibc/include/sys/cdefs.h
index 895bb74b8..45d3e50d6 100644
--- a/mdk-stage1/dietlibc/include/sys/cdefs.h
+++ b/mdk-stage1/dietlibc/include/sys/cdefs.h
@@ -1,10 +1,7 @@
#ifndef _SYS_CDEFS_H
#define _SYS_CDEFS_H
-#define __dietlibc__
-
#ifndef __cplusplus
-#define throw ()
#define __THROW
#define __BEGIN_DECLS
#define __END_DECLS
@@ -16,21 +13,43 @@
#ifndef __GNUC__
#define __attribute__(xyz)
+#define __extension__
#endif
-#define __pure__
-#ifdef __GNUC__
#if (__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 96))
-#undef __pure__
#define __pure__ __attribute__ ((__pure__))
+#else
+#define __pure__
#endif
#if (__GNUC__ == 2) && (__GNUC_MINOR__ < 95)
#define __restrict__
#endif
+#ifndef __STRICT_ANSI__
+#if __GNUC__ < 3
+#define __builtin_expect(foo,bar) (foo)
+#define expect(foo,bar) (foo)
+#else
+#define expect(foo,bar) __builtin_expect(foo,bar)
+#define __attribute_malloc__ __attribute__((malloc))
+#endif
+#endif
+
+#ifndef __attribute_malloc__
+#define __attribute_malloc__
#endif
#define __P(x) x
+#define __ptr_t void*
+
+#ifdef __STRICT_ANSI__
+#define inline
+#endif
+
+#ifndef __i386__
+#define regparm(x)
+#endif
+
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/epoll.h b/mdk-stage1/dietlibc/include/sys/epoll.h
new file mode 100644
index 000000000..d65d5465f
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/epoll.h
@@ -0,0 +1,60 @@
+#ifndef _SYS_EPOLL_H
+#define _SYS_EPOLL_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/poll.h>
+
+/* Valid opcodes ( "op" parameter ) to issue to epoll_ctl() */
+#define EPOLL_CTL_ADD 1 /* Add a file decriptor to the interface */
+#define EPOLL_CTL_DEL 2 /* Remove a file decriptor from the interface */
+#define EPOLL_CTL_MOD 3 /* Change file decriptor epoll_event structure */
+
+enum EPOLL_EVENTS {
+ EPOLLIN = 0x001,
+#define EPOLLIN EPOLLIN
+ EPOLLPRI = 0x002,
+#define EPOLLPRI EPOLLPRI
+ EPOLLOUT = 0x004,
+#define EPOLLOUT EPOLLOUT
+
+#ifdef __USE_XOPEN
+ EPOLLRDNORM = 0x040,
+#define EPOLLRDNORM EPOLLRDNORM
+ EPOLLRDBAND = 0x080,
+#define EPOLLRDBAND EPOLLRDBAND
+ EPOLLWRNORM = 0x100,
+#define EPOLLWRNORM EPOLLWRNORM
+ EPOLLWRBAND = 0x200,
+#define EPOLLWRBAND EPOLLWRBAND
+#endif /* #ifdef __USE_XOPEN */
+
+#ifdef __USE_GNU
+ EPOLLMSG = 0x400,
+#define EPOLLMSG EPOLLMSG
+#endif /* #ifdef __USE_GNU */
+
+ EPOLLERR = 0x008,
+#define EPOLLERR EPOLLERR
+ EPOLLHUP = 0x010
+#define EPOLLHUP EPOLLHUP
+};
+
+typedef union epoll_data {
+ void *ptr;
+ int fd;
+ uint32_t u32;
+ uint64_t u64;
+} epoll_data_t;
+
+struct epoll_event {
+ uint32_t events;
+ epoll_data_t data;
+};
+
+int epoll_create(int size) __THROW;
+int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event) __THROW;
+int epoll_wait(int epfd, struct epoll_event *events, int maxevents,
+ int timeout) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/file.h b/mdk-stage1/dietlibc/include/sys/file.h
index 93787fd42..cf2c74305 100644
--- a/mdk-stage1/dietlibc/include/sys/file.h
+++ b/mdk-stage1/dietlibc/include/sys/file.h
@@ -2,18 +2,9 @@
#define _SYS_FILE_H
#include <sys/cdefs.h>
+#include <fcntl.h>
extern int fcntl(int fd, int cmd, ...) __THROW;
extern int flock(int fd, int operation) __THROW;
-/* Operations for the `flock' call. */
-#define LOCK_SH 1 /* Shared lock. */
-#define LOCK_EX 2 /* Exclusive lock. */
-#define LOCK_UN 8 /* Unlock. */
-
-/* Can be OR'd in to one of the above. */
-#define LOCK_NB 4 /* Don't block when locking. */
-
-
-
#endif /* _SYS_FILE_H */
diff --git a/mdk-stage1/dietlibc/include/sys/fsuid.h b/mdk-stage1/dietlibc/include/sys/fsuid.h
new file mode 100644
index 000000000..538070451
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/fsuid.h
@@ -0,0 +1,12 @@
+#ifndef __FSUID_H
+#define __FSUID_H 1
+
+#include <sys/types.h>
+
+/* Linux only: */
+int setfsuid(uid_t uid);
+int setfsgid(gid_t gid);
+int setfsuid32(uid32_t fsuid) __THROW;
+int setfsgid32(gid32_t fsgid) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/gmon.h b/mdk-stage1/dietlibc/include/sys/gmon.h
new file mode 100644
index 000000000..50aae3028
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/gmon.h
@@ -0,0 +1,99 @@
+#ifndef __DLC_GMON_H_
+#define __DLC_GMON_H_
+
+# define HISTCOUNTER unsigned short
+# define HISTFRACTION 2
+# define HASHFRACTION 2
+# define ARCDENSITY 2
+# define MINARCS 50
+# define MAXARCS (( 1 << (8 * sizeof(HISTCOUNTER))) - 2)
+
+# define ROUNDDOWN(x,y) (((x)/(y))*y)
+# define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*y)
+
+# define PROF_SECTION __attribute__ ((section (".profile")))
+
+struct tostruct {
+ unsigned long selfpc;
+ signed long count;
+ unsigned short link;
+ unsigned short pad;
+};
+
+struct rawarc {
+ unsigned long raw_frompc;
+ unsigned long raw_selfpc;
+ signed long raw_count;
+};
+
+struct monparam {
+ unsigned short *kcount;
+ unsigned long kcountsize;
+ struct rawarc *arcs;
+ unsigned long arcnum;
+ unsigned long lowpc;
+ unsigned long highpc;
+ unsigned long textsize;
+};
+
+struct gmonparam {
+ long state;
+ unsigned short *kcount;
+ unsigned long kcountsize;
+ unsigned short *froms;
+ unsigned long fromsize;
+ struct tostruct *tos;
+ unsigned long tossize;
+ long tolimit;
+ unsigned long lowpc;
+ unsigned long highpc;
+ unsigned long textsize;
+ unsigned long hashfraction;
+ unsigned long log_hashfraction;
+};
+
+struct gmon_hdr {
+ char cookie[4];
+ long version;
+ char spare[12];
+};
+
+struct gmon_hist_hdr {
+ long low_pc;
+ long high_pc;
+ long hist_size;
+ long prof_rate;
+ char dimen[15];
+ char dimen_abbrev;
+};
+
+struct gmon_cg_arc_record {
+ long from_pc;
+ long self_pc;
+ long count;
+};
+
+struct __bb {
+ long zero_word;
+ char *filename;
+ long *counts;
+ long ncounts;
+ struct __bb *next;
+ unsigned long *addresses;
+};
+
+typedef enum {
+ GMON_TAG_TIME_HIST, GMON_TAG_CG_ARC, GMON_TAG_BB_COUNT
+} GMON_Record_Tag;
+
+enum { GMON_PROF_ON, GMON_PROF_BUSY, GMON_PROF_ERROR, GMON_PROF_OFF };
+enum { GPROF_STATE, GPROF_COUNT, GPROF_FROMS, GPROF_TOS, GPROF_GMONPARAM };
+
+extern struct gmonparam gmparam;
+extern struct __bb * __bb_head;
+
+extern void __monstartup(unsigned long, unsigned long);
+extern void monstartup(unsigned long, unsigned long);
+extern void _mcleanup(void);
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/gmon_out.h b/mdk-stage1/dietlibc/include/sys/gmon_out.h
new file mode 100644
index 000000000..31566b999
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/gmon_out.h
@@ -0,0 +1 @@
+#include <sys/gmon.h>
diff --git a/mdk-stage1/dietlibc/include/sys/hppa-ioctl.h b/mdk-stage1/dietlibc/include/sys/hppa-ioctl.h
new file mode 100644
index 000000000..62b6f1cf9
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/hppa-ioctl.h
@@ -0,0 +1,133 @@
+#ifndef __ARCH_PARISC_IOCTLS_H__
+#define __ARCH_PARISC_IOCTLS_H__
+
+#ifndef _ASM_PARISC_IOCTL_H
+#define _ASM_PARISC_IOCTL_H
+
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+#define _IOC_SIZEBITS 14
+#define _IOC_DIRBITS 2
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits.
+ */
+#define _IOC_NONE 0U
+#define _IOC_WRITE 2U
+#define _IOC_READ 1U
+
+#define _IOC(dir,type,nr,size) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
+/* used to create numbers */
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode ioctl numbers.. */
+#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the drivers/sound files... */
+
+#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
+
+#endif /* _ASM_PARISC_IOCTL_H */
+/* 0x54 is just a magic number to make these relatively unique ('T') */
+
+#define TCGETS _IOR('T', 16, struct termios) /* TCGETATTR */
+#define TCSETS _IOW('T', 17, struct termios) /* TCSETATTR */
+#define TCSETSW _IOW('T', 18, struct termios) /* TCSETATTRD */
+#define TCSETSF _IOW('T', 19, struct termios) /* TCSETATTRF */
+#define TCGETA _IOR('T', 1, struct termio)
+#define TCSETA _IOW('T', 2, struct termio)
+#define TCSETAW _IOW('T', 3, struct termio)
+#define TCSETAF _IOW('T', 4, struct termio)
+#define TCSBRK _IO('T', 5)
+#define TCXONC _IO('T', 6)
+#define TCFLSH _IO('T', 7)
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+#define TIOCGPGRP _IOR('T', 30, int)
+#define TIOCSPGRP _IOW('T', 29, int)
+#define TIOCOUTQ 0x5411
+#define TIOCSTI 0x5412
+#define TIOCGWINSZ 0x5413
+#define TIOCSWINSZ 0x5414
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define FIONREAD 0x541B
+#define TIOCINQ FIONREAD
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+#define FIONBIO 0x5421
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
+#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */
+#define TIOCSBRK 0x5427 /* BSD compatibility */
+#define TIOCCBRK 0x5428 /* BSD compatibility */
+#define TIOCGSID _IOR('T', 20, int) /* Return the session ID of FD */
+#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
+
+#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */
+#define FIOCLEX 0x5451
+#define FIOASYNC 0x5452
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
+#define TIOCSERGETLSR 0x5459 /* Get line status register */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
+#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
+#define TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */
+#define TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */
+#define FIOQSIZE 0x5460 /* Get exact space used by quota */
+
+/* Used for packet mode */
+#define TIOCPKT_DATA 0
+#define TIOCPKT_FLUSHREAD 1
+#define TIOCPKT_FLUSHWRITE 2
+#define TIOCPKT_STOP 4
+#define TIOCPKT_START 8
+#define TIOCPKT_NOSTOP 16
+#define TIOCPKT_DOSTOP 32
+
+#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
+
+#endif /* _ASM_PARISC_IOCTLS_H */
diff --git a/mdk-stage1/dietlibc/include/sys/i386-ioctl.h b/mdk-stage1/dietlibc/include/sys/i386-ioctl.h
new file mode 100644
index 000000000..c9aa270d6
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/i386-ioctl.h
@@ -0,0 +1,141 @@
+
+/*
+ * The following is for compatibility across the various Linux
+ * platforms. The i386 ioctl numbering scheme doesn't really enforce
+ * a type field. De facto, however, the top 8 bits of the lower 16
+ * bits are indeed used as a type field, so we might just as well make
+ * this explicit here. Please be sure to use the decoding macros
+ * below from now on.
+ */
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+#define _IOC_SIZEBITS 14
+#define _IOC_DIRBITS 2
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits.
+ */
+#define _IOC_NONE 0U
+#define _IOC_WRITE 1U
+#define _IOC_READ 2U
+
+#define _IOC(dir,type,nr,size) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
+/* used to create numbers */
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode ioctl numbers.. */
+#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the drivers/sound files... */
+
+#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
+
+/* 0x54 is just a magic number to make these relatively unique ('T') */
+
+#define TCGETS 0x5401
+#define TCSETS 0x5402
+#define TCSETSW 0x5403
+#define TCSETSF 0x5404
+#define TCGETA 0x5405
+#define TCSETA 0x5406
+#define TCSETAW 0x5407
+#define TCSETAF 0x5408
+#define TCSBRK 0x5409
+#define TCXONC 0x540A
+#define TCFLSH 0x540B
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+#define TIOCGPGRP 0x540F
+#define TIOCSPGRP 0x5410
+#define TIOCOUTQ 0x5411
+#define TIOCSTI 0x5412
+#define TIOCGWINSZ 0x5413
+#define TIOCSWINSZ 0x5414
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define FIONREAD 0x541B
+#define TIOCINQ FIONREAD
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+#define FIONBIO 0x5421
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
+#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */
+#define TIOCSBRK 0x5427 /* BSD compatibility */
+#define TIOCCBRK 0x5428 /* BSD compatibility */
+#define TIOCGSID 0x5429 /* Return the session ID of FD */
+#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
+
+#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */
+#define FIOCLEX 0x5451
+#define FIOASYNC 0x5452
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
+#define TIOCSERGETLSR 0x5459 /* Get line status register */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
+#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
+#define TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */
+#define TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */
+#define FIOQSIZE 0x5460
+
+/* Used for packet mode */
+#define TIOCPKT_DATA 0
+#define TIOCPKT_FLUSHREAD 1
+#define TIOCPKT_FLUSHWRITE 2
+#define TIOCPKT_STOP 4
+#define TIOCPKT_START 8
+#define TIOCPKT_NOSTOP 16
+#define TIOCPKT_DOSTOP 32
+
+#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
+
+/* Socket-level I/O control calls. */
+#define FIOSETOWN 0x8901
+#define SIOCSPGRP 0x8902
+#define FIOGETOWN 0x8903
+#define SIOCGPGRP 0x8904
+#define SIOCATMARK 0x8905
+#define SIOCGSTAMP 0x8906 /* Get stamp */
diff --git a/mdk-stage1/dietlibc/include/sys/io.h b/mdk-stage1/dietlibc/include/sys/io.h
index cce841735..5edf33a57 100644
--- a/mdk-stage1/dietlibc/include/sys/io.h
+++ b/mdk-stage1/dietlibc/include/sys/io.h
@@ -1,41 +1,44 @@
-#ifndef _IO_H
-#define _IO_H
+#ifndef _SYS_IO_H
+#define _SYS_IO_H
-int ioperm(unsigned long from, unsigned long num, int turn_on) __THROW;
+#include <sys/cdefs.h>
-#ifdef __i386__
-
-static __inline void
-outb (unsigned char value, unsigned short int port)
-{
- __asm__ __volatile__ ("outb %b0,%w1": :"a" (value), "Nd" (port));
-}
+extern int ioperm(unsigned long from, unsigned long num, int turn_on) __THROW;
+extern int iopl(int level) __THROW;
-static __inline unsigned char
-inb (unsigned short int port)
-{
+#ifndef __STRICT_ANSI__
+/* anyone have a cleaner solution for this mess? */
+#ifdef __i386__
+static inline unsigned char inb (unsigned short int port) {
unsigned char _v;
-
__asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (port));
return _v;
}
-static __inline unsigned short int
-inw (unsigned short int port)
-{
+static inline unsigned short inw (unsigned short int port) {
unsigned short _v;
-
__asm__ __volatile__ ("inw %w1,%0":"=a" (_v):"Nd" (port));
return _v;
}
-static __inline void
-outw (unsigned short int value, unsigned short int port)
-{
- __asm__ __volatile__ ("outw %w0,%w1": :"a" (value), "Nd" (port));
+static inline unsigned int inl (unsigned short int port) {
+ unsigned int _v;
+ __asm__ __volatile__ ("inl %w1,%0":"=a" (_v):"Nd" (port));
+ return _v;
+}
+
+static inline void outb (unsigned char value, unsigned short int port) {
+ __asm__ __volatile__ ("outb %b0,%w1": :"a" (value), "Nd" (port));
+}
+static inline void outw (unsigned short value, unsigned short int port) {
+ __asm__ __volatile__ ("outw %w0,%w1": :"a" (value), "Nd" (port));
}
+static inline void outl (unsigned int value, unsigned short int port) {
+ __asm__ __volatile__ ("outl %0,%w1": :"a" (value), "Nd" (port));
+}
+#endif
#endif
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/ioctl.h b/mdk-stage1/dietlibc/include/sys/ioctl.h
index fca1aeeab..630abc515 100644
--- a/mdk-stage1/dietlibc/include/sys/ioctl.h
+++ b/mdk-stage1/dietlibc/include/sys/ioctl.h
@@ -2,8 +2,24 @@
#define _IOCTL_H
#include <sys/cdefs.h>
-#include <linux/ioctl.h>
-#include <asm/ioctls.h>
+
+#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
+#include <sys/i386-ioctl.h>
+#elif defined(__alpha__)
+#include <sys/alpha-ioctl.h>
+#elif defined(__arm__)
+#include <sys/arm-ioctl.h>
+#elif defined(__sparc__)
+#include <sys/sparc-ioctl.h>
+#elif defined(__mips__)
+#include <sys/mips-ioctl.h>
+#elif defined(__powerpc__)
+#include <sys/ppc-ioctl.h>
+#elif defined(__s390__)
+#include <sys/s390-ioctl.h>
+#elif defined(__hppa__)
+#include <sys/hppa-ioctl.h>
+#endif
int ioctl(int d, int request, ...) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sys/ipc.h b/mdk-stage1/dietlibc/include/sys/ipc.h
index 9184a2a82..481d97b62 100644
--- a/mdk-stage1/dietlibc/include/sys/ipc.h
+++ b/mdk-stage1/dietlibc/include/sys/ipc.h
@@ -2,7 +2,48 @@
#define _SYS_IPC_H
#include <sys/cdefs.h>
-#include <linux/ipc.h>
-#include <asm/page.h>
+#include <sys/types.h>
+
+#define SEMOP 1
+#define SEMGET 2
+#define SEMCTL 3
+#define MSGSND 11
+#define MSGRCV 12
+#define MSGGET 13
+#define MSGCTL 14
+#define SHMAT 21
+#define SHMDT 22
+#define SHMGET 23
+#define SHMCTL 24
+
+#define IPC_PRIVATE ((key_t) 0)
+
+#define IPC_CREAT 00001000 /* create if key is nonexistent */
+#define IPC_EXCL 00002000 /* fail if key exists */
+#define IPC_NOWAIT 00004000 /* return error on wait */
+
+#define IPC_RMID 0 /* remove resource */
+#define IPC_SET 1 /* set ipc_perm options */
+#define IPC_STAT 2 /* get ipc_perm options */
+#define IPC_INFO 3 /* see ipcs */
+
+/*
+ * Version flags for semctl, msgctl, and shmctl commands
+ * These are passed as bitflags or-ed with the actual command
+ */
+#define IPC_OLD 0 /* Old version (no 32-bit UID support on many
+ architectures) */
+#define IPC_64 0x0100 /* New version (support 32-bit UIDs, bigger
+ message sizes, etc. */
+
+struct ipc_perm {
+ key_t key;
+ uid_t uid;
+ gid_t gid;
+ uid_t cuid;
+ gid_t cgid;
+ mode_t mode;
+ unsigned short seq;
+};
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/kd.h b/mdk-stage1/dietlibc/include/sys/kd.h
index 9e9a5152b..98b337ede 100644
--- a/mdk-stage1/dietlibc/include/sys/kd.h
+++ b/mdk-stage1/dietlibc/include/sys/kd.h
@@ -1,6 +1,183 @@
#ifndef _SYS_KD_H
#define _SYS_KD_H
-#include <linux/kd.h>
+/* 0x4B is 'K', to avoid collision with termios and vt */
+
+#define GIO_FONT 0x4B60 /* gets font in expanded form */
+#define PIO_FONT 0x4B61 /* use font in expanded form */
+
+#define GIO_FONTX 0x4B6B /* get font using struct consolefontdesc */
+#define PIO_FONTX 0x4B6C /* set font using struct consolefontdesc */
+
+struct consolefontdesc {
+ unsigned short charcount; /* characters in font (256 or 512) */
+ unsigned short charheight; /* scan lines per character (1-32) */
+ char *chardata; /* font data in expanded form */
+};
+
+#define PIO_FONTRESET 0x4B6D /* reset to default font */
+
+#define GIO_CMAP 0x4B70 /* gets colour palette on VGA+ */
+#define PIO_CMAP 0x4B71 /* sets colour palette on VGA+ */
+
+#define KIOCSOUND 0x4B2F /* start sound generation (0 for off) */
+#define KDMKTONE 0x4B30 /* generate tone */
+
+#define KDGETLED 0x4B31 /* return current led state */
+#define KDSETLED 0x4B32 /* set led state [lights, not flags] */
+#define LED_SCR 0x01 /* scroll lock led */
+#define LED_CAP 0x04 /* caps lock led */
+#define LED_NUM 0x02 /* num lock led */
+
+#define KDGKBTYPE 0x4B33 /* get keyboard type */
+#define KB_84 0x01
+#define KB_101 0x02 /* this is what we always answer */
+#define KB_OTHER 0x03
+
+#define KDADDIO 0x4B34 /* add i/o port as valid */
+#define KDDELIO 0x4B35 /* del i/o port as valid */
+#define KDENABIO 0x4B36 /* enable i/o to video board */
+#define KDDISABIO 0x4B37 /* disable i/o to video board */
+
+#define KDSETMODE 0x4B3A /* set text/graphics mode */
+#define KD_TEXT 0x00
+#define KD_GRAPHICS 0x01
+#define KD_TEXT0 0x02 /* obsolete */
+#define KD_TEXT1 0x03 /* obsolete */
+#define KDGETMODE 0x4B3B /* get current mode */
+
+#define KDMAPDISP 0x4B3C /* map display into address space */
+#define KDUNMAPDISP 0x4B3D /* unmap display from address space */
+
+typedef char scrnmap_t;
+
+#define E_TABSZ 256
+#define GIO_SCRNMAP 0x4B40 /* get screen mapping from kernel */
+#define PIO_SCRNMAP 0x4B41 /* put screen mapping table in kernel */
+#define GIO_UNISCRNMAP 0x4B69 /* get full Unicode screen mapping */
+#define PIO_UNISCRNMAP 0x4B6A /* set full Unicode screen mapping */
+
+#define GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from kernel */
+
+struct unipair {
+ unsigned short unicode;
+ unsigned short fontpos;
+};
+
+struct unimapdesc {
+ unsigned short entry_ct;
+ struct unipair *entries;
+};
+
+#define PIO_UNIMAP 0x4B67 /* put unicode-to-font mapping in kernel */
+#define PIO_UNIMAPCLR 0x4B68 /* clear table, possibly advise hash algorithm */
+
+struct unimapinit {
+ unsigned short advised_hashsize; /* 0 if no opinion */
+ unsigned short advised_hashstep; /* 0 if no opinion */
+ unsigned short advised_hashlevel; /* 0 if no opinion */
+};
+
+#define UNI_DIRECT_BASE 0xF000 /* start of Direct Font Region */
+#define UNI_DIRECT_MASK 0x01FF /* Direct Font Region bitmask */
+
+#define K_RAW 0x00
+#define K_XLATE 0x01
+#define K_MEDIUMRAW 0x02
+#define K_UNICODE 0x03
+#define KDGKBMODE 0x4B44 /* gets current keyboard mode */
+#define KDSKBMODE 0x4B45 /* sets current keyboard mode */
+
+#define K_METABIT 0x03
+#define K_ESCPREFIX 0x04
+#define KDGKBMETA 0x4B62 /* gets meta key handling mode */
+#define KDSKBMETA 0x4B63 /* sets meta key handling mode */
+
+#define K_SCROLLLOCK 0x01
+#define K_CAPSLOCK 0x02
+#define K_NUMLOCK 0x04
+#define KDGKBLED 0x4B64 /* get led flags (not lights) */
+#define KDSKBLED 0x4B65 /* set led flags (not lights) */
+
+struct kbentry {
+ unsigned char kb_table;
+ unsigned char kb_index;
+ unsigned short kb_value;
+};
+
+#define K_NORMTAB 0x00
+#define K_SHIFTTAB 0x01
+#define K_ALTTAB 0x02
+#define K_ALTSHIFTTAB 0x03
+
+#define KDGKBENT 0x4B46 /* gets one entry in translation table */
+#define KDSKBENT 0x4B47 /* sets one entry in translation table */
+
+struct kbsentry {
+ unsigned char kb_func;
+ unsigned char kb_string[512];
+};
+
+#define KDGKBSENT 0x4B48 /* gets one function key string entry */
+#define KDSKBSENT 0x4B49 /* sets one function key string entry */
+
+struct kbdiacr {
+ unsigned char diacr, base, result;
+};
+
+struct kbdiacrs {
+ unsigned int kb_cnt; /* number of entries in following array */
+ struct kbdiacr kbdiacr[256]; /* MAX_DIACR from keyboard.h */
+};
+
+#define KDGKBDIACR 0x4B4A /* read kernel accent table */
+#define KDSKBDIACR 0x4B4B /* write kernel accent table */
+
+struct kbkeycode {
+ unsigned int scancode, keycode;
+};
+
+#define KDGETKEYCODE 0x4B4C /* read kernel keycode table entry */
+#define KDSETKEYCODE 0x4B4D /* write kernel keycode table entry */
+
+#define KDSIGACCEPT 0x4B4E /* accept kbd generated signals */
+
+struct hwclk_time {
+ unsigned int sec; /* 0..59 */
+ unsigned int min; /* 0..59 */
+ unsigned int hour; /* 0..23 */
+ unsigned int day; /* 1..31 */
+ unsigned int mon; /* 0..11 */
+ unsigned int year; /* 70... */
+ int wday; /* 0..6, 0 is Sunday, -1 means unknown/don't set */
+};
+
+#define KDGHWCLK 0x4B50 /* get hardware clock */
+#define KDSHWCLK 0x4B51 /* set hardware clock */
+
+struct kbd_repeat {
+ int delay; /* in msec; <= 0: don't change */
+ int rate; /* in msec; <= 0: don't change */
+};
+
+#define KDKBDREP 0x4B52 /* set keyboard delay/repeat rate;
+ * actually used values are returned */
+
+#define KDFONTOP 0x4B72 /* font operations */
+
+struct console_font_op {
+ unsigned int op; /* operation code KD_FONT_OP_* */
+ unsigned int flags; /* KD_FONT_FLAG_* */
+ unsigned int width, height; /* font size */
+ unsigned int charcount;
+ unsigned char *data; /* font data with height fixed to 32 */
+};
+
+#define KD_FONT_OP_SET 0 /* Set font */
+#define KD_FONT_OP_GET 1 /* Get font */
+#define KD_FONT_OP_SET_DEFAULT 2 /* Set font to default, data points to name / NULL */
+#define KD_FONT_OP_COPY 3 /* Copy from another console */
+
+#define KD_FONT_FLAG_DONT_RECALC 1 /* Don't recalculate hw charcell size [compat] */
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/klog.h b/mdk-stage1/dietlibc/include/sys/klog.h
new file mode 100644
index 000000000..abacfef9c
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/klog.h
@@ -0,0 +1,8 @@
+#ifndef _SYS_KLOG_H
+#define _SYS_KLOG_H
+
+#include <sys/cdefs.h>
+
+extern int klogctl (int __type, char *__bufp, int __len) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/mips-ioctl.h b/mdk-stage1/dietlibc/include/sys/mips-ioctl.h
new file mode 100644
index 000000000..889ac83ae
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/mips-ioctl.h
@@ -0,0 +1,177 @@
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+#define _IOC_SIZEBITS 13
+#define _IOC_DIRBITS 3
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * We to additionally limit parameters to a maximum 255 bytes.
+ */
+#define _IOC_SLMASK 0xff
+
+/*
+ * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit.
+ * And this turns out useful to catch old ioctl numbers in header
+ * files for us.
+ */
+#define _IOC_NONE 1U
+#define _IOC_READ 2U
+#define _IOC_WRITE 4U
+
+/*
+ * The following are included for compatibility
+ */
+#define _IOC_VOID 0x20000000
+#define _IOC_OUT 0x40000000
+#define _IOC_IN 0x80000000
+#define _IOC_INOUT (IOC_IN|IOC_OUT)
+
+#define _IOC(dir,type,nr,size) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ (((size) & _IOC_SLMASK) << _IOC_SIZESHIFT))
+
+/* used to create numbers */
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode them.. */
+#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the drivers/sound files... */
+
+#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
+
+#if defined(__USE_MISC) || defined (__KERNEL__)
+#define tIOC ('t' << 8)
+#endif
+
+#define TCGETA 0x5401
+#define TCSETA 0x5402
+#define TCSETAW 0x5403
+#define TCSETAF 0x5404
+
+#define TCSBRK 0x5405
+#define TCXONC 0x5406
+#define TCFLSH 0x5407
+
+#define TCGETS 0x540d
+#define TCSETS 0x540e
+#define TCSETSW 0x540f
+#define TCSETSF 0x5410
+
+#define TIOCEXCL 0x740d /* set exclusive use of tty */
+#define TIOCNXCL 0x740e /* reset exclusive use of tty */
+#define TIOCOUTQ 0x7472 /* output queue size */
+#define TIOCSTI 0x5472 /* simulate terminal input */
+#define TIOCMGET 0x741d /* get all modem bits */
+#define TIOCMBIS 0x741b /* bis modem bits */
+#define TIOCMBIC 0x741c /* bic modem bits */
+#define TIOCMSET 0x741a /* set all modem bits */
+#define TIOCPKT 0x5470 /* pty: set/clear packet mode */
+#define TIOCPKT_DATA 0x00 /* data packet */
+#define TIOCPKT_FLUSHREAD 0x01 /* flush packet */
+#define TIOCPKT_FLUSHWRITE 0x02 /* flush packet */
+#define TIOCPKT_STOP 0x04 /* stop output */
+#define TIOCPKT_START 0x08 /* start output */
+#define TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */
+#define TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */
+#if 0
+#define TIOCPKT_IOCTL 0x40 /* state change of pty driver */
+#endif
+#define TIOCSWINSZ _IOW('t', 103, struct winsize) /* set window size */
+#define TIOCGWINSZ _IOR('t', 104, struct winsize) /* get window size */
+#define TIOCNOTTY 0x5471 /* void tty association */
+#define TIOCSETD (tIOC | 1)
+#define TIOCGETD (tIOC | 0)
+
+#define FIOCLEX 0x6601
+#define FIONCLEX 0x6602 /* these numbers need to be adjusted. */
+#define FIOASYNC 0x667d
+#define FIONBIO 0x667e
+#define FIOQSIZE 0x667f
+
+#if defined(__USE_MISC) || defined (__KERNEL__)
+#define TIOCGLTC (tIOC | 116) /* get special local chars */
+#define TIOCSLTC (tIOC | 117) /* set special local chars */
+#endif
+#define TIOCSPGRP _IOW('t', 118, int) /* set pgrp of tty */
+#define TIOCGPGRP _IOR('t', 119, int) /* get pgrp of tty */
+#define TIOCCONS _IOW('t', 120, int) /* become virtual console */
+
+#define FIONREAD 0x467f
+#define TIOCINQ FIONREAD
+
+#if defined(__USE_MISC) || defined (__KERNEL__)
+#define TIOCGETP (tIOC | 8)
+#define TIOCSETP (tIOC | 9)
+#define TIOCSETN (tIOC | 10) /* TIOCSETP wo flush */
+#endif
+
+#if 0
+#define TIOCSETA _IOW('t', 20, struct termios) /* set termios struct */
+#define TIOCSETAW _IOW('t', 21, struct termios) /* drain output, set */
+#define TIOCSETAF _IOW('t', 22, struct termios) /* drn out, fls in, set */
+#define TIOCGETD _IOR('t', 26, int) /* get line discipline */
+#define TIOCSETD _IOW('t', 27, int) /* set line discipline */
+ /* 127-124 compat */
+#endif
+
+/* I hope the range from 0x5480 on is free ... */
+#define TIOCSCTTY 0x5480 /* become controlling tty */
+#define TIOCGSOFTCAR 0x5481
+#define TIOCSSOFTCAR 0x5482
+#define TIOCLINUX 0x5483
+#define TIOCGSERIAL 0x5484
+#define TIOCSSERIAL 0x5485
+
+#define TCSBRKP 0x5486 /* Needed for POSIX tcsendbreak() */
+#define TIOCTTYGSTRUCT 0x5487 /* For debugging only */
+#define TIOCSBRK 0x5427 /* BSD compatibility */
+#define TIOCCBRK 0x5428 /* BSD compatibility */
+#define TIOCGSID 0x7416 /* Return the session ID of FD */
+#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
+
+#define TIOCSERCONFIG 0x5488
+#define TIOCSERGWILD 0x5489
+#define TIOCSERSWILD 0x548a
+#define TIOCGLCKTRMIOS 0x548b
+#define TIOCSLCKTRMIOS 0x548c
+#define TIOCSERGSTRUCT 0x548d /* For debugging only */
+#define TIOCSERGETLSR 0x548e /* Get line status register */
+#define TIOCSERGETMULTI 0x548f /* Get multiport config */
+#define TIOCSERSETMULTI 0x5490 /* Set multiport config */
+#define TIOCMIWAIT 0x5491 /* wait for a change on serial input line(s) */
+#define TIOCGICOUNT 0x5492 /* read serial port inline interrupt counts */
+#define TIOCGHAYESESP 0x5493 /* Get Hayes ESP configuration */
+#define TIOCSHAYESESP 0x5494 /* Set Hayes ESP configuration */
+
+/* Socket-level I/O control calls. */
+#define FIOGETOWN _IOR('f', 123, int)
+#define FIOSETOWN _IOW('f', 124, int)
+
+#define SIOCATMARK _IOR('s', 7, int)
+#define SIOCSPGRP _IOW('s', 8, pid_t)
+#define SIOCGPGRP _IOR('s', 9, pid_t)
+
+#define SIOCGSTAMP 0x8906 /* Get stamp - linux-specific */
diff --git a/mdk-stage1/dietlibc/include/sys/mman.h b/mdk-stage1/dietlibc/include/sys/mman.h
index dc398ba90..298773a92 100644
--- a/mdk-stage1/dietlibc/include/sys/mman.h
+++ b/mdk-stage1/dietlibc/include/sys/mman.h
@@ -3,13 +3,160 @@
#include <sys/cdefs.h>
#include <sys/types.h>
-#include <linux/mman.h>
-#include <asm/page.h>
-#ifndef PAGE_SIZE
-#warning PAGE_SIZE undefined
+#define MREMAP_MAYMOVE 1UL
+#define MREMAP_FIXED 2UL
+
+#define PROT_READ 0x1 /* page can be read */
+#define PROT_WRITE 0x2 /* page can be written */
+#define PROT_EXEC 0x4 /* page can be executed */
+#define PROT_NONE 0x0 /* page can not be accessed */
+
+#define MAP_SHARED 0x01 /* Share changes */
+#define MAP_PRIVATE 0x02 /* Changes are private */
+
+#ifdef __mips__
+#define MAP_FIXED 0x010 /* Interpret addr exactly */
+#define MAP_NORESERVE 0x0400 /* don't check for reservations */
+#define MAP_ANONYMOUS 0x0800 /* don't use a file */
+#define MAP_GROWSDOWN 0x1000 /* stack-like segment */
+#define MAP_DENYWRITE 0x2000 /* ETXTBSY */
+#define MAP_EXECUTABLE 0x4000 /* mark it as an executable */
+#define MAP_LOCKED 0x8000 /* pages are locked */
+#define MS_ASYNC 0x0001 /* sync memory asynchronously */
+#define MS_INVALIDATE 0x0002 /* invalidate mappings & caches */
+#define MS_SYNC 0x0004 /* synchronous memory sync */
+#define MCL_CURRENT 1 /* lock all current mappings */
+#define MCL_FUTURE 2 /* lock all future mappings */
+#define MADV_NORMAL 0x0 /* default page-in behavior */
+#define MADV_RANDOM 0x1 /* page-in minimum required */
+#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */
+#define MADV_WILLNEED 0x3 /* pre-fault pages */
+#define MADV_DONTNEED 0x4 /* discard these pages */
+#else
+
+#ifdef __alpha__
+#define MAP_FIXED 0x100 /* Interpret addr exactly */
+#define MAP_ANONYMOUS 0x10 /* don't use a file */
+#define MAP_GROWSDOWN 0x1000 /* stack-like segment */
+#define MAP_DENYWRITE 0x2000 /* ETXTBSY */
+#define MAP_EXECUTABLE 0x4000 /* mark it as an executable */
+#define MAP_LOCKED 0x8000 /* lock the mapping */
+#define MAP_NORESERVE 0x10000 /* don't check for reservations */
+#define MS_ASYNC 1 /* sync memory asynchronously */
+#define MS_SYNC 2 /* synchronous memory sync */
+#define MS_INVALIDATE 4 /* invalidate the caches */
+#define MCL_CURRENT 8192 /* lock all currently mapped pages */
+#define MCL_FUTURE 16384 /* lock all additions to address space */
+#define MADV_NORMAL 0 /* no further special treatment */
+#define MADV_RANDOM 1 /* expect random page references */
+#define MADV_SEQUENTIAL 2 /* expect sequential page references */
+#define MADV_WILLNEED 3 /* will need these pages */
+#define MADV_SPACEAVAIL 5 /* ensure resources are available */
+#define MADV_DONTNEED 6 /* dont need these pages */
+#else
+#define MAP_FIXED 0x10 /* Interpret addr exactly */
+#define MAP_ANONYMOUS 0x20 /* don't use a file */
#endif
+#if defined(__i386__) || defined(__s390__) || defined(__x86_64__)
+#define MAP_GROWSDOWN 0x0100 /* stack-like segment */
+#define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */
+#define MAP_LOCKED 0x2000 /* pages are locked */
+#define MAP_NORESERVE 0x4000 /* don't check for reservations */
+#define MS_ASYNC 1 /* sync memory asynchronously */
+#define MS_INVALIDATE 2 /* invalidate the caches */
+#define MS_SYNC 4 /* synchronous memory sync */
+#define MCL_CURRENT 1 /* lock all current mappings */
+#define MCL_FUTURE 2 /* lock all future mappings */
+#define MADV_NORMAL 0x0 /* default page-in behavior */
+#define MADV_RANDOM 0x1 /* page-in minimum required */
+#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */
+#define MADV_WILLNEED 0x3 /* pre-fault pages */
+#define MADV_DONTNEED 0x4 /* discard these pages */
+#elif defined(__sparc__) || defined (__powerpc__)
+#define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */
+#define MAP_NORESERVE 0x40 /* don't reserve swap pages */
+#define MAP_INHERIT 0x80 /* SunOS doesn't do this, but... */
+#define MAP_LOCKED 0x100 /* lock the mapping */
+#define _MAP_NEW 0x80000000 /* Binary compatibility is fun... */
+#define MAP_GROWSDOWN 0x0100 /* stack-like segment */
+#define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */
+#define MS_ASYNC 1 /* sync memory asynchronously */
+#define MS_INVALIDATE 2 /* invalidate the caches */
+#define MS_SYNC 4 /* synchronous memory sync */
+#define MCL_CURRENT 0x2000 /* lock all currently mapped pages */
+#define MCL_FUTURE 0x4000 /* lock all additions to address space */
+#define MADV_NORMAL 0x0 /* default page-in behavior */
+#define MADV_RANDOM 0x1 /* page-in minimum required */
+#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */
+#define MADV_WILLNEED 0x3 /* pre-fault pages */
+#define MADV_DONTNEED 0x4 /* discard these pages */
+#define MADV_FREE 0x5 /* (Solaris) contents can be freed */
+#elif defined (__arm__)
+#define MAP_GROWSDOWN 0x0100 /* stack-like segment */
+#define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */
+#define MAP_LOCKED 0x2000 /* pages are locked */
+#define MAP_NORESERVE 0x4000 /* don't check for reservations */
+#define MS_ASYNC 1 /* sync memory asynchronously */
+#define MS_INVALIDATE 2 /* invalidate the caches */
+#define MS_SYNC 4 /* synchronous memory sync */
+#define MCL_CURRENT 1 /* lock all current mappings */
+#define MCL_FUTURE 2 /* lock all future mappings */
+#define MADV_NORMAL 0x0 /* default page-in behavior */
+#define MADV_RANDOM 0x1 /* page-in minimum required */
+#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */
+#define MADV_WILLNEED 0x3 /* pre-fault pages */
+#define MADV_DONTNEED 0x4 /* discard these pages */
+
+#elif defined(__hppa__)
+#define MAP_TYPE 0x03 /* Mask for type of mapping */
+#define MAP_FIXED 0x04 /* Interpret addr exactly */
+#define MAP_ANONYMOUS 0x10 /* don't use a file */
+
+#define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */
+#define MAP_LOCKED 0x2000 /* pages are locked */
+#define MAP_NORESERVE 0x4000 /* don't check for reservations */
+#define MAP_GROWSDOWN 0x8000 /* stack-like segment */
+
+#define MS_SYNC 1 /* synchronous memory sync */
+#define MS_ASYNC 2 /* sync memory asynchronously */
+#define MS_INVALIDATE 4 /* invalidate the caches */
+
+#define MCL_CURRENT 1 /* lock all current mappings */
+#define MCL_FUTURE 2
+
+#elif defined(__ia64__)
+
+#define MAP_TYPE 0x0f /* Mask for type of mapping */
+#define MAP_FIXED 0x10 /* Interpret addr exactly */
+#define MAP_ANONYMOUS 0x20 /* don't use a file */
+
+#define MAP_GROWSDOWN 0x0100 /* stack-like segment */
+#define MAP_GROWSUP 0x0200 /* register stack-like segment */
+#define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */
+#define MAP_LOCKED 0x2000 /* pages are locked */
+#define MAP_NORESERVE 0x4000 /* don't check for reservations */
+#define MAP_WRITECOMBINED 0x10000 /* write-combine the area */
+#define MAP_NONCACHED 0x20000 /* don't cache the memory */
+
+#define MS_ASYNC 1 /* sync memory asynchronously */
+#define MS_INVALIDATE 2 /* invalidate the caches */
+#define MS_SYNC 4 /* synchronous memory sync */
+
+#endif
+
+#endif
+
+/* compatibility flags */
+#define MAP_ANON MAP_ANONYMOUS
+#define MAP_FILE 0
+
#define MAP_FAILED ((void *) -1)
extern void *mmap (void *__addr, size_t __len, int __prot,
@@ -19,15 +166,19 @@ extern int munmap (void *__addr, size_t __len) __THROW;
extern int mprotect (void *__addr, size_t __len, int __prot) __THROW;
extern int msync (void *__addr, size_t __len, int __flags) __THROW;
extern void *mremap (void *__addr, size_t __old_len, size_t __new_len,
- int __may_move) __THROW;
+ unsigned long __may_move) __THROW;
extern int mincore (void *__start, size_t __len, unsigned char *__vec);
-#ifdef __quad_t
extern void *mmap64 (void *__addr, size_t __len, int __prot,
int __flags, int __fd, off64_t __offset) __THROW;
-#endif
int mlockall(int flags) __THROW;
+int mlock(const void *addr, size_t len) __THROW;
+int munlock(const void *addr, size_t len) __THROW;
int munlockall(void) __THROW;
+int madvise(void *start, size_t length, int advice) __THROW;
+
+#define _POSIX_MAPPED_FILES
+
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/mount.h b/mdk-stage1/dietlibc/include/sys/mount.h
index 2e9e86774..a5170fda9 100644
--- a/mdk-stage1/dietlibc/include/sys/mount.h
+++ b/mdk-stage1/dietlibc/include/sys/mount.h
@@ -3,17 +3,78 @@
#include <sys/cdefs.h>
#include <sys/types.h>
-#include <linux/fs.h>
+#define _LINUX_CONFIG_H
+
+#define BLOCK_SIZE 1024
+#define BLOCK_SIZE_BITS 10
+
+
+/* These are the fs-independent mount-flags: up to 16 flags are
+ supported */
+enum
+{
+ MS_RDONLY = 1, /* Mount read-only. */
+#define MS_RDONLY MS_RDONLY
+ MS_NOSUID = 2, /* Ignore suid and sgid bits. */
+#define MS_NOSUID MS_NOSUID
+ MS_NODEV = 4, /* Disallow access to device special files. */
+#define MS_NODEV MS_NODEV
+ MS_NOEXEC = 8, /* Disallow program execution. */
+#define MS_NOEXEC MS_NOEXEC
+ MS_SYNCHRONOUS = 16, /* Writes are synced at once. */
+#define MS_SYNCHRONOUS MS_SYNCHRONOUS
+ MS_REMOUNT = 32, /* Alter flags of a mounted FS. */
+#define MS_REMOUNT MS_REMOUNT
+ MS_MANDLOCK = 64, /* Allow mandatory locks on an FS. */
+#define MS_MANDLOCK MS_MANDLOCK
+ S_WRITE = 128, /* Write on file/directory/symlink. */
+#define S_WRITE S_WRITE
+ S_APPEND = 256, /* Append-only file. */
+#define S_APPEND S_APPEND
+ S_IMMUTABLE = 512, /* Immutable file. */
+#define S_IMMUTABLE S_IMMUTABLE
+ MS_NOATIME = 1024, /* Do not update access times. */
+#define MS_NOATIME MS_NOATIME
+ MS_NODIRATIME = 2048, /* Do not update directory access times. */
+#define MS_NODIRATIME MS_NODIRATIME
+ MS_BIND = 4096, /* Bind directory at different place. */
+#define MS_BIND MS_BIND
+};
+
+/* Flags that can be altered by MS_REMOUNT */
+#define MS_RMT_MASK (MS_RDONLY | MS_MANDLOCK)
+
+
+/* Magic mount flag number. Has to be or-ed to the flag values. */
+
+#define MS_MGC_VAL 0xc0ed0000 /* Magic flag number to indicate "new" flags */
+#define MS_MGC_MSK 0xffff0000 /* Magic flag number mask */
+
+
+/* The read-only stuff doesn't really belong here, but any other place
+ is probably as bad and I don't want to create yet another include
+ file. */
+
+#define BLKROSET _IO(0x12, 93) /* Set device read-only (0 = read-write). */
+#define BLKROGET _IO(0x12, 94) /* Get read-only status (0 = read_write). */
+#define BLKRRPART _IO(0x12, 95) /* Re-read partition table. */
+#define BLKGETSIZE _IO(0x12, 96) /* Return device size. */
+#define BLKFLSBUF _IO(0x12, 97) /* Flush buffer cache. */
+#define BLKRASET _IO(0x12, 98) /* Set read ahead for block device. */
+#define BLKRAGET _IO(0x12, 99) /* Get current read ahead setting. */
+
+
+/* Possible value for FLAGS parameter of `umount2'. */
+enum
+{
+ MNT_FORCE = 1 /* Force unmounting. */
+#define MNT_FORCE MNT_FORCE
+};
int mount(const char* specialfile, const char* dir, const char* filesystemtype,
unsigned long rwflag, const void * data) __THROW;
int umount(const char *specialfile) __THROW;
-
-int umount(const char *dir) __THROW;
-
int umount2(const char *specialfile, int mflag) __THROW;
-int umount2(const char *dir, int mflag) __THROW;
-
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/msg.h b/mdk-stage1/dietlibc/include/sys/msg.h
index ea1e470b6..564fd9472 100644
--- a/mdk-stage1/dietlibc/include/sys/msg.h
+++ b/mdk-stage1/dietlibc/include/sys/msg.h
@@ -1,9 +1,53 @@
#ifndef _SYS_MSG_H
#define _SYS_MSG_H
-#include <linux/msg.h>
#include <sys/ipc.h>
-#include <asm/page.h>
+
+/* ipcs ctl commands */
+#define MSG_STAT 11
+#define MSG_INFO 12
+
+/* msgrcv options */
+#define MSG_NOERROR 010000 /* no error if message is too big */
+#define MSG_EXCEPT 020000 /* recv any msg except of specified type.*/
+
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ struct msg *msg_first; /* first message on queue,unused */
+ struct msg *msg_last; /* last message in queue,unused */
+ time_t msg_stime; /* last msgsnd time */
+ time_t msg_rtime; /* last msgrcv time */
+ time_t msg_ctime; /* last change time */
+ unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */
+ unsigned long msg_lqbytes; /* ditto */
+ unsigned short msg_cbytes; /* current number of bytes on queue */
+ unsigned short msg_qnum; /* number of messages in queue */
+ unsigned short msg_qbytes; /* max number of bytes on queue */
+ pid_t msg_lspid; /* pid of last msgsnd */
+ pid_t msg_lrpid; /* last receive pid */
+};
+
+/* message buffer for msgsnd and msgrcv calls */
+struct msgbuf {
+ long mtype; /* type of message */
+ char mtext[1]; /* message text */
+};
+
+/* buffer for msgctl calls IPC_INFO, MSG_INFO */
+struct msginfo {
+ int msgpool;
+ int msgmap;
+ int msgmax;
+ int msgmnb;
+ int msgmni;
+ int msgssz;
+ int msgtql;
+ unsigned short msgseg;
+};
+
+#define MSGMNI 16 /* <= IPCMNI */ /* max # of msg queue identifiers */
+#define MSGMAX 8192 /* <= INT_MAX */ /* max size of message (bytes) */
+#define MSGMNB 16384 /* <= INT_MAX */ /* default max size of a message queue */
extern int msgctl (int msqid, int cmd, struct msqid_ds *buf) __THROW;
extern int msgget (key_t key, int msgflg) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sys/mtio.h b/mdk-stage1/dietlibc/include/sys/mtio.h
index e70663407..08c735dcc 100644
--- a/mdk-stage1/dietlibc/include/sys/mtio.h
+++ b/mdk-stage1/dietlibc/include/sys/mtio.h
@@ -1,6 +1,340 @@
#ifndef _SYS_MTIO_H
#define _SYS_MTIO_H
-#include <linux/mtio.h>
+#include <sys/ioctl.h>
+
+/* structure for MTIOCTOP - mag tape op command */
+struct mtop {
+ short int mt_op; /* operations defined below */
+ int mt_count; /* how many of them */
+};
+
+/* Magnetic Tape operations [Not all operations supported by all drivers]: */
+#define MTRESET 0 /* +reset drive in case of problems */
+#define MTFSF 1 /* forward space over FileMark,
+ * position at first record of next file
+ */
+#define MTBSF 2 /* backward space FileMark (position before FM) */
+#define MTFSR 3 /* forward space record */
+#define MTBSR 4 /* backward space record */
+#define MTWEOF 5 /* write an end-of-file record (mark) */
+#define MTREW 6 /* rewind */
+#define MTOFFL 7 /* rewind and put the drive offline (eject?) */
+#define MTNOP 8 /* no op, set status only (read with MTIOCGET) */
+#define MTRETEN 9 /* retension tape */
+#define MTBSFM 10 /* +backward space FileMark, position at FM */
+#define MTFSFM 11 /* +forward space FileMark, position at FM */
+#define MTEOM 12 /* goto end of recorded media (for appending files).
+ * MTEOM positions after the last FM, ready for
+ * appending another file.
+ */
+#define MTERASE 13 /* erase tape -- be careful! */
+
+#define MTRAS1 14 /* run self test 1 (nondestructive) */
+#define MTRAS2 15 /* run self test 2 (destructive) */
+#define MTRAS3 16 /* reserved for self test 3 */
+
+#define MTSETBLK 20 /* set block length (SCSI) */
+#define MTSETDENSITY 21 /* set tape density (SCSI) */
+#define MTSEEK 22 /* seek to block (Tandberg, etc.) */
+#define MTTELL 23 /* tell block (Tandberg, etc.) */
+#define MTSETDRVBUFFER 24 /* set the drive buffering according to SCSI-2 */
+ /* ordinary buffered operation with code 1 */
+#define MTFSS 25 /* space forward over setmarks */
+#define MTBSS 26 /* space backward over setmarks */
+#define MTWSM 27 /* write setmarks */
+
+#define MTLOCK 28 /* lock the drive door */
+#define MTUNLOCK 29 /* unlock the drive door */
+#define MTLOAD 30 /* execute the SCSI load command */
+#define MTUNLOAD 31 /* execute the SCSI unload command */
+#define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */
+#define MTSETPART 33 /* Change the active tape partition */
+#define MTMKPART 34 /* Format the tape with one or two partitions */
+
+/* structure for MTIOCGET - mag tape get status command */
+
+typedef int daddr_t;
+
+struct mtget {
+ long int mt_type; /* type of magtape device */
+ long int mt_resid; /* residual count: (not sure)
+ * number of bytes ignored, or
+ * number of files not skipped, or
+ * number of records not skipped.
+ */
+ /* the following registers are device dependent */
+ long int mt_dsreg; /* status register */
+ long int mt_gstat; /* generic (device independent) status */
+ long int mt_erreg; /* error register */
+ /* The next two fields are not always used */
+ daddr_t mt_fileno; /* number of current file on tape */
+ daddr_t mt_blkno; /* current block number */
+};
+
+/*
+ * Constants for mt_type. Not all of these are supported,
+ * and these are not all of the ones that are supported.
+ */
+#define MT_ISUNKNOWN 0x01
+#define MT_ISQIC02 0x02 /* Generic QIC-02 tape streamer */
+#define MT_ISWT5150 0x03 /* Wangtek 5150EQ, QIC-150, QIC-02 */
+#define MT_ISARCHIVE_5945L2 0x04 /* Archive 5945L-2, QIC-24, QIC-02? */
+#define MT_ISCMSJ500 0x05 /* CMS Jumbo 500 (QIC-02?) */
+#define MT_ISTDC3610 0x06 /* Tandberg 6310, QIC-24 */
+#define MT_ISARCHIVE_VP60I 0x07 /* Archive VP60i, QIC-02 */
+#define MT_ISARCHIVE_2150L 0x08 /* Archive Viper 2150L */
+#define MT_ISARCHIVE_2060L 0x09 /* Archive Viper 2060L */
+#define MT_ISARCHIVESC499 0x0A /* Archive SC-499 QIC-36 controller */
+#define MT_ISQIC02_ALL_FEATURES 0x0F /* Generic QIC-02 with all features */
+#define MT_ISWT5099EEN24 0x11 /* Wangtek 5099-een24, 60MB, QIC-24 */
+#define MT_ISTEAC_MT2ST 0x12 /* Teac MT-2ST 155mb drive, Teac DC-1 card (Wangtek type) */
+#define MT_ISEVEREX_FT40A 0x32 /* Everex FT40A (QIC-40) */
+#define MT_ISDDS1 0x51 /* DDS device without partitions */
+#define MT_ISDDS2 0x52 /* DDS device with partitions */
+#define MT_ISONSTREAM_SC 0x61 /* OnStream SCSI tape drives (SC-x0)
+ and SCSI emulated (DI, DP, USB) */
+#define MT_ISSCSI1 0x71 /* Generic ANSI SCSI-1 tape unit */
+#define MT_ISSCSI2 0x72 /* Generic ANSI SCSI-2 tape unit */
+
+/* QIC-40/80/3010/3020 ftape supported drives.
+ * 20bit vendor ID + 0x800000 (see ftape-vendors.h)
+ */
+#define MT_ISFTAPE_UNKNOWN 0x800000 /* obsolete */
+#define MT_ISFTAPE_FLAG 0x800000
+
+struct mt_tape_info {
+ long int t_type; /* device type id (mt_type) */
+ char* t_name; /* descriptive name */
+};
+
+#define MT_TAPE_INFO { \
+ {MT_ISUNKNOWN, "Unknown type of tape device"}, \
+ {MT_ISQIC02, "Generic QIC-02 tape streamer"}, \
+ {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \
+ {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, \
+ {MT_ISCMSJ500, "CMS Jumbo 500"}, \
+ {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"}, \
+ {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"}, \
+ {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, \
+ {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \
+ {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"}, \
+ {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"}, \
+ {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"}, \
+ {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"}, \
+ {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, \
+ {MT_ISONSTREAM_SC, "OnStream SC-, DI-, DP-, or USB tape drive"}, \
+ {MT_ISSCSI1, "Generic SCSI-1 tape"}, \
+ {MT_ISSCSI2, "Generic SCSI-2 tape"}, \
+ {0, NULL} \
+}
+
+
+/* structure for MTIOCPOS - mag tape get position command */
+
+struct mtpos {
+ long int mt_blkno; /* current block number */
+};
+
+
+/* structure for MTIOCGETCONFIG/MTIOCSETCONFIG primarily intended
+ * as an interim solution for QIC-02 until DDI is fully implemented.
+ */
+struct mtconfiginfo {
+ long int mt_type; /* drive type */
+ long int ifc_type; /* interface card type */
+ unsigned short int irqnr; /* IRQ number to use */
+ unsigned short int dmanr; /* DMA channel to use */
+ unsigned short int port; /* IO port base address */
+
+ unsigned long int debug; /* debugging flags */
+
+ unsigned int have_dens:1;
+ unsigned int have_bsf:1;
+ unsigned int have_fsr:1;
+ unsigned int have_bsr:1;
+ unsigned int have_eod:1;
+ unsigned int have_seek:1;
+ unsigned int have_tell:1;
+ unsigned int have_ras1:1;
+ unsigned int have_ras2:1;
+ unsigned int have_ras3:1;
+ unsigned int have_qfa:1;
+
+ unsigned int pad1:5;
+ char reserved[10];
+};
+
+/* structure for MTIOCVOLINFO, query information about the volume
+ * currently positioned at (zftape)
+ */
+struct mtvolinfo {
+ unsigned int mt_volno; /* vol-number */
+ unsigned int mt_blksz; /* blocksize used when recording */
+ unsigned int mt_rawsize; /* raw tape space consumed, in kb */
+ unsigned int mt_size; /* volume size after decompression, in kb */
+ unsigned int mt_cmpr:1; /* this volume has been compressed */
+};
+
+/* raw access to a floppy drive, read and write an arbitrary segment.
+ * For ftape/zftape to support formatting etc.
+ */
+#define MT_FT_RD_SINGLE 0
+#define MT_FT_RD_AHEAD 1
+#define MT_FT_WR_ASYNC 0 /* start tape only when all buffers are full */
+#define MT_FT_WR_MULTI 1 /* start tape, continue until buffers are empty */
+#define MT_FT_WR_SINGLE 2 /* write a single segment and stop afterwards */
+#define MT_FT_WR_DELETE 3 /* write deleted data marks, one segment at time */
+
+struct mtftseg {
+ unsigned int mt_segno; /* the segment to read or write */
+ unsigned int mt_mode; /* modes for read/write (sync/async etc.) */
+ int mt_result; /* result of r/w request, not of the ioctl */
+ void *mt_data; /* User space buffer: must be 29kb */
+};
+
+/* get tape capacity (ftape/zftape)
+ */
+struct mttapesize {
+ unsigned long mt_capacity; /* entire, uncompressed capacity of a cartridge */
+ unsigned long mt_used; /* what has been used so far, raw uncompressed amount */
+};
+
+/* possible values of the ftfmt_op field
+ */
+#define FTFMT_SET_PARMS 1 /* set software parms */
+#define FTFMT_GET_PARMS 2 /* get software parms */
+#define FTFMT_FORMAT_TRACK 3 /* start formatting a tape track */
+#define FTFMT_STATUS 4 /* monitor formatting a tape track */
+#define FTFMT_VERIFY 5 /* verify the given segment */
+
+struct ftfmtparms {
+ unsigned char ft_qicstd; /* QIC-40/QIC-80/QIC-3010/QIC-3020 */
+ unsigned char ft_fmtcode; /* Refer to the QIC specs */
+ unsigned char ft_fhm; /* floppy head max */
+ unsigned char ft_ftm; /* floppy track max */
+ unsigned short ft_spt; /* segments per track */
+ unsigned short ft_tpc; /* tracks per cartridge */
+};
+
+struct ftfmttrack {
+ unsigned int ft_track; /* track to format */
+ unsigned char ft_gap3; /* size of gap3, for FORMAT_TRK */
+};
+
+struct ftfmtstatus {
+ unsigned int ft_segment; /* segment currently being formatted */
+};
+
+struct ftfmtverify {
+ unsigned int ft_segment; /* segment to verify */
+ unsigned long ft_bsm; /* bsm as result of VERIFY cmd */
+};
+
+struct mtftformat {
+ unsigned int fmt_op; /* operation to perform */
+ union fmt_arg {
+ struct ftfmtparms fmt_parms; /* format parameters */
+ struct ftfmttrack fmt_track; /* ctrl while formatting */
+ struct ftfmtstatus fmt_status;
+ struct ftfmtverify fmt_verify; /* for verifying */
+ } fmt_arg;
+};
+
+/* mag tape io control commands */
+#define MTIOCTOP _IOW('m', 1, struct mtop) /* do a mag tape op */
+#define MTIOCGET _IOR('m', 2, struct mtget) /* get tape status */
+#define MTIOCPOS _IOR('m', 3, struct mtpos) /* get tape position */
+
+/* The next two are used by the QIC-02 driver for runtime reconfiguration.
+ * See tpqic02.h for struct mtconfiginfo.
+ */
+#define MTIOCGETCONFIG _IOR('m', 4, struct mtconfiginfo) /* get tape config */
+#define MTIOCSETCONFIG _IOW('m', 5, struct mtconfiginfo) /* set tape config */
+
+/* the next six are used by the floppy ftape drivers and its frontends
+ * sorry, but MTIOCTOP commands are write only.
+ */
+#define MTIOCRDFTSEG _IOWR('m', 6, struct mtftseg) /* read a segment */
+#define MTIOCWRFTSEG _IOWR('m', 7, struct mtftseg) /* write a segment */
+#define MTIOCVOLINFO _IOR('m', 8, struct mtvolinfo) /* info about volume */
+#define MTIOCGETSIZE _IOR('m', 9, struct mttapesize)/* get cartridge size*/
+#define MTIOCFTFORMAT _IOWR('m', 10, struct mtftformat) /* format ftape */
+#define MTIOCFTCMD _IOWR('m', 11, struct mtftcmd) /* send QIC-117 cmd */
+
+/* Generic Mag Tape (device independent) status macros for examining
+ * mt_gstat -- HP-UX compatible.
+ * There is room for more generic status bits here, but I don't
+ * know which of them are reserved. At least three or so should
+ * be added to make this really useful.
+ */
+#define GMT_EOF(x) ((x) & 0x80000000)
+#define GMT_BOT(x) ((x) & 0x40000000)
+#define GMT_EOT(x) ((x) & 0x20000000)
+#define GMT_SM(x) ((x) & 0x10000000) /* DDS setmark */
+#define GMT_EOD(x) ((x) & 0x08000000) /* DDS EOD */
+#define GMT_WR_PROT(x) ((x) & 0x04000000)
+/* #define GMT_ ? ((x) & 0x02000000) */
+#define GMT_ONLINE(x) ((x) & 0x01000000)
+#define GMT_D_6250(x) ((x) & 0x00800000)
+#define GMT_D_1600(x) ((x) & 0x00400000)
+#define GMT_D_800(x) ((x) & 0x00200000)
+/* #define GMT_ ? ((x) & 0x00100000) */
+/* #define GMT_ ? ((x) & 0x00080000) */
+#define GMT_DR_OPEN(x) ((x) & 0x00040000) /* door open (no tape) */
+/* #define GMT_ ? ((x) & 0x00020000) */
+#define GMT_IM_REP_EN(x) ((x) & 0x00010000) /* immediate report mode */
+/* 16 generic status bits unused */
+
+
+/* SCSI-tape specific definitions */
+/* Bitfield shifts in the status */
+#define MT_ST_BLKSIZE_SHIFT 0
+#define MT_ST_BLKSIZE_MASK 0xffffff
+#define MT_ST_DENSITY_SHIFT 24
+#define MT_ST_DENSITY_MASK 0xff000000
+
+#define MT_ST_SOFTERR_SHIFT 0
+#define MT_ST_SOFTERR_MASK 0xffff
+
+/* Bitfields for the MTSETDRVBUFFER ioctl */
+#define MT_ST_OPTIONS 0xf0000000
+#define MT_ST_BOOLEANS 0x10000000
+#define MT_ST_SETBOOLEANS 0x30000000
+#define MT_ST_CLEARBOOLEANS 0x40000000
+#define MT_ST_WRITE_THRESHOLD 0x20000000
+#define MT_ST_DEF_BLKSIZE 0x50000000
+#define MT_ST_DEF_OPTIONS 0x60000000
+#define MT_ST_TIMEOUTS 0x70000000
+#define MT_ST_SET_TIMEOUT (MT_ST_TIMEOUTS | 0x000000)
+#define MT_ST_SET_LONG_TIMEOUT (MT_ST_TIMEOUTS | 0x100000)
+
+#define MT_ST_BUFFER_WRITES 0x1
+#define MT_ST_ASYNC_WRITES 0x2
+#define MT_ST_READ_AHEAD 0x4
+#define MT_ST_DEBUGGING 0x8
+#define MT_ST_TWO_FM 0x10
+#define MT_ST_FAST_MTEOM 0x20
+#define MT_ST_AUTO_LOCK 0x40
+#define MT_ST_DEF_WRITES 0x80
+#define MT_ST_CAN_BSR 0x100
+#define MT_ST_NO_BLKLIMS 0x200
+#define MT_ST_CAN_PARTITIONS 0x400
+#define MT_ST_SCSI2LOGICAL 0x800
+#define MT_ST_SYSV 0x1000
+
+/* The mode parameters to be controlled. Parameter chosen with bits 20-28 */
+#define MT_ST_CLEAR_DEFAULT 0xfffff
+#define MT_ST_DEF_DENSITY (MT_ST_DEF_OPTIONS | 0x100000)
+#define MT_ST_DEF_COMPRESSION (MT_ST_DEF_OPTIONS | 0x200000)
+#define MT_ST_DEF_DRVBUFFER (MT_ST_DEF_OPTIONS | 0x300000)
+
+/* The offset for the arguments for the special HP changer load command. */
+#define MT_ST_HPLOADER_OFFSET 10000
+
+/* Specify default tape device. */
+#ifndef DEFTAPE
+#define DEFTAPE "/dev/tape/0"
+#endif
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/param.h b/mdk-stage1/dietlibc/include/sys/param.h
index 05f4d40e2..0744dccdb 100644
--- a/mdk-stage1/dietlibc/include/sys/param.h
+++ b/mdk-stage1/dietlibc/include/sys/param.h
@@ -3,6 +3,26 @@
#include <limits.h>
-#define MAXPATHLEN PATH_MAX
+#define MAXPATHLEN PATH_MAX
+#define MAXHOSTNAMELEN 64
+#define NGROUPS 32
+#define NOGROUP (-1)
+
+#undef MIN
+#undef MAX
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#define MAX(a,b) (((a)>(b))?(a):(b))
+
+#ifdef __alpha__
+#define HZ 1024
+#else
+#define HZ 100
+#endif
+
+#ifndef howmany
+# define howmany(x, y) (((x)+((y)-1))/(y))
+#endif
+#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
+#define powerof2(x) ((((x)-1)&(x))==0)
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/poll.h b/mdk-stage1/dietlibc/include/sys/poll.h
index adce26687..d17f6422c 100644
--- a/mdk-stage1/dietlibc/include/sys/poll.h
+++ b/mdk-stage1/dietlibc/include/sys/poll.h
@@ -3,7 +3,31 @@
#include <sys/cdefs.h>
-#include <linux/poll.h>
+#define POLLIN 0x0001
+#define POLLPRI 0x0002
+#define POLLOUT 0x0004
+#define POLLERR 0x0008
+#define POLLHUP 0x0010
+#define POLLNVAL 0x0020
+#define POLLRDNORM 0x0040
+#define POLLRDBAND 0x0080
+#define POLLWRBAND 0x0200
+#define POLLMSG 0x0400
+/* POLLREMOVE is for /dev/epoll (/dev/misc/eventpoll),
+ * a new event notification mechanism for 2.6 */
+#define POLLREMOVE 0x1000
+
+#if defined(__sparc__) || defined (__mips__)
+#define POLLWRNORM POLLOUT
+#else
+#define POLLWRNORM 0x0100
+#endif
+
+struct pollfd {
+ int fd;
+ short events;
+ short revents;
+};
extern int poll(struct pollfd *ufds, unsigned int nfds, int timeout) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sys/ppc-ioctl.h b/mdk-stage1/dietlibc/include/sys/ppc-ioctl.h
new file mode 100644
index 000000000..c3de6d254
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/ppc-ioctl.h
@@ -0,0 +1,164 @@
+
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+#define _IOC_SIZEBITS 13
+#define _IOC_DIRBITS 3
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit.
+ * And this turns out useful to catch old ioctl numbers in header
+ * files for us.
+ */
+#define _IOC_NONE 1U
+#define _IOC_READ 2U
+#define _IOC_WRITE 4U
+
+#define _IOC(dir,type,nr,size) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
+/* used to create numbers */
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode them.. */
+#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* various drivers, such as the pcmcia stuff, need these... */
+#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
+
+#define FIOCLEX _IO('f', 1)
+#define FIONCLEX _IO('f', 2)
+#define FIOASYNC _IOW('f', 125, int)
+#define FIONBIO _IOW('f', 126, int)
+#define FIONREAD _IOR('f', 127, int)
+#define TIOCINQ FIONREAD
+#define FIOQSIZE _IOR('f', 128, loff_t)
+
+#define TIOCGETP _IOR('t', 8, struct sgttyb)
+#define TIOCSETP _IOW('t', 9, struct sgttyb)
+#define TIOCSETN _IOW('t', 10, struct sgttyb) /* TIOCSETP wo flush */
+
+#define TIOCSETC _IOW('t', 17, struct tchars)
+#define TIOCGETC _IOR('t', 18, struct tchars)
+#define TCGETS _IOR('t', 19, struct termios)
+#define TCSETS _IOW('t', 20, struct termios)
+#define TCSETSW _IOW('t', 21, struct termios)
+#define TCSETSF _IOW('t', 22, struct termios)
+
+#define TCGETA _IOR('t', 23, struct termio)
+#define TCSETA _IOW('t', 24, struct termio)
+#define TCSETAW _IOW('t', 25, struct termio)
+#define TCSETAF _IOW('t', 28, struct termio)
+
+#define TCSBRK _IO('t', 29)
+#define TCXONC _IO('t', 30)
+#define TCFLSH _IO('t', 31)
+
+#define TIOCSWINSZ _IOW('t', 103, struct winsize)
+#define TIOCGWINSZ _IOR('t', 104, struct winsize)
+#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
+#define TIOCSTOP _IO('t', 111) /* stop output, like ^S */
+#define TIOCOUTQ _IOR('t', 115, int) /* output queue size */
+
+#define TIOCGLTC _IOR('t', 116, struct ltchars)
+#define TIOCSLTC _IOW('t', 117, struct ltchars)
+#define TIOCSPGRP _IOW('t', 118, int)
+#define TIOCGPGRP _IOR('t', 119, int)
+
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+
+#define TIOCSTI 0x5412
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+# define TIOCM_LE 0x001
+# define TIOCM_DTR 0x002
+# define TIOCM_RTS 0x004
+# define TIOCM_ST 0x008
+# define TIOCM_SR 0x010
+# define TIOCM_CTS 0x020
+# define TIOCM_CAR 0x040
+# define TIOCM_RNG 0x080
+# define TIOCM_DSR 0x100
+# define TIOCM_CD TIOCM_CAR
+# define TIOCM_RI TIOCM_RNG
+
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+# define TIOCPKT_DATA 0
+# define TIOCPKT_FLUSHREAD 1
+# define TIOCPKT_FLUSHWRITE 2
+# define TIOCPKT_STOP 4
+# define TIOCPKT_START 8
+# define TIOCPKT_NOSTOP 16
+# define TIOCPKT_DOSTOP 32
+
+
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
+#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */
+#define TIOCSBRK 0x5427 /* BSD compatibility */
+#define TIOCCBRK 0x5428 /* BSD compatibility */
+#define TIOCGSID 0x5429 /* Return the session ID of FD */
+#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
+
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
+#define TIOCSERGETLSR 0x5459 /* Get line status register */
+ /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
+# define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
+#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
+
+#if 0 /* These are defined this way on Alpha - maybe later. */
+/* Socket-level I/O control calls. */
+
+#define FIOGETOWN _IOR('f', 123, int)
+#define FIOSETOWN _IOW('f', 124, int)
+
+#define SIOCATMARK _IOR('s', 7, int)
+#define SIOCSPGRP _IOW('s', 8, pid_t)
+#define SIOCGPGRP _IOR('s', 9, pid_t)
+
+#define SIOCGSTAMP 0x8906 /* Get stamp - linux-specific */
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/prctl.h b/mdk-stage1/dietlibc/include/sys/prctl.h
new file mode 100644
index 000000000..26749cbd4
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/prctl.h
@@ -0,0 +1,8 @@
+#ifndef _SYS_PRCTL_H
+#define _SYS_PRCTL_H
+
+#include <sys/cdefs.h>
+
+int prctl(int option, unsigned long arg2, unsigned long arg3 , unsigned long arg4, unsigned long arg5) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/ptrace.h b/mdk-stage1/dietlibc/include/sys/ptrace.h
index 9dd730bc6..b09d3ac3a 100644
--- a/mdk-stage1/dietlibc/include/sys/ptrace.h
+++ b/mdk-stage1/dietlibc/include/sys/ptrace.h
@@ -3,8 +3,844 @@
#include <sys/cdefs.h>
-#include <linux/ptrace.h>
+#define PTRACE_TRACEME 0
+#define PTRACE_PEEKTEXT 1
+#define PTRACE_PEEKDATA 2
+#define PTRACE_PEEKUSR 3
+#define PTRACE_PEEKUSER PTRACE_PEEKUSR
+#define PTRACE_POKETEXT 4
+#define PTRACE_POKEDATA 5
+#define PTRACE_POKEUSR 6
+#define PTRACE_POKEUSER PTRACE_POKEUSR
+#define PTRACE_CONT 7
+#define PTRACE_KILL 8
+#define PTRACE_SINGLESTEP 9
-extern long int ptrace (int request, ...) __THROW;
+#define PTRACE_ATTACH 0x10
+#define PTRACE_DETACH 0x11
+
+#define PTRACE_SYSCALL 24
+
+#define PT_TRACE_ME PTRACE_TRACEME
+#define PT_READ_I PTRACE_PEEKTEXT
+#define PT_READ_D PTRACE_PEEKDATA
+#define PT_READ_U PTRACE_READ_U
+#define PT_WRITE_I PTRACE_POKETEXT
+#define PT_WRITE_D PTRACE_POKEDATA
+#define PT_WRITE_U PTRACE_POKEUSER
+#define PT_CONTINUE PTRACE_CONT
+#define PT_KILL PTRACE_KILL
+#define PT_STEP PTRACE_SINGLESTEP
+#define PT_GETREGS PTRACE_GETREGS
+#define PT_SETREGS PTRACE_SETREGS
+#define PT_GETFPREGS PTRACE_GETFPREGS
+#define PT_SETFPREGS PTRACE_SETFPREGS
+#define PT_ATTACH PTRACE_ATTACH
+#define PT_DETACH PTRACE_DETACH
+
+#if defined(__i386__)
+#define EBX 0
+#define ECX 1
+#define EDX 2
+#define ESI 3
+#define EDI 4
+#define EBP 5
+#define EAX 6
+#define DS 7
+#define ES 8
+#define FS 9
+#define GS 10
+#define ORIG_EAX 11
+#define EIP 12
+#define CS 13
+#define EFL 14
+#define UESP 15
+#define SS 16
+#define FRAME_SIZE 17
+
+/* this struct defines the way the registers are stored on the
+ stack during a system call. */
+
+struct pt_regs {
+ long ebx;
+ long ecx;
+ long edx;
+ long esi;
+ long edi;
+ long ebp;
+ long eax;
+ int xds;
+ int xes;
+ long orig_eax;
+ long eip;
+ int xcs;
+ long eflags;
+ long esp;
+ int xss;
+};
+
+/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
+#define PTRACE_GETREGS 12
+#define PTRACE_SETREGS 13
+#define PTRACE_GETFPREGS 14
+#define PTRACE_SETFPREGS 15
+#define PTRACE_GETFPXREGS 18
+#define PTRACE_SETFPXREGS 19
+
+#define PTRACE_SETOPTIONS 21
+
+/* options set using PTRACE_SETOPTIONS */
+#define PTRACE_O_TRACESYSGOOD 0x00000001
+
+#elif defined(__s390__)
+
+#define PT_PSWMASK 0x00
+#define PT_PSWADDR 0x04
+#define PT_GPR0 0x08
+#define PT_GPR1 0x0C
+#define PT_GPR2 0x10
+#define PT_GPR3 0x14
+#define PT_GPR4 0x18
+#define PT_GPR5 0x1C
+#define PT_GPR6 0x20
+#define PT_GPR7 0x24
+#define PT_GPR8 0x28
+#define PT_GPR9 0x2C
+#define PT_GPR10 0x30
+#define PT_GPR11 0x34
+#define PT_GPR12 0x38
+#define PT_GPR13 0x3C
+#define PT_GPR14 0x40
+#define PT_GPR15 0x44
+#define PT_ACR0 0x48
+#define PT_ACR1 0x4C
+#define PT_ACR2 0x50
+#define PT_ACR3 0x54
+#define PT_ACR4 0x58
+#define PT_ACR5 0x5C
+#define PT_ACR6 0x60
+#define PT_ACR7 0x64
+#define PT_ACR8 0x68
+#define PT_ACR9 0x6C
+#define PT_ACR10 0x70
+#define PT_ACR11 0x74
+#define PT_ACR12 0x78
+#define PT_ACR13 0x7C
+#define PT_ACR14 0x80
+#define PT_ACR15 0x84
+#define PT_ORIGGPR2 0x88
+#define PT_FPC 0x90
+#define PT_FPR0_HI 0x98
+#define PT_FPR0_LO 0x9C
+#define PT_FPR1_HI 0xA0
+#define PT_FPR1_LO 0xA4
+#define PT_FPR2_HI 0xA8
+#define PT_FPR2_LO 0xAC
+#define PT_FPR3_HI 0xB0
+#define PT_FPR3_LO 0xB4
+#define PT_FPR4_HI 0xB8
+#define PT_FPR4_LO 0xBC
+#define PT_FPR5_HI 0xC0
+#define PT_FPR5_LO 0xC4
+#define PT_FPR6_HI 0xC8
+#define PT_FPR6_LO 0xCC
+#define PT_FPR7_HI 0xD0
+#define PT_FPR7_LO 0xD4
+#define PT_FPR8_HI 0xD8
+#define PT_FPR8_LO 0XDC
+#define PT_FPR9_HI 0xE0
+#define PT_FPR9_LO 0xE4
+#define PT_FPR10_HI 0xE8
+#define PT_FPR10_LO 0xEC
+#define PT_FPR11_HI 0xF0
+#define PT_FPR11_LO 0xF4
+#define PT_FPR12_HI 0xF8
+#define PT_FPR12_LO 0xFC
+#define PT_FPR13_HI 0x100
+#define PT_FPR13_LO 0x104
+#define PT_FPR14_HI 0x108
+#define PT_FPR14_LO 0x10C
+#define PT_FPR15_HI 0x110
+#define PT_FPR15_LO 0x114
+#define PT_CR_9 0x118
+#define PT_CR_10 0x11C
+#define PT_CR_11 0x120
+#define PT_IEEE_IP 0x13C
+#define PT_LASTOFF PT_IEEE_IP
+#define PT_ENDREGS 0x140-1
+
+#define NUM_GPRS 16
+#define NUM_FPRS 16
+#define NUM_CRS 16
+#define NUM_ACRS 16
+#define GPR_SIZE 4
+#define FPR_SIZE 8
+#define FPC_SIZE 4
+#define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */
+#define CR_SIZE 4
+#define ACR_SIZE 4
+
+#define STACK_FRAME_OVERHEAD 96 /* size of minimum stack frame */
+
+#include <inttypes.h>
+
+/* this typedef defines how a Program Status Word looks like */
+typedef struct {
+ uint32_t mask;
+ uint32_t addr;
+} psw_t __attribute__ ((aligned(8)));
+
+typedef union
+{
+ float f;
+ double d;
+ uint64_t ui;
+ struct
+ {
+ uint32_t hi;
+ uint32_t lo;
+ } fp;
+} freg_t;
+
+typedef struct
+{
+ uint32_t fpc;
+ freg_t fprs[NUM_FPRS];
+} s390_fp_regs;
+
+#define FPC_EXCEPTION_MASK 0xF8000000
+#define FPC_FLAGS_MASK 0x00F80000
+#define FPC_DXC_MASK 0x0000FF00
+#define FPC_RM_MASK 0x00000003
+#define FPC_VALID_MASK 0xF8F8FF03
+
+typedef struct
+{
+ psw_t psw;
+ uint32_t gprs[NUM_GPRS];
+ uint32_t acrs[NUM_ACRS];
+ uint32_t orig_gpr2;
+} s390_regs;
+
+struct pt_regs
+{
+ psw_t psw;
+ uint32_t gprs[NUM_GPRS];
+ uint32_t acrs[NUM_ACRS];
+ uint32_t orig_gpr2;
+ uint32_t trap;
+ uint32_t old_ilc;
+};
+
+typedef struct
+{
+ uint32_t cr[3];
+} per_cr_words __attribute__((packed));
+
+#define PER_EM_MASK 0xE8000000
+
+typedef uint32_t addr_t;
+
+typedef struct
+{
+ unsigned em_branching : 1;
+ unsigned em_instruction_fetch : 1;
+ /*
+ * Switching on storage alteration automatically fixes
+ * the storage alteration event bit in the users std.
+ */
+ unsigned em_storage_alteration : 1;
+ unsigned em_gpr_alt_unused : 1;
+ unsigned em_store_real_address : 1;
+ unsigned : 3;
+ unsigned branch_addr_ctl : 1;
+ unsigned : 1;
+ unsigned storage_alt_space_ctl : 1;
+ unsigned : 21;
+ addr_t starting_addr;
+ addr_t ending_addr;
+} per_cr_bits __attribute__((packed));
+
+typedef struct
+{
+ uint16_t perc_atmid; /* 0x096 */
+ uint32_t address; /* 0x098 */
+ uint8_t access_id; /* 0x0a1 */
+} per_lowcore_words __attribute__((packed));
+
+typedef struct
+{
+ unsigned perc_branching : 1; /* 0x096 */
+ unsigned perc_instruction_fetch : 1;
+ unsigned perc_storage_alteration : 1;
+ unsigned perc_gpr_alt_unused : 1;
+ unsigned perc_store_real_address : 1;
+ unsigned : 4;
+ unsigned atmid_validity_bit : 1;
+ unsigned atmid_psw_bit_32 : 1;
+ unsigned atmid_psw_bit_5 : 1;
+ unsigned atmid_psw_bit_16 : 1;
+ unsigned atmid_psw_bit_17 : 1;
+ unsigned si : 2;
+ addr_t address; /* 0x098 */
+ unsigned : 4; /* 0x0a1 */
+ unsigned access_id : 4;
+} per_lowcore_bits __attribute__((packed));
+
+typedef struct
+{
+ union {
+ per_cr_words words;
+ per_cr_bits bits;
+ } control_regs __attribute__((packed));
+ /*
+ * Use these flags instead of setting em_instruction_fetch
+ * directly they are used so that single stepping can be
+ * switched on & off while not affecting other tracing
+ */
+ unsigned single_step : 1;
+ unsigned instruction_fetch : 1;
+ unsigned : 30;
+ /*
+ * These addresses are copied into cr10 & cr11 if single
+ * stepping is switched off
+ */
+ uint32_t starting_addr;
+ uint32_t ending_addr;
+ union {
+ per_lowcore_words words;
+ per_lowcore_bits bits;
+ } lowcore;
+} per_struct __attribute__((packed));
+
+typedef struct
+{
+ uint32_t len;
+ addr_t kernel_addr;
+ addr_t process_addr;
+} ptrace_area;
+
+/*
+ * S/390 specific non posix ptrace requests. I chose unusual values so
+ * they are unlikely to clash with future ptrace definitions.
+ */
+#define PTRACE_PEEKUSR_AREA 0x5000
+#define PTRACE_POKEUSR_AREA 0x5001
+#define PTRACE_PEEKTEXT_AREA 0x5002
+#define PTRACE_PEEKDATA_AREA 0x5003
+#define PTRACE_POKETEXT_AREA 0x5004
+#define PTRACE_POKEDATA_AREA 0x5005
+/*
+ * PT_PROT definition is loosely based on hppa bsd definition in
+ * gdb/hppab-nat.c
+ */
+#define PTRACE_PROT 21
+
+typedef enum
+{
+ ptprot_set_access_watchpoint,
+ ptprot_set_write_watchpoint,
+ ptprot_disable_watchpoint
+} ptprot_flags;
+
+typedef struct
+{
+ addr_t lowaddr;
+ addr_t hiaddr;
+ ptprot_flags prot;
+} ptprot_area;
+
+/* Sequence of bytes for breakpoint illegal instruction. */
+#define S390_BREAKPOINT {0x0,0x1}
+#define S390_BREAKPOINT_U16 ((uint16_t)0x0001)
+#define S390_SYSCALL_OPCODE ((uint16_t)0x0a00)
+#define S390_SYSCALL_SIZE 2
+
+/*
+ * The user_regs_struct defines the way the user registers are
+ * store on the stack for signal handling.
+ */
+struct user_regs_struct
+{
+ psw_t psw;
+ uint32_t gprs[NUM_GPRS];
+ uint32_t acrs[NUM_ACRS];
+ uint32_t orig_gpr2;
+ s390_fp_regs fp_regs;
+ /*
+ * These per registers are in here so that gdb can modify them
+ * itself as there is no "official" ptrace interface for hardware
+ * watchpoints. This is the way intel does it.
+ */
+ per_struct per_info;
+ addr_t ieee_instruction_pointer;
+ /* Used to give failing instruction back to user for ieee exceptions */
+};
+
+#elif defined(__arm__)
+
+/* this assumes armv */
+#define USR26_MODE 0x00
+#define FIQ26_MODE 0x01
+#define IRQ26_MODE 0x02
+#define SVC26_MODE 0x03
+#define USR_MODE 0x10
+#define FIQ_MODE 0x11
+#define IRQ_MODE 0x12
+#define SVC_MODE 0x13
+#define ABT_MODE 0x17
+#define UND_MODE 0x1b
+#define SYSTEM_MODE 0x1f
+#define MODE_MASK 0x1f
+#define T_BIT 0x20
+#define F_BIT 0x40
+#define I_BIT 0x80
+#define CC_V_BIT (1 << 28)
+#define CC_C_BIT (1 << 29)
+#define CC_Z_BIT (1 << 30)
+#define CC_N_BIT (1 << 31)
+#define PCMASK 0
+
+struct pt_regs {
+ long uregs[18];
+};
+
+#define ARM_cpsr uregs[16]
+#define ARM_pc uregs[15]
+#define ARM_lr uregs[14]
+#define ARM_sp uregs[13]
+#define ARM_ip uregs[12]
+#define ARM_fp uregs[11]
+#define ARM_r10 uregs[10]
+#define ARM_r9 uregs[9]
+#define ARM_r8 uregs[8]
+#define ARM_r7 uregs[7]
+#define ARM_r6 uregs[6]
+#define ARM_r5 uregs[5]
+#define ARM_r4 uregs[4]
+#define ARM_r3 uregs[3]
+#define ARM_r2 uregs[2]
+#define ARM_r1 uregs[1]
+#define ARM_r0 uregs[0]
+#define ARM_ORIG_r0 uregs[17]
+
+#elif defined(__alpha__)
+
+struct pt_regs {
+ unsigned long r0;
+ unsigned long r1;
+ unsigned long r2;
+ unsigned long r3;
+ unsigned long r4;
+ unsigned long r5;
+ unsigned long r6;
+ unsigned long r7;
+ unsigned long r8;
+ unsigned long r19;
+ unsigned long r20;
+ unsigned long r21;
+ unsigned long r22;
+ unsigned long r23;
+ unsigned long r24;
+ unsigned long r25;
+ unsigned long r26;
+ unsigned long r27;
+ unsigned long r28;
+ unsigned long hae;
+/* JRP - These are the values provided to a0-a2 by PALcode */
+ unsigned long trap_a0;
+ unsigned long trap_a1;
+ unsigned long trap_a2;
+/* These are saved by PAL-code: */
+ unsigned long ps;
+ unsigned long pc;
+ unsigned long gp;
+ unsigned long r16;
+ unsigned long r17;
+ unsigned long r18;
+};
+
+struct switch_stack {
+ unsigned long r9;
+ unsigned long r10;
+ unsigned long r11;
+ unsigned long r12;
+ unsigned long r13;
+ unsigned long r14;
+ unsigned long r15;
+ unsigned long r26;
+ unsigned long fp[32]; /* fp[31] is fpcr */
+};
+
+#elif defined(__mips__)
+
+/* 0 - 31 are integer registers, 32 - 63 are fp registers. */
+#define FPR_BASE 32
+#define PC 64
+#define CAUSE 65
+#define BADVADDR 66
+#define MMHI 67
+#define MMLO 68
+#define FPC_CSR 69
+#define FPC_EIR 70
+
+struct pt_regs {
+ /* Pad bytes for argument save space on the stack. */
+ unsigned long pad0[6];
+ /* Saved main processor registers. */
+ unsigned long regs[32];
+ /* Other saved registers. */
+ unsigned long lo;
+ unsigned long hi;
+ /* saved cp0 registers */
+ unsigned long cp0_epc;
+ unsigned long cp0_badvaddr;
+ unsigned long cp0_status;
+ unsigned long cp0_cause;
+};
+
+#elif defined(__sparc__)
+
+struct pt_regs {
+ unsigned long psr;
+ unsigned long pc;
+ unsigned long npc;
+ unsigned long y;
+ unsigned long u_regs[16]; /* globals and ins */
+};
+
+#define UREG_G0 0
+#define UREG_G1 1
+#define UREG_G2 2
+#define UREG_G3 3
+#define UREG_G4 4
+#define UREG_G5 5
+#define UREG_G6 6
+#define UREG_G7 7
+#define UREG_I0 8
+#define UREG_I1 9
+#define UREG_I2 10
+#define UREG_I3 11
+#define UREG_I4 12
+#define UREG_I5 13
+#define UREG_I6 14
+#define UREG_I7 15
+#define UREG_WIM UREG_G0
+#define UREG_FADDR UREG_G0
+#define UREG_FP UREG_I6
+#define UREG_RETPC UREG_I7
+
+/* A register window */
+struct reg_window {
+ unsigned long locals[8];
+ unsigned long ins[8];
+};
+
+/* A Sparc stack frame */
+struct sparc_stackf {
+ unsigned long locals[8];
+ unsigned long ins[6];
+ struct sparc_stackf *fp;
+ unsigned long callers_pc;
+ char *structptr;
+ unsigned long xargs[6];
+ unsigned long xxargs[1];
+};
+
+#define TRACEREG_SZ sizeof(struct pt_regs)
+#define STACKFRAME_SZ sizeof(struct sparc_stackf)
+#define REGWIN_SZ sizeof(struct reg_window)
+
+/* These are for pt_regs. */
+#define PT_PSR 0x0
+#define PT_PC 0x4
+#define PT_NPC 0x8
+#define PT_Y 0xc
+#define PT_G0 0x10
+#define PT_WIM PT_G0
+#define PT_G1 0x14
+#define PT_G2 0x18
+#define PT_G3 0x1c
+#define PT_G4 0x20
+#define PT_G5 0x24
+#define PT_G6 0x28
+#define PT_G7 0x2c
+#define PT_I0 0x30
+#define PT_I1 0x34
+#define PT_I2 0x38
+#define PT_I3 0x3c
+#define PT_I4 0x40
+#define PT_I5 0x44
+#define PT_I6 0x48
+#define PT_FP PT_I6
+#define PT_I7 0x4c
+
+/* Reg_window offsets */
+#define RW_L0 0x00
+#define RW_L1 0x04
+#define RW_L2 0x08
+#define RW_L3 0x0c
+#define RW_L4 0x10
+#define RW_L5 0x14
+#define RW_L6 0x18
+#define RW_L7 0x1c
+#define RW_I0 0x20
+#define RW_I1 0x24
+#define RW_I2 0x28
+#define RW_I3 0x2c
+#define RW_I4 0x30
+#define RW_I5 0x34
+#define RW_I6 0x38
+#define RW_I7 0x3c
+
+/* Stack_frame offsets */
+#define SF_L0 0x00
+#define SF_L1 0x04
+#define SF_L2 0x08
+#define SF_L3 0x0c
+#define SF_L4 0x10
+#define SF_L5 0x14
+#define SF_L6 0x18
+#define SF_L7 0x1c
+#define SF_I0 0x20
+#define SF_I1 0x24
+#define SF_I2 0x28
+#define SF_I3 0x2c
+#define SF_I4 0x30
+#define SF_I5 0x34
+#define SF_FP 0x38
+#define SF_PC 0x3c
+#define SF_RETP 0x40
+#define SF_XARG0 0x44
+#define SF_XARG1 0x48
+#define SF_XARG2 0x4c
+#define SF_XARG3 0x50
+#define SF_XARG4 0x54
+#define SF_XARG5 0x58
+#define SF_XXARG 0x5c
+
+/* Stuff for the ptrace system call */
+#define PTRACE_SUNATTACH 10
+#define PTRACE_SUNDETACH 11
+#define PTRACE_GETREGS 12
+#define PTRACE_SETREGS 13
+#define PTRACE_GETFPREGS 14
+#define PTRACE_SETFPREGS 15
+#define PTRACE_READDATA 16
+#define PTRACE_WRITEDATA 17
+#define PTRACE_READTEXT 18
+#define PTRACE_WRITETEXT 19
+#define PTRACE_GETFPAREGS 20
+#define PTRACE_SETFPAREGS 21
+
+#define PTRACE_GETUCODE 29 /* stupid bsd-ism */
+
+#elif defined(__powerpc__)
+
+struct pt_regs {
+ unsigned long gpr[32];
+ unsigned long nip;
+ unsigned long msr;
+ unsigned long orig_gpr3; /* Used for restarting system calls */
+ unsigned long ctr;
+ unsigned long link;
+ unsigned long xer;
+ unsigned long ccr;
+ unsigned long mq; /* 601 only (not used at present) */
+ /* Used on APUS to hold IPL value. */
+ unsigned long trap; /* Reason for being here */
+ unsigned long dar; /* Fault registers */
+ unsigned long dsisr;
+ unsigned long result; /* Result of a system call */
+};
+
+/*
+ * Offsets used by 'ptrace' system call interface.
+ * These can't be changed without breaking binary compatibility
+ * with MkLinux, etc.
+ */
+#define PT_R0 0
+#define PT_R1 1
+#define PT_R2 2
+#define PT_R3 3
+#define PT_R4 4
+#define PT_R5 5
+#define PT_R6 6
+#define PT_R7 7
+#define PT_R8 8
+#define PT_R9 9
+#define PT_R10 10
+#define PT_R11 11
+#define PT_R12 12
+#define PT_R13 13
+#define PT_R14 14
+#define PT_R15 15
+#define PT_R16 16
+#define PT_R17 17
+#define PT_R18 18
+#define PT_R19 19
+#define PT_R20 20
+#define PT_R21 21
+#define PT_R22 22
+#define PT_R23 23
+#define PT_R24 24
+#define PT_R25 25
+#define PT_R26 26
+#define PT_R27 27
+#define PT_R28 28
+#define PT_R29 29
+#define PT_R30 30
+#define PT_R31 31
+
+#define PT_NIP 32
+#define PT_MSR 33
+#define PT_CTR 35
+#define PT_LNK 36
+#define PT_XER 37
+#define PT_CCR 38
+#define PT_MQ 39
+
+#define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */
+#define PT_FPR31 (PT_FPR0 + 2*31)
+#define PT_FPSCR (PT_FPR0 + 2*32 + 1)
+
+#elif defined(__hppa__)
+
+#include <inttypes.h>
+
+struct pt_regs {
+ unsigned long gr[32]; /* PSW is in gr[0] */
+ uint64_t fr[32];
+ unsigned long sr[ 8];
+ unsigned long iasq[2];
+ unsigned long iaoq[2];
+ unsigned long cr27;
+ unsigned long pad0; /* available for other uses */
+ unsigned long orig_r28;
+ unsigned long ksp;
+ unsigned long kpc;
+ unsigned long sar; /* CR11 */
+ unsigned long iir; /* CR19 */
+ unsigned long isr; /* CR20 */
+ unsigned long ior; /* CR21 */
+ unsigned long ipsw; /* CR22 */
+};
+
+#define PTRACE_SINGLEBLOCK 12 /* resume execution until next branch */
+#define PTRACE_GETSIGINFO 13 /* get child's siginfo structure */
+#define PTRACE_SETSIGINFO 14 /* set child's siginfo structure */
+
+#elif defined(__ia64__)
+
+struct ia64_fpreg {
+ union {
+ unsigned long bits[2];
+ } u;
+} __attribute__ ((aligned (16)));
+
+struct pt_regs {
+ unsigned long cr_ipsr; /* interrupted task's psr */
+ unsigned long cr_iip; /* interrupted task's instruction pointer */
+ unsigned long cr_ifs; /* interrupted task's function state */
+ unsigned long ar_unat; /* interrupted task's NaT register (preserved) */
+ unsigned long ar_pfs; /* prev function state */
+ unsigned long ar_rsc; /* RSE configuration */
+ unsigned long ar_rnat; /* RSE NaT */
+ unsigned long ar_bspstore; /* RSE bspstore */
+ unsigned long pr; /* 64 predicate registers (1 bit each) */
+ unsigned long b6; /* scratch */
+ unsigned long loadrs; /* size of dirty partition << 16 */
+ unsigned long r1; /* the gp pointer */
+ unsigned long r2; /* scratch */
+ unsigned long r3; /* scratch */
+ unsigned long r12; /* interrupted task's memory stack pointer */
+ unsigned long r13; /* thread pointer */
+ unsigned long r14; /* scratch */
+ unsigned long r15; /* scratch */
+ unsigned long r8; /* scratch (return value register 0) */
+ unsigned long r9; /* scratch (return value register 1) */
+ unsigned long r10; /* scratch (return value register 2) */
+ unsigned long r11; /* scratch (return value register 3) */
+ unsigned long r16; /* scratch */
+ unsigned long r17; /* scratch */
+ unsigned long r18; /* scratch */
+ unsigned long r19; /* scratch */
+ unsigned long r20; /* scratch */
+ unsigned long r21; /* scratch */
+ unsigned long r22; /* scratch */
+ unsigned long r23; /* scratch */
+ unsigned long r24; /* scratch */
+ unsigned long r25; /* scratch */
+ unsigned long r26; /* scratch */
+ unsigned long r27; /* scratch */
+ unsigned long r28; /* scratch */
+ unsigned long r29; /* scratch */
+ unsigned long r30; /* scratch */
+ unsigned long r31; /* scratch */
+ unsigned long ar_ccv; /* compare/exchange value (scratch) */
+ unsigned long ar_fpsr; /* floating point status (preserved) */
+ unsigned long b0; /* return pointer (bp) */
+ unsigned long b7; /* scratch */
+ struct ia64_fpreg f6; /* scratch */
+ struct ia64_fpreg f7; /* scratch */
+ struct ia64_fpreg f8; /* scratch */
+ struct ia64_fpreg f9; /* scratch */
+};
+
+struct switch_stack {
+ unsigned long caller_unat; /* user NaT collection register (preserved) */
+ unsigned long ar_fpsr; /* floating-point status register */
+
+ struct ia64_fpreg f2; /* preserved */
+ struct ia64_fpreg f3; /* preserved */
+ struct ia64_fpreg f4; /* preserved */
+ struct ia64_fpreg f5; /* preserved */
+
+ struct ia64_fpreg f10; /* scratch, but untouched by kernel */
+ struct ia64_fpreg f11; /* scratch, but untouched by kernel */
+ struct ia64_fpreg f12; /* scratch, but untouched by kernel */
+ struct ia64_fpreg f13; /* scratch, but untouched by kernel */
+ struct ia64_fpreg f14; /* scratch, but untouched by kernel */
+ struct ia64_fpreg f15; /* scratch, but untouched by kernel */
+ struct ia64_fpreg f16; /* preserved */
+ struct ia64_fpreg f17; /* preserved */
+ struct ia64_fpreg f18; /* preserved */
+ struct ia64_fpreg f19; /* preserved */
+ struct ia64_fpreg f20; /* preserved */
+ struct ia64_fpreg f21; /* preserved */
+ struct ia64_fpreg f22; /* preserved */
+ struct ia64_fpreg f23; /* preserved */
+ struct ia64_fpreg f24; /* preserved */
+ struct ia64_fpreg f25; /* preserved */
+ struct ia64_fpreg f26; /* preserved */
+ struct ia64_fpreg f27; /* preserved */
+ struct ia64_fpreg f28; /* preserved */
+ struct ia64_fpreg f29; /* preserved */
+ struct ia64_fpreg f30; /* preserved */
+ struct ia64_fpreg f31; /* preserved */
+
+ unsigned long r4; /* preserved */
+ unsigned long r5; /* preserved */
+ unsigned long r6; /* preserved */
+ unsigned long r7; /* preserved */
+
+ unsigned long b0; /* so we can force a direct return in copy_thread */
+ unsigned long b1;
+ unsigned long b2;
+ unsigned long b3;
+ unsigned long b4;
+ unsigned long b5;
+
+ unsigned long ar_pfs; /* previous function state */
+ unsigned long ar_lc; /* loop counter (preserved) */
+ unsigned long ar_unat; /* NaT bits for r4-r7 */
+ unsigned long ar_rnat; /* RSE NaT collection register */
+ unsigned long ar_bspstore; /* RSE dirty base (preserved) */
+ unsigned long pr; /* 64 predicate registers (1 bit each) */
+};
+
+#endif
+
+extern long int ptrace(int request, ...) __THROW;
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/reboot.h b/mdk-stage1/dietlibc/include/sys/reboot.h
index ba58d296a..b17a556e5 100644
--- a/mdk-stage1/dietlibc/include/sys/reboot.h
+++ b/mdk-stage1/dietlibc/include/sys/reboot.h
@@ -1,9 +1,26 @@
#ifndef _SYS_REBOOT_H
#define _SYS_REBOOT_H
-#include <linux/reboot.h>
+#define LINUX_REBOOT_MAGIC1 0xfee1dead
+#define LINUX_REBOOT_MAGIC2 672274793
+#define LINUX_REBOOT_MAGIC2A 85072278
+#define LINUX_REBOOT_MAGIC2B 369367448
+
+#define LINUX_REBOOT_CMD_RESTART 0x01234567
+#define LINUX_REBOOT_CMD_HALT 0xCDEF0123
+#define LINUX_REBOOT_CMD_CAD_ON 0x89ABCDEF
+#define LINUX_REBOOT_CMD_CAD_OFF 0x00000000
+#define LINUX_REBOOT_CMD_POWER_OFF 0x4321FEDC
+#define LINUX_REBOOT_CMD_RESTART2 0xA1B2C3D4
/* Reboot or halt the system. */
-int reboot (int flag, void *arg);
+int reboot (int flag);
+
+/* the glibc people changed their macro names :-/ */
+#define RB_AUTOBOOT 0x01234567
+#define RB_HALT_SYSTEM 0xcdef0123
+#define RB_ENABLE_CAD 0x89abcdef
+#define RB_DISABLE_CAD 0
+#define RB_POWER_OFF 0x4321fedc
#endif /* _SYS_REBOOT_H */
diff --git a/mdk-stage1/dietlibc/include/sys/resource.h b/mdk-stage1/dietlibc/include/sys/resource.h
index 442434cd1..df31b82ab 100644
--- a/mdk-stage1/dietlibc/include/sys/resource.h
+++ b/mdk-stage1/dietlibc/include/sys/resource.h
@@ -1,8 +1,59 @@
#ifndef _SYS_RESOURCE_H
#define _SYS_RESOURCE_H
+#include <time.h>
#include <sys/cdefs.h>
-#include <linux/resource.h>
+
+#define RUSAGE_SELF 0
+#define RUSAGE_CHILDREN (-1)
+#define RUSAGE_BOTH (-2) /* sys_wait4() uses this */
+
+struct rusage {
+ struct timeval ru_utime; /* user time used */
+ struct timeval ru_stime; /* system time used */
+ long ru_maxrss; /* maximum resident set size */
+ long ru_ixrss; /* integral shared memory size */
+ long ru_idrss; /* integral unshared data size */
+ long ru_isrss; /* integral unshared stack size */
+ long ru_minflt; /* page reclaims */
+ long ru_majflt; /* page faults */
+ long ru_nswap; /* swaps */
+ long ru_inblock; /* block input operations */
+ long ru_oublock; /* block output operations */
+ long ru_msgsnd; /* messages sent */
+ long ru_msgrcv; /* messages received */
+ long ru_nsignals; /* signals received */
+ long ru_nvcsw; /* voluntary context switches */
+ long ru_nivcsw; /* involuntary " */
+};
+
+struct rlimit {
+ unsigned long rlim_cur;
+ unsigned long rlim_max;
+};
+
+#define PRIO_MIN (-20)
+#define PRIO_MAX 20
+
+#define PRIO_PROCESS 0
+#define PRIO_PGRP 1
+#define PRIO_USER 2
+
+#define RLIMIT_CPU 0 /* CPU time in ms */
+#define RLIMIT_FSIZE 1 /* Maximum filesize */
+#define RLIMIT_DATA 2 /* max data size */
+#define RLIMIT_STACK 3 /* max stack size */
+#define RLIMIT_CORE 4 /* max core file size */
+#define RLIMIT_RSS 5 /* max resident set size */
+#define RLIMIT_NPROC 6 /* max number of processes */
+#define RLIMIT_NOFILE 7 /* max number of open files */
+#define RLIMIT_MEMLOCK 8 /* max locked-in-memory address space */
+#define RLIMIT_AS 9 /* address space limit */
+#define RLIMIT_LOCKS 10 /* maximum file locks held */
+
+#define RLIM_NLIMITS 11
+
+#define RLIM_INFINITY ((long)(~0UL>>1))
int getpriority(int which, int who) __THROW;
int setpriority(int which, int who, int prio) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sys/s390-ioctl.h b/mdk-stage1/dietlibc/include/sys/s390-ioctl.h
new file mode 100644
index 000000000..4682a0fda
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/s390-ioctl.h
@@ -0,0 +1,141 @@
+
+/* ioctl command encoding: 32 bits total, command in lower 16 bits,
+ * size of the parameter structure in the lower 14 bits of the
+ * upper 16 bits.
+ * Encoding the size of the parameter structure in the ioctl request
+ * is useful for catching programs compiled with old versions
+ * and to avoid overwriting user space outside the user buffer area.
+ * The highest 2 bits are reserved for indicating the ``access mode''.
+ * NOTE: This limits the max parameter size to 16kB -1 !
+ */
+
+/*
+ * The following is for compatibility across the various Linux
+ * platforms. The i386 ioctl numbering scheme doesn't really enforce
+ * a type field. De facto, however, the top 8 bits of the lower 16
+ * bits are indeed used as a type field, so we might just as well make
+ * this explicit here. Please be sure to use the decoding macros
+ * below from now on.
+ */
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+#define _IOC_SIZEBITS 14
+#define _IOC_DIRBITS 2
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits.
+ */
+#define _IOC_NONE 0U
+#define _IOC_WRITE 1U
+#define _IOC_READ 2U
+
+#define _IOC(dir,type,nr,size) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
+/* used to create numbers */
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode ioctl numbers.. */
+#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the drivers/sound files... */
+
+#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
+
+/* 0x54 is just a magic number to make these relatively unique ('T') */
+
+#define TCGETS 0x5401
+#define TCSETS 0x5402
+#define TCSETSW 0x5403
+#define TCSETSF 0x5404
+#define TCGETA 0x5405
+#define TCSETA 0x5406
+#define TCSETAW 0x5407
+#define TCSETAF 0x5408
+#define TCSBRK 0x5409
+#define TCXONC 0x540A
+#define TCFLSH 0x540B
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+#define TIOCGPGRP 0x540F
+#define TIOCSPGRP 0x5410
+#define TIOCOUTQ 0x5411
+#define TIOCSTI 0x5412
+#define TIOCGWINSZ 0x5413
+#define TIOCSWINSZ 0x5414
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define FIONREAD 0x541B
+#define TIOCINQ FIONREAD
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+#define FIONBIO 0x5421
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */
+#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */
+#define TIOCSBRK 0x5427 /* BSD compatibility */
+#define TIOCCBRK 0x5428 /* BSD compatibility */
+#define TIOCGSID 0x5429 /* Return the session ID of FD */
+#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
+
+#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */
+#define FIOCLEX 0x5451
+#define FIOASYNC 0x5452
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
+#define TIOCSERGETLSR 0x5459 /* Get line status register */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
+#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
+#define FIOQSIZE 0x545E
+
+/* Used for packet mode */
+#define TIOCPKT_DATA 0
+#define TIOCPKT_FLUSHREAD 1
+#define TIOCPKT_FLUSHWRITE 2
+#define TIOCPKT_STOP 4
+#define TIOCPKT_START 8
+#define TIOCPKT_NOSTOP 16
+#define TIOCPKT_DOSTOP 32
+
+#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
diff --git a/mdk-stage1/dietlibc/include/sys/select.h b/mdk-stage1/dietlibc/include/sys/select.h
index e69de29bb..ce67b8bee 100644
--- a/mdk-stage1/dietlibc/include/sys/select.h
+++ b/mdk-stage1/dietlibc/include/sys/select.h
@@ -0,0 +1,22 @@
+#ifndef _SYS_SELECT_H
+#define _SYS_SELECT_H
+
+typedef long int fd_mask;
+
+#define NFDBITS (8 * sizeof(unsigned long))
+#define FD_SETSIZE 1024
+#define __FDSET_LONGS (FD_SETSIZE/NFDBITS)
+#define __FDELT(d) ((d) / NFDBITS)
+#define __FDMASK(d) (1UL << ((d) % NFDBITS))
+
+typedef struct {
+ unsigned long fds_bits [__FDSET_LONGS];
+} fd_set;
+
+#define FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d))
+#define FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d))
+#define FD_ISSET(d, set) (((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0)
+#define FD_ZERO(set) \
+ ((void) memset ((void*) (set), 0, sizeof (fd_set)))
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/sem.h b/mdk-stage1/dietlibc/include/sys/sem.h
index cc182649c..ad16b5f53 100644
--- a/mdk-stage1/dietlibc/include/sys/sem.h
+++ b/mdk-stage1/dietlibc/include/sys/sem.h
@@ -1,11 +1,81 @@
#ifndef _SYS_SEM_H
#define _SYS_SEM_H
-#include <linux/sem.h>
#include <sys/ipc.h>
+/* semop flags */
+#define SEM_UNDO 0x1000 /* undo the operation on exit */
+
+/* semctl Command Definitions. */
+#define GETPID 11 /* get sempid */
+#define GETVAL 12 /* get semval */
+#define GETALL 13 /* get all semval's */
+#define GETNCNT 14 /* get semncnt */
+#define GETZCNT 15 /* get semzcnt */
+#define SETVAL 16 /* set semval */
+#define SETALL 17 /* set all semval's */
+
+/* ipcs ctl cmds */
+#define SEM_STAT 18
+#define SEM_INFO 19
+
+struct semid_ds {
+ struct ipc_perm sem_perm; /* permissions .. see ipc.h */
+ time_t sem_otime; /* last semop time */
+ time_t sem_ctime; /* last change time */
+ struct sem *sem_base; /* ptr to first semaphore in array */
+ struct sem_queue *sem_pending; /* pending operations to be processed */
+ struct sem_queue **sem_pending_last; /* last pending operation */
+ struct sem_undo *undo; /* undo requests on this array */
+ unsigned short sem_nsems; /* no. of semaphores in array */
+};
+
+/* semop system calls takes an array of these. */
+struct sembuf {
+ unsigned short sem_num; /* semaphore index in array */
+ short sem_op; /* semaphore operation */
+ short sem_flg; /* operation flags */
+};
+
+/* please complain to the glibc goons for the following misbehaviour */
+#if 0
+/* arg for semctl system calls. */
+union semun {
+ int val; /* value for SETVAL */
+ struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
+ unsigned short *array; /* array for GETALL & SETALL */
+ struct seminfo *__buf; /* buffer for IPC_INFO */
+ void *__pad;
+};
+#endif
+#define _SEM_SEMUN_UNDEFINED
+
+struct seminfo {
+ int semmap;
+ int semmni;
+ int semmns;
+ int semmnu;
+ int semmsl;
+ int semopm;
+ int semume;
+ int semusz;
+ int semvmx;
+ int semaem;
+};
+
+#define SEMMNI 128 /* <= IPCMNI max # of semaphore identifiers */
+#define SEMMSL 250 /* <= 8 000 max num of semaphores per id */
+#define SEMMNS (SEMMNI*SEMMSL) /* <= INT_MAX max # of semaphores in system */
+#define SEMOPM 32 /* <= 1 000 max num of ops per semop call */
+#define SEMVMX 32767 /* <= 32767 semaphore maximum value */
+
extern int semget( key_t key, int nsems, int semflg) __THROW;
-extern int semctl(int semid, int semnum, int cmd, union semun arg) __THROW;
+
+/* The prototype really is:
+ * extern int semctl(int semid, int semnum, int cmd, union semun arg) __THROW;
+ * glibc bug compatibility forces us to write it like this: */
+extern int semctl(int semid, int semnum, int cmd, ...) __THROW;
+
extern int semop(int semid, struct sembuf *sops, unsigned nsops) __THROW;
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/sendfile.h b/mdk-stage1/dietlibc/include/sys/sendfile.h
index 2e0c04add..ce6630676 100644
--- a/mdk-stage1/dietlibc/include/sys/sendfile.h
+++ b/mdk-stage1/dietlibc/include/sys/sendfile.h
@@ -2,8 +2,12 @@
#define _SYS_SENDFILE_H
#include <sys/cdefs.h>
+#include <sys/types.h>
-extern ssize_t sendfile (int __out_fd, int __in_fd, off_t *offset,
- size_t __count) __THROW;
+extern ssize_t sendfile (int out_fd, int in_fd, off_t* offset,
+ size_t count) __THROW;
+
+extern ssize_t sendfile64 (int out_fd, int in_fd, loff_t* offset,
+ size_t count) __THROW;
#endif /* sys/sendfile.h */
diff --git a/mdk-stage1/dietlibc/include/sys/shm.h b/mdk-stage1/dietlibc/include/sys/shm.h
index c27f5ddcf..879a8786e 100644
--- a/mdk-stage1/dietlibc/include/sys/shm.h
+++ b/mdk-stage1/dietlibc/include/sys/shm.h
@@ -1,12 +1,70 @@
#ifndef _SYS_SHM_H
#define _SYS_SHM_H
-#include <linux/shm.h>
#include <sys/ipc.h>
-#include <asm/page.h>
-#ifndef PAGE_SIZE
-#define PAGE_SIZE getpagesize()
+#define SHMMAX 0x2000000 /* max shared seg size (bytes) */
+#define SHMMIN 1 /* min shared seg size (bytes) */
+#define SHMMNI 4096 /* max num of segs system wide */
+#define SHMALL (SHMMAX/PAGE_SIZE*(SHMMNI/16)) /* max shm system wide (pages) */
+#define SHMSEG SHMMNI /* max shared segs per process */
+
+struct shmid_ds {
+ struct ipc_perm shm_perm; /* operation perms */
+ int shm_segsz; /* size of segment (bytes) */
+ time_t shm_atime; /* last attach time */
+ time_t shm_dtime; /* last detach time */
+ time_t shm_ctime; /* last change time */
+ pid_t shm_cpid; /* pid of creator */
+ pid_t shm_lpid; /* pid of last operator */
+ unsigned short shm_nattch; /* no. of current attaches */
+ unsigned short shm_unused; /* compatibility */
+ void *shm_unused2; /* ditto - used by DIPC */
+ void *shm_unused3; /* unused */
+};
+
+/* permission flag for shmget */
+#define SHM_R 0400 /* or S_IRUGO from <linux/stat.h> */
+#define SHM_W 0200 /* or S_IWUGO from <linux/stat.h> */
+
+/* mode for attach */
+#define SHM_RDONLY 010000 /* read-only access */
+#define SHM_RND 020000 /* round attach address to SHMLBA boundary */
+#define SHM_REMAP 040000 /* take-over region on attach */
+
+/* super user shmctl commands */
+#define SHM_LOCK 11
+#define SHM_UNLOCK 12
+
+/* ipcs ctl commands */
+#define SHM_STAT 13
+#define SHM_INFO 14
+
+/* Obsolete, used only for backwards compatibility */
+struct shminfo {
+ int shmmax;
+ int shmmin;
+ int shmmni;
+ int shmseg;
+ int shmall;
+};
+
+struct shm_info {
+ int used_ids;
+ unsigned long shm_tot; /* total allocated shm */
+ unsigned long shm_rss; /* total resident shm */
+ unsigned long shm_swp; /* total swapped shm */
+ unsigned long swap_attempts;
+ unsigned long swap_successes;
+};
+
+#if defined(__i386__) || defined(__mips__) || defined(__arm__) || defined(__powerpc__) || defined(__s390__) || defined(__hppa__) || defined(__x86_64__) || defined(__ia64__)
+#define PAGE_SIZE 4096UL
+#define PAGE_SHIFT 12
+#elif defined(__alpha__) || defined(__sparc__)
+/* sun4* has 4k except sun4 architecture, sparc64 has 8k */
+#define PAGE_SIZE 8192UL
+#define PAGE_SHIFT 13
#endif
extern int shmget(key_t key, int size, int shmflg) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sys/socket.h b/mdk-stage1/dietlibc/include/sys/socket.h
index a1435501c..a1130c4f6 100644
--- a/mdk-stage1/dietlibc/include/sys/socket.h
+++ b/mdk-stage1/dietlibc/include/sys/socket.h
@@ -3,26 +3,380 @@
#include <sys/cdefs.h>
#include <sys/types.h>
-#include <linux/socket.h>
-#ifndef SOCK_DGRAM
-/* the Linux kernel headers suck really badly on non-x86 */
+/* For setsockoptions(2) */
+#if defined(__alpha__) || defined(__mips__)
+#define SOL_SOCKET 0xffff
+
+#define SO_DEBUG 0x0001
+#define SO_REUSEADDR 0x0004
+#define SO_TYPE 0x1008
+#define SO_ERROR 0x1007
+#define SO_DONTROUTE 0x0010
+#define SO_BROADCAST 0x0020
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_KEEPALIVE 0x0008
+#define SO_OOBINLINE 0x0100
+#define SO_NO_CHECK 11
+#define SO_PRIORITY 12
+#define SO_LINGER 0x0080
+#define SO_BSDCOMPAT 14
+/* To add :#define SO_REUSEPORT 15 */
+#define SO_PASSCRED 17
+#define SO_PEERCRED 18
+#define SO_RCVLOWAT 0x1004
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVTIMEO 0x1006
+#define SO_SNDTIMEO 0x1005
+#define SO_ACCEPTCONN 0x1009
+
+#define SO_STYLE SO_TYPE /* Synonym */
+
+#elif defined(__hppa__)
+#define SOL_SOCKET 0xffff
+
+#define SO_DEBUG 0x0001
+#define SO_REUSEADDR 0x0004
+#define SO_KEEPALIVE 0x0008
+#define SO_DONTROUTE 0x0010
+#define SO_BROADCAST 0x0020
+#define SO_LINGER 0x0080
+#define SO_OOBINLINE 0x0100
+/* To add :#define SO_REUSEPORT 0x0200 */
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVLOWAT 0x1004
+#define SO_SNDTIMEO 0x1005
+#define SO_RCVTIMEO 0x1006
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+#define SO_PEERNAME 0x2000
+
+#define SO_NO_CHECK 0x400b
+#define SO_PRIORITY 0x400c
+#define SO_BSDCOMPAT 0x400e
+#define SO_PASSCRED 0x4010
+#define SO_PEERCRED 0x4011
+#define SO_TIMESTAMP 0x4012
+#define SCM_TIMESTAMP SO_TIMESTAMP
+
+/* Security levels - as per NRL IPv6 - don't actually do anything */
+#define SO_SECURITY_AUTHENTICATION 0x4016
+#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x4017
+#define SO_SECURITY_ENCRYPTION_NETWORK 0x4018
+
+#define SO_BINDTODEVICE 0x4019
+
+/* Socket filtering */
+#define SO_ATTACH_FILTER 0x401a
+#define SO_DETACH_FILTER 0x401b
+
+#define SO_ACCEPTCONN 0x401c
+
+#elif defined(__sparc__)
+#define SOL_SOCKET 0xffff
+
+#define SO_DEBUG 0x0001
+#define SO_PASSCRED 0x0002
+#define SO_REUSEADDR 0x0004
+#define SO_KEEPALIVE 0x0008
+#define SO_DONTROUTE 0x0010
+#define SO_BROADCAST 0x0020
+#define SO_PEERCRED 0x0040
+#define SO_LINGER 0x0080
+#define SO_OOBINLINE 0x0100
+/* To add :#define SO_REUSEPORT 0x0200 */
+#define SO_BSDCOMPAT 0x0400
+#define SO_RCVLOWAT 0x0800
+#define SO_SNDLOWAT 0x1000
+#define SO_RCVTIMEO 0x2000
+#define SO_SNDTIMEO 0x4000
+#define SO_ACCEPTCONN 0x8000
+
+#define SO_DONTLINGER (~SO_LINGER) /* Older SunOS compat. hack */
+
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+
+#define SO_ATTACH_FILTER 0x001a
+#define SO_DETACH_FILTER 0x001b
+
+#define SO_PEERNAME 0x001c
+#define SO_TIMESTAMP 0x001d
+#define SCM_TIMESTAMP SO_TIMESTAMP
+
+/* Security levels - as per NRL IPv6 - don't actually do anything */
+#define SO_SECURITY_AUTHENTICATION 0x5001
+#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
+#define SO_SECURITY_ENCRYPTION_NETWORK 0x5004
+
+#else
+
+#define SOL_SOCKET 1
+
+#define SO_DEBUG 1
+#define SO_REUSEADDR 2
+#define SO_TYPE 3
+#define SO_ERROR 4
+#define SO_DONTROUTE 5
+#define SO_BROADCAST 6
+#define SO_SNDBUF 7
+#define SO_RCVBUF 8
+#define SO_KEEPALIVE 9
+#define SO_OOBINLINE 10
+#define SO_NO_CHECK 11
+#define SO_PRIORITY 12
+#define SO_LINGER 13
+#define SO_BSDCOMPAT 14
+/* To add :#define SO_REUSEPORT 15 */
+#define SO_PASSCRED 16
+#define SO_PEERCRED 17
+#define SO_RCVLOWAT 18
+#define SO_SNDLOWAT 19
+#define SO_RCVTIMEO 20
+#define SO_SNDTIMEO 21
+#define SO_ACCEPTCONN 30
+
+#endif
+
+#if !defined(__hppa__) && !defined(__sparc__)
+/* Security levels - as per NRL IPv6 - don't actually do anything */
+#define SO_SECURITY_AUTHENTICATION 22
+#define SO_SECURITY_ENCRYPTION_TRANSPORT 23
+#define SO_SECURITY_ENCRYPTION_NETWORK 24
+
+#define SO_BINDTODEVICE 25
+
+/* Socket filtering */
+#define SO_ATTACH_FILTER 26
+#define SO_DETACH_FILTER 27
+
+#define SO_PEERNAME 28
+#define SO_TIMESTAMP 29
+#define SCM_TIMESTAMP SO_TIMESTAMP
+#endif
+
+/* Socket types. */
+#ifdef __mips__
+#define SOCK_DGRAM 1 /* datagram (conn.less) socket */
+#define SOCK_STREAM 2 /* stream (connection) socket */
+#else
#define SOCK_STREAM 1 /* stream (connection) socket */
#define SOCK_DGRAM 2 /* datagram (conn.less) socket */
+#endif
#define SOCK_RAW 3 /* raw socket */
#define SOCK_RDM 4 /* reliably-delivered message */
#define SOCK_SEQPACKET 5 /* sequential packet socket */
#define SOCK_PACKET 10 /* linux specific way of */
-#endif
+ /* getting packets at the dev */
+ /* level. For writing rarp and */
+ /* other similar things on the */
+ /* user level. */
+
+struct sockaddr {
+ sa_family_t sa_family;
+ char sa_data[14];
+};
+
+struct linger {
+ int l_onoff;
+ int l_linger;
+};
+
+struct iovec {
+ void* iov_base; /* BSD uses caddr_t (1003.1g requires void *) */
+ size_t iov_len; /* Must be size_t (1003.1g) */
+};
+
+struct msghdr {
+ void* msg_name; /* Socket name */
+ int msg_namelen; /* Length of name */
+ struct iovec* msg_iov; /* Data blocks */
+ size_t msg_iovlen; /* Number of blocks */
+ void* msg_control; /* Per protocol magic (eg BSD file descriptor passing) */
+ size_t msg_controllen; /* Length of cmsg list */
+ unsigned msg_flags;
+};
+
+struct cmsghdr {
+ size_t cmsg_len; /* data byte count, including hdr */
+ int cmsg_level; /* originating protocol */
+ int cmsg_type; /* protocol-specific type */
+};
+
+#define UIO_FASTIOV 8
+#define UIO_MAXIOV 1024
+
+/* "Socket"-level control message types: */
+
+#define SCM_RIGHTS 0x01 /* rw: access rights (array of int) */
+#define SCM_CREDENTIALS 0x02 /* rw: struct ucred */
+#define SCM_CONNECT 0x03 /* rw: struct scm_connect */
+
+struct ucred {
+ unsigned int pid;
+ unsigned int uid;
+ unsigned int gid;
+};
+
+/* Supported address families. */
+#define AF_UNSPEC 0
+#define AF_UNIX 1 /* Unix domain sockets */
+#define AF_LOCAL 1 /* POSIX name for AF_UNIX */
+#define AF_INET 2 /* Internet IP Protocol */
+#define AF_AX25 3 /* Amateur Radio AX.25 */
+#define AF_IPX 4 /* Novell IPX */
+#define AF_APPLETALK 5 /* AppleTalk DDP */
+#define AF_NETROM 6 /* Amateur Radio NET/ROM */
+#define AF_BRIDGE 7 /* Multiprotocol bridge */
+#define AF_ATMPVC 8 /* ATM PVCs */
+#define AF_X25 9 /* Reserved for X.25 project */
+#define AF_INET6 10 /* IP version 6 */
+#define AF_ROSE 11 /* Amateur Radio X.25 PLP */
+#define AF_DECnet 12 /* Reserved for DECnet project */
+#define AF_NETBEUI 13 /* Reserved for 802.2LLC project*/
+#define AF_SECURITY 14 /* Security callback pseudo AF */
+#define AF_KEY 15 /* PF_KEY key management API */
+#define AF_NETLINK 16
+#define AF_ROUTE AF_NETLINK /* Alias to emulate 4.4BSD */
+#define AF_PACKET 17 /* Packet family */
+#define AF_ASH 18 /* Ash */
+#define AF_ECONET 19 /* Acorn Econet */
+#define AF_ATMSVC 20 /* ATM SVCs */
+#define AF_SNA 22 /* Linux SNA Project (nutters!) */
+#define AF_IRDA 23 /* IRDA sockets */
+#define AF_PPPOX 24 /* PPPoX sockets */
+#define AF_WANPIPE 25 /* Wanpipe API Sockets */
+#define AF_MAX 32 /* For now.. */
+
+/* Protocol families, same as address families. */
+#define PF_UNSPEC AF_UNSPEC
+#define PF_UNIX AF_UNIX
+#define PF_LOCAL AF_LOCAL
+#define PF_INET AF_INET
+#define PF_AX25 AF_AX25
+#define PF_IPX AF_IPX
+#define PF_APPLETALK AF_APPLETALK
+#define PF_NETROM AF_NETROM
+#define PF_BRIDGE AF_BRIDGE
+#define PF_ATMPVC AF_ATMPVC
+#define PF_X25 AF_X25
+#define PF_INET6 AF_INET6
+#define PF_ROSE AF_ROSE
+#define PF_DECnet AF_DECnet
+#define PF_NETBEUI AF_NETBEUI
+#define PF_SECURITY AF_SECURITY
+#define PF_KEY AF_KEY
+#define PF_NETLINK AF_NETLINK
+#define PF_ROUTE AF_ROUTE
+#define PF_PACKET AF_PACKET
+#define PF_ASH AF_ASH
+#define PF_ECONET AF_ECONET
+#define PF_ATMSVC AF_ATMSVC
+#define PF_SNA AF_SNA
+#define PF_IRDA AF_IRDA
+#define PF_PPPOX AF_PPPOX
+#define PF_WANPIPE AF_WANPIPE
+#define PF_MAX AF_MAX
+
+/* Maximum queue length specifiable by listen. */
+#define SOMAXCONN 128
+
+/* Flags we can use with send/ and recv.
+ Added those for 1003.1g not all are supported yet */
+#define MSG_OOB 1
+#define MSG_PEEK 2
+#define MSG_DONTROUTE 4
+#define MSG_TRYHARD 4 /* Synonym for MSG_DONTROUTE for DECnet */
+#define MSG_CTRUNC 8
+#define MSG_PROBE 0x10 /* Do not send. Only probe path f.e. for MTU */
+#define MSG_TRUNC 0x20
+#define MSG_DONTWAIT 0x40 /* Nonblocking io */
+#define MSG_EOR 0x80 /* End of record */
+#define MSG_WAITALL 0x100 /* Wait for a full request */
+#define MSG_FIN 0x200
+#define MSG_EOF MSG_FIN
+#define MSG_SYN 0x400
+#define MSG_CONFIRM 0x800 /* Confirm path validity */
+#define MSG_RST 0x1000
+#define MSG_ERRQUEUE 0x2000 /* Fetch message from error queue */
+#define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */
+#define MSG_MORE 0x8000 /* Sender will send more */
+
+/* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */
+#define SOL_IP 0
+/* #define SOL_ICMP 1 No-no-no! Due to Linux :-) we cannot use SOL_ICMP=1 */
+#define SOL_TCP 6
+#define SOL_UDP 17
+#define SOL_IPV6 41
+#define SOL_ICMPV6 58
+#define SOL_RAW 255
+#define SOL_IPX 256
+#define SOL_AX25 257
+#define SOL_ATALK 258
+#define SOL_NETROM 259
+#define SOL_ROSE 260
+#define SOL_DECNET 261
+#define SOL_X25 262
+#define SOL_PACKET 263
+#define SOL_ATM 264 /* ATM layer (cell level) */
+#define SOL_AAL 265 /* ATM Adaption Layer (packet level) */
+#define SOL_IRDA 266
+
+/* IPX options */
+#define IPX_TYPE 1
+
+#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
+#define __CMSG_NXTHDR(ctl, len, cmsg) __cmsg_nxthdr((ctl),(len),(cmsg))
+#define CMSG_NXTHDR(mhdr, cmsg) cmsg_nxthdr((mhdr), (cmsg))
+
+static inline struct cmsghdr* __cmsg_nxthdr(void *__ctl, size_t __size, struct cmsghdr *__cmsg)
+{
+ struct cmsghdr * __ptr;
+ __ptr = (struct cmsghdr*)(((unsigned char *) __cmsg) + CMSG_ALIGN(__cmsg->cmsg_len));
+ if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
+ return (struct cmsghdr *)0;
+ return __ptr;
+}
+
+static inline struct cmsghdr* cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
+{
+ return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
+}
+
+#define CMSG_DATA(cmsg) ((void *)((char *)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr))))
+#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len))
+#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
+
+#define __CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct cmsghdr) ? \
+ (struct cmsghdr *)(ctl) : \
+ (struct cmsghdr *)NULL)
+#define CMSG_FIRSTHDR(msg) __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
struct sockaddr_storage {
- char __tmp[sizeof(struct sockaddr)];
+ sa_family_t ss_family;
+ uint32_t __ss_align;
+ char __ss_padding[(128 - (2 * sizeof (uint32_t ))) ];
};
+#ifndef SOCK_DGRAM
+/* the Linux kernel headers suck really badly on non-x86 */
+#define SOCK_STREAM 1 /* stream (connection) socket */
+#define SOCK_DGRAM 2 /* datagram (conn.less) socket */
+#define SOCK_RAW 3 /* raw socket */
+#define SOCK_RDM 4 /* reliably-delivered message */
+#define SOCK_SEQPACKET 5 /* sequential packet socket */
+#define SOCK_PACKET 10 /* linux specific way of */
+#endif
+
int socket(int domain, int type, int protocol) __THROW;
int accept(int s, struct sockaddr *addr, socklen_t *addrlen) __THROW;
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) __THROW;
-int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen) __THROW;
+int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) __THROW;
int recv(int s, void *buf, size_t len, int flags) __THROW;
int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) __THROW;
int recvmsg(int s, struct msghdr *msg, int flags) __THROW;
@@ -43,4 +397,130 @@ int listen(int s, int backlog) __THROW;
#define SHUT_RDWR 2
int shutdown(int s, int how) __THROW;
+int socketpair(int d, int type, int protocol, int sv[2]);
+
+/* currently not supported: */
+#define NI_NOFQDN 1
+
+#define NI_NUMERICHOST 2
+#define NI_NAMEREQD 4
+#define NI_NUMERICSERV 8
+#define NI_DGRAM 16
+
+struct addrinfo {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ struct sockaddr *ai_addr;
+ char *ai_canonname;
+ struct addrinfo *ai_next;
+};
+
+int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host,
+ size_t hostlen, char *serv, size_t servlen, int flags) __THROW;
+int getaddrinfo(const char *node, const char *service, const struct
+ addrinfo *hints, struct addrinfo **res) __THROW;
+void freeaddrinfo(struct addrinfo *res) __THROW;
+const char *gai_strerror(int errcode) __THROW;
+
+#define EAI_FAMILY -1
+#define EAI_SOCKTYPE -2
+#define EAI_BADFLAGS -3
+#define EAI_NONAME -4
+#define EAI_SERVICE -5
+#define EAI_ADDRFAMILY -6
+#define EAI_NODATA -7
+#define EAI_MEMORY -8
+#define EAI_FAIL -9
+#define EAI_AGAIN -10
+#define EAI_SYSTEM -11
+
+#define AI_NUMERICHOST 1
+#define AI_CANONNAME 2
+#define AI_PASSIVE 4
+
+/* Linux-specific socket ioctls */
+#define SIOCINQ FIONREAD
+#define SIOCOUTQ TIOCOUTQ
+
+/* Routing table calls. */
+#define SIOCADDRT 0x890B /* add routing table entry */
+#define SIOCDELRT 0x890C /* delete routing table entry */
+#define SIOCRTMSG 0x890D /* call to routing system */
+
+/* Socket configuration controls. */
+#define SIOCGIFNAME 0x8910 /* get iface name */
+#define SIOCSIFLINK 0x8911 /* set iface channel */
+#define SIOCGIFCONF 0x8912 /* get iface list */
+#define SIOCGIFFLAGS 0x8913 /* get flags */
+#define SIOCSIFFLAGS 0x8914 /* set flags */
+#define SIOCGIFADDR 0x8915 /* get PA address */
+#define SIOCSIFADDR 0x8916 /* set PA address */
+#define SIOCGIFDSTADDR 0x8917 /* get remote PA address */
+#define SIOCSIFDSTADDR 0x8918 /* set remote PA address */
+#define SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */
+#define SIOCSIFBRDADDR 0x891a /* set broadcast PA address */
+#define SIOCGIFNETMASK 0x891b /* get network PA mask */
+#define SIOCSIFNETMASK 0x891c /* set network PA mask */
+#define SIOCGIFMETRIC 0x891d /* get metric */
+#define SIOCSIFMETRIC 0x891e /* set metric */
+#define SIOCGIFMEM 0x891f /* get memory address (BSD) */
+#define SIOCSIFMEM 0x8920 /* set memory address (BSD) */
+#define SIOCGIFMTU 0x8921 /* get MTU size */
+#define SIOCSIFMTU 0x8922 /* set MTU size */
+#define SIOCSIFNAME 0x8923 /* set interface name */
+#define SIOCSIFHWADDR 0x8924 /* set hardware address */
+#define SIOCGIFENCAP 0x8925 /* get/set encapsulations */
+#define SIOCSIFENCAP 0x8926
+#define SIOCGIFHWADDR 0x8927 /* Get hardware address */
+#define SIOCGIFSLAVE 0x8929 /* Driver slaving support */
+#define SIOCSIFSLAVE 0x8930
+#define SIOCADDMULTI 0x8931 /* Multicast address lists */
+#define SIOCDELMULTI 0x8932
+#define SIOCGIFINDEX 0x8933 /* name -> if_index mapping */
+#define SIOGIFINDEX SIOCGIFINDEX /* misprint compatibility :-) */
+#define SIOCSIFPFLAGS 0x8934 /* set/get extended flags set */
+#define SIOCGIFPFLAGS 0x8935
+#define SIOCDIFADDR 0x8936 /* delete PA address */
+#define SIOCSIFHWBROADCAST 0x8937 /* set hardware broadcast addr */
+#define SIOCGIFCOUNT 0x8938 /* get number of devices */
+
+#define SIOCGIFBR 0x8940 /* Bridging support */
+#define SIOCSIFBR 0x8941 /* Set bridging options */
+
+#define SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */
+#define SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */
+
+#define SIOCGIFDIVERT 0x8944 /* Frame diversion support */
+#define SIOCSIFDIVERT 0x8945 /* Set frame diversion options */
+
+#define SIOCETHTOOL 0x8946 /* Ethtool interface */
+
+/* ARP cache control calls. */
+ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */
+#define SIOCDARP 0x8953 /* delete ARP table entry */
+#define SIOCGARP 0x8954 /* get ARP table entry */
+#define SIOCSARP 0x8955 /* set ARP table entry */
+
+/* RARP cache control calls. */
+#define SIOCDRARP 0x8960 /* delete RARP table entry */
+#define SIOCGRARP 0x8961 /* get RARP table entry */
+#define SIOCSRARP 0x8962 /* set RARP table entry */
+
+/* Driver configuration calls */
+
+#define SIOCGIFMAP 0x8970 /* Get device parameters */
+#define SIOCSIFMAP 0x8971 /* Set device parameters */
+
+/* DLCI configuration calls */
+
+#define SIOCADDDLCI 0x8980 /* Create new DLCI device */
+#define SIOCDELDLCI 0x8981 /* Delete DLCI device */
+
+#define SIOCDEVPRIVATE 0x89F0 /* to 89FF */
+
+#define _LINUX_SOCKET_H
+
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/soundcard.h b/mdk-stage1/dietlibc/include/sys/soundcard.h
new file mode 100644
index 000000000..e8766499a
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/soundcard.h
@@ -0,0 +1,1300 @@
+#ifndef _SYS_SOUNDCARD_H
+#define _SYS_SOUNDCARD_H
+
+/*
+ * Copyright by Hannu Savolainen 1993-1997
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer. 2.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * OSS interface version. With versions earlier than 3.6 this value is
+ * an integer with value less than 361. In versions 3.6 and later
+ * it's a six digit hexadecimal value. For example value
+ * of 0x030600 represents OSS version 3.6.0.
+ * Use ioctl(fd, OSS_GETVERSION, &int) to get the version number of
+ * the currently active driver.
+ */
+#define SOUND_VERSION 0x030802
+#define OPEN_SOUND_SYSTEM
+
+/* In Linux we need to be prepared for cross compiling */
+#include <sys/ioctl.h>
+
+/*
+ * Supported card ID numbers (Should be somewhere else?)
+ */
+
+#define SNDCARD_ADLIB 1
+#define SNDCARD_SB 2
+#define SNDCARD_PAS 3
+#define SNDCARD_GUS 4
+#define SNDCARD_MPU401 5
+#define SNDCARD_SB16 6
+#define SNDCARD_SB16MIDI 7
+#define SNDCARD_UART6850 8
+#define SNDCARD_GUS16 9
+#define SNDCARD_MSS 10
+#define SNDCARD_PSS 11
+#define SNDCARD_SSCAPE 12
+#define SNDCARD_PSS_MPU 13
+#define SNDCARD_PSS_MSS 14
+#define SNDCARD_SSCAPE_MSS 15
+#define SNDCARD_TRXPRO 16
+#define SNDCARD_TRXPRO_SB 17
+#define SNDCARD_TRXPRO_MPU 18
+#define SNDCARD_MAD16 19
+#define SNDCARD_MAD16_MPU 20
+#define SNDCARD_CS4232 21
+#define SNDCARD_CS4232_MPU 22
+#define SNDCARD_MAUI 23
+#define SNDCARD_PSEUDO_MSS 24
+#define SNDCARD_GUSPNP 25
+#define SNDCARD_UART401 26
+/* Sound card numbers 27 to N are reserved. Don't add more numbers here. */
+
+/***********************************
+ * IOCTL Commands for /dev/sequencer
+ */
+
+#ifndef _SIOWR
+#if defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__)))
+/* Use already defined ioctl defines if they exist (except with Sun or Sparc) */
+#define SIOCPARM_MASK IOCPARM_MASK
+#define SIOC_VOID IOC_VOID
+#define SIOC_OUT IOC_OUT
+#define SIOC_IN IOC_IN
+#define SIOC_INOUT IOC_INOUT
+#define _SIOC_SIZE _IOC_SIZE
+#define _SIOC_DIR _IOC_DIR
+#define _SIOC_NONE _IOC_NONE
+#define _SIOC_READ _IOC_READ
+#define _SIOC_WRITE _IOC_WRITE
+#define _SIO _IO
+#define _SIOR _IOR
+#define _SIOW _IOW
+#define _SIOWR _IOWR
+#else
+
+/* Ioctl's have the command encoded in the lower word,
+ * and the size of any in or out parameters in the upper
+ * word. The high 2 bits of the upper word are used
+ * to encode the in/out status of the parameter; for now
+ * we restrict parameters to at most 8191 bytes.
+ */
+/* #define SIOCTYPE (0xff<<8) */
+#define SIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */
+#define SIOC_VOID 0x00000000 /* no parameters */
+#define SIOC_OUT 0x20000000 /* copy out parameters */
+#define SIOC_IN 0x40000000 /* copy in parameters */
+#define SIOC_INOUT (SIOC_IN|SIOC_OUT)
+/* the 0x20000000 is so we can distinguish new ioctl's from old */
+#define _SIO(x,y) ((int)(SIOC_VOID|(x<<8)|y))
+#define _SIOR(x,y,t) ((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
+#define _SIOW(x,y,t) ((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
+/* this should be _SIORW, but stdio got there first */
+#define _SIOWR(x,y,t) ((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
+#define _SIOC_SIZE(x) ((x>>16)&SIOCPARM_MASK)
+#define _SIOC_DIR(x) (x & 0xf0000000)
+#define _SIOC_NONE SIOC_VOID
+#define _SIOC_READ SIOC_OUT
+#define _SIOC_WRITE SIOC_IN
+# endif /* _IOWR */
+#endif /* !_SIOWR */
+
+#define SNDCTL_SEQ_RESET _SIO ('Q', 0)
+#define SNDCTL_SEQ_SYNC _SIO ('Q', 1)
+#define SNDCTL_SYNTH_INFO _SIOWR('Q', 2, struct synth_info)
+#define SNDCTL_SEQ_CTRLRATE _SIOWR('Q', 3, int) /* Set/get timer resolution (HZ) */
+#define SNDCTL_SEQ_GETOUTCOUNT _SIOR ('Q', 4, int)
+#define SNDCTL_SEQ_GETINCOUNT _SIOR ('Q', 5, int)
+#define SNDCTL_SEQ_PERCMODE _SIOW ('Q', 6, int)
+#define SNDCTL_FM_LOAD_INSTR _SIOW ('Q', 7, struct sbi_instrument) /* Obsolete. Don't use!!!!!! */
+#define SNDCTL_SEQ_TESTMIDI _SIOW ('Q', 8, int)
+#define SNDCTL_SEQ_RESETSAMPLES _SIOW ('Q', 9, int)
+#define SNDCTL_SEQ_NRSYNTHS _SIOR ('Q',10, int)
+#define SNDCTL_SEQ_NRMIDIS _SIOR ('Q',11, int)
+#define SNDCTL_MIDI_INFO _SIOWR('Q',12, struct midi_info)
+#define SNDCTL_SEQ_THRESHOLD _SIOW ('Q',13, int)
+#define SNDCTL_SYNTH_MEMAVL _SIOWR('Q',14, int) /* in=dev#, out=memsize */
+#define SNDCTL_FM_4OP_ENABLE _SIOW ('Q',15, int) /* in=dev# */
+#define SNDCTL_SEQ_PANIC _SIO ('Q',17)
+#define SNDCTL_SEQ_OUTOFBAND _SIOW ('Q',18, struct seq_event_rec)
+#define SNDCTL_SEQ_GETTIME _SIOR ('Q',19, int)
+#define SNDCTL_SYNTH_ID _SIOWR('Q',20, struct synth_info)
+#define SNDCTL_SYNTH_CONTROL _SIOWR('Q',21, struct synth_control)
+#define SNDCTL_SYNTH_REMOVESAMPLE _SIOWR('Q',22, struct remove_sample)
+
+typedef struct synth_control
+{
+ int devno; /* Synthesizer # */
+ char data[4000]; /* Device spesific command/data record */
+}synth_control;
+
+typedef struct remove_sample
+{
+ int devno; /* Synthesizer # */
+ int bankno; /* MIDI bank # (0=General MIDI) */
+ int instrno; /* MIDI instrument number */
+} remove_sample;
+
+typedef struct seq_event_rec {
+ unsigned char arr[8];
+} seq_event_rec;
+
+#define SNDCTL_TMR_TIMEBASE _SIOWR('T', 1, int)
+#define SNDCTL_TMR_START _SIO ('T', 2)
+#define SNDCTL_TMR_STOP _SIO ('T', 3)
+#define SNDCTL_TMR_CONTINUE _SIO ('T', 4)
+#define SNDCTL_TMR_TEMPO _SIOWR('T', 5, int)
+#define SNDCTL_TMR_SOURCE _SIOWR('T', 6, int)
+# define TMR_INTERNAL 0x00000001
+# define TMR_EXTERNAL 0x00000002
+# define TMR_MODE_MIDI 0x00000010
+# define TMR_MODE_FSK 0x00000020
+# define TMR_MODE_CLS 0x00000040
+# define TMR_MODE_SMPTE 0x00000080
+#define SNDCTL_TMR_METRONOME _SIOW ('T', 7, int)
+#define SNDCTL_TMR_SELECT _SIOW ('T', 8, int)
+
+/*
+ * Some big endian/little endian handling macros
+ */
+
+#if defined(_AIX) || defined(AIX) || defined(sparc) || defined(__sparc__) || defined(HPPA) || defined(PPC)
+/* Big endian machines */
+# define _PATCHKEY(id) (0xfd00|id)
+# define AFMT_S16_NE AFMT_S16_BE
+#else
+# define _PATCHKEY(id) ((id<<8)|0xfd)
+# define AFMT_S16_NE AFMT_S16_LE
+#endif
+
+/*
+ * Sample loading mechanism for internal synthesizers (/dev/sequencer)
+ * The following patch_info structure has been designed to support
+ * Gravis UltraSound. It tries to be universal format for uploading
+ * sample based patches but is probably too limited.
+ *
+ * (PBD) As Hannu guessed, the GUS structure is too limited for
+ * the WaveFront, but this is the right place for a constant definition.
+ */
+
+struct patch_info {
+ unsigned short key; /* Use WAVE_PATCH here */
+#define WAVE_PATCH _PATCHKEY(0x04)
+#define GUS_PATCH WAVE_PATCH
+#define WAVEFRONT_PATCH _PATCHKEY(0x06)
+
+ short device_no; /* Synthesizer number */
+ short instr_no; /* Midi pgm# */
+
+ unsigned int mode;
+/*
+ * The least significant byte has the same format than the GUS .PAT
+ * files
+ */
+#define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */
+#define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */
+#define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */
+#define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */
+#define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */
+#define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3)*/
+#define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */
+#define WAVE_FAST_RELEASE 0x80 /* bit 7 = Shut off immediately after note off */
+ /* (use the env_rate/env_offs fields). */
+/* Linux specific bits */
+#define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */
+#define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */
+#define WAVE_SCALE 0x00040000 /* The scaling info is valid */
+#define WAVE_FRACTIONS 0x00080000 /* Fraction information is valid */
+/* Reserved bits */
+#define WAVE_ROM 0x40000000 /* For future use */
+#define WAVE_MULAW 0x20000000 /* For future use */
+/* Other bits must be zeroed */
+
+ int len; /* Size of the wave data in bytes */
+ int loop_start, loop_end; /* Byte offsets from the beginning */
+
+/*
+ * The base_freq and base_note fields are used when computing the
+ * playback speed for a note. The base_note defines the tone frequency
+ * which is heard if the sample is played using the base_freq as the
+ * playback speed.
+ *
+ * The low_note and high_note fields define the minimum and maximum note
+ * frequencies for which this sample is valid. It is possible to define
+ * more than one samples for an instrument number at the same time. The
+ * low_note and high_note fields are used to select the most suitable one.
+ *
+ * The fields base_note, high_note and low_note should contain
+ * the note frequency multiplied by 1000. For example value for the
+ * middle A is 440*1000.
+ */
+
+ unsigned int base_freq;
+ unsigned int base_note;
+ unsigned int high_note;
+ unsigned int low_note;
+ int panning; /* -128=left, 127=right */
+ int detuning;
+
+/* New fields introduced in version 1.99.5 */
+
+ /* Envelope. Enabled by mode bit WAVE_ENVELOPES */
+ unsigned char env_rate[ 6 ]; /* GUS HW ramping rate */
+ unsigned char env_offset[ 6 ]; /* 255 == 100% */
+
+ /*
+ * The tremolo, vibrato and scale info are not supported yet.
+ * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or
+ * WAVE_SCALE
+ */
+
+ unsigned char tremolo_sweep;
+ unsigned char tremolo_rate;
+ unsigned char tremolo_depth;
+
+ unsigned char vibrato_sweep;
+ unsigned char vibrato_rate;
+ unsigned char vibrato_depth;
+
+ int scale_frequency;
+ unsigned int scale_factor; /* from 0 to 2048 or 0 to 2 */
+
+ int volume;
+ int fractions;
+ int reserved1;
+ int spare[2];
+ char data[1]; /* The waveform data starts here */
+ };
+
+struct sysex_info {
+ short key; /* Use SYSEX_PATCH or MAUI_PATCH here */
+#define SYSEX_PATCH _PATCHKEY(0x05)
+#define MAUI_PATCH _PATCHKEY(0x06)
+ short device_no; /* Synthesizer number */
+ int len; /* Size of the sysex data in bytes */
+ unsigned char data[1]; /* Sysex data starts here */
+ };
+
+/*
+ * /dev/sequencer input events.
+ *
+ * The data written to the /dev/sequencer is a stream of events. Events
+ * are records of 4 or 8 bytes. The first byte defines the size.
+ * Any number of events can be written with a write call. There
+ * is a set of macros for sending these events. Use these macros if you
+ * want to maximize portability of your program.
+ *
+ * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events.
+ * (All input events are currently 4 bytes long. Be prepared to support
+ * 8 byte events also. If you receive any event having first byte >= 128,
+ * it's a 8 byte event.
+ *
+ * The events are documented at the end of this file.
+ *
+ * Normal events (4 bytes)
+ * There is also a 8 byte version of most of the 4 byte events. The
+ * 8 byte one is recommended.
+ */
+#define SEQ_NOTEOFF 0
+#define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */
+#define SEQ_NOTEON 1
+#define SEQ_FMNOTEON SEQ_NOTEON
+#define SEQ_WAIT TMR_WAIT_ABS
+#define SEQ_PGMCHANGE 3
+#define SEQ_FMPGMCHANGE SEQ_PGMCHANGE
+#define SEQ_SYNCTIMER TMR_START
+#define SEQ_MIDIPUTC 5
+#define SEQ_DRUMON 6 /*** OBSOLETE ***/
+#define SEQ_DRUMOFF 7 /*** OBSOLETE ***/
+#define SEQ_ECHO TMR_ECHO /* For synching programs with output */
+#define SEQ_AFTERTOUCH 9
+#define SEQ_CONTROLLER 10
+
+/*******************************************
+ * Midi controller numbers
+ *******************************************
+ * Controllers 0 to 31 (0x00 to 0x1f) and
+ * 32 to 63 (0x20 to 0x3f) are continuous
+ * controllers.
+ * In the MIDI 1.0 these controllers are sent using
+ * two messages. Controller numbers 0 to 31 are used
+ * to send the MSB and the controller numbers 32 to 63
+ * are for the LSB. Note that just 7 bits are used in MIDI bytes.
+ */
+
+#define CTL_BANK_SELECT 0x00
+#define CTL_MODWHEEL 0x01
+#define CTL_BREATH 0x02
+/* undefined 0x03 */
+#define CTL_FOOT 0x04
+#define CTL_PORTAMENTO_TIME 0x05
+#define CTL_DATA_ENTRY 0x06
+#define CTL_MAIN_VOLUME 0x07
+#define CTL_BALANCE 0x08
+/* undefined 0x09 */
+#define CTL_PAN 0x0a
+#define CTL_EXPRESSION 0x0b
+/* undefined 0x0c */
+/* undefined 0x0d */
+/* undefined 0x0e */
+/* undefined 0x0f */
+#define CTL_GENERAL_PURPOSE1 0x10
+#define CTL_GENERAL_PURPOSE2 0x11
+#define CTL_GENERAL_PURPOSE3 0x12
+#define CTL_GENERAL_PURPOSE4 0x13
+/* undefined 0x14 - 0x1f */
+
+/* undefined 0x20 */
+/* The controller numbers 0x21 to 0x3f are reserved for the */
+/* least significant bytes of the controllers 0x00 to 0x1f. */
+/* These controllers are not recognised by the driver. */
+
+/* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */
+/* 0=OFF and 127=ON (intermediate values are possible) */
+#define CTL_DAMPER_PEDAL 0x40
+#define CTL_SUSTAIN 0x40 /* Alias */
+#define CTL_HOLD 0x40 /* Alias */
+#define CTL_PORTAMENTO 0x41
+#define CTL_SOSTENUTO 0x42
+#define CTL_SOFT_PEDAL 0x43
+/* undefined 0x44 */
+#define CTL_HOLD2 0x45
+/* undefined 0x46 - 0x4f */
+
+#define CTL_GENERAL_PURPOSE5 0x50
+#define CTL_GENERAL_PURPOSE6 0x51
+#define CTL_GENERAL_PURPOSE7 0x52
+#define CTL_GENERAL_PURPOSE8 0x53
+/* undefined 0x54 - 0x5a */
+#define CTL_EXT_EFF_DEPTH 0x5b
+#define CTL_TREMOLO_DEPTH 0x5c
+#define CTL_CHORUS_DEPTH 0x5d
+#define CTL_DETUNE_DEPTH 0x5e
+#define CTL_CELESTE_DEPTH 0x5e /* Alias for the above one */
+#define CTL_PHASER_DEPTH 0x5f
+#define CTL_DATA_INCREMENT 0x60
+#define CTL_DATA_DECREMENT 0x61
+#define CTL_NONREG_PARM_NUM_LSB 0x62
+#define CTL_NONREG_PARM_NUM_MSB 0x63
+#define CTL_REGIST_PARM_NUM_LSB 0x64
+#define CTL_REGIST_PARM_NUM_MSB 0x65
+/* undefined 0x66 - 0x78 */
+/* reserved 0x79 - 0x7f */
+
+/* Pseudo controllers (not midi compatible) */
+#define CTRL_PITCH_BENDER 255
+#define CTRL_PITCH_BENDER_RANGE 254
+#define CTRL_EXPRESSION 253 /* Obsolete */
+#define CTRL_MAIN_VOLUME 252 /* Obsolete */
+#define SEQ_BALANCE 11
+#define SEQ_VOLMODE 12
+
+/*
+ * Volume mode decides how volumes are used
+ */
+
+#define VOL_METHOD_ADAGIO 1
+#define VOL_METHOD_LINEAR 2
+
+/*
+ * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as
+ * input events.
+ */
+
+/*
+ * Event codes 0xf0 to 0xfc are reserved for future extensions.
+ */
+
+#define SEQ_FULLSIZE 0xfd /* Long events */
+/*
+ * SEQ_FULLSIZE events are used for loading patches/samples to the
+ * synthesizer devices. These events are passed directly to the driver
+ * of the associated synthesizer device. There is no limit to the size
+ * of the extended events. These events are not queued but executed
+ * immediately when the write() is called (execution can take several
+ * seconds of time).
+ *
+ * When a SEQ_FULLSIZE message is written to the device, it must
+ * be written using exactly one write() call. Other events cannot
+ * be mixed to the same write.
+ *
+ * For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the
+ * /dev/sequencer. Don't write other data together with the instrument structure
+ * Set the key field of the structure to FM_PATCH. The device field is used to
+ * route the patch to the corresponding device.
+ *
+ * For wave table use struct patch_info. Initialize the key field
+ * to WAVE_PATCH.
+ */
+#define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */
+#define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */
+
+/*
+ * Record for FM patches
+ */
+
+typedef unsigned char sbi_instr_data[32];
+
+struct sbi_instrument {
+ unsigned short key; /* FM_PATCH or OPL3_PATCH */
+#define FM_PATCH _PATCHKEY(0x01)
+#define OPL3_PATCH _PATCHKEY(0x03)
+ short device; /* Synth# (0-4) */
+ int channel; /* Program# to be initialized */
+ sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */
+ };
+
+struct synth_info { /* Read only */
+ char name[30];
+ int device; /* 0-N. INITIALIZE BEFORE CALLING */
+ int synth_type;
+#define SYNTH_TYPE_FM 0
+#define SYNTH_TYPE_SAMPLE 1
+#define SYNTH_TYPE_MIDI 2 /* Midi interface */
+
+ int synth_subtype;
+#define FM_TYPE_ADLIB 0x00
+#define FM_TYPE_OPL3 0x01
+#define MIDI_TYPE_MPU401 0x401
+
+#define SAMPLE_TYPE_BASIC 0x10
+#define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC
+#define SAMPLE_TYPE_WAVEFRONT 0x11
+
+ int perc_mode; /* No longer supported */
+ int nr_voices;
+ int nr_drums; /* Obsolete field */
+ int instr_bank_size;
+ unsigned int capabilities;
+#define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */
+#define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */
+#define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */
+ int dummies[19]; /* Reserve space */
+ };
+
+struct sound_timer_info {
+ char name[32];
+ int caps;
+ };
+
+#define MIDI_CAP_MPU401 1 /* MPU-401 intelligent mode */
+
+struct midi_info {
+ char name[30];
+ int device; /* 0-N. INITIALIZE BEFORE CALLING */
+ unsigned int capabilities; /* To be defined later */
+ int dev_type;
+ int dummies[18]; /* Reserve space */
+ };
+
+/********************************************
+ * ioctl commands for the /dev/midi##
+ */
+typedef struct {
+ unsigned char cmd;
+ char nr_args, nr_returns;
+ unsigned char data[30];
+ } mpu_command_rec;
+
+#define SNDCTL_MIDI_PRETIME _SIOWR('m', 0, int)
+#define SNDCTL_MIDI_MPUMODE _SIOWR('m', 1, int)
+#define SNDCTL_MIDI_MPUCMD _SIOWR('m', 2, mpu_command_rec)
+
+/********************************************
+ * IOCTL commands for /dev/dsp and /dev/audio
+ */
+
+#define SNDCTL_DSP_RESET _SIO ('P', 0)
+#define SNDCTL_DSP_SYNC _SIO ('P', 1)
+#define SNDCTL_DSP_SPEED _SIOWR('P', 2, int)
+#define SNDCTL_DSP_STEREO _SIOWR('P', 3, int)
+#define SNDCTL_DSP_GETBLKSIZE _SIOWR('P', 4, int)
+#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT
+#define SNDCTL_DSP_CHANNELS _SIOWR('P', 6, int)
+#define SOUND_PCM_WRITE_CHANNELS SNDCTL_DSP_CHANNELS
+#define SOUND_PCM_WRITE_FILTER _SIOWR('P', 7, int)
+#define SNDCTL_DSP_POST _SIO ('P', 8)
+#define SNDCTL_DSP_SUBDIVIDE _SIOWR('P', 9, int)
+#define SNDCTL_DSP_SETFRAGMENT _SIOWR('P',10, int)
+
+/* Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */
+#define SNDCTL_DSP_GETFMTS _SIOR ('P',11, int) /* Returns a mask */
+#define SNDCTL_DSP_SETFMT _SIOWR('P',5, int) /* Selects ONE fmt*/
+# define AFMT_QUERY 0x00000000 /* Return current fmt */
+# define AFMT_MU_LAW 0x00000001
+# define AFMT_A_LAW 0x00000002
+# define AFMT_IMA_ADPCM 0x00000004
+# define AFMT_U8 0x00000008
+# define AFMT_S16_LE 0x00000010 /* Little endian signed 16*/
+# define AFMT_S16_BE 0x00000020 /* Big endian signed 16 */
+# define AFMT_S8 0x00000040
+# define AFMT_U16_LE 0x00000080 /* Little endian U16 */
+# define AFMT_U16_BE 0x00000100 /* Big endian U16 */
+# define AFMT_MPEG 0x00000200 /* MPEG (2) audio */
+# define AFMT_AC3 0x00000400 /* Dolby Digital AC3 */
+
+/*
+ * Buffer status queries.
+ */
+typedef struct audio_buf_info {
+ int fragments; /* # of available fragments (partially usend ones not counted) */
+ int fragstotal; /* Total # of fragments allocated */
+ int fragsize; /* Size of a fragment in bytes */
+
+ int bytes; /* Available space in bytes (includes partially used fragments) */
+ /* Note! 'bytes' could be more than fragments*fragsize */
+ } audio_buf_info;
+
+#define SNDCTL_DSP_GETOSPACE _SIOR ('P',12, audio_buf_info)
+#define SNDCTL_DSP_GETISPACE _SIOR ('P',13, audio_buf_info)
+#define SNDCTL_DSP_NONBLOCK _SIO ('P',14)
+#define SNDCTL_DSP_GETCAPS _SIOR ('P',15, int)
+# define DSP_CAP_REVISION 0x000000ff /* Bits for revision level (0 to 255) */
+# define DSP_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */
+# define DSP_CAP_REALTIME 0x00000200 /* Real time capability */
+# define DSP_CAP_BATCH 0x00000400 /* Device has some kind of */
+ /* internal buffers which may */
+ /* cause some delays and */
+ /* decrease precision of timing */
+# define DSP_CAP_COPROC 0x00000800 /* Has a coprocessor */
+ /* Sometimes it's a DSP */
+ /* but usually not */
+# define DSP_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */
+# define DSP_CAP_MMAP 0x00002000 /* Supports mmap() */
+# define DSP_CAP_MULTI 0x00004000 /* support multiple open */
+# define DSP_CAP_BIND 0x00008000 /* channel binding to front/rear/cneter/lfe */
+
+
+#define SNDCTL_DSP_GETTRIGGER _SIOR ('P',16, int)
+#define SNDCTL_DSP_SETTRIGGER _SIOW ('P',16, int)
+# define PCM_ENABLE_INPUT 0x00000001
+# define PCM_ENABLE_OUTPUT 0x00000002
+
+typedef struct count_info {
+ int bytes; /* Total # of bytes processed */
+ int blocks; /* # of fragment transitions since last time */
+ int ptr; /* Current DMA pointer value */
+ } count_info;
+
+#define SNDCTL_DSP_GETIPTR _SIOR ('P',17, count_info)
+#define SNDCTL_DSP_GETOPTR _SIOR ('P',18, count_info)
+
+typedef struct buffmem_desc {
+ unsigned *buffer;
+ int size;
+ } buffmem_desc;
+#define SNDCTL_DSP_MAPINBUF _SIOR ('P', 19, buffmem_desc)
+#define SNDCTL_DSP_MAPOUTBUF _SIOR ('P', 20, buffmem_desc)
+#define SNDCTL_DSP_SETSYNCRO _SIO ('P', 21)
+#define SNDCTL_DSP_SETDUPLEX _SIO ('P', 22)
+#define SNDCTL_DSP_GETODELAY _SIOR ('P', 23, int)
+
+#define SNDCTL_DSP_GETCHANNELMASK _SIOWR('P', 64, int)
+#define SNDCTL_DSP_BIND_CHANNEL _SIOWR('P', 65, int)
+# define DSP_BIND_QUERY 0x00000000
+# define DSP_BIND_FRONT 0x00000001
+# define DSP_BIND_SURR 0x00000002
+# define DSP_BIND_CENTER_LFE 0x00000004
+# define DSP_BIND_HANDSET 0x00000008
+# define DSP_BIND_MIC 0x00000010
+# define DSP_BIND_MODEM1 0x00000020
+# define DSP_BIND_MODEM2 0x00000040
+# define DSP_BIND_I2S 0x00000080
+# define DSP_BIND_SPDIF 0x00000100
+
+#define SNDCTL_DSP_SETSPDIF _SIOW ('P', 66, int)
+#define SNDCTL_DSP_GETSPDIF _SIOR ('P', 67, int)
+# define SPDIF_PRO 0x0001
+# define SPDIF_N_AUD 0x0002
+# define SPDIF_COPY 0x0004
+# define SPDIF_PRE 0x0008
+# define SPDIF_CC 0x07f0
+# define SPDIF_L 0x0800
+# define SPDIF_DRS 0x4000
+# define SPDIF_V 0x8000
+
+/*
+ * Application's profile defines the way how playback underrun situations should be handled.
+ *
+ * APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the
+ * playback buffer whenever an underrun occurs. This consumes some time
+ * prevents looping the existing buffer.
+ * APF_CPUINTENS is intended to be set by CPU intensive applications which
+ * are likely to run out of time occasionally. In this mode the buffer cleanup is
+ * disabled which saves CPU time but also let's the previous buffer content to
+ * be played during the "pause" after the underrun.
+ */
+#define SNDCTL_DSP_PROFILE _SIOW ('P', 23, int)
+#define APF_NORMAL 0 /* Normal applications */
+#define APF_NETWORK 1 /* Underruns probably caused by an "external" delay */
+#define APF_CPUINTENS 2 /* Underruns probably caused by "overheating" the CPU */
+
+#define SOUND_PCM_READ_RATE _SIOR ('P', 2, int)
+#define SOUND_PCM_READ_CHANNELS _SIOR ('P', 6, int)
+#define SOUND_PCM_READ_BITS _SIOR ('P', 5, int)
+#define SOUND_PCM_READ_FILTER _SIOR ('P', 7, int)
+
+/* Some alias names */
+#define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SETFMT
+#define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED
+#define SOUND_PCM_POST SNDCTL_DSP_POST
+#define SOUND_PCM_RESET SNDCTL_DSP_RESET
+#define SOUND_PCM_SYNC SNDCTL_DSP_SYNC
+#define SOUND_PCM_SUBDIVIDE SNDCTL_DSP_SUBDIVIDE
+#define SOUND_PCM_SETFRAGMENT SNDCTL_DSP_SETFRAGMENT
+#define SOUND_PCM_GETFMTS SNDCTL_DSP_GETFMTS
+#define SOUND_PCM_SETFMT SNDCTL_DSP_SETFMT
+#define SOUND_PCM_GETOSPACE SNDCTL_DSP_GETOSPACE
+#define SOUND_PCM_GETISPACE SNDCTL_DSP_GETISPACE
+#define SOUND_PCM_NONBLOCK SNDCTL_DSP_NONBLOCK
+#define SOUND_PCM_GETCAPS SNDCTL_DSP_GETCAPS
+#define SOUND_PCM_GETTRIGGER SNDCTL_DSP_GETTRIGGER
+#define SOUND_PCM_SETTRIGGER SNDCTL_DSP_SETTRIGGER
+#define SOUND_PCM_SETSYNCRO SNDCTL_DSP_SETSYNCRO
+#define SOUND_PCM_GETIPTR SNDCTL_DSP_GETIPTR
+#define SOUND_PCM_GETOPTR SNDCTL_DSP_GETOPTR
+#define SOUND_PCM_MAPINBUF SNDCTL_DSP_MAPINBUF
+#define SOUND_PCM_MAPOUTBUF SNDCTL_DSP_MAPOUTBUF
+
+/*
+ * ioctl calls to be used in communication with coprocessors and
+ * DSP chips.
+ */
+
+typedef struct copr_buffer {
+ int command; /* Set to 0 if not used */
+ int flags;
+#define CPF_NONE 0x0000
+#define CPF_FIRST 0x0001 /* First block */
+#define CPF_LAST 0x0002 /* Last block */
+ int len;
+ int offs; /* If required by the device (0 if not used) */
+
+ unsigned char data[4000]; /* NOTE! 4000 is not 4k */
+ } copr_buffer;
+
+typedef struct copr_debug_buf {
+ int command; /* Used internally. Set to 0 */
+ int parm1;
+ int parm2;
+ int flags;
+ int len; /* Length of data in bytes */
+ } copr_debug_buf;
+
+typedef struct copr_msg {
+ int len;
+ unsigned char data[4000];
+ } copr_msg;
+
+#define SNDCTL_COPR_RESET _SIO ('C', 0)
+#define SNDCTL_COPR_LOAD _SIOWR('C', 1, copr_buffer)
+#define SNDCTL_COPR_RDATA _SIOWR('C', 2, copr_debug_buf)
+#define SNDCTL_COPR_RCODE _SIOWR('C', 3, copr_debug_buf)
+#define SNDCTL_COPR_WDATA _SIOW ('C', 4, copr_debug_buf)
+#define SNDCTL_COPR_WCODE _SIOW ('C', 5, copr_debug_buf)
+#define SNDCTL_COPR_RUN _SIOWR('C', 6, copr_debug_buf)
+#define SNDCTL_COPR_HALT _SIOWR('C', 7, copr_debug_buf)
+#define SNDCTL_COPR_SENDMSG _SIOWR('C', 8, copr_msg)
+#define SNDCTL_COPR_RCVMSG _SIOR ('C', 9, copr_msg)
+
+/*********************************************
+ * IOCTL commands for /dev/mixer
+ */
+
+/*
+ * Mixer devices
+ *
+ * There can be up to 20 different analog mixer channels. The
+ * SOUND_MIXER_NRDEVICES gives the currently supported maximum.
+ * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells
+ * the devices supported by the particular mixer.
+ */
+
+#define SOUND_MIXER_NRDEVICES 25
+#define SOUND_MIXER_VOLUME 0
+#define SOUND_MIXER_BASS 1
+#define SOUND_MIXER_TREBLE 2
+#define SOUND_MIXER_SYNTH 3
+#define SOUND_MIXER_PCM 4
+#define SOUND_MIXER_SPEAKER 5
+#define SOUND_MIXER_LINE 6
+#define SOUND_MIXER_MIC 7
+#define SOUND_MIXER_CD 8
+#define SOUND_MIXER_IMIX 9 /* Recording monitor */
+#define SOUND_MIXER_ALTPCM 10
+#define SOUND_MIXER_RECLEV 11 /* Recording level */
+#define SOUND_MIXER_IGAIN 12 /* Input gain */
+#define SOUND_MIXER_OGAIN 13 /* Output gain */
+/*
+ * The AD1848 codec and compatibles have three line level inputs
+ * (line, aux1 and aux2). Since each card manufacturer have assigned
+ * different meanings to these inputs, it's inpractical to assign
+ * specific meanings (line, cd, synth etc.) to them.
+ */
+#define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */
+#define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */
+#define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */
+#define SOUND_MIXER_DIGITAL1 17 /* Digital (input) 1 */
+#define SOUND_MIXER_DIGITAL2 18 /* Digital (input) 2 */
+#define SOUND_MIXER_DIGITAL3 19 /* Digital (input) 3 */
+#define SOUND_MIXER_PHONEIN 20 /* Phone input */
+#define SOUND_MIXER_PHONEOUT 21 /* Phone output */
+#define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */
+#define SOUND_MIXER_RADIO 23 /* Radio in */
+#define SOUND_MIXER_MONITOR 24 /* Monitor (usually mic) volume */
+
+/* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */
+/* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */
+#define SOUND_ONOFF_MIN 28
+#define SOUND_ONOFF_MAX 30
+
+/* Note! Number 31 cannot be used since the sign bit is reserved */
+#define SOUND_MIXER_NONE 31
+
+/*
+ * The following unsupported macros are no longer functional.
+ * Use SOUND_MIXER_PRIVATE# macros in future.
+ */
+#define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE
+#define SOUND_MIXER_MUTE SOUND_MIXER_NONE
+#define SOUND_MIXER_LOUD SOUND_MIXER_NONE
+
+
+#define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \
+ "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \
+ "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \
+ "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"}
+
+#define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \
+ "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \
+ "line1", "line2", "line3", "dig1", "dig2", "dig3", \
+ "phin", "phout", "video", "radio", "monitor"}
+
+/* Device bitmask identifiers */
+
+#define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */
+#define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */
+#define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */
+#define SOUND_MIXER_CAPS 0xfc
+# define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */
+#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */
+#define SOUND_MIXER_OUTSRC 0xfa /* Arg contains a bit for each input source to output */
+#define SOUND_MIXER_OUTMASK 0xf9 /* Arg contains a bit for each supported input source to output */
+
+/* Device mask bits */
+
+#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)
+#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)
+#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)
+#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)
+#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)
+#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)
+#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)
+#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)
+#define SOUND_MASK_CD (1 << SOUND_MIXER_CD)
+#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)
+#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)
+#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)
+#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN)
+#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN)
+#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1)
+#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2)
+#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3)
+#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1)
+#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2)
+#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3)
+#define SOUND_MASK_PHONEIN (1 << SOUND_MIXER_PHONEIN)
+#define SOUND_MASK_PHONEOUT (1 << SOUND_MIXER_PHONEOUT)
+#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO)
+#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO)
+#define SOUND_MASK_MONITOR (1 << SOUND_MIXER_MONITOR)
+
+/* Obsolete macros */
+#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)
+#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)
+#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)
+
+#define MIXER_READ(dev) _SIOR('M', dev, int)
+#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)
+#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)
+#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)
+#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)
+#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)
+#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)
+#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)
+#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)
+#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)
+#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)
+#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)
+#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)
+#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN)
+#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN)
+#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1)
+#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2)
+#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3)
+
+/* Obsolete macros */
+#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE)
+#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE)
+#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD)
+
+#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)
+#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)
+#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)
+#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)
+#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)
+
+#define MIXER_WRITE(dev) _SIOWR('M', dev, int)
+#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)
+#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)
+#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)
+#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)
+#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)
+#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)
+#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)
+#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)
+#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)
+#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)
+#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)
+#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)
+#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN)
+#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN)
+#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1)
+#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2)
+#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3)
+
+/* Obsolete macros */
+#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE)
+#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE)
+#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD)
+
+#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)
+
+typedef struct mixer_info
+{
+ char id[16];
+ char name[32];
+ int modify_counter;
+ int fillers[10];
+} mixer_info;
+
+typedef struct _old_mixer_info /* Obsolete */
+{
+ char id[16];
+ char name[32];
+} _old_mixer_info;
+
+#define SOUND_MIXER_INFO _SIOR ('M', 101, mixer_info)
+#define SOUND_OLD_MIXER_INFO _SIOR ('M', 101, _old_mixer_info)
+
+/*
+ * A mechanism for accessing "proprietary" mixer features. This method
+ * permits passing 128 bytes of arbitrary data between a mixer application
+ * and the mixer driver. Interpretation of the record is defined by
+ * the particular mixer driver.
+ */
+typedef unsigned char mixer_record[128];
+
+#define SOUND_MIXER_ACCESS _SIOWR('M', 102, mixer_record)
+
+/*
+ * Two ioctls for special souncard function
+ */
+#define SOUND_MIXER_AGC _SIOWR('M', 103, int)
+#define SOUND_MIXER_3DSE _SIOWR('M', 104, int)
+
+/*
+ * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers.
+ * These features can be used when accessing device specific features.
+ */
+#define SOUND_MIXER_PRIVATE1 _SIOWR('M', 111, int)
+#define SOUND_MIXER_PRIVATE2 _SIOWR('M', 112, int)
+#define SOUND_MIXER_PRIVATE3 _SIOWR('M', 113, int)
+#define SOUND_MIXER_PRIVATE4 _SIOWR('M', 114, int)
+#define SOUND_MIXER_PRIVATE5 _SIOWR('M', 115, int)
+
+/*
+ * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used
+ * for querying current mixer settings from the driver and for loading
+ * default volume settings _prior_ activating the mixer (loading
+ * doesn't affect current state of the mixer hardware). These calls
+ * are for internal use only.
+ */
+
+typedef struct mixer_vol_table {
+ int num; /* Index to volume table */
+ char name[32];
+ int levels[32];
+} mixer_vol_table;
+
+#define SOUND_MIXER_GETLEVELS _SIOWR('M', 116, mixer_vol_table)
+#define SOUND_MIXER_SETLEVELS _SIOWR('M', 117, mixer_vol_table)
+
+/*
+ * An ioctl for identifying the driver version. It will return value
+ * of the SOUND_VERSION macro used when compiling the driver.
+ * This call was introduced in OSS version 3.6 and it will not work
+ * with earlier versions (returns EINVAL).
+ */
+#define OSS_GETVERSION _SIOR ('M', 118, int)
+
+/*
+ * Level 2 event types for /dev/sequencer
+ */
+
+/*
+ * The 4 most significant bits of byte 0 specify the class of
+ * the event:
+ *
+ * 0x8X = system level events,
+ * 0x9X = device/port specific events, event[1] = device/port,
+ * The last 4 bits give the subtype:
+ * 0x02 = Channel event (event[3] = chn).
+ * 0x01 = note event (event[4] = note).
+ * (0x01 is not used alone but always with bit 0x02).
+ * event[2] = MIDI message code (0x80=note off etc.)
+ *
+ */
+
+#define EV_SEQ_LOCAL 0x80
+#define EV_TIMING 0x81
+#define EV_CHN_COMMON 0x92
+#define EV_CHN_VOICE 0x93
+#define EV_SYSEX 0x94
+/*
+ * Event types 200 to 220 are reserved for application use.
+ * These numbers will not be used by the driver.
+ */
+
+/*
+ * Events for event type EV_CHN_VOICE
+ */
+
+#define MIDI_NOTEOFF 0x80
+#define MIDI_NOTEON 0x90
+#define MIDI_KEY_PRESSURE 0xA0
+
+/*
+ * Events for event type EV_CHN_COMMON
+ */
+
+#define MIDI_CTL_CHANGE 0xB0
+#define MIDI_PGM_CHANGE 0xC0
+#define MIDI_CHN_PRESSURE 0xD0
+#define MIDI_PITCH_BEND 0xE0
+
+#define MIDI_SYSTEM_PREFIX 0xF0
+
+/*
+ * Timer event types
+ */
+#define TMR_WAIT_REL 1 /* Time relative to the prev time */
+#define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */
+#define TMR_STOP 3
+#define TMR_START 4
+#define TMR_CONTINUE 5
+#define TMR_TEMPO 6
+#define TMR_ECHO 8
+#define TMR_CLOCK 9 /* MIDI clock */
+#define TMR_SPP 10 /* Song position pointer */
+#define TMR_TIMESIG 11 /* Time signature */
+
+/*
+ * Local event types
+ */
+#define LOCL_STARTAUDIO 1
+
+#if (!defined(__KERNEL__) && !defined(KERNEL) && !defined(INKERNEL) && !defined(_KERNEL)) || defined(USE_SEQ_MACROS)
+/*
+ * Some convenience macros to simplify programming of the
+ * /dev/sequencer interface
+ *
+ * These macros define the API which should be used when possible.
+ */
+#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF()
+
+void seqbuf_dump(void); /* This function must be provided by programs */
+
+extern int OSS_init(int seqfd, int buflen);
+extern void OSS_seqbuf_dump(int fd, unsigned char *buf, int buflen);
+extern void OSS_seq_advbuf(int len, int fd, unsigned char *buf, int buflen);
+extern void OSS_seq_needbuf(int len, int fd, unsigned char *buf, int buflen);
+extern void OSS_patch_caching(int dev, int chn, int patch,
+ int fd, unsigned char *buf, int buflen);
+extern void OSS_drum_caching(int dev, int chn, int patch,
+ int fd, unsigned char *buf, int buflen);
+extern void OSS_write_patch(int fd, unsigned char *buf, int len);
+extern int OSS_write_patch2(int fd, unsigned char *buf, int len);
+
+#define SEQ_PM_DEFINES int __foo_bar___
+#ifdef OSSLIB
+# define SEQ_USE_EXTBUF() \
+ extern unsigned char *_seqbuf; \
+ extern int _seqbuflen;extern int _seqbufptr
+# define SEQ_DEFINEBUF(len) SEQ_USE_EXTBUF();static int _requested_seqbuflen=len
+# define _SEQ_ADVBUF(len) OSS_seq_advbuf(len, seqfd, _seqbuf, _seqbuflen)
+# define _SEQ_NEEDBUF(len) OSS_seq_needbuf(len, seqfd, _seqbuf, _seqbuflen)
+# define SEQ_DUMPBUF() OSS_seqbuf_dump(seqfd, _seqbuf, _seqbuflen)
+
+# define SEQ_LOAD_GMINSTR(dev, instr) \
+ OSS_patch_caching(dev, -1, instr, seqfd, _seqbuf, _seqbuflen)
+# define SEQ_LOAD_GMDRUM(dev, drum) \
+ OSS_drum_caching(dev, -1, drum, seqfd, _seqbuf, _seqbuflen)
+#else /* !OSSLIB */
+
+# define SEQ_LOAD_GMINSTR(dev, instr)
+# define SEQ_LOAD_GMDRUM(dev, drum)
+
+# define SEQ_USE_EXTBUF() \
+ extern unsigned char _seqbuf[]; \
+ extern int _seqbuflen;extern int _seqbufptr
+
+#ifndef USE_SIMPLE_MACROS
+/* Sample seqbuf_dump() implementation:
+ *
+ * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes
+ *
+ * int seqfd; -- The file descriptor for /dev/sequencer.
+ *
+ * void
+ * seqbuf_dump ()
+ * {
+ * if (_seqbufptr)
+ * if (write (seqfd, _seqbuf, _seqbufptr) == -1)
+ * {
+ * perror ("write /dev/sequencer");
+ * exit (-1);
+ * }
+ * _seqbufptr = 0;
+ * }
+ */
+
+#define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0
+#define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()
+#define _SEQ_ADVBUF(len) _seqbufptr += len
+#define SEQ_DUMPBUF seqbuf_dump
+#else
+/*
+ * This variation of the sequencer macros is used just to format one event
+ * using fixed buffer.
+ *
+ * The program using the macro library must define the following macros before
+ * using this library.
+ *
+ * #define _seqbuf name of the buffer (unsigned char[])
+ * #define _SEQ_ADVBUF(len) If the applic needs to know the exact
+ * size of the event, this macro can be used.
+ * Otherwise this must be defined as empty.
+ * #define _seqbufptr Define the name of index variable or 0 if
+ * not required.
+ */
+#define _SEQ_NEEDBUF(len) /* empty */
+#endif
+#endif /* !OSSLIB */
+
+#define SEQ_VOLUME_MODE(dev, mode) {_SEQ_NEEDBUF(8);\
+ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
+ _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\
+ _seqbuf[_seqbufptr+2] = (dev);\
+ _seqbuf[_seqbufptr+3] = (mode);\
+ _seqbuf[_seqbufptr+4] = 0;\
+ _seqbuf[_seqbufptr+5] = 0;\
+ _seqbuf[_seqbufptr+6] = 0;\
+ _seqbuf[_seqbufptr+7] = 0;\
+ _SEQ_ADVBUF(8);}
+
+/*
+ * Midi voice messages
+ */
+
+#define _CHN_VOICE(dev, event, chn, note, parm) \
+ {_SEQ_NEEDBUF(8);\
+ _seqbuf[_seqbufptr] = EV_CHN_VOICE;\
+ _seqbuf[_seqbufptr+1] = (dev);\
+ _seqbuf[_seqbufptr+2] = (event);\
+ _seqbuf[_seqbufptr+3] = (chn);\
+ _seqbuf[_seqbufptr+4] = (note);\
+ _seqbuf[_seqbufptr+5] = (parm);\
+ _seqbuf[_seqbufptr+6] = (0);\
+ _seqbuf[_seqbufptr+7] = 0;\
+ _SEQ_ADVBUF(8);}
+
+#define SEQ_START_NOTE(dev, chn, note, vol) \
+ _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol)
+
+#define SEQ_STOP_NOTE(dev, chn, note, vol) \
+ _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol)
+
+#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \
+ _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure)
+
+/*
+ * Midi channel messages
+ */
+
+#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \
+ {_SEQ_NEEDBUF(8);\
+ _seqbuf[_seqbufptr] = EV_CHN_COMMON;\
+ _seqbuf[_seqbufptr+1] = (dev);\
+ _seqbuf[_seqbufptr+2] = (event);\
+ _seqbuf[_seqbufptr+3] = (chn);\
+ _seqbuf[_seqbufptr+4] = (p1);\
+ _seqbuf[_seqbufptr+5] = (p2);\
+ *(short *)&_seqbuf[_seqbufptr+6] = (w14);\
+ _SEQ_ADVBUF(8);}
+/*
+ * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits
+ * sending any MIDI bytes but it's absolutely not possible. Trying to do
+ * so _will_ cause problems with MPU401 intelligent mode).
+ *
+ * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be
+ * sent by calling SEQ_SYSEX() several times (there must be no other events
+ * between them). First sysex fragment must have 0xf0 in the first byte
+ * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte
+ * between these sysex start and end markers cannot be larger than 0x7f. Also
+ * lengths of each fragments (except the last one) must be 6.
+ *
+ * Breaking the above rules may work with some MIDI ports but is likely to
+ * cause fatal problems with some other devices (such as MPU401).
+ */
+#define SEQ_SYSEX(dev, buf, len) \
+ {int ii, ll=(len); \
+ unsigned char *bufp=buf;\
+ if (ll>6)ll=6;\
+ _SEQ_NEEDBUF(8);\
+ _seqbuf[_seqbufptr] = EV_SYSEX;\
+ _seqbuf[_seqbufptr+1] = (dev);\
+ for(ii=0;ii<ll;ii++)\
+ _seqbuf[_seqbufptr+ii+2] = bufp[ii];\
+ for(ii=ll;ii<6;ii++)\
+ _seqbuf[_seqbufptr+ii+2] = 0xff;\
+ _SEQ_ADVBUF(8);}
+
+#define SEQ_CHN_PRESSURE(dev, chn, pressure) \
+ _CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)
+
+#define SEQ_SET_PATCH SEQ_PGM_CHANGE
+#ifdef OSSLIB
+# define SEQ_PGM_CHANGE(dev, chn, patch) \
+ {OSS_patch_caching(dev, chn, patch, seqfd, _seqbuf, _seqbuflen); \
+ _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0);}
+#else
+# define SEQ_PGM_CHANGE(dev, chn, patch) \
+ _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)
+#endif
+
+#define SEQ_CONTROL(dev, chn, controller, value) \
+ _CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)
+
+#define SEQ_BENDER(dev, chn, value) \
+ _CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)
+
+
+#define SEQ_V2_X_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\
+ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
+ _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\
+ _seqbuf[_seqbufptr+2] = (dev);\
+ _seqbuf[_seqbufptr+3] = (voice);\
+ _seqbuf[_seqbufptr+4] = (controller);\
+ _seqbuf[_seqbufptr+5] = ((value)&0xff);\
+ _seqbuf[_seqbufptr+6] = ((value>>8)&0xff);\
+ _seqbuf[_seqbufptr+7] = 0;\
+ _SEQ_ADVBUF(8);}
+/*
+ * The following 5 macros are incorrectly implemented and obsolete.
+ * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead.
+ */
+#define SEQ_PITCHBEND(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)
+#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)
+#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128)
+#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100)
+#define SEQ_PANNING(dev, voice, pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2)
+
+/*
+ * Timing and syncronization macros
+ */
+
+#define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\
+ _seqbuf[_seqbufptr+0] = EV_TIMING; \
+ _seqbuf[_seqbufptr+1] = (ev); \
+ _seqbuf[_seqbufptr+2] = 0;\
+ _seqbuf[_seqbufptr+3] = 0;\
+ *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \
+ _SEQ_ADVBUF(8);}
+
+#define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0)
+#define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0)
+#define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0)
+#define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks)
+#define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks)
+#define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key)
+#define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value)
+#define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos)
+#define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig)
+
+/*
+ * Local control events
+ */
+
+#define _LOCAL_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\
+ _seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \
+ _seqbuf[_seqbufptr+1] = (ev); \
+ _seqbuf[_seqbufptr+2] = 0;\
+ _seqbuf[_seqbufptr+3] = 0;\
+ *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \
+ _SEQ_ADVBUF(8);}
+
+#define SEQ_PLAYAUDIO(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO, devmask)
+/*
+ * Events for the level 1 interface only
+ */
+
+#define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\
+ _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\
+ _seqbuf[_seqbufptr+1] = (byte);\
+ _seqbuf[_seqbufptr+2] = (device);\
+ _seqbuf[_seqbufptr+3] = 0;\
+ _SEQ_ADVBUF(4);}
+
+/*
+ * Patch loading.
+ */
+#ifdef OSSLIB
+# define SEQ_WRPATCH(patchx, len) \
+ OSS_write_patch(seqfd, (char*)(patchx), len)
+# define SEQ_WRPATCH2(patchx, len) \
+ OSS_write_patch2(seqfd, (char*)(patchx), len)
+#else
+# define SEQ_WRPATCH(patchx, len) \
+ {if (_seqbufptr) SEQ_DUMPBUF();\
+ if (write(seqfd, (char*)(patchx), len)==-1) \
+ perror("Write patch: /dev/sequencer");}
+# define SEQ_WRPATCH2(patchx, len) \
+ (SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len))
+#endif
+
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/sparc-ioctl.h b/mdk-stage1/dietlibc/include/sys/sparc-ioctl.h
new file mode 100644
index 000000000..07b502465
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/sparc-ioctl.h
@@ -0,0 +1,172 @@
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+#define _IOC_SIZEBITS 8
+#define _IOC_RESVBITS 5
+#define _IOC_DIRBITS 3
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_RESVMASK ((1 << _IOC_RESVBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT + _IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT + _IOC_TYPEBITS)
+#define _IOC_RESVSHIFT (_IOC_SIZESHIFT + _IOC_SIZEBITS)
+#define _IOC_DIRSHIFT (_IOC_RESVSHIFT + _IOC_RESVBITS)
+
+#define _IOC_NONE 1U
+#define _IOC_READ 2U
+#define _IOC_WRITE 4U
+
+#define _IOC(dir,type,nr,size) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the PCMCIA... */
+
+#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
+
+/* Big T */
+#define TCGETA _IOR('T', 1, struct termio)
+#define TCSETA _IOW('T', 2, struct termio)
+#define TCSETAW _IOW('T', 3, struct termio)
+#define TCSETAF _IOW('T', 4, struct termio)
+#define TCSBRK _IO('T', 5)
+#define TCXONC _IO('T', 6)
+#define TCFLSH _IO('T', 7)
+#define TCGETS _IOR('T', 8, struct termios)
+#define TCSETS _IOW('T', 9, struct termios)
+#define TCSETSW _IOW('T', 10, struct termios)
+#define TCSETSF _IOW('T', 11, struct termios)
+
+/* Note that all the ioctls that are not available in Linux have a
+ * double underscore on the front to: a) avoid some programs to
+ * thing we support some ioctls under Linux (autoconfiguration stuff)
+ */
+/* Little t */
+#define TIOCGETD _IOR('t', 0, int)
+#define TIOCSETD _IOW('t', 1, int)
+#define __TIOCHPCL _IO('t', 2) /* SunOS Specific */
+#define __TIOCMODG _IOR('t', 3, int) /* SunOS Specific */
+#define __TIOCMODS _IOW('t', 4, int) /* SunOS Specific */
+#define __TIOCGETP _IOR('t', 8, struct sgttyb) /* SunOS Specific */
+#define __TIOCSETP _IOW('t', 9, struct sgttyb) /* SunOS Specific */
+#define __TIOCSETN _IOW('t', 10, struct sgttyb) /* SunOS Specific */
+#define TIOCEXCL _IO('t', 13)
+#define TIOCNXCL _IO('t', 14)
+#define __TIOCFLUSH _IOW('t', 16, int) /* SunOS Specific */
+#define __TIOCSETC _IOW('t', 17, struct tchars) /* SunOS Specific */
+#define __TIOCGETC _IOR('t', 18, struct tchars) /* SunOS Specific */
+#define __TIOCTCNTL _IOW('t', 32, int) /* SunOS Specific */
+#define __TIOCSIGNAL _IOW('t', 33, int) /* SunOS Specific */
+#define __TIOCSETX _IOW('t', 34, int) /* SunOS Specific */
+#define __TIOCGETX _IOR('t', 35, int) /* SunOS Specific */
+#define TIOCCONS _IO('t', 36)
+#define __TIOCSSIZE _IOW('t', 37, struct sunos_ttysize) /* SunOS Specific */
+#define __TIOCGSIZE _IOR('t', 38, struct sunos_ttysize) /* SunOS Specific */
+#define TIOCGSOFTCAR _IOR('t', 100, int)
+#define TIOCSSOFTCAR _IOW('t', 101, int)
+#define __TIOCUCNTL _IOW('t', 102, int) /* SunOS Specific */
+#define TIOCSWINSZ _IOW('t', 103, struct winsize)
+#define TIOCGWINSZ _IOR('t', 104, struct winsize)
+#define __TIOCREMOTE _IOW('t', 105, int) /* SunOS Specific */
+#define TIOCMGET _IOR('t', 106, int)
+#define TIOCMBIC _IOW('t', 107, int)
+#define TIOCMBIS _IOW('t', 108, int)
+#define TIOCMSET _IOW('t', 109, int)
+#define __TIOCSTART _IO('t', 110) /* SunOS Specific */
+#define __TIOCSTOP _IO('t', 111) /* SunOS Specific */
+#define TIOCPKT _IOW('t', 112, int)
+#define TIOCNOTTY _IO('t', 113)
+#define TIOCSTI _IOW('t', 114, char)
+#define TIOCOUTQ _IOR('t', 115, int)
+#define __TIOCGLTC _IOR('t', 116, struct ltchars) /* SunOS Specific */
+#define __TIOCSLTC _IOW('t', 117, struct ltchars) /* SunOS Specific */
+/* 118 is the non-posix setpgrp tty ioctl */
+/* 119 is the non-posix getpgrp tty ioctl */
+#define __TIOCCDTR _IO('t', 120) /* SunOS Specific */
+#define __TIOCSDTR _IO('t', 121) /* SunOS Specific */
+#define TIOCCBRK _IO('t', 122)
+#define TIOCSBRK _IO('t', 123)
+#define __TIOCLGET _IOW('t', 124, int) /* SunOS Specific */
+#define __TIOCLSET _IOW('t', 125, int) /* SunOS Specific */
+#define __TIOCLBIC _IOW('t', 126, int) /* SunOS Specific */
+#define __TIOCLBIS _IOW('t', 127, int) /* SunOS Specific */
+#define __TIOCISPACE _IOR('t', 128, int) /* SunOS Specific */
+#define __TIOCISIZE _IOR('t', 129, int) /* SunOS Specific */
+#define TIOCSPGRP _IOW('t', 130, int)
+#define TIOCGPGRP _IOR('t', 131, int)
+#define TIOCSCTTY _IO('t', 132)
+#define TIOCGSID _IOR('t', 133, int)
+/* Get minor device of a pty master's FD -- Solaris equiv is ISPTM */
+#define TIOCGPTN _IOR('t', 134, unsigned int) /* Get Pty Number */
+#define TIOCSPTLCK _IOW('t', 135, int) /* Lock/unlock PTY */
+
+/* Little f */
+#define FIOCLEX _IO('f', 1)
+#define FIONCLEX _IO('f', 2)
+#define FIOASYNC _IOW('f', 125, int)
+#define FIONBIO _IOW('f', 126, int)
+#define FIONREAD _IOR('f', 127, int)
+#define TIOCINQ FIONREAD
+#define FIOQSIZE _IOR('f', 128, loff_t)
+
+/* SCARY Rutgers local SunOS kernel hackery, perhaps I will support it
+ * someday. This is completely bogus, I know...
+ */
+#define __TCGETSTAT _IO('T', 200) /* Rutgers specific */
+#define __TCSETSTAT _IO('T', 201) /* Rutgers specific */
+
+/* Linux specific, no SunOS equivalent. */
+#define TIOCLINUX 0x541C
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TCSBRKP 0x5425
+#define TIOCTTYGSTRUCT 0x5426
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
+#define TIOCSERGETLSR 0x5459 /* Get line status register */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+#define TIOCMIWAIT 0x545C /* Wait input */
+#define TIOCGICOUNT 0x545D /* Read serial port inline interrupt counts */
+
+/* Used for packet mode */
+#define TIOCPKT_DATA 0
+#define TIOCPKT_FLUSHREAD 1
+#define TIOCPKT_FLUSHWRITE 2
+#define TIOCPKT_STOP 4
+#define TIOCPKT_START 8
+#define TIOCPKT_NOSTOP 16
+#define TIOCPKT_DOSTOP 32
+
+/* Socket-level I/O control calls. */
+#define FIOSETOWN 0x8901
+#define SIOCSPGRP 0x8902
+#define FIOGETOWN 0x8903
+#define SIOCGPGRP 0x8904
+#define SIOCATMARK 0x8905
+#define SIOCGSTAMP 0x8906 /* Get stamp */
+
diff --git a/mdk-stage1/dietlibc/include/sys/stat.h b/mdk-stage1/dietlibc/include/sys/stat.h
index 10fddfa42..d31cbd1f2 100644
--- a/mdk-stage1/dietlibc/include/sys/stat.h
+++ b/mdk-stage1/dietlibc/include/sys/stat.h
@@ -3,30 +3,499 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <endian.h>
-#include <linux/stat.h>
-#include <asm/stat.h>
+#if defined(__i386__)
+struct stat {
+ unsigned short st_dev;
+ unsigned short __pad1;
+ unsigned long st_ino;
+ unsigned short st_mode;
+ unsigned short st_nlink;
+ unsigned short st_uid;
+ unsigned short st_gid;
+ unsigned short st_rdev;
+ unsigned short __pad2;
+ unsigned long st_size;
+ unsigned long st_blksize;
+ unsigned long st_blocks;
+ signed long st_atime;
+ unsigned long __unused1;
+ signed long st_mtime;
+ unsigned long __unused2;
+ signed long st_ctime;
+ unsigned long __unused3;
+ unsigned long __unused4;
+ unsigned long __unused5;
+};
+
+struct stat64 {
+ unsigned short st_dev;
+ unsigned char __pad0[10];
+
+#define STAT64_HAS_BROKEN_ST_INO 1
+ unsigned long __st_ino;
+
+ unsigned int st_mode;
+ unsigned int st_nlink;
+
+ unsigned long st_uid;
+ unsigned long st_gid;
+
+ unsigned short st_rdev;
+ unsigned char __pad3[10];
+
+__extension__ long long st_size;
+ unsigned long st_blksize;
+
+ unsigned long st_blocks; /* Number 512-byte blocks allocated. */
+ unsigned long __pad4; /* future possible st_blocks high bits */
+
+ unsigned long st_atime;
+ unsigned long __pad5;
+
+ signed long st_mtime;
+ unsigned long __pad6;
+
+ unsigned long st_ctime;
+ unsigned long __pad7; /* will be high 32 bits of ctime someday */
+
+__extension__ unsigned long long st_ino;
+};
+#elif defined(__sparc__)
+struct stat {
+ unsigned short st_dev;
+ unsigned long st_ino;
+ unsigned short st_mode;
+ short st_nlink;
+ unsigned short st_uid;
+ unsigned short st_gid;
+ unsigned short st_rdev;
+ long st_size;
+ long st_atime;
+ unsigned long __unused1;
+ long st_mtime;
+ unsigned long __unused2;
+ long st_ctime;
+ unsigned long __unused3;
+ long st_blksize;
+ long st_blocks;
+ unsigned long __unused4[2];
+};
+
+struct stat64 {
+ unsigned char __pad0[6];
+ unsigned short st_dev;
+
+__extension__ unsigned long long st_ino;
+
+ unsigned int st_mode;
+ unsigned int st_nlink;
+
+ unsigned int st_uid;
+ unsigned int st_gid;
+
+ unsigned char __pad2[6];
+ unsigned short st_rdev;
+
+ unsigned char __pad3[8];
+
+__extension__ long long st_size;
+ unsigned int st_blksize;
+
+ unsigned char __pad4[8];
+ unsigned int st_blocks;
+
+ signed int st_atime;
+ unsigned int __unused1;
+
+ signed int st_mtime;
+ unsigned int __unused2;
+
+ signed int st_ctime;
+ unsigned int __unused3;
+
+ unsigned int __unused4;
+ unsigned int __unused5;
+};
+#elif defined(__alpha__)
+struct stat {
+ unsigned int st_dev;
+ unsigned int st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+ unsigned int st_uid;
+ unsigned int st_gid;
+ unsigned int st_rdev;
+ long st_size;
+ signed long st_atime;
+ signed long st_mtime;
+ signed long st_ctime;
+ unsigned int st_blksize;
+ int st_blocks;
+ unsigned int st_flags;
+ unsigned int st_gen;
+};
+#elif defined(__mips__)
+struct stat {
+ unsigned int st_dev;
+ long st_pad1[3]; /* Reserved for network id */
+ ino_t st_ino;
+ unsigned int st_mode;
+ int st_nlink;
+ int st_uid;
+ int st_gid;
+ unsigned int st_rdev;
+ long st_pad2[2];
+ long st_size;
+ long st_pad3;
+ /*
+ * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
+ * but we don't have it under Linux.
+ */
+ time_t st_atime;
+ long reserved0;
+ time_t st_mtime;
+ long reserved1;
+ time_t st_ctime;
+ long reserved2;
+ long st_blksize;
+ long st_blocks;
+ char st_fstype[16]; /* Filesystem type name */
+ long st_pad4[8];
+ /* Linux specific fields */
+ unsigned int st_flags;
+ unsigned int st_gen;
+};
+
+struct stat64 {
+ unsigned long st_dev;
+ unsigned long st_pad0[3]; /* Reserved for st_dev expansion */
+__extension__ unsigned long long st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+ unsigned int st_uid;
+ unsigned int st_gid;
+ unsigned long st_rdev;
+ unsigned long st_pad1[3]; /* Reserved for st_rdev expansion */
+__extension__ long long st_size;
+ /*
+ * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
+ * but we don't have it under Linux.
+ */
+ time_t st_atime;
+ unsigned long reserved0; /* Reserved for st_atime expansion */
+ time_t st_mtime;
+ unsigned long reserved1; /* Reserved for st_atime expansion */
+ time_t st_ctime;
+ unsigned long reserved2; /* Reserved for st_atime expansion */
+ unsigned long st_blksize;
+ unsigned long st_pad2;
+__extension__ long long st_blocks;
+};
+#elif defined(__powerpc__)
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ off_t st_size;
+ unsigned long st_blksize;
+ unsigned long st_blocks;
+ signed long st_atime;
+ unsigned long __unused1;
+ signed long st_mtime;
+ unsigned long __unused2;
+ signed long st_ctime;
+ unsigned long __unused3;
+ unsigned long __unused4;
+ unsigned long __unused5;
+};
+
+/* This matches struct stat64 in glibc2.1.
+ */
+struct stat64 {
+__extension__ unsigned long long st_dev; /* Device. */
+__extension__ unsigned long long st_ino; /* File serial number. */
+ unsigned int st_mode; /* File mode. */
+ unsigned int st_nlink; /* Link count. */
+ unsigned int st_uid; /* User ID of the file's owner. */
+ unsigned int st_gid; /* Group ID of the file's group. */
+__extension__ unsigned long long st_rdev; /* Device number, if device. */
+ unsigned short int __pad2;
+__extension__ long long st_size; /* Size of file, in bytes. */
+ long st_blksize; /* Optimal block size for I/O. */
+
+__extension__ long long st_blocks; /* Number 512-byte blocks allocated. */
+ long st_atime; /* Time of last access. */
+ unsigned long int __unused1;
+ long st_mtime; /* Time of last modification. */
+ unsigned long int __unused2;
+ long st_ctime; /* Time of last status change. */
+ unsigned long int __unused3;
+ unsigned long int __unused4;
+ unsigned long int __unused5;
+};
+#elif defined(__arm__)
+struct stat {
+ unsigned short st_dev;
+ unsigned short __pad1;
+ unsigned long st_ino;
+ unsigned short st_mode;
+ unsigned short st_nlink;
+ unsigned short st_uid;
+ unsigned short st_gid;
+ unsigned short st_rdev;
+ unsigned short __pad2;
+ unsigned long st_size;
+ unsigned long st_blksize;
+ unsigned long st_blocks;
+ signed long st_atime;
+ unsigned long __unused1;
+ signed long st_mtime;
+ unsigned long __unused2;
+ signed long st_ctime;
+ unsigned long __unused3;
+ unsigned long __unused4;
+ unsigned long __unused5;
+};
+
+/* This matches struct stat64 in glibc2.1, hence the absolutely
+ * insane amounts of padding around dev_t's.
+ */
+struct stat64 {
+ unsigned short st_dev;
+ unsigned char __pad0[10];
+
+#define STAT64_HAS_BROKEN_ST_INO 1
+ unsigned long __st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+
+ unsigned long st_uid;
+ unsigned long st_gid;
+
+ unsigned short st_rdev;
+ unsigned char __pad3[10];
+
+__extension__ long long st_size;
+ unsigned long st_blksize;
+
+ unsigned long st_blocks; /* Number 512-byte blocks allocated. */
+ unsigned long __pad4; /* future possible st_blocks high bits */
+
+ signed long st_atime;
+ unsigned long __pad5;
+
+ signed long st_mtime;
+ unsigned long __pad6;
+
+ signed long st_ctime;
+ unsigned long __pad7; /* will be high 32 bits of ctime someday */
+
+__extension__ unsigned long long st_ino;
+};
+#elif defined(__s390__)
+struct stat {
+ unsigned short st_dev;
+ unsigned short __pad1;
+ unsigned long st_ino;
+ unsigned short st_mode;
+ unsigned short st_nlink;
+ unsigned short st_uid;
+ unsigned short st_gid;
+ unsigned short st_rdev;
+ unsigned short __pad2;
+ unsigned long st_size;
+ unsigned long st_blksize;
+ unsigned long st_blocks;
+ unsigned long st_atime;
+ unsigned long __unused1;
+ unsigned long st_mtime;
+ unsigned long __unused2;
+ unsigned long st_ctime;
+ unsigned long __unused3;
+ unsigned long __unused4;
+ unsigned long __unused5;
+};
+struct stat64 {
+ unsigned char __pad0[6];
+ unsigned short st_dev;
+ unsigned int __pad1;
+#define STAT64_HAS_BROKEN_ST_INO 1
+ unsigned long __st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+ unsigned long st_uid;
+ unsigned long st_gid;
+ unsigned char __pad2[6];
+ unsigned short st_rdev;
+ unsigned int __pad3;
+__extension__ long long st_size;
+ unsigned long st_blksize;
+ unsigned char __pad4[4];
+ unsigned long __pad5; /* future possible st_blocks high bits */
+ unsigned long st_blocks; /* Number 512-byte blocks allocated. */
+ unsigned long st_atime;
+ unsigned long __pad6;
+ unsigned long st_mtime;
+ unsigned long __pad7;
+ unsigned long st_ctime;
+ unsigned long __pad8; /* will be high 32 bits of ctime someday */
+__extension__ unsigned long long st_ino;
+};
+
+#elif defined(__hppa__)
+
+struct stat {
+ unsigned long long st_dev;
+ unsigned short int _pad1;
+ unsigned long st_ino;
+ unsigned long st_mode;
+ unsigned long st_nlink;
+ unsigned long st_uid;
+ unsigned long st_gid;
+ unsigned long long st_rdev;
+ unsigned short int _pad2;
+ unsigned long st_size;
+ unsigned long st_blksize;
+ unsigned long st_blocks;
+ unsigned long st_atime;
+ unsigned long int unused1;
+ unsigned long st_mtime;
+ unsigned long int unused2;
+ unsigned long st_ctime;
+ unsigned long int unused3;
+ unsigned long long unused4;
+};
+
+struct stat64 {
+ unsigned long long st_dev;
+ unsigned int __pad1;
+#define STAT64_HAS_BROKEN_ST_INO 1
+ unsigned long __st_ino;
+ unsigned long st_mode;
+ unsigned long st_nlink;
+ unsigned long st_uid;
+ unsigned long st_gid;
+ unsigned long long st_rdev;
+ unsigned int __pad2;
+ unsigned long long st_size;
+ unsigned long long st_blksize;
+
+ unsigned long long st_blocks;
+ unsigned long st_atime;
+ unsigned long int __unused1;
+ unsigned long st_mtime;
+ unsigned long int __unused2;
+ unsigned long st_ctime;
+ unsigned long int __unused3;
+ unsigned long long st_ino;
+};
+
+#elif defined(__x86_64__)
+struct stat {
+ unsigned long st_dev;
+ unsigned long st_ino;
+ unsigned long st_nlink;
+ unsigned int st_mode;
+ unsigned int st_uid;
+ unsigned int st_gid;
+ unsigned int __pad0;
+ unsigned long st_rdev;
+ unsigned long st_size;
+ unsigned long st_blksize;
+ unsigned long st_blocks;
+ unsigned long st_atime;
+ unsigned long __reserved0;
+ unsigned long st_mtime;
+ unsigned long __reserved1;
+ unsigned long st_ctime;
+ unsigned long __reserved2;
+ long __unused[3];
+};
+
+#elif defined(__ia64__)
+
+struct stat {
+ unsigned long st_dev;
+ unsigned long st_ino;
+ unsigned long st_nlink;
+ unsigned int st_mode;
+ unsigned int st_uid;
+ unsigned int st_gid;
+ unsigned int __pad;
+ unsigned long st_rdev;
+ unsigned long st_size;
+ unsigned long st_atime;
+ unsigned long reserved;
+ unsigned long st_mtime;
+ unsigned long reserved2;
+ unsigned long st_ctime;
+ unsigned long reserved3;
+ unsigned long st_blksize;
+ long st_blocks;
+ unsigned long pad[3];
+};
-#ifndef STAT64_HAS_BROKEN_ST_INO
-#define __NO_STAT64
#endif
+#define S_IFMT 00170000
+#define S_IFSOCK 0140000
+#define S_IFLNK 0120000
+#define S_IFREG 0100000
+#define S_IFBLK 0060000
+#define S_IFDIR 0040000
+#define S_IFCHR 0020000
+#define S_IFIFO 0010000
+#define S_ISUID 0004000
+#define S_ISGID 0002000
+#define S_ISVTX 0001000
+
+#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
+#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
+#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
+#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
+
+#define S_IRWXU 00700
+#define S_IRUSR 00400
+#define S_IWUSR 00200
+#define S_IXUSR 00100
+
+#define S_IRWXG 00070
+#define S_IRGRP 00040
+#define S_IWGRP 00020
+#define S_IXGRP 00010
+
+#define S_IRWXO 00007
+#define S_IROTH 00004
+#define S_IWOTH 00002
+#define S_IXOTH 00001
+
extern int stat(const char *__file, struct stat *__buf) __THROW;
extern int fstat(int __fd, struct stat *__buf) __THROW;
extern int lstat(const char *__file, struct stat *__buf) __THROW;
-#ifdef __NO_STAT64
-#undef _FILE_OFFSET_BITS
+#if __WORDSIZE == 64
+#define __NO_STAT64
#else
extern int stat64(const char *__file, struct stat64 *__buf) __THROW;
extern int fstat64(int __fd, struct stat64 *__buf) __THROW;
extern int lstat64(const char *__file, struct stat64 *__buf) __THROW;
-#endif
-#if _FILE_OFFSET_BITS == 64
-#define lstat(file,buf) lstat64(file,buf)
-#define fstat(file,buf) fstat64(file,buf)
+#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
+#define lstat lstat64
+#define fstat fstat64
#define stat stat64
+#define pread pread64
+#define pwrite pwrite64
+#endif
#endif
#define major(dev) (((dev)>>8) & 0xff)
@@ -34,15 +503,10 @@ extern int lstat64(const char *__file, struct stat64 *__buf) __THROW;
#define makedev(major, minor) ((((unsigned int) (major)) << 8) | ((unsigned int) (minor)))
extern int chmod (const char *__file, mode_t __mode) __THROW;
-
extern int fchmod (int __fd, mode_t __mode) __THROW;
-
extern mode_t umask (mode_t __mask) __THROW;
-
extern int mkdir (const char *__path, mode_t __mode) __THROW;
-
extern int mknod (const char *__path, mode_t __mode, dev_t __dev) __THROW;
-
extern int mkfifo (const char *__path, mode_t __mode) __THROW;
#define S_IREAD S_IRUSR
diff --git a/mdk-stage1/dietlibc/include/sys/sysinfo.h b/mdk-stage1/dietlibc/include/sys/sysinfo.h
index 5f059d469..cf88be34c 100644
--- a/mdk-stage1/dietlibc/include/sys/sysinfo.h
+++ b/mdk-stage1/dietlibc/include/sys/sysinfo.h
@@ -2,7 +2,25 @@
#define _SYS_SYSINFO_H
#include <sys/cdefs.h>
-#include <linux/kernel.h>
+
+#define SI_LOAD_SHIFT 16
+struct sysinfo {
+ long uptime; /* Seconds since boot */
+ unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
+ unsigned long totalram; /* Total usable main memory size */
+ unsigned long freeram; /* Available memory size */
+ unsigned long sharedram; /* Amount of shared memory */
+ unsigned long bufferram; /* Memory used by buffers */
+ unsigned long totalswap; /* Total swap space size */
+ unsigned long freeswap; /* swap space still available */
+ unsigned short procs; /* Number of current processes */
+ unsigned short pad; /* explicit padding */
+ unsigned long totalhigh; /* Total high memory size */
+ unsigned long freehigh; /* Available high memory size */
+ unsigned int mem_unit; /* Memory unit size in bytes */
+ char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
+};
+
int sysinfo(struct sysinfo *info) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sys/syslog.h b/mdk-stage1/dietlibc/include/sys/syslog.h
index 91bf0d1fa..8722038a5 100644
--- a/mdk-stage1/dietlibc/include/sys/syslog.h
+++ b/mdk-stage1/dietlibc/include/sys/syslog.h
@@ -92,7 +92,7 @@ void vsyslog (int priority, const char *format, va_list arg_ptr) __THROW;
/* yuck yuck yuck, only needed for syslogd. */
typedef struct _code {
- char *c_name;
+ const char *const c_name;
int c_val;
} CODE;
diff --git a/mdk-stage1/dietlibc/include/sys/sysmacros.h b/mdk-stage1/dietlibc/include/sys/sysmacros.h
new file mode 100644
index 000000000..8a8124131
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/sysmacros.h
@@ -0,0 +1,6 @@
+#ifndef _SYSMACROS_H
+#define _SYSMACROS_H
+
+#include <sys/stat.h>
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/time.h b/mdk-stage1/dietlibc/include/sys/time.h
index 11144f57b..8d345a77d 100644
--- a/mdk-stage1/dietlibc/include/sys/time.h
+++ b/mdk-stage1/dietlibc/include/sys/time.h
@@ -2,11 +2,39 @@
#define _SYS_TIME_H 1
#include <sys/cdefs.h>
-
#include <sys/types.h>
-#include <linux/time.h>
+#include <sys/select.h>
+
+struct timespec {
+ time_t tv_sec; /* seconds */
+ long tv_nsec; /* nanoseconds */
+};
+
+struct timeval {
+ time_t tv_sec; /* seconds */
+ suseconds_t tv_usec; /* microseconds */
+};
+
+struct timezone {
+ int tz_minuteswest; /* minutes west of Greenwich */
+ int tz_dsttime; /* type of dst correction */
+};
-#if defined __USE_GNU || defined __USE_BSD
+#define ITIMER_REAL 0
+#define ITIMER_VIRTUAL 1
+#define ITIMER_PROF 2
+
+struct itimerspec {
+ struct timespec it_interval; /* timer period */
+ struct timespec it_value; /* timer expiration */
+};
+
+struct itimerval {
+ struct timeval it_interval; /* timer interval */
+ struct timeval it_value; /* current value */
+};
+
+#if defined _GNU_SOURCE || defined _BSD_SOURCE
typedef struct timezone *__timezone_ptr_t;
#else
typedef void *__timezone_ptr_t;
@@ -18,17 +46,15 @@ int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue
int gettimeofday(struct timeval *tv, struct timezone *tz) __THROW;
int settimeofday(const struct timeval *tv , const struct timezone *tz) __THROW;
-extern int adjtime (const struct timeval *__delta,
- struct timeval *__olddelta) __THROW;
+extern int adjtime (const struct timeval *delta, struct timeval *olddelta) __THROW;
-struct tm
-{
+struct tm {
int tm_sec; /* Seconds. [0-60] (1 leap second) */
int tm_min; /* Minutes. [0-59] */
int tm_hour; /* Hours. [0-23] */
int tm_mday; /* Day. [1-31] */
int tm_mon; /* Month. [0-11] */
- int tm_year; /* Year - 1900. */
+ int tm_year; /* Year - 1900. */
int tm_wday; /* Day of week. [0-6] */
int tm_yday; /* Days in year.[0-365] */
int tm_isdst; /* DST. [-1/0/1]*/
@@ -37,10 +63,4 @@ struct tm
const char *tm_zone; /* Timezone abbreviation. */
};
-struct tm* gmtime(const time_t *t) __THROW;
-struct tm* gmtime_r(const time_t *t, struct tm *r) __THROW;
-
-struct tm* localtime(const time_t *t) __THROW;
-struct tm* localtime_r(const time_t *t, struct tm *r) __THROW;
-
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/timeb.h b/mdk-stage1/dietlibc/include/sys/timeb.h
new file mode 100644
index 000000000..ceed377e7
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/timeb.h
@@ -0,0 +1,13 @@
+#ifndef __SYS_TIMEB_H
+#define __SYS_TIMEB_H 1
+
+struct timeb {
+ time_t time;
+ unsigned short millitm;
+ short timezone;
+ short dstflag;
+};
+
+int ftime(struct timeb *tp);
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/times.h b/mdk-stage1/dietlibc/include/sys/times.h
index 72ec62fec..27f75cdc5 100644
--- a/mdk-stage1/dietlibc/include/sys/times.h
+++ b/mdk-stage1/dietlibc/include/sys/times.h
@@ -1,8 +1,16 @@
#ifndef _SYS_TIMES_H
#define _SYS_TIMES_H
-#include <linux/times.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
-clock_t times(struct tms *buf);
+struct tms {
+ clock_t tms_utime;
+ clock_t tms_stime;
+ clock_t tms_cutime;
+ clock_t tms_cstime;
+};
+
+clock_t times(struct tms *buf) __THROW;
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/timex.h b/mdk-stage1/dietlibc/include/sys/timex.h
new file mode 100644
index 000000000..cf024e009
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/timex.h
@@ -0,0 +1,50 @@
+#ifndef _SYS_TIMEX_H
+#define _SYS_TIMEX_H
+
+struct timex {
+ unsigned int modes; /* mode selector */
+ long int offset; /* time offset (usec) */
+ long int freq; /* frequency offset (scaled ppm) */
+ long int maxerror; /* maximum error (usec) */
+ long int esterror; /* estimated error (usec) */
+ int status; /* clock command/status */
+ long int constant; /* pll time constant */
+ long int precision; /* clock precision (usec) (read only) */
+ long int tolerance; /* clock frequency tolerance (ppm) (read only) */
+ struct timeval time; /* (read only) */
+ long int tick; /* (modified) usecs between clock ticks */
+
+ long int ppsfreq; /* pps frequency (scaled ppm) (ro) */
+ long int jitter; /* pps jitter (us) (ro) */
+ int shift; /* interval duration (s) (shift) (ro) */
+ long int stabil; /* pps stability (scaled ppm) (ro) */
+ long int jitcnt; /* jitter limit exceeded (ro) */
+ long int calcnt; /* calibration intervals (ro) */
+ long int errcnt; /* calibration errors (ro) */
+ long int stbcnt; /* stability limit exceeded (ro) */
+
+ /* ??? */
+ int :32; int :32; int :32; int :32;
+ int :32; int :32; int :32; int :32;
+ int :32; int :32; int :32; int :32;
+};
+
+#define ADJ_OFFSET 0x0001 /* time offset */
+#define ADJ_FREQUENCY 0x0002 /* frequency offset */
+#define ADJ_MAXERROR 0x0004 /* maximum time error */
+#define ADJ_ESTERROR 0x0008 /* estimated time error */
+#define ADJ_STATUS 0x0010 /* clock status */
+#define ADJ_TIMECONST 0x0020 /* pll time constant */
+#define ADJ_TICK 0x4000 /* tick value */
+#define ADJ_OFFSET_SINGLESHOT 0x8001 /* old-fashioned adjtime */
+
+#define TIME_OK 0 /* clock synchronized */
+#define TIME_INS 1 /* insert leap second */
+#define TIME_DEL 2 /* delete leap second */
+#define TIME_OOP 3 /* leap second in progress */
+#define TIME_WAIT 4 /* leap second has occurred */
+#define TIME_BAD 5 /* clock not synchronized */
+
+int adjtimex(struct timex *buf);
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/types.h b/mdk-stage1/dietlibc/include/sys/types.h
index 34dbaa9f1..6bd483e50 100644
--- a/mdk-stage1/dietlibc/include/sys/types.h
+++ b/mdk-stage1/dietlibc/include/sys/types.h
@@ -1,33 +1,130 @@
#ifndef _SYS_TYPES_H
#define _SYS_TYPES_H
-#include <linux/types.h>
-#include <linux/posix_types.h>
-#include <linux/socket.h>
-
-#ifdef __GNUC__
-#define __quad_t __quad_t
-typedef long long int __quad_t;
-typedef unsigned long long int __u_quad_t;
+#include <inttypes.h>
+#include <stddef.h>
+
+typedef unsigned long int blkcnt_t; /* Used for file block counts */
+typedef unsigned long int blksize_t; /* Used for block sizes */
+typedef unsigned long int clock_t; /* Used for system times in
+ clock ticks or CLOCKS_PER_SEC
+ (see <time.h>). */
+
+/* TODO:
+ clockid_t
+ Used for clock ID type in the clock and timer functions.
+ fsblkcnt_t
+ Used for file system block counts
+ fsfilcnt_t
+ Used for file system file counts
+ pthread_attr_t
+ Used to identify a thread attribute object.
+ pthread_cond_t
+ Used for condition variables.
+ pthread_condattr_t
+ Used to identify a condition attribute object.
+ pthread_key_t
+ Used for thread-specific data keys.
+ pthread_mutex_t
+ Used for mutexes.
+ pthread_mutexattr_t
+ Used to identify a mutex attribute object.
+ pthread_once_t
+ Used for dynamic package initialisation.
+ pthread_rwlock_t
+ Used for read-write locks.
+ pthread_rwlockattr_t
+ Used for read-write lock attributes.
+ pthread_t
+ Used to identify a thread.
+ timer_t
+ Used for timer ID returned by timer_create().
+*/
+
+#if defined(__alpha__) || defined(__mips__) || defined(__ppc__) || defined(__hppa__) || defined(__sparc64__) \
+ || defined(__x86_64__) || defined(__ia64__)
+typedef unsigned int uid_t; /* Used for user IDs. */
+typedef unsigned int gid_t; /* Used for group IDs. */
+typedef unsigned int dev_t; /* Used for device IDs. */
#else
-#warning no long long support - no 64 bit file I/O support
-typedef long int __quad_t;
-typedef unsigned long int __u_quad_t;
+typedef unsigned short uid_t; /* Used for user IDs. */
+typedef unsigned short gid_t; /* Used for group IDs. */
+typedef unsigned short dev_t; /* Used for device IDs. */
#endif
+#if defined(__alpha__) || defined(__mips__) || defined(__ppc__) || defined(__sparc64__) \
+ || defined(__x86_64__) || defined(__ia64__)
+typedef unsigned int mode_t; /* Used for some file attributes. */
+#else
+typedef unsigned short mode_t; /* Used for some file attributes. */
+#endif
-#ifdef __quad_t
-typedef __quad_t off64_t;
-typedef __u_quad_t ino64_t;
-typedef __quad_t blkcnt64_t;
+#if defined(__alpha__) || defined(__mips__) || defined(__sparc64__) \
+ || defined(__x86_64__) || defined(__ia64__)
+typedef unsigned int nlink_t; /* Used for link counts. */
+#else
+typedef unsigned short nlink_t; /* Used for link counts. */
#endif
+typedef signed int id_t; /* Used as a general identifier; can be
+ used to contain at least a pid_t,
+ uid_t or a gid_t. */
+typedef unsigned long ino_t; /* Used for file serial numbers. */
+typedef signed int key_t; /* Used for interprocess communication. */
+typedef signed int pid_t; /* Used for process IDs and process group IDs. */
+typedef signed long ssize_t; /* Used for a count of bytes or an error indication. */
+typedef signed long suseconds_t; /* Used for time in microseconds. */
+typedef signed long time_t; /* Used for time in seconds. */
+typedef signed long useconds_t; /* Used for time in microseconds. */
+
+/* non-susv2 types: */
+__extension__ typedef signed long long loff_t; /* 64-bit offset */
+
+__extension__ typedef signed long long off64_t;
+#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
+typedef off64_t off_t;
+#else
+typedef signed long off_t; /* Used for file sizes. */
+#endif
+
+__extension__ typedef unsigned long long ino64_t;
+__extension__ typedef signed long long blkcnt64_t;
+
+typedef uint32_t uid32_t;
+typedef uint32_t gid32_t;
+
typedef long int fpos_t;
-#define socklen_t socklen_t
+#define __socklen_t_defined
typedef unsigned int socklen_t;
+typedef unsigned short sa_family_t;
-typedef long int blksize_t;
-typedef long int blkcnt_t;
+#ifdef _BSD_SOURCE
+/* die, BSD, die! */
+typedef char* caddr_t;
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned char uchar;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+typedef uint32_t u_long;
+typedef uint32_t n_long;
+typedef uint32_t n_time;
+typedef uint16_t n_short;
+typedef uint32_t ulong;
+typedef uint32_t nlong;
+typedef uint32_t ntime;
+typedef uint16_t nshort;
+#endif
+
+#ifdef _GNU_SOURCE
+typedef uint8_t u_int8_t;
+typedef uint16_t u_int16_t;
+typedef uint32_t u_int32_t;
+#ifndef __STRICT_ANSI__
+typedef uint64_t u_int64_t;
+#endif
+#endif
#endif
diff --git a/mdk-stage1/dietlibc/include/sys/ucontext.h b/mdk-stage1/dietlibc/include/sys/ucontext.h
new file mode 100644
index 000000000..573c6c7fb
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/ucontext.h
@@ -0,0 +1,110 @@
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H
+
+#include <asm/sigcontext.h>
+#include <signal.h>
+
+typedef struct sigcontext mcontext_t;
+
+#if defined(__i386__) || defined(__arm__) || defined(__mips__) || defined(__mips64__) || defined(__powerpc__) || defined(__hppa__)
+struct ucontext {
+ unsigned long uc_flags;
+ struct ucontext *uc_link;
+ stack_t uc_stack;
+ struct sigcontext uc_mcontext;
+ sigset_t uc_sigmask; /* mask last for extensibility */
+};
+#elif defined(__alpha__)
+struct ucontext {
+ unsigned long uc_flags;
+ struct ucontext *uc_link;
+ unsigned long uc_osf_sigmask;
+ stack_t uc_stack;
+ struct sigcontext uc_mcontext;
+ sigset_t uc_sigmask; /* mask last for extensibility */
+};
+#elif defined(__sparc__) || defined(__sparc64__)
+
+#define MC_TSTATE 0
+#define MC_PC 1
+#define MC_NPC 2
+#define MC_Y 3
+#define MC_G1 4
+#define MC_G2 5
+#define MC_G3 6
+#define MC_G4 7
+#define MC_G5 8
+#define MC_G6 9
+#define MC_G7 10
+#define MC_O0 11
+#define MC_O1 12
+#define MC_O2 13
+#define MC_O3 14
+#define MC_O4 15
+#define MC_O5 16
+#define MC_O6 17
+#define MC_O7 18
+#define MC_NGREG 19
+
+typedef unsigned long mc_greg_t;
+typedef mc_greg_t mc_gregset_t[MC_NGREG];
+
+#define MC_MAXFPQ 16
+struct mc_fq {
+ unsigned long *mcfq_addr;
+ unsigned int mcfq_insn;
+};
+
+typedef struct mc_fpu {
+ union {
+ unsigned int sregs[32];
+ unsigned long dregs[32];
+ long double qregs[16];
+ } mcfpu_fregs;
+ unsigned long mcfpu_fsr;
+ unsigned long mcfpu_fprs;
+ unsigned long mcfpu_gsr;
+ struct mc_fq *mcfpu_fq;
+ unsigned char mcfpu_qcnt;
+ unsigned char mcfpu_qentsz;
+ unsigned char mcfpu_enab;
+} mc_fpu_t;
+
+typedef struct {
+ mc_gregset_t mc_gregs;
+ mc_greg_t mc_fp;
+ mc_greg_t mc_i7;
+ mc_fpu_t mc_fpregs;
+} mcontext_t;
+
+struct ucontext {
+ struct ucontext *uc_link;
+ unsigned long uc_flags;
+ sigset_t uc_sigmask;
+ mcontext_t uc_mcontext;
+};
+#elif defined(__s390__)
+struct ucontext {
+ unsigned long uc_flags;
+ struct ucontext *uc_link;
+ stack_t uc_stack;
+ _sigregs uc_mcontext;
+ sigset_t uc_sigmask; /* mask last for extensibility */
+};
+#elif defined(__ia64__)
+
+/* oh my god is this ugly! --fefe*/
+struct ucontext {
+ struct sigcontext uc_mcontext;
+};
+
+#define uc_link uc_mcontext.sc_gr[0] /* wrong type; nobody cares */
+#define uc_sigmask uc_mcontext.sc_sigmask
+#define uc_stack uc_mcontext.sc_stack
+#else
+#error NEED TO PORT <sys/sigcontext.h>!
+#endif
+
+typedef struct ucontext ucontext_t;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/uio.h b/mdk-stage1/dietlibc/include/sys/uio.h
index d64fd33c9..5edbdc8b2 100644
--- a/mdk-stage1/dietlibc/include/sys/uio.h
+++ b/mdk-stage1/dietlibc/include/sys/uio.h
@@ -1,7 +1,7 @@
#ifndef _SYS_UIO
#define _SYS_UIO 1
-#include <linux/uio.h>
+#include <sys/socket.h>
int readv(int filedes, const struct iovec *vector, size_t count);
int writev(int filedes, const struct iovec *vector, size_t count);
diff --git a/mdk-stage1/dietlibc/include/sys/un.h b/mdk-stage1/dietlibc/include/sys/un.h
index 213d9290e..000a937c1 100644
--- a/mdk-stage1/dietlibc/include/sys/un.h
+++ b/mdk-stage1/dietlibc/include/sys/un.h
@@ -3,6 +3,11 @@
#include <sys/cdefs.h>
-#include <linux/un.h>
+#define UNIX_PATH_MAX 108
+
+struct sockaddr_un {
+ sa_family_t sun_family; /* AF_UNIX */
+ char sun_path[UNIX_PATH_MAX]; /* pathname */
+};
#endif /* sys/un.h */
diff --git a/mdk-stage1/dietlibc/include/sys/vfs.h b/mdk-stage1/dietlibc/include/sys/vfs.h
index e4740a225..cf7e7f946 100644
--- a/mdk-stage1/dietlibc/include/sys/vfs.h
+++ b/mdk-stage1/dietlibc/include/sys/vfs.h
@@ -3,7 +3,28 @@
#include <sys/cdefs.h>
#include <sys/types.h>
-#include <linux/vfs.h>
+
+typedef struct {
+ int __val[2];
+} __kernel_fsid_t;
+
+struct statfs {
+ long f_type;
+ long f_bsize;
+ long f_blocks;
+ long f_bfree;
+#ifndef __mips__
+ long f_bavail;
+#endif
+ long f_files;
+ long f_ffree;
+#ifdef __mips__
+ long f_bavail;
+#endif
+ __kernel_fsid_t f_fsid;
+ long f_namelen;
+ long f_spare[6];
+};
int statfs(const char *path, struct statfs *buf) __THROW;
int fstatfs(int fd, struct statfs *buf) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sys/wait.h b/mdk-stage1/dietlibc/include/sys/wait.h
index eb70112e2..0ba55499e 100644
--- a/mdk-stage1/dietlibc/include/sys/wait.h
+++ b/mdk-stage1/dietlibc/include/sys/wait.h
@@ -3,7 +3,13 @@
#include <sys/cdefs.h>
#include <sys/resource.h>
-#include <linux/wait.h>
+
+#define WNOHANG 0x00000001
+#define WUNTRACED 0x00000002
+
+#define __WNOTHREAD 0x20000000 /* Don't wait on children of other threads in this group */
+#define __WALL 0x40000000 /* Wait on all children, regardless of type */
+#define __WCLONE 0x80000000 /* Wait only on non-SIGCHLD children */
/* If WIFEXITED(STATUS), the low-order 8 bits of the status. */
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
@@ -26,6 +32,8 @@
/* Nonzero if STATUS indicates the child is stopped. */
#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
+/* Nonzero if STATUS indicates the child dumped core. */
+#define WCOREDUMP(status) ((status) & 0x80)
pid_t wait(int *status) __THROW;
pid_t waitpid(pid_t pid, int *status, int options) __THROW;
diff --git a/mdk-stage1/dietlibc/include/sysexits.h b/mdk-stage1/dietlibc/include/sysexits.h
new file mode 100644
index 000000000..5540795ff
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sysexits.h
@@ -0,0 +1,26 @@
+#ifndef _SYSEXITS_H
+#define _SYSEXITS_H 1
+
+#define EX_OK 0
+
+#define EX__BASE 64
+
+#define EX_USAGE 64
+#define EX_DATAERR 65
+#define EX_NOINPUT 66
+#define EX_NOUSER 67
+#define EX_NOHOST 68
+#define EX_UNAVAILABLE 69
+#define EX_SOFTWARE 70
+#define EX_OSERR 71
+#define EX_OSFILE 72
+#define EX_CANTCREAT 73
+#define EX_IOERR 74
+#define EX_TEMPFAIL 75
+#define EX_PROTOCOL 76
+#define EX_NOPERM 77
+#define EX_CONFIG 78
+
+#define EX__MAX 78
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/tar.h b/mdk-stage1/dietlibc/include/tar.h
new file mode 100644
index 000000000..a78bbce54
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/tar.h
@@ -0,0 +1,36 @@
+#ifndef _TAR_H_
+#define _TAR_H_
+
+#define TMAGIC "ustar"
+#define TVERSION "00"
+
+#define TMAGLEN 6
+#define TVERSLEN 2
+
+#define REGTYPE '0'
+#define AREGTYPE '\0'
+#define LNKTYPE '1'
+#define SYMTYPE '2'
+#define CHRTYPE '3'
+#define BLKTYPE '4'
+#define DIRTYPE '5'
+#define FIFOTYPE '6'
+#define CONTTYPE '7'
+
+#define TSUID 04000
+#define TSGID 02000
+#define TSVTX 01000
+
+#define TUREAD 00400
+#define TUWRITE 00200
+#define TUEXEC 00100
+
+#define TGREAD 00040
+#define TGWRITE 00020
+#define TGEXEC 00010
+
+#define TOREAD 00004
+#define TOWRITE 00002
+#define TOEXEC 00001
+
+#endif /* _TAR_H_ */
diff --git a/mdk-stage1/dietlibc/include/termio.h b/mdk-stage1/dietlibc/include/termio.h
new file mode 100644
index 000000000..55d1f242b
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/termio.h
@@ -0,0 +1,4 @@
+/* this looks horribly wrong, but glibc does it like that */
+
+#include <termios.h>
+#include <sys/ioctl.h>
diff --git a/mdk-stage1/dietlibc/include/termios.h b/mdk-stage1/dietlibc/include/termios.h
index f10909c1b..c9998595c 100644
--- a/mdk-stage1/dietlibc/include/termios.h
+++ b/mdk-stage1/dietlibc/include/termios.h
@@ -4,19 +4,378 @@
#include <sys/cdefs.h>
#include <sys/types.h>
-/* man, the Linux kernel headers suck */
-#define __USE_BSD
-#include <linux/termios.h>
-#undef __USE_BSD
+struct winsize {
+ unsigned short ws_row;
+ unsigned short ws_col;
+ unsigned short ws_xpixel;
+ unsigned short ws_ypixel;
+};
+
+#define NCC 8
+struct termio {
+ unsigned short c_iflag; /* input mode flags */
+ unsigned short c_oflag; /* output mode flags */
+ unsigned short c_cflag; /* control mode flags */
+ unsigned short c_lflag; /* local mode flags */
+ unsigned char c_line; /* line discipline */
+ unsigned char c_cc[NCC]; /* control characters */
+};
+
+/* modem lines */
+#ifdef __mips__
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x010
+#define TIOCM_SR 0x020
+#define TIOCM_CTS 0x040
+#define TIOCM_CAR 0x100
+#define TIOCM_RNG 0x200
+#define TIOCM_DSR 0x400
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+#else
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x008
+#define TIOCM_SR 0x010
+#define TIOCM_CTS 0x020
+#define TIOCM_CAR 0x040
+#define TIOCM_RNG 0x080
+#define TIOCM_DSR 0x100
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+#endif
+
+/* line disciplines */
+#define N_TTY 0
+#define N_SLIP 1
+#define N_MOUSE 2
+#define N_PPP 3
+#define N_STRIP 4
+#define N_AX25 5
+#define N_X25 6 /* X.25 async */
+#define N_6PACK 7
+#define N_MASC 8 /* Reserved for Mobitex module <kaz@cafe.net> */
+#define N_R3964 9 /* Reserved for Simatic R3964 module */
+#define N_PROFIBUS_FDL 10 /* Reserved for Profibus <Dave@mvhi.com> */
+#define N_IRDA 11 /* Linux IR - http://irda.sourceforge.net/ */
+#define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */
+#define N_HDLC 13 /* synchronous HDLC */
+#define N_SYNC_PPP 14 /* synchronous PPP */
+#define N_HCI 15 /* Bluetooth HCI UART */
+
+typedef unsigned char cc_t;
+typedef unsigned int speed_t;
+typedef unsigned int tcflag_t;
+
+#if defined(__i386__) || defined(__arm__) || defined(__ia64__) || defined(__hppa__) || defined(__s390__) || defined(__s390x__) || defined(__x86_64__)
+#define NCCS 19
+struct termios {
+ tcflag_t c_iflag; /* input mode flags */
+ tcflag_t c_oflag; /* output mode flags */
+ tcflag_t c_cflag; /* control mode flags */
+ tcflag_t c_lflag; /* local mode flags */
+ cc_t c_line; /* line discipline */
+ cc_t c_cc[NCCS]; /* control characters */
+};
+#elif defined(__mips__) || defined(__mips64__)
+#define NCCS 23
+struct termios {
+ tcflag_t c_iflag; /* input mode flags */
+ tcflag_t c_oflag; /* output mode flags */
+ tcflag_t c_cflag; /* control mode flags */
+ tcflag_t c_lflag; /* local mode flags */
+ /*
+ * Seems nonexistent in the ABI, but Linux assumes existence ...
+ */
+ cc_t c_line; /* line discipline */
+ cc_t c_cc[NCCS]; /* control characters */
+};
+#elif defined(powerpc) || defined(__alpha__)
+#define NCCS 19
+struct termios {
+ tcflag_t c_iflag; /* input mode flags */
+ tcflag_t c_oflag; /* output mode flags */
+ tcflag_t c_cflag; /* control mode flags */
+ tcflag_t c_lflag; /* local mode flags */
+ cc_t c_cc[NCCS]; /* control characters */
+ cc_t c_line; /* line discipline (== c_cc[19]) */
+ speed_t c_ispeed; /* input speed */
+ speed_t c_ospeed; /* output speed */
+};
+#elif defined(__sparc__)
+#define NCCS 17
+struct termios {
+ tcflag_t c_iflag; /* input mode flags */
+ tcflag_t c_oflag; /* output mode flags */
+ tcflag_t c_cflag; /* control mode flags */
+ tcflag_t c_lflag; /* local mode flags */
+ cc_t c_line; /* line discipline */
+ cc_t c_cc[NCCS]; /* control characters */
+};
+#else
+# error "Struct termios undefined on your architecture"
+#endif
+
+/* c_cc characters */
+#if defined(__alpha__)
+#define VEOF 0
+#define VEOL 1
+#define VEOL2 2
+#define VERASE 3
+#define VWERASE 4
+#define VKILL 5
+#define VREPRINT 6
+#define VSWTC 7
+#define VINTR 8
+#define VQUIT 9
+#define VSUSP 10
+#define VSTART 12
+#define VSTOP 13
+#define VLNEXT 14
+#define VDISCARD 15
+#define VMIN 16
+#define VTIME 17
+#elif defined(__mips__)
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VMIN 4
+#define VTIME 5
+#define VEOL2 6
+#define VSWTC 7
+#define VSWTCH VSWTC
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VEOF 16
+#define VEOL 17
+#elif defined(__powerpc__)
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VEOF 4
+#define VMIN 5
+#define VEOL 6
+#define VTIME 7
+#define VEOL2 8
+#define VSWTC 9
+#define VWERASE 10
+#define VREPRINT 11
+#define VSUSP 12
+#define VSTART 13
+#define VSTOP 14
+#define VLNEXT 15
+#define VDISCARD 16
+#elif defined(__sparc__)
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VEOF 4
+#define VEOL 5
+#define VEOL2 6
+#define VSWTC 7
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VDSUSP 11
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VMIN 16
+#define VTIME 17
+#else /* arm, i386, parisc, s390, x86_64 */
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VEOF 4
+#define VTIME 5
+#define VMIN 6
+#define VSWTC 7
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VEOL 11
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VEOL2 16
+#endif
+
+/* c_iflag bits */
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK 0000020
+#define ISTRIP 0000040
+#define INLCR 0000100
+#define IGNCR 0000200
+#define ICRNL 0000400
+#define IUCLC 0001000
+#define IXON 0002000
+#define IXANY 0004000
+#define IXOFF 0010000
+#define IMAXBEL 0020000
+
+/* c_oflag bits */
+#define OPOST 0000001
+#define OLCUC 0000002
+#define ONLCR 0000004
+#define OCRNL 0000010
+#define ONOCR 0000020
+#define ONLRET 0000040
+#define OFILL 0000100
+#define OFDEL 0000200
+#define NLDLY 0000400
+#define NL0 0000000
+#define NL1 0000400
+#define CRDLY 0003000
+#define CR0 0000000
+#define CR1 0001000
+#define CR2 0002000
+#define CR3 0003000
+#define TABDLY 0014000
+#define TAB0 0000000
+#define TAB1 0004000
+#define TAB2 0010000
+#define TAB3 0014000
+#define XTABS 0014000
+#define BSDLY 0020000
+#define BS0 0000000
+#define BS1 0020000
+#define VTDLY 0040000
+#define VT0 0000000
+#define VT1 0040000
+#define FFDLY 0100000
+#define FF0 0000000
+#define FF1 0100000
+
+/* c_cflag bit meaning */
+#define CBAUD 0010017
+#define B0 0000000 /* hang up */
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+#define EXTA B19200
+#define EXTB B38400
+#define CSIZE 0000060
+#define CS5 0000000
+#define CS6 0000020
+#define CS7 0000040
+#define CS8 0000060
+#define CSTOPB 0000100
+#define CREAD 0000200
+#define PARENB 0000400
+#define PARODD 0001000
+#define HUPCL 0002000
+#define CLOCAL 0004000
+#define CBAUDEX 0010000
+#define B57600 0010001
+#define B115200 0010002
+#define B230400 0010003
+#define B460800 0010004
+#define B500000 0010005
+#define B576000 0010006
+#define B921600 0010007
+#define B1000000 0010010
+#define B1152000 0010011
+#define B1500000 0010012
+#define B2000000 0010013
+#define B2500000 0010014
+#define B3000000 0010015
+#define B3500000 0010016
+#define B4000000 0010017
+#define CIBAUD 002003600000 /* input baud rate (not used) */
+#define CMSPAR 010000000000 /* mark or space (stick) parity */
+#define CRTSCTS 020000000000 /* flow control */
+
+/* c_lflag bits */
+#define ISIG 0000001
+#define ICANON 0000002
+#define XCASE 0000004
+#define ECHO 0000010
+#define ECHOE 0000020
+#define ECHOK 0000040
+#define ECHONL 0000100
+#define NOFLSH 0000200
+#define ECHOCTL 0001000
+#define ECHOPRT 0002000
+#define ECHOKE 0004000
+#ifdef __mips__
+#define IEXTEN 0000400
+#define FLUSHO 0020000
+#define TOSTOP 0100000
+#else
+#define TOSTOP 0000400
+#define FLUSHO 0010000
+#define IEXTEN 0100000
+#endif
+#define PENDIN 0040000
+
+/* tcflow() and TCXONC use these */
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+/* tcflush() and TCFLSH use these */
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+
+/* tcsetattr uses these */
+#ifdef __mips__
+#define TCSANOW 0x540e
+#define TCSADRAIN 0x540f
+#define TCSAFLUSH 0x5410
+#else
+#define TCSANOW 0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+#endif
-pid_t tcgetpgrp(int fd) __THROW;
-int tcsetpgrp(int fd, pid_t pgrpid) __THROW;
int tcgetattr(int fd, struct termios *termios_p) __THROW;
int tcsetattr(int fd, int optional_actions, struct termios *termios_p) __THROW;
speed_t cfgetospeed(struct termios *termios_p) __THROW;
int cfsetospeed(struct termios *termios_p, speed_t speed) __THROW;
speed_t cfgetispeed(struct termios *termios_p) __THROW;
int cfsetispeed(struct termios *termios_p, speed_t speed) __THROW;
+void cfmakeraw(struct termios *t) __THROW;
+
int tcflush(int fd, int queue_selector) __THROW;
+int tcdrain(int fd) __THROW;
+int tcflow (int fd,int action) __THROW;
+int tcsendbreak (int fd,int duration) __THROW;
#endif
diff --git a/mdk-stage1/dietlibc/include/time.h b/mdk-stage1/dietlibc/include/time.h
index 827c85b97..29681fa3d 100644
--- a/mdk-stage1/dietlibc/include/time.h
+++ b/mdk-stage1/dietlibc/include/time.h
@@ -7,7 +7,6 @@
extern int __isleap(int year);
int nanosleep(const struct timespec *req, struct timespec *rem) __THROW;
-unsigned int sleep(unsigned int secs) __THROW;
time_t mktime(struct tm *timeptr) __THROW __pure__;
@@ -16,9 +15,26 @@ char *asctime_r(const struct tm *timeptr, char *buf) __THROW;
char *ctime(const time_t *timep) __THROW;
-size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) __THROW;
+size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) __THROW __attribute__((format(strftime,3,0)));
time_t time(time_t *t) __THROW;
int stime(time_t *t) __THROW;
+double difftime(time_t time1, time_t time0) __THROW __attribute__((const));
+
+#define CLOCKS_PER_SEC 1000000l
+
+extern long int timezone;
+extern int daylight;
+extern char* tzname[2];
+
+void tzset (void) __THROW;
+
+struct tm* localtime(const time_t* t) __THROW;
+struct tm* gmtime(const time_t* t) __THROW;
+struct tm* localtime_r(const time_t* t, struct tm* r) __THROW;
+struct tm* gmtime_r(const time_t* t, struct tm* r) __THROW;
+
+clock_t clock(void);
+
#endif
diff --git a/mdk-stage1/dietlibc/include/unistd.h b/mdk-stage1/dietlibc/include/unistd.h
index 1a528c0e4..0f49b2b9b 100644
--- a/mdk-stage1/dietlibc/include/unistd.h
+++ b/mdk-stage1/dietlibc/include/unistd.h
@@ -2,12 +2,14 @@
#define _UNISTD_H
#include <sys/cdefs.h>
-#include <dirent.h>
#include <sys/types.h>
#include <sys/time.h>
-#include <getopt.h>
-#include <linux/sysctl.h>
#include <sys/stat.h>
+#include <sys/fsuid.h>
+
+extern int optind,opterr;
+extern char *optarg;
+int getopt(int argc, char *const argv[], const char *options);
/* Values for the second argument to access.
These may be OR'd together. */
@@ -17,28 +19,28 @@
#define F_OK 0 /* Test for existence. */
/* Test for access to NAME using the real UID and real GID. */
-extern int access (__const char *__name, int __type) __THROW;
+extern int access (const char *__name, int __type) __THROW;
+#ifndef SEEK_SET
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
+#endif
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
off_t lseek(int fildes, off_t offset, int whence) __THROW;
-int llseek(int fildes, unsigned long hi, unsigned long lo, loff_t* result,int whence) __THROW;
#ifndef __NO_STAT64
loff_t lseek64(int fildes, loff_t offset, int whence) __THROW;
#endif
-#if _FILE_OFFSET_BITS == 64
+#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
#define lseek(fildes,offset,whence) lseek64(fildes,offset,whence)
#endif
int chdir(const char *path) __THROW;
int fchdir(int fd) __THROW;
-int mkdir(const char *pathname, mode_t mode) __THROW;
int rmdir(const char *pathname) __THROW;
char *getcwd(char *buf, size_t size) __THROW;
@@ -60,23 +62,24 @@ int execlp(const char *file, const char *arg, ...) __THROW;
int execv(const char *path, char *const argv[]) __THROW;
int execvp(const char *file, char *const argv[]) __THROW;
int execl(const char *path, ...) __THROW;
+int execle(const char *path, ...) __THROW;
-pid_t getpid(void) __attribute__((__const__)) __THROW;
+pid_t getpid(void) __THROW;
pid_t getppid(void) __THROW;
-int kill(pid_t pid, int sig) __THROW;
int setpgid (pid_t pid,pid_t pgid) __THROW;
pid_t getpgid (pid_t pid) __THROW;
int setpgrp (void) __THROW;
pid_t getpgrp (void) __THROW;
+pid_t getsid(pid_t pid) __THROW;
pid_t setsid (void) __THROW;
int dup (int oldfd) __THROW;
int dup2 (int oldfd,int newfd) __THROW;
-int mknod(const char *pathname, mode_t mode, dev_t dev) __THROW;
-
-int getdents(unsigned int fd, struct dirent *dirp, unsigned int count) __THROW;
-int getdents64(unsigned int fd, struct dirent64 *dirp, unsigned int count) __THROW;
+struct dirent;
+struct dirent64;
+int getdents(int fd, struct dirent *dirp, unsigned int count) __THROW;
+int getdents64(int fd, struct dirent64 *dirp, unsigned int count) __THROW;
pid_t fork(void) __THROW;
pid_t vfork(void) __THROW;
@@ -90,6 +93,8 @@ int fchown(int fd, uid_t owner, gid_t group) __THROW;
int lchown(const char *path, uid_t owner, gid_t group) __THROW;
int fsync(int fd) __THROW;
+#define _POSIX_SYNCHRONIZED_IO
+int fdatasync(int fd) __THROW;
int pipe(int filedes[2]) __THROW;
@@ -101,7 +106,7 @@ void *sbrk(ptrdiff_t increment) __THROW;
int gethostname(char *name, size_t len) __THROW;
int sethostname(const char *name, size_t len) __THROW;
-void usleep(unsigned long usec) __THROW;
+int usleep(unsigned long useconds) __THROW;
unsigned int sleep(unsigned int seconds) __THROW;
unsigned int alarm(unsigned int seconds) __THROW;
@@ -111,11 +116,16 @@ int isatty(int desc) __THROW;
void _exit(int status) __THROW __attribute__((noreturn));
-extern int daemon (int nochdir,int noclose) __THROW;
+extern int daemon(int nochdir,int noclose) __THROW;
-#if _FILE_OFFSET_BITS == 64
+int pause(void) __THROW;
+
+#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
#define open open64
#define creat creat64
+#define truncate truncate64
+#define ftruncate ftruncate64
+#define getdents getdents64
#endif
extern char* getlogin(void) __THROW;
@@ -137,32 +147,86 @@ int setreuid(uid_t ruid, uid_t euid) __THROW;
#define setegid(egid) setregid(-1,egid)
int rename(const char *oldpath, const char *newpath) __THROW;
+int truncate(const char *path, off_t length) __THROW;
int ftruncate(int fd, off_t length) __THROW;
-
-int mkstemp(char *Template) __THROW;
+#ifndef __NO_STAT64
+int truncate64(const char *path, loff_t length) __THROW;
+int ftruncate64(int fd, loff_t length) __THROW;
+#endif
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) __THROW;
int nice(int inc) __THROW;
-extern char *__environ[];
+extern char **__environ;
char *crypt(const char *key, const char *salt) __THROW;
void encrypt(char block[64], int edflag) __THROW;
void setkey(const char *key) __THROW;
-size_t getpagesize(void) __attribute__((__const__)) __THROW;
+size_t getpagesize(void) __THROW __attribute__((__const__));
int getdomainname(char *name, size_t len) __THROW;
int setdomainname(const char *name, size_t len) __THROW;
int getgroups(int size, gid_t list[]) __THROW;
+int getdtablesize(void) __THROW;
+char *getpass(const char * prompt) __THROW;
/* warning: linux specific: */
+int llseek(int fildes, unsigned long hi, unsigned long lo, loff_t* result,int whence) __THROW;
+
+/* include <linux/sysctl.h> to get all the definitions! */
+struct __sysctl_args;
int _sysctl(struct __sysctl_args *args) __THROW;
-int sendfile(int out_fd, int in_fd, off_t *offset, size_t count) __THROW;
-int getdtablesize(void) __THROW;
-char *getpass(const char * prompt) __THROW;
+#define _SC_CLK_TCK 1
+#define _SC_ARG_MAX 2
+#define _SC_OPEN_MAX 4
+#define _SC_PAGESIZE 5
+#define _SC_NPROCESSORS_ONLN 6
+#define _SC_NPROCESSORS_CONF _SC_NPROCESSORS_ONLN
+long sysconf(int name) __THROW;
+#define _PC_PATH_MAX 1
+#define _PC_VDISABLE 2
+
+pid_t tcgetpgrp(int fd) __THROW;
+int tcsetpgrp(int fd, pid_t pgrpid) __THROW;
+
+int profil(unsigned short *buf, size_t bufsiz, size_t offset, unsigned int scale);
+
+/* Linux only: */
+int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) __THROW;
+int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) __THROW;
+int setresuid(uid_t ruid, uid_t euid, uid_t suid) __THROW;
+int setresgid(gid_t rgid, gid_t egid, gid_t sgid) __THROW;
+
+/* 32-bit uid support */
+int chown32(const char *path, uid32_t owner, gid32_t group) __THROW;
+int fchown32(int fd, uid32_t owner, gid32_t group) __THROW;
+int lchown32(const char *path, uid32_t owner, gid32_t group) __THROW;
+uid32_t getuid32(void) __THROW;
+uid32_t geteuid32(void) __THROW;
+gid32_t getgid32(void) __THROW;
+gid32_t getegid32(void) __THROW;
+int setuid32(uid32_t uid) __THROW;
+int setgid32(gid32_t gid) __THROW;
+int setreuid32(uid32_t ruid, uid32_t euid) __THROW;
+int setregid32(gid32_t rgid, gid32_t egid) __THROW;
+#define seteuid32(euid) setreuid32(-1,euid)
+#define setegid32(egid) setregid32(-1,egid)
+int getgroups32(int size, gid32_t list[]) __THROW;
+int getresuid32(uid32_t *ruid, uid32_t *euid, uid32_t *suid);
+int getresgid32(gid32_t *rgid, gid32_t *egid, gid32_t *sgid);
+int setresuid32(uid32_t ruid, uid32_t euid, uid32_t suid) __THROW;
+int setresgid32(gid32_t rgid, gid32_t egid, gid32_t sgid) __THROW;
+
+#ifdef _BSD_SOURCE
+char *getusershell(void);
+void setusershell(void);
+void endusershell(void);
+#endif
+
+#define _POSIX_VERSION 199506L
#endif
diff --git a/mdk-stage1/dietlibc/include/utmp.h b/mdk-stage1/dietlibc/include/utmp.h
index 2946be921..cc2adc9f6 100644
--- a/mdk-stage1/dietlibc/include/utmp.h
+++ b/mdk-stage1/dietlibc/include/utmp.h
@@ -11,6 +11,11 @@
#define _PATH_UTMP "/var/run/utmp"
#define _PATH_WTMP "/var/log/wtmp"
+#ifdef _BSD_SOURCE
+/* die, BSD, die!!! */
+#define UTMP_FILE _PATH_UTMP
+#define WTMP_FILE _PATH_WTMP
+#endif
/* The structure describing an entry in the database of
previous logins. */
@@ -38,11 +43,13 @@ struct utmp
char ut_id[4]; /* Inittab ID. */
char ut_user[UT_NAMESIZE]; /* Username. */
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */
-#define ut_name ut_host
+#define ut_name ut_user
struct exit_status ut_exit; /* Exit status of a process marked
as DEAD_PROCESS. */
long int ut_session; /* Session ID, used for windowing. */
+#define ut_time ut_tv.tv_sec
struct timeval ut_tv; /* Time entry was made. */
+#define ut_addr ut_addr_v6[0]
int32_t ut_addr_v6[4]; /* Internet address of remote host. */
char __unused[20]; /* Reserved for future use. */
};
@@ -70,4 +77,18 @@ struct utmp
#define _HAVE_UT_TV 1
#define _HAVE_UT_HOST 1
+struct utmp *getutent(void) __THROW;
+struct utmp *getutid(struct utmp *ut) __THROW;
+struct utmp *getutline(struct utmp *ut) __THROW;
+
+void pututline(struct utmp *ut) __THROW;
+
+void setutent(void) __THROW;
+void endutent(void) __THROW;
+
+void utmpname(const char *file) __THROW;
+
+void updwtmp(const char *wtmp_file, const struct utmp *ut);
+void logwtmp(const char *line, const char *name, const char *host);
+
#endif
diff --git a/mdk-stage1/dietlibc/include/write12.h b/mdk-stage1/dietlibc/include/write12.h
new file mode 100644
index 000000000..960b4b722
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/write12.h
@@ -0,0 +1,4 @@
+#include <sys/cdefs.h>
+
+int __write1 ( const char* s ) __attribute__ (( regparm(1) ));
+int __write2 ( const char* s ) __attribute__ (( regparm(1) ));
diff --git a/mdk-stage1/dietlibc/lib/__dtostr.c b/mdk-stage1/dietlibc/lib/__dtostr.c
index e9a8a83d3..f54bde22b 100644
--- a/mdk-stage1/dietlibc/lib/__dtostr.c
+++ b/mdk-stage1/dietlibc/lib/__dtostr.c
@@ -1,104 +1,127 @@
-#include <stdio.h>
+#include <stdlib.h>
+#include <endian.h>
/* convert double to string. Helper for sprintf. */
-int __dtostr(double d,char *buf,int maxlen,int prec) {
+int __dtostr(double d,char *buf,unsigned int maxlen,unsigned int prec,unsigned int prec2) {
+#if 1
unsigned long long *x=(unsigned long long *)&d;
/* step 1: extract sign, mantissa and exponent */
- signed int s=*x>>63;
signed long e=((*x>>52)&((1<<11)-1))-1023;
+#else
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ signed long e=(((((unsigned long*)&d)[1])>>20)&((1<<11)-1))-1023;
+#else
+ signed long e=(((*((unsigned long*)&d))>>20)&((1<<11)-1))-1023;
+#endif
+#endif
/* unsigned long long m=*x & ((1ull<<52)-1); */
/* step 2: exponent is base 2, compute exponent for base 10 */
signed long e10=1+(long)(e*0.30102999566398119802); /* log10(2) */
/* step 3: calculate 10^e10 */
- int i;
- double tmp=10.0;
+ unsigned int i;
+ double backup=d;
+ double tmp;
char *oldbuf=buf;
- int initial=1;
+ /* Wir iterieren von Links bis wir bei 0 sind oder maxlen erreicht
+ * ist. Wenn maxlen erreicht ist, machen wir das nochmal in
+ * scientific notation. Wenn dann von prec noch was übrig ist, geben
+ * wir einen Dezimalpunkt aus und geben prec2 Nachkommastellen aus.
+ * Wenn prec2 Null ist, geben wir so viel Stellen aus, wie von prec
+ * noch übrig ist. */
if (d==0.0) {
- *buf='0'; ++buf;
- goto done;
+ prec2=prec2==0?1:prec2+2;
+ prec2=prec2>maxlen?8:prec2;
+ for (i=0; i<prec2; ++i) buf[i]='0';
+ buf[1]='.'; buf[i]=0;
+ return i;
}
- if (s) { d=-d; *buf='-'; --maxlen; buf++; }
+
+ if (d < 0.0) { d=-d; *buf='-'; --maxlen; buf++; }
+
+ /*
+ Perform rounding. It needs to be done before we generate any
+ digits as the carry could propagate through the whole number.
+ */
+
+ tmp = 0.5;
+ for (i = 0; i < prec2; i++) { tmp *= 0.1; }
+ d += tmp;
+
/* printf("e=%d e10=%d prec=%d\n",e,e10,prec); */
- if (e10>=0) {
+ if (e10>0) {
+ int first=1; /* are we about to write the first digit? */
+ tmp = 10.0;
i=e10;
while (i>10) { tmp=tmp*1e10; i-=10; }
while (i>1) { tmp=tmp*10; --i; }
- } else {
- i=(e10=-e10);
- while (i>10) { tmp=tmp*1e-10; i-=10; }
- while (i>1) { tmp=tmp/10; --i; }
- }
- while (d/tmp<1) {
- --e10;
- tmp/=10.0;
- }
- /* step 4: see if precision is sufficient to display all digits */
- if (e10>prec) {
- /* use scientific notation */
- int len=__dtostr(d/tmp,buf,maxlen,prec);
- if (len==0) return 0;
- maxlen-=len; buf+=len;
- if (--maxlen>=0) {
- *buf='e';
- ++buf;
- }
- for (len=1000; len>0; len/=10) {
- if (e10>=len || !initial) {
- if (--maxlen>=0) {
- *buf=(e10/len)+'0';
- ++buf;
+ /* the number is greater than 1. Iterate through digits before the
+ * decimal point until we reach the decimal point or maxlen is
+ * reached (in which case we switch to scientific notation). */
+ while (tmp>0.9) {
+ char digit;
+ double fraction=d/tmp;
+ digit=(int)(fraction); /* floor() */
+ if (!first || digit) {
+ first=0;
+ *buf=digit+'0'; ++buf;
+ if (!maxlen) {
+ /* use scientific notation */
+ int len=__dtostr(backup/tmp,oldbuf,maxlen,prec,prec2);
+ int initial=1;
+ if (len==0) return 0;
+ maxlen-=len; buf+=len;
+ if (maxlen>0) {
+ *buf='e';
+ ++buf;
+ }
+ --maxlen;
+ for (len=1000; len>0; len/=10) {
+ if (e10>=len || !initial) {
+ if (maxlen>0) {
+ *buf=(e10/len)+'0';
+ ++buf;
+ }
+ --maxlen;
+ initial=0;
+ e10=e10%len;
+ }
+ }
+ if (maxlen>0) goto fini;
+ return 0;
}
- initial=0;
- e10=e10%len;
+ d-=digit*tmp;
+ --maxlen;
}
+ tmp/=10.0;
}
- if (maxlen>=0) return buf-oldbuf;
- return 0;
}
- /* step 5: loop through the digits, inserting the decimal point when
- * appropriate */
- if (d<1.0) {
- double x=1.0;
- int first=1;
- do {
- if (--maxlen<0) return buf-oldbuf;
- *buf='0'; ++buf;
- if (first) {
- first=0;
- *buf='.'; ++buf;
- if (--maxlen<0) return buf-oldbuf;
- }
- x/=10.0;
- } while (x>d);
+ else
+ {
+ tmp = 0.1;
}
- for (; prec>0; ) {
- double tmp2=d/tmp;
- char c;
- d-=((int)tmp2*tmp);
- c=((int)tmp2);
- if ((!initial)||c) {
- if (--maxlen>=0) {
- initial=0;
- *buf=c+'0';
- ++buf;
- } else
- return 0;
+
+ if (buf==oldbuf) {
+ if (!maxlen) return 0; --maxlen;
+ *buf='0'; ++buf;
+ }
+ if (prec2 || prec>(unsigned int)(buf-oldbuf)+1) { /* more digits wanted */
+ if (!maxlen) return 0; --maxlen;
+ *buf='.'; ++buf;
+ prec-=buf-oldbuf-1;
+ if (prec2) prec=prec2;
+ if (prec>maxlen) return 0;
+ while (prec>0) {
+ char digit;
+ double fraction=d/tmp;
+ digit=(int)(fraction); /* floor() */
+ *buf=digit+'0'; ++buf;
+ d-=digit*tmp;
+ tmp/=10.0;
--prec;
}
- if (tmp>0.5 && tmp<1.5) {
- tmp=1e-1;
- initial=0;
- if (--maxlen>=0) {
- *buf='.';
- ++buf;
- } else
- return 0;
- } else
- tmp/=10.0;
}
-done:
+fini:
*buf=0;
return buf-oldbuf;
}
diff --git a/mdk-stage1/dietlibc/lib/__fstat64.c b/mdk-stage1/dietlibc/lib/__fstat64.c
index 6f9fcb2c5..f2f9858ea 100644
--- a/mdk-stage1/dietlibc/lib/__fstat64.c
+++ b/mdk-stage1/dietlibc/lib/__fstat64.c
@@ -1,9 +1,8 @@
+#include <errno.h>
#include "dietfeatures.h"
-
#ifdef WANT_LARGEFILE_BACKCOMPAT
#include <sys/stat.h>
#ifndef __NO_STAT64
-#include <errno.h>
extern int __dietlibc_fstat64(int __fd, struct stat64 *__buf);
extern void __stat64_cvt(const struct stat *src,struct stat64 *dest);
@@ -11,11 +10,7 @@ extern void __stat64_cvt(const struct stat *src,struct stat64 *dest);
int fstat64(int __fd, struct stat64 *__buf) {
if (__dietlibc_fstat64(__fd,__buf)) {
struct stat temp;
-#ifdef WANT_THREAD_SAFE
- if (*__errno_location()!=ENOSYS) return -1;
-#else
if (errno!=ENOSYS) return -1;
-#endif
if (fstat(__fd,&temp)) return -1;
__stat64_cvt(&temp,__buf);
}
diff --git a/mdk-stage1/dietlibc/lib/__ftruncate64.c b/mdk-stage1/dietlibc/lib/__ftruncate64.c
new file mode 100644
index 000000000..e0ea8c98a
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__ftruncate64.c
@@ -0,0 +1,23 @@
+#include <errno.h>
+#include "dietfeatures.h"
+#ifdef WANT_LARGEFILE_BACKCOMPAT
+#include <sys/stat.h>
+#include "syscalls.h"
+#include <unistd.h>
+#ifndef __NO_STAT64
+#ifdef __NR_ftruncate64
+
+extern int __dietlibc_ftruncate64(int fd, loff_t o);
+
+int ftruncate64(int fd, loff_t o) {
+ int tmp;
+ if ((tmp=__dietlibc_ftruncate64(fd,o))==-1) {
+ if (errno!=ENOSYS) return -1;
+ if (o>0x7fffffff) { errno=EOVERFLOW; return -1; }
+ return ftruncate(fd,o);
+ }
+ return tmp;
+}
+#endif
+#endif
+#endif
diff --git a/mdk-stage1/dietlibc/lib/__getcwd.c b/mdk-stage1/dietlibc/lib/__getcwd.c
index e97fc4520..8616704ec 100644
--- a/mdk-stage1/dietlibc/lib/__getcwd.c
+++ b/mdk-stage1/dietlibc/lib/__getcwd.c
@@ -1,3 +1,4 @@
+#include <unistd.h>
#include <stdlib.h>
extern int __syscall_getcwd(char* buf, size_t size);
diff --git a/mdk-stage1/dietlibc/lib/__isnan.c b/mdk-stage1/dietlibc/lib/__isnan.c
index 9d21e9824..20e44dd46 100644
--- a/mdk-stage1/dietlibc/lib/__isnan.c
+++ b/mdk-stage1/dietlibc/lib/__isnan.c
@@ -1,9 +1,10 @@
-#include <stdio.h>
+#include <math.h>
-int __isnan(double d) {
+int isnan(double d) {
unsigned long long *x=(unsigned long long *)&d;
return (*x==0x7FF8002000000000ll || *x==0x7FF0002000000000);
}
+int __isnan(double d) __attribute__((alias("isnan")));
#if 0
TestFromIeeeExtended("7FFF0000000000000000"); /* +infinity */
diff --git a/mdk-stage1/dietlibc/lib/__lltostr.c b/mdk-stage1/dietlibc/lib/__lltostr.c
index eb4a27cef..fe4701f29 100644
--- a/mdk-stage1/dietlibc/lib/__lltostr.c
+++ b/mdk-stage1/dietlibc/lib/__lltostr.c
@@ -1,9 +1,11 @@
#include <string.h>
+int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase);
+
int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase)
{
char *tmp;
- int j=0;
+ unsigned int j=0;
s[--size]=0;
diff --git a/mdk-stage1/dietlibc/lib/__lstat64.c b/mdk-stage1/dietlibc/lib/__lstat64.c
index a871f3917..0eab6a94b 100644
--- a/mdk-stage1/dietlibc/lib/__lstat64.c
+++ b/mdk-stage1/dietlibc/lib/__lstat64.c
@@ -1,9 +1,8 @@
+#include <errno.h>
#include "dietfeatures.h"
-
#ifdef WANT_LARGEFILE_BACKCOMPAT
#include <sys/stat.h>
#ifndef __NO_STAT64
-#include <errno.h>
extern int __dietlibc_lstat64(const char *__file, struct stat64 *__buf);
extern void __stat64_cvt(const struct stat *src,struct stat64 *dest);
@@ -11,11 +10,7 @@ extern void __stat64_cvt(const struct stat *src,struct stat64 *dest);
int lstat64(const char *__file, struct stat64 *__buf) {
if (__dietlibc_lstat64(__file,__buf)) {
struct stat temp;
-#ifdef WANT_THREAD_SAFE
- if (*__errno_location()!=ENOSYS) return -1;
-#else
if (errno!=ENOSYS) return -1;
-#endif
if (lstat(__file,&temp)) return -1;
__stat64_cvt(&temp,__buf);
}
diff --git a/mdk-stage1/dietlibc/lib/__ltostr.c b/mdk-stage1/dietlibc/lib/__ltostr.c
index 57e0690d2..fa71be9ab 100644
--- a/mdk-stage1/dietlibc/lib/__ltostr.c
+++ b/mdk-stage1/dietlibc/lib/__ltostr.c
@@ -1,9 +1,10 @@
#include <string.h>
+#include <stdlib.h>
-int __ltostr(char *s, int size, unsigned long i, int base, char UpCase)
+int __ltostr(char *s, unsigned int size, unsigned long i, unsigned int base, int UpCase)
{
char *tmp;
- int j=0;
+ unsigned int j=0;
s[--size]=0;
diff --git a/mdk-stage1/dietlibc/lib/__ptrace.c b/mdk-stage1/dietlibc/lib/__ptrace.c
new file mode 100644
index 000000000..bd14a0351
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__ptrace.c
@@ -0,0 +1,27 @@
+/* we need this because we need to use the glibc prototype which uses
+ * varargs :-( */
+#define ptrace fnord
+#include <sys/ptrace.h>
+#undef ptrace
+#include <sys/types.h>
+#include <unistd.h>
+
+extern int __diet_ptrace(int request, pid_t pid, void *addr, void *data);
+int ptrace(int request, pid_t pid, void *addr, void *data);
+
+int ptrace(int request, pid_t pid, void *addr, void *data) {
+ switch (request) {
+ case PTRACE_TRACEME: case PTRACE_KILL: case PTRACE_ATTACH:
+ case PTRACE_DETACH:
+ return (__diet_ptrace (request, pid, NULL, NULL));
+ case PTRACE_PEEKDATA: case PTRACE_PEEKUSER: case PTRACE_PEEKTEXT:
+ {
+ long result;
+ if (__diet_ptrace (request, pid, addr, &result) == -1)
+ return (-1);
+ return (result);
+ }
+ default:
+ return (__diet_ptrace (request, pid, addr, data));
+ }
+}
diff --git a/mdk-stage1/dietlibc/lib/__stat64.c b/mdk-stage1/dietlibc/lib/__stat64.c
index dfb0d4315..fcbdfef2d 100644
--- a/mdk-stage1/dietlibc/lib/__stat64.c
+++ b/mdk-stage1/dietlibc/lib/__stat64.c
@@ -1,9 +1,8 @@
+#include <errno.h>
#include "dietfeatures.h"
-
#ifdef WANT_LARGEFILE_BACKCOMPAT
#include <sys/stat.h>
#ifndef __NO_STAT64
-#include <errno.h>
extern int __dietlibc_stat64(const char *__file, struct stat64 *__buf);
extern void __stat64_cvt(const struct stat *src,struct stat64 *dest);
@@ -11,11 +10,7 @@ extern void __stat64_cvt(const struct stat *src,struct stat64 *dest);
int stat64(const char *__file, struct stat64 *__buf) {
if (__dietlibc_stat64(__file,__buf)) {
struct stat temp;
-#ifdef WANT_THREAD_SAFE
- if (*__errno_location()!=ENOSYS) return -1;
-#else
if (errno!=ENOSYS) return -1;
-#endif
if (stat(__file,&temp)) return -1;
__stat64_cvt(&temp,__buf);
}
diff --git a/mdk-stage1/dietlibc/lib/__stat64_cvt.c b/mdk-stage1/dietlibc/lib/__stat64_cvt.c
index dced352a4..c4ce8bea4 100644
--- a/mdk-stage1/dietlibc/lib/__stat64_cvt.c
+++ b/mdk-stage1/dietlibc/lib/__stat64_cvt.c
@@ -1,6 +1,8 @@
#include <sys/stat.h>
#ifndef __NO_STAT64
+void __stat64_cvt(const struct stat *src,struct stat64 *dest);
+
void __stat64_cvt(const struct stat *src,struct stat64 *dest) {
dest->st_dev=src->st_dev;
dest->st_ino=src->st_ino;
diff --git a/mdk-stage1/dietlibc/lib/__stime.c b/mdk-stage1/dietlibc/lib/__stime.c
new file mode 100644
index 000000000..7b2c77729
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__stime.c
@@ -0,0 +1,14 @@
+#include <errno.h>
+#include <sys/time.h>
+#include <time.h>
+#include <syscalls.h>
+
+#ifndef __NR_stime
+int stime(time_t *when)
+{
+ struct timeval tv;
+ tv.tv_sec = *when;
+ tv.tv_usec = 0;
+ return settimeofday(&tv, (struct timezone *)0);
+}
+#endif
diff --git a/mdk-stage1/dietlibc/lib/__truncate64.c b/mdk-stage1/dietlibc/lib/__truncate64.c
new file mode 100644
index 000000000..ccb3e7f64
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__truncate64.c
@@ -0,0 +1,23 @@
+#include "dietfeatures.h"
+#include <errno.h>
+#ifdef WANT_LARGEFILE_BACKCOMPAT
+#include <sys/stat.h>
+#include "syscalls.h"
+#include <unistd.h>
+#ifndef __NO_STAT64
+#ifdef __NR_truncate64
+
+extern int __dietlibc_truncate64(const char* f, loff_t o);
+
+int truncate64(const char* f, loff_t o) {
+ int tmp;
+ if ((tmp=__dietlibc_truncate64(f,o))==-1) {
+ if (errno!=ENOSYS) return -1;
+ if (o>0x7fffffff) { errno=EOVERFLOW; return -1; }
+ return truncate(f,o);
+ }
+ return tmp;
+}
+#endif
+#endif
+#endif
diff --git a/mdk-stage1/dietlibc/lib/__v_printf.c b/mdk-stage1/dietlibc/lib/__v_printf.c
new file mode 100644
index 000000000..e27c63788
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__v_printf.c
@@ -0,0 +1,299 @@
+#include "dietfeatures.h"
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+#include "dietstdio.h"
+#include "dietwarning.h"
+
+static inline unsigned int skip_to(const unsigned char *format) {
+ unsigned int nr;
+ for (nr=0; format[nr] && (format[nr]!='%'); ++nr);
+ return nr;
+}
+
+#define A_WRITE(fn,buf,sz) ((fn)->put((void*)(buf),(sz),(fn)->data))
+
+static const char pad_line[2][16]= { " ", "0000000000000000", };
+static inline int write_pad(struct arg_printf* fn, int len, int padwith) {
+ int nr=0;
+ for (;len>15;len-=16,nr+=16) {
+ A_WRITE(fn,pad_line[(padwith=='0')?1:0],16);
+ }
+ if (len>0) {
+ A_WRITE(fn,pad_line[(padwith=='0')?1:0],(unsigned int)len); nr+=len;
+ }
+ return nr;
+}
+
+int __v_printf(struct arg_printf* fn, const unsigned char *format, va_list arg_ptr)
+{
+ int len=0;
+
+ while (*format) {
+ unsigned int sz = skip_to(format);
+ if (sz) {
+ A_WRITE(fn,format,sz); len+=sz;
+ format+=sz;
+ }
+ if (*format=='%') {
+ char buf[128];
+
+ unsigned char ch, *s, padwith=' ';
+
+ char flag_in_sign=0;
+ char flag_upcase=0;
+ char flag_hash=0;
+ char flag_left=0;
+ char flag_space=0;
+ char flag_sign=0;
+ char flag_dot=0;
+ signed char flag_long=0;
+
+ unsigned int base;
+ unsigned int width=0, preci=0;
+
+ long number=0;
+#ifdef WANT_LONGLONG_PRINTF
+ long long llnumber=0;
+#endif
+
+ ++format;
+inn_printf:
+ switch(ch=*format++) {
+ case 0:
+ return -1;
+ break;
+
+ /* FLAGS */
+ case '#':
+ flag_hash=-1;
+ case 'z':
+ goto inn_printf;
+
+ case 'h':
+ --flag_long;
+ goto inn_printf;
+ case 'L':
+ ++flag_long; /* fall through */
+ case 'l':
+ ++flag_long;
+ goto inn_printf;
+
+ case '0':
+ padwith='0';
+ goto inn_printf;
+
+ case '-':
+ flag_left=1;
+ goto inn_printf;
+
+ case ' ':
+ flag_space=1;
+ goto inn_printf;
+
+ case '+':
+ flag_sign=1;
+ goto inn_printf;
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if(flag_dot) return -1;
+ width=strtoul(format-1,(char**)&s,10);
+ format=s;
+ goto inn_printf;
+
+ case '*':
+ width=va_arg(arg_ptr,int);
+ goto inn_printf;
+
+ case '.':
+ flag_dot=1;
+ if (*format=='*') {
+ preci=va_arg(arg_ptr,int);
+ ++format;
+ } else {
+ long int tmp=strtol(format,(char**)&s,10);
+ preci=tmp<0?0:tmp;
+ format=s;
+ }
+ goto inn_printf;
+
+ /* print a char or % */
+ case 'c':
+ ch=(char)va_arg(arg_ptr,int);
+ case '%':
+ A_WRITE(fn,&ch,1); ++len;
+ break;
+
+ /* print a string */
+ case 's':
+ s=va_arg(arg_ptr,char *);
+#ifdef WANT_NULL_PRINTF
+ if (!s) s="(null)";
+#endif
+ sz = strlen(s);
+ if (flag_dot && sz>preci) sz=preci;
+ flag_dot^=flag_dot;
+
+print_out:
+ if (width && (!flag_left)) {
+ if (flag_in_sign) {
+ A_WRITE(fn,s,1); ++len;
+ ++s; --sz;
+ --width;
+ }
+ if (flag_hash>0) {
+ A_WRITE(fn,s,flag_hash); len+=flag_hash;
+ s+=flag_hash; sz-=flag_hash;
+ width-=flag_hash;
+ }
+// len+=write_pad(fn,(signed int)width-(signed int)sz,padwith);
+ if (flag_dot) {
+ len+=write_pad(fn,(signed int)width-(signed int)preci,padwith);
+ len+=write_pad(fn,(signed int)preci-(signed int)sz,'0');
+ } else
+ len+=write_pad(fn,(signed int)width-(signed int)sz,padwith);
+ }
+ A_WRITE(fn,s,sz); len+=sz;
+ if (width && (flag_left)) {
+ len+=write_pad(fn,(signed int)width-(signed int)sz,' ');
+ }
+ break;
+
+ /* print an integer value */
+ case 'b':
+ base=2;
+ sz=0;
+ goto num_printf;
+ case 'p':
+ flag_hash=2;
+ flag_long=1;
+ ch='x';
+ case 'X':
+ flag_upcase=(ch=='X');
+ case 'x':
+ base=16;
+ sz=0;
+ if (flag_hash) {
+ buf[1]='0';
+ buf[2]=ch;
+ flag_hash=2;
+ sz=2;
+ }
+ goto num_printf;
+ case 'd':
+ case 'i':
+ flag_in_sign=1;
+ case 'u':
+ base=10;
+ sz=0;
+ goto num_printf;
+ case 'o':
+ base=8;
+ sz=0;
+ if (flag_hash) {
+ buf[1]='0';
+ flag_hash=1;
+ ++sz;
+ }
+
+num_printf:
+ s=buf+1;
+
+ if (flag_long>0) {
+#ifdef WANT_LONGLONG_PRINTF
+ if (flag_long>1)
+ llnumber=va_arg(arg_ptr,long long);
+ else
+#endif
+ number=va_arg(arg_ptr,long);
+ }
+ else
+ number=va_arg(arg_ptr,int);
+
+ if (flag_in_sign) {
+#ifdef WANT_LONGLONG_PRINTF
+ if ((flag_long>1)&&(llnumber<0)) {
+ llnumber=-llnumber;
+ flag_in_sign=2;
+ } else
+#endif
+ if (number<0) {
+ number=-number;
+ flag_in_sign=2;
+ }
+ }
+ if (flag_long<0) number&=0xffff;
+ if (flag_long<-1) number&=0xff;
+#ifdef WANT_LONGLONG_PRINTF
+ if (flag_long>1)
+ sz += __lltostr(s+sz,sizeof(buf)-5,(unsigned long long) llnumber,base,flag_upcase);
+ else
+#endif
+ sz += __ltostr(s+sz,sizeof(buf)-5,(unsigned long) number,base,flag_upcase);
+
+ if (flag_in_sign==2) {
+ *(--s)='-';
+ ++sz;
+ } else if ((flag_in_sign)&&(flag_sign || flag_space)) {
+ *(--s)=(flag_sign)?'+':' ';
+ ++sz;
+ } else flag_in_sign=0;
+
+ goto print_out;
+
+#ifdef WANT_FLOATING_POINT_IN_PRINTF
+ /* print a floating point value */
+ case 'f':
+ case 'g':
+ {
+ int g=(ch=='g');
+ double d=va_arg(arg_ptr,double);
+ if (width==0) width=1;
+ if (!flag_dot) preci=6;
+ sz=__dtostr(d,buf,sizeof(buf),width,preci);
+ if (flag_dot) {
+ char *tmp;
+ if ((tmp=strchr(buf,'.'))) {
+ ++tmp;
+ while (preci>0 && *++tmp) --preci;
+ *tmp=0;
+ }
+ }
+ if (g) {
+ char *tmp,*tmp1; /* boy, is _this_ ugly! */
+ if ((tmp=strchr(buf,'.'))) {
+ tmp1=strchr(tmp,'e');
+ while (*tmp) ++tmp;
+ if (tmp1) tmp=tmp1;
+ while (*--tmp=='0') ;
+ if (*tmp!='.') ++tmp;
+ *tmp=0;
+ if (tmp1) strcpy(tmp,tmp1);
+ }
+ }
+ preci=strlen(buf);
+ s=buf;
+
+ goto print_out;
+ }
+#endif
+
+ default:
+ break;
+ }
+ }
+ }
+ return len;
+}
+
+link_warning("__v_printf","warning: the printf functions add several kilobytes of bloat.")
+
diff --git a/mdk-stage1/dietlibc/lib/__v_scanf.c b/mdk-stage1/dietlibc/lib/__v_scanf.c
new file mode 100644
index 000000000..6db51db59
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__v_scanf.c
@@ -0,0 +1,391 @@
+#include "dietfeatures.h"
+#include <stdarg.h>
+#include <sys/types.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "dietstdio.h"
+#include "dietwarning.h"
+
+#define A_GETC(fn) (++consumed,(fn)->getch((fn)->data))
+#define A_PUTC(c,fn) (--consumed,(fn)->putch((c),(fn)->data))
+
+int __v_scanf(struct arg_scanf* fn, const unsigned char *format, va_list arg_ptr)
+{
+ unsigned int ch; /* format act. char */
+ int n=0;
+
+ /* arg_ptr tmps */
+#ifdef WANT_FLOATING_POINT_IN_SCANF
+ double *pd;
+ float *pf;
+#endif
+#ifdef WANT_LONGLONG_SCANF
+ long long *pll;
+#endif
+ long *pl;
+ short *ph;
+ int *pi;
+ char *s;
+
+ unsigned int consumed=0;
+
+ /* get one char */
+ int tpch= A_GETC(fn);
+
+ //while ((tpch!=-1)&&(*format))
+ while (*format)
+ {
+// const unsigned char *prev_fmt=format;
+ ch=*format++;
+ switch (ch) {
+ /* end of format string ?!? */
+ case 0: return 0;
+
+ /* skip spaces ... */
+ case ' ':
+ case '\f':
+ case '\t':
+ case '\v':
+ case '\n':
+ case '\r':
+ while((*format)&&(isspace(*format))) ++format;
+ while(isspace(tpch)) tpch=A_GETC(fn);
+ break;
+
+ /* format string ... */
+ case '%':
+ {
+ unsigned int _div=0;
+ int width=-1;
+ char flag_width=0;
+ char flag_discard=0;
+ char flag_half=0;
+ char flag_long=0;
+ char flag_longlong=0;
+
+in_scan:
+ ch=*format++;
+ if(ch!='n' && tpch==-1) goto err_out;
+ switch (ch) {
+ /* end of format string ?!? */
+ case 0: return 0;
+
+ /* check for % */
+ case '%':
+ if ((unsigned char)tpch != ch) goto err_out;
+ tpch=A_GETC(fn);
+ break;
+
+ /* FLAGS */
+ case '*':
+ flag_discard=1;
+ goto in_scan;
+ case 'h':
+ flag_half=1;
+ goto in_scan;
+ case 'l':
+ if (flag_long) flag_longlong=1;
+ flag_long=1;
+ goto in_scan;
+ case 'q':
+ case 'L':
+ flag_longlong=1;
+ goto in_scan;
+
+ /* WIDTH */
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ width=strtol(format-1,&s,10);
+ format=s;
+ flag_width=1;
+ goto in_scan;
+
+ /* scan for integer / strtol reimplementation ... */
+ case 'p':
+ case 'X':
+ case 'x':
+ _div+=6;
+ case 'd':
+ _div+=2;
+ case 'o':
+ _div+=8;
+ case 'u':
+ case 'i':
+ {
+#ifdef WANT_LONGLONG_SCANF
+ unsigned long long v=0;
+#else
+ unsigned long v=0;
+#endif
+ unsigned int consumedsofar=consumed;
+ int neg=0;
+ while(isspace(tpch)) tpch=A_GETC(fn);
+ if (tpch=='-') {
+ tpch=A_GETC(fn);
+ neg=1;
+ }
+
+ if (tpch=='+') tpch=A_GETC(fn);
+
+ if (!flag_width) {
+ if ((_div==16) && (tpch=='0')) goto scan_hex;
+ if (!_div) {
+ _div=10;
+ if (tpch=='0') {
+ _div=8;
+scan_hex:
+ tpch=A_GETC(fn);
+ if ((tpch|32)=='x') {
+ tpch=A_GETC(fn);
+ _div=16;
+ }
+ }
+ }
+ }
+ while ((width)&&(tpch!=-1)) {
+ register unsigned long c=tpch&0xff;
+#ifdef WANT_LONGLONG_SCANF
+ register unsigned long long d=c|0x20;
+#else
+ register unsigned long d=c|0x20;
+#endif
+ c=(d>='a'?d-'a'+10:c<='9'?c-'0':0xff);
+ if (c>=_div) break;
+ d=v*_div;
+#ifdef WANT_LONGLONG_SCANF
+ v=(d<v)?ULLONG_MAX:d+c;
+#else
+ v=(d<v)?ULONG_MAX:d+c;
+#endif
+ --width;
+ tpch=A_GETC(fn);
+ }
+ if ((ch|0x20)<'p') {
+#ifdef WANT_LONGLONG_SCANF
+ register long long l=v;
+ if (v>=-((unsigned long long)LLONG_MIN)) {
+ l=(neg)?LLONG_MIN:LLONG_MAX;
+ }
+ else {
+ if (neg) v*=-1;
+ }
+#else
+ register long l=v;
+ if (v>=-((unsigned long)LONG_MIN)) {
+ l=(neg)?LONG_MIN:LONG_MAX;
+ }
+ else {
+ if (neg) v*=-1;
+ }
+#endif
+ }
+ if (!flag_discard) {
+#ifdef WANT_LONGLONG_SCANF
+ if (flag_longlong) {
+ pll=(long long *)va_arg(arg_ptr,long long*);
+ *pll=v;
+ } else
+#endif
+ if (flag_long) {
+ pl=(long *)va_arg(arg_ptr,long*);
+ *pl=v;
+ } else if (flag_half) {
+ ph=(short*)va_arg(arg_ptr,short*);
+ *ph=v;
+ } else {
+ pi=(int *)va_arg(arg_ptr,int*);
+ *pi=v;
+ }
+ if(consumedsofar<consumed)
+ ++n;
+ }
+ }
+ break;
+
+#ifdef WANT_FLOATING_POINT_IN_SCANF
+ /* floating point numbers */
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'g':
+ {
+ double d=0.0;
+ int neg=0;
+
+ while(isspace(tpch)) tpch=A_GETC(fn);
+
+ if (tpch=='-') {
+ tpch=A_GETC(fn);
+ neg=1;
+ }
+ if (tpch=='+') tpch=A_GETC(fn);
+
+ while (isdigit(tpch)) {
+ d=d*10+(tpch-'0');
+ tpch=A_GETC(fn);
+ }
+ if (tpch=='.') {
+ double factor=.1;
+ tpch=A_GETC(fn);
+ while (isdigit(tpch)) {
+ d=d+(factor*(tpch-'0'));
+ factor/=10;
+ tpch=A_GETC(fn);
+ }
+ }
+ if ((tpch|0x20)=='e') {
+ int exp=0, prec=tpch;
+ double factor=10;
+ tpch=A_GETC(fn);
+ if (tpch=='-') {
+ factor=0.1;
+ tpch=A_GETC(fn);
+ } else if (tpch=='+') {
+ tpch=A_GETC(fn);
+ } else {
+ d=0;
+ if (tpch!=-1) A_PUTC(tpch,fn);
+ tpch=prec;
+ goto exp_out;
+ }
+ while (isdigit(tpch)) {
+ exp=exp*10+(tpch-'0');
+ tpch=A_GETC(fn);
+ }
+ while (exp) { /* as in strtod: XXX: this introduces rounding errors */
+ d*=factor; --exp;
+ }
+ }
+exp_out:
+ if (!flag_discard) {
+ if (flag_long) {
+ pd=(double *)va_arg(arg_ptr,double*);
+ *pd=d;
+ } else {
+ pf=(float *)va_arg(arg_ptr,float*);
+ *pf=d;
+ }
+ }
+ ++n;
+ }
+ break;
+#endif
+
+ /* char-sequences */
+ case 'c':
+ if (!flag_discard) {
+ s=(char *)va_arg(arg_ptr,char*);
+ ++n;
+ }
+ if (!flag_width) width=1;
+ while (width && (tpch!=-1)) {
+ if (!flag_discard) *(s++)=tpch;
+ --width;
+ tpch=A_GETC(fn);
+ }
+ break;
+
+ /* c-string */
+ case 's':
+ if (!flag_discard) s=(char *)va_arg(arg_ptr,char*);
+ while(isspace(tpch)) tpch=A_GETC(fn);
+ while (width && (tpch!=-1) && (!isspace(tpch))) {
+ if (!flag_discard) *s=tpch;
+ if (tpch) ++s; else break;
+ --width;
+ tpch=A_GETC(fn);
+ }
+ if (!flag_discard) { *s=0; n++; }
+ break;
+
+ /* consumed-count */
+ case 'n':
+ if (!flag_discard) {
+ s=(char *)va_arg(arg_ptr,char*);
+// ++n; /* in accordance to ANSI C we don't count this conversion */
+ }
+ if (!flag_discard) *(s++)=consumed-1;
+ break;
+
+#ifdef WANT_CHARACTER_CLASSES_IN_SCANF
+ case '[':
+ {
+ char cset[256];
+ int flag_not=0;
+ int flag_dash=0;
+ memset(cset,0,sizeof(cset));
+ ch=*format++;
+ /* first char specials */
+ if (ch=='^') {
+ flag_not=1;
+ ch=*format++;
+ }
+ if ((ch=='-')||(ch==']')) {
+ cset[ch]=1;
+ ch=*format++;
+ }
+ /* almost all non special chars */
+ for (;(*format) && (*format!=']');++format) {
+ if (flag_dash) {
+ register unsigned char tmp=*format;
+ for (;ch<=tmp;++ch) cset[ch]=1;
+ flag_dash=0;
+ ch=*format;
+ }
+ else if (*format=='-') flag_dash=1;
+ else {
+ cset[ch]=1;
+ ch=*format;
+ }
+ }
+ /* last char specials */
+ if (flag_dash) cset['-']=1;
+ else cset[ch]=1;
+
+ /* like %c or %s */
+ if (!flag_discard) {
+ s=(char *)va_arg(arg_ptr,char*);
+ ++n;
+ }
+ while (width && (tpch>=0) && (cset[tpch]^flag_not)) {
+ if (!flag_discard) *s=tpch;
+ if (tpch) ++s; else break;
+ --width;
+ tpch=A_GETC(fn);
+ }
+ if (!flag_discard) *s=0;
+ ++format;
+ }
+ break;
+#endif
+ default:
+ goto err_out;
+ }
+ }
+ break;
+
+ /* check if equal format string... */
+ default:
+ if ((unsigned char)tpch != ch) goto err_out;
+ tpch=A_GETC(fn);
+ break;
+ }
+ }
+err_out:
+ if (tpch<0 && n==0) return EOF;
+ A_PUTC(tpch,fn);
+ return n;
+}
+
+link_warning("__v_scanf","warning: the scanf functions add several kilobytes of bloat.");
diff --git a/mdk-stage1/dietlibc/lib/__xmknod.c b/mdk-stage1/dietlibc/lib/__xmknod.c
deleted file mode 100644
index 4739a1f5f..000000000
--- a/mdk-stage1/dietlibc/lib/__xmknod.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <sys/stat.h>
-
-int __xmknod(int ver,char* filename,mode_t mode,dev_t *dev) {
- return mknod(filename,mode,*dev);
-}
-
diff --git a/mdk-stage1/dietlibc/lib/_brk.c b/mdk-stage1/dietlibc/lib/_brk.c
index 6d0b29c03..e73d7b621 100644
--- a/mdk-stage1/dietlibc/lib/_brk.c
+++ b/mdk-stage1/dietlibc/lib/_brk.c
@@ -1,14 +1,13 @@
#include <unistd.h>
-extern int __diet_brk(void *end_data_segment);
+extern void* __diet_brk(void *end_data_segment);
void* __curbrk=0;
-int __brk(void *end_data_segment) {
- int res;
- if ((res=__diet_brk(end_data_segment))==0)
- __curbrk=end_data_segment;
- return res;
+int __libc_brk(void *end_data_segment);
+
+int __libc_brk(void *end_data_segment) {
+ return ((__curbrk=__diet_brk(end_data_segment))==(void*)-1?-1:0);
}
-int brk (void *end_data_segment) __attribute__((weak,alias("__brk")));
+int brk(void *end_data_segment) __attribute__((weak,alias("__libc_brk")));
diff --git a/mdk-stage1/dietlibc/lib/abort.c b/mdk-stage1/dietlibc/lib/abort.c
index 55bfb8f0f..7c49a32ef 100644
--- a/mdk-stage1/dietlibc/lib/abort.c
+++ b/mdk-stage1/dietlibc/lib/abort.c
@@ -1,10 +1,16 @@
-#include <linux/types.h>
-#include <linux/signal.h>
+#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
+#include <stdio.h>
+
+#ifndef __PIC__
+void __stdio_flushall(void) __attribute__((weak));
+void __stdio_flushall(void) { }
+#endif
void abort() {
sigset_t t;
+ __stdio_flushall();
if (!sigemptyset(&t) && !sigaddset(&t, SIGABRT))
sigprocmask(SIG_UNBLOCK, &t, 0);
while (1)
diff --git a/mdk-stage1/dietlibc/lib/abs.c b/mdk-stage1/dietlibc/lib/abs.c
index 9d7055358..d3b75f202 100644
--- a/mdk-stage1/dietlibc/lib/abs.c
+++ b/mdk-stage1/dietlibc/lib/abs.c
@@ -1,6 +1,6 @@
-#include <stdlib.h>
+#include <endian.h>
-int abs(int j)
-{
- return (j < 0) ? -j : j;
-}
+int abs(int i) { return i>=0?i:-i; }
+#if __WORDSIZE == 32
+long labs(long i) __attribute__((alias("abs")));
+#endif
diff --git a/mdk-stage1/dietlibc/lib/accept.c b/mdk-stage1/dietlibc/lib/accept.c
index c7e8254ca..08359b894 100644
--- a/mdk-stage1/dietlibc/lib/accept.c
+++ b/mdk-stage1/dietlibc/lib/accept.c
@@ -1,14 +1,12 @@
-#include <linux/net.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
+int __libc_accept(int a, void * addr, void * addr2);
+
int __libc_accept(int a, void * addr, void * addr2) {
-#ifdef __i386__
- return socketcall(SYS_ACCEPT, (long*)&a);
-#else
unsigned long args[] = { a, (long) addr, (long) addr2 };
return socketcall(SYS_ACCEPT, args);
-#endif
}
int accept(int a, void * addr, void * addr2) __attribute__((weak,alias("__libc_accept")));
diff --git a/mdk-stage1/dietlibc/lib/adjtime.c b/mdk-stage1/dietlibc/lib/adjtime.c
new file mode 100644
index 000000000..b8986be57
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/adjtime.c
@@ -0,0 +1,18 @@
+#include <time.h>
+#include <sys/timex.h>
+
+int adjtime (const struct timeval *itv, struct timeval *otv) {
+ struct timex tmp;
+ if (itv) {
+ tmp.offset = (itv->tv_usec % 1000000L) + (itv->tv_sec + itv->tv_usec / 1000000L) * 1000000L;
+ tmp.modes = ADJ_OFFSET_SINGLESHOT;
+ } else
+ tmp.modes = 0;
+ if (adjtimex(&tmp)==-1)
+ return -1;
+ if (otv) {
+ otv->tv_usec = tmp.offset % 1000000;
+ otv->tv_sec = tmp.offset / 1000000;
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/alarm.c b/mdk-stage1/dietlibc/lib/alarm.c
deleted file mode 100644
index fd35372f2..000000000
--- a/mdk-stage1/dietlibc/lib/alarm.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright (C) 1991, 1992, 1994, 1997 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 Library General Public License as
- published by the Free Software Foundation; either version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <unistd.h>
-#include <sys/time.h>
-
-/* Schedule an alarm. In SECONDS seconds, the process will get a SIGALRM.
- If SECONDS is zero, any currently scheduled alarm will be cancelled.
- The function returns the number of seconds remaining until the last
- alarm scheduled would have signaled, or zero if there wasn't one.
- There is no return value to indicate an error, but you can set `errno'
- to 0 and check its value after calling `alarm', and this might tell you.
- The signal may come late due to processor scheduling. */
-unsigned int
-alarm (seconds)
- unsigned int seconds;
-{
- struct itimerval old, new;
- unsigned int retval;
-
- new.it_interval.tv_usec = 0;
- new.it_interval.tv_sec = 0;
- new.it_value.tv_usec = 0;
- new.it_value.tv_sec = (long int) seconds;
- if (setitimer (ITIMER_REAL, &new, &old) < 0)
- return 0;
-
- retval = old.it_value.tv_sec;
- if (old.it_value.tv_usec)
- ++retval;
- return retval;
-}
diff --git a/mdk-stage1/dietlibc/lib/alloc.c b/mdk-stage1/dietlibc/lib/alloc.c
index 8cb87a69b..a2b3b73a1 100644
--- a/mdk-stage1/dietlibc/lib/alloc.c
+++ b/mdk-stage1/dietlibc/lib/alloc.c
@@ -1,23 +1,27 @@
/*
* malloc/free by O.Dreesen
+ *
+ * first TRY:
+ * lists w/magics
+ * and now the second TRY
+ * let the kernel map all the stuff (if there is something to do)
*/
-#include <linux/unistd.h>
-#include <asm/mman.h>
-#include <linux/errno.h>
-#include "dietfeatures.h"
-
-#if 0
+#include <unistd.h>
#include <sys/mman.h>
-#define _LIBC
#include <errno.h>
-#endif
+#include "dietfeatures.h"
-#include <linux/types.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/shm.h> /* for PAGE_SIZE */
-#if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
-#define MAP_ANON MAP_ANONYMOUS
-#endif
+
+/* -- HELPER CODE --------------------------------------------------------- */
#ifndef MAP_FAILED
#define MAP_FAILED ((void*)-1)
@@ -27,217 +31,207 @@
#define NULL ((void*)0)
#endif
-extern void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
-extern void *memset(void *s, int c, size_t n);
-extern void *memcpy(void *dest, const void *src, size_t n);
+typedef union {
+ void* next;
+ size_t size;
+} __alloc_t;
-typedef struct t_alloc_head {
- unsigned int magic1;
- struct t_alloc_head *ptr;
- unsigned long size;
- unsigned int magic2;
-} alloc_head;
+#define BLOCK_START(b) (((void*)(b))-sizeof(__alloc_t))
+#define BLOCK_RET(b) (((void*)(b))+sizeof(__alloc_t))
-/* guess what ? the virtual block size */
-#define MEM_BLOCK_SIZE 4096
+#define MEM_BLOCK_SIZE PAGE_SIZE
+#define PAGE_ALIGN(s) (((s)+MEM_BLOCK_SIZE-1)&(unsigned long)(~(MEM_BLOCK_SIZE-1)))
-/* minimum allocated bytes */
-#define MEM_ALLOC_MIN 4
+/* a simple mmap :) */
-/* Initial start position in memory */
-#define MEM_ALLOC_START ((char*)0x18000000)
+#ifdef __i386__
+/* regparm exists only on i386 */
+static void *do_mmap(size_t size) __attribute__((regparm(1)));
+static size_t get_index(size_t _size) __attribute__((regparm(1)));
+static void* __small_malloc(size_t _size) __attribute__((regparm(1)));
+#endif
-/* Make every block align */
-#define MEM_ALIGN(s) (((s)+MEM_ALLOC_MIN-1)&(~(MEM_ALLOC_MIN-1)))
-#define PAGE_ALIGN(s) (((s)+MEM_BLOCK_SIZE-1)&(~(MEM_BLOCK_SIZE-1)))
-#define PAGE_ALIGNP(p) ((char*)PAGE_ALIGN((size_t)(p)))
+static void *do_mmap(size_t size) {
+ return mmap(0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, (size_t)0);
+}
-#define END_OF_BLOCK(p) ((alloc_head*)(((char*)(p))+((p)->size)))
-#define START_BLOCK(p) ((alloc_head*)(((char*)(p))-sizeof(alloc_head)))
-#define START_DATA(p) (((char*)(p))+sizeof(alloc_head))
-#define MIN_ALLOC(s) (((((s)+sizeof(alloc_head)-1)/MEM_ALLOC_MIN)+1)*MEM_ALLOC_MIN)
+/* -- SMALL MEM ----------------------------------------------------------- */
-#define ALLOC_MAGIC1 0xbad2f7ee
-#define ALLOC_MAGIC2 0xf7ee2bad
+static __alloc_t* __small_mem[8];
-/* freelist handler */
-static alloc_head base = {ALLOC_MAGIC1,&base,0,ALLOC_MAGIC2};
-static char *alloc_get_end = MEM_ALLOC_START;
+#define __SMALL_NR(i) (MEM_BLOCK_SIZE/(i))
-void __libc_free(void *ptr)
-{
- alloc_head *prev,*p,*block;
+#define __MIN_SMALL_SIZE __SMALL_NR(256) /* 16 / 32 */
+#define __MAX_SMALL_SIZE __SMALL_NR(2) /* 2048 / 4096 */
- if (ptr==NULL) return;
+#define GET_SIZE(s) (__MIN_SMALL_SIZE<<get_index((s)))
- block=START_BLOCK(ptr);
- if (block->magic1 != ALLOC_MAGIC1) return;
- if (block->magic2 != ALLOC_MAGIC2) return;
+#define FIRST_SMALL(p) (((unsigned long)(p))&(~(MEM_BLOCK_SIZE-1)))
- prev=&base;
- for (p=prev->ptr ; ; prev=p, p=p->ptr)
- {
- if ((block>prev)&&(block<p)) break; /* found the gap block belongs */
- if ((prev>p)&&(block<p)) break; /* block pre freelist */
- if ((prev>p)&&(block>prev)) break; /* block after freelist */
+static inline int __ind_shift() { return (MEM_BLOCK_SIZE==4096)?4:5; }
- /* emergency escape: freelist has ONLY one entry the freelist base */
- if (p->ptr==p) break;
+static size_t get_index(size_t _size) {
+ register size_t idx=0;
+ if (_size) {
+ register size_t size=((_size-1)&(MEM_BLOCK_SIZE-1))>>__ind_shift();
+ while(size) { size>>=1; ++idx; }
}
- prev->ptr = block;
+ return idx;
+}
- if (END_OF_BLOCK(block)==p)
- { /* join right neighbor */
- block->ptr = p->ptr;
- block->size += p->size;
- }
- else
- block->ptr = p;
+/* small mem */
+static void __small_free(void*_ptr,size_t _size) __attribute__((regparm(2)));
- if (END_OF_BLOCK(prev)==block)
- { /* join left neighbor */
- prev->size += block->size;
- prev->ptr = block->ptr;
- }
+static void __small_free(void*_ptr,size_t _size) {
+ __alloc_t* ptr=BLOCK_START(_ptr);
+ size_t size=_size;
+ size_t idx=get_index(size);
+
+ memset(ptr,0,size); /* allways zero out small mem */
+
+ ptr->next=__small_mem[idx];
+ __small_mem[idx]=ptr;
}
-void free(void *ptr) __attribute__((weak,alias("__libc_free")));
-
-static void *alloc_get_mem(unsigned long size)
-{
- char *tmp;
- alloc_head *ah;
-
- size=PAGE_ALIGN(size);
-
- /* map free pages @ alloc_get_end */
- tmp=mmap(alloc_get_end, size, PROT_READ|PROT_WRITE,
- MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED, -1, 0);
- if (tmp==MAP_FAILED)
- {
- /* OK we can't map free pages @ alloc_get_end so try free position */
- tmp=mmap(0, size, PROT_READ|PROT_WRITE,
- MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
- if (tmp==MAP_FAILED)
- {
- errno = ENOMEM;
- return NULL; /* PANIC ! */
- }
- alloc_get_end=tmp;
- }
- alloc_get_end+=size;
+static void* __small_malloc(size_t _size) {
+ __alloc_t *ptr;
+ size_t size=_size;
+ size_t idx;
+
+ idx=get_index(size);
+ ptr=__small_mem[idx];
- /* make a header */
- ah=(alloc_head*)tmp;
- ah->magic1=ALLOC_MAGIC1;
- ah->magic2=ALLOC_MAGIC2;
- ah->ptr=ah;
- ah->size=size;
+ if (ptr==0) { /* no free blocks ? */
+ register int i,nr;
+ ptr=do_mmap(MEM_BLOCK_SIZE);
+ if (ptr==MAP_FAILED) return MAP_FAILED;
+
+ __small_mem[idx]=ptr;
+
+ nr=__SMALL_NR(size)-1;
+ for (i=0;i<nr;i++) {
+ ptr->next=(((void*)ptr)+size);
+ ptr=ptr->next;
+ }
+ ptr->next=0;
+
+ ptr=__small_mem[idx];
+ }
- /* link new free maped pages in freelist */
- __libc_free(START_DATA(tmp));
+ /* get a free block */
+ __small_mem[idx]=ptr->next;
+ ptr->next=0;
- return &base;
+ return ptr;
}
-void *__libc_malloc(size_t size)
-{
- alloc_head *p, *prev;
- size_t need;
+/* -- PUBLIC FUNCTIONS ---------------------------------------------------- */
- /* needed MEM_ALLOC_MIN */
- need=MIN_ALLOC(size);
-
- prev=&base;
- for (p=prev->ptr;;prev=p,p=p->ptr)
- {
- if (p->size>=need)
- {
- if (p->size==need)
- { /* fit PERFECT */
- prev->ptr=p->ptr; /* relink freelist */
- }
+static void _alloc_libc_free(void *ptr) {
+ register size_t size;
+ if (ptr) {
+ size=((__alloc_t*)BLOCK_START(ptr))->size;
+ if (size) {
+ if (size<=__MAX_SMALL_SIZE)
+ __small_free(ptr,size);
else
- {
- alloc_head *tmp=(alloc_head*)(((char*)p)+need);
- if ((p->size-need)<sizeof(alloc_head))
- { /* work around: if there is not enough space for freelist head.
- * this waste some bytes ( < sizeof(alloc_head) ) */
- need=p->size;
- prev->ptr=p->ptr; /* relink freelist */
- }
- else
- {
- prev->ptr=tmp;
- tmp->magic1=ALLOC_MAGIC1;
- tmp->magic2=ALLOC_MAGIC2;
- tmp->ptr=p->ptr;
- tmp->size=p->size-need; /* remaining size */
- }
+ munmap(BLOCK_START(ptr),size);
+ }
+ }
+}
+void __libc_free(void *ptr) __attribute__((alias("_alloc_libc_free")));
+void free(void *ptr) __attribute__((weak,alias("_alloc_libc_free")));
+void if_freenameindex(void* ptr) __attribute__((alias("free")));
- p->size=need; /* set size */
- }
- p->ptr=p; /* self-link */
+#ifdef WANT_MALLOC_ZERO
+static __alloc_t zeromem[2]={{0},{0}};
+#endif
- return (void*)START_DATA(p);
- }
- else if (p==&base)
- {
- if ((p=alloc_get_mem(need))==NULL) goto err_out;
- }
+static void* _alloc_libc_malloc(size_t size) {
+ __alloc_t* ptr;
+ size_t need;
+#ifdef WANT_MALLOC_ZERO
+ if (!size) return BLOCK_RET(zeromem);
+#else
+ if (!size) goto retzero;
+#endif
+ size+=sizeof(__alloc_t);
+ if (size<sizeof(__alloc_t)) goto retzero;
+ if (size<=__MAX_SMALL_SIZE) {
+ need=GET_SIZE(size);
+ ptr=__small_malloc(need);
+ }
+ else {
+ need=PAGE_ALIGN(size);
+ if (!need) ptr=MAP_FAILED; else ptr=do_mmap(need);
}
+ if (ptr==MAP_FAILED) goto err_out;
+ ptr->size=need;
+ return BLOCK_RET(ptr);
err_out:
- return NULL;
+ (*__errno_location())=ENOMEM;
+retzero:
+ return 0;
}
-void *malloc(size_t size) __attribute__((weak,alias("__libc_malloc")));
-
-void *calloc(size_t nmemb,size_t size)
-{
- size_t n=nmemb*size;
- void *tmp=malloc(n);
- if (tmp) memset(tmp,0,n);
- return tmp;
+void* __libc_malloc(size_t size) __attribute__((alias("_alloc_libc_malloc")));
+void* malloc(size_t size) __attribute__((weak,alias("_alloc_libc_malloc")));
+
+void *calloc(size_t nmemb, size_t _size) {
+ register size_t size=_size*nmemb;
+ if (nmemb && size/nmemb!=_size) {
+ (*__errno_location())=ENOMEM;
+ return 0;
+ }
+ return malloc(size);
}
-void *realloc(void *ptr,size_t size)
-{
- alloc_head *tmp=0,*tf=0;
- long need=0;
- long diff=0;
-
- if (ptr)
- {
- if (size)
- {
- tmp=START_BLOCK(ptr);
- need=MIN_ALLOC(size); /* only this size will survive */
- diff=tmp->size-need;
- if (diff<0)
- {
- if ((tf=malloc(size)))
- {
- memcpy(tf,ptr,tmp->size-sizeof(alloc_head));
- free(ptr);
- return tf;
+void* __libc_realloc(void* ptr, size_t _size);
+void* __libc_realloc(void* ptr, size_t _size) {
+ register size_t size=_size;
+ if (ptr) {
+ if (size) {
+ __alloc_t* tmp=BLOCK_START(ptr);
+ size+=sizeof(__alloc_t);
+ if (size<sizeof(__alloc_t)) goto retzero;
+ size=(size<=__MAX_SMALL_SIZE)?GET_SIZE(size):PAGE_ALIGN(size);
+ if (tmp->size!=size) {
+ if ((tmp->size<=__MAX_SMALL_SIZE)) {
+ void *new=_alloc_libc_malloc(_size);
+ if (new) {
+ register __alloc_t* foo=BLOCK_START(new);
+ size=foo->size;
+ if (size>tmp->size) size=tmp->size;
+ if (size) memcpy(new,ptr,size-sizeof(__alloc_t));
+ _alloc_libc_free(ptr);
+ }
+ ptr=new;
+ }
+ else {
+ register __alloc_t* foo;
+ size=PAGE_ALIGN(size);
+ foo=mremap(tmp,tmp->size,size,MREMAP_MAYMOVE);
+ if (foo==MAP_FAILED) {
+retzero:
+ (*__errno_location())=ENOMEM;
+ ptr=0;
+ }
+ else {
+ foo->size=size;
+ ptr=BLOCK_RET(foo);
+ }
}
- return NULL;
- }
- if (diff>=sizeof(alloc_head))
- {
- tmp->size=need;
- tf=END_OF_BLOCK(tmp);
- tf->magic1=ALLOC_MAGIC1;
- tf->magic2=ALLOC_MAGIC2;
- tf->ptr=tf;
- tf->size=diff;
- free(START_DATA(tf));
}
- return ptr;
}
- else
- free(ptr);
+ else { /* size==0 */
+ _alloc_libc_free(ptr);
+ }
}
- else if (size>0)
- return malloc(size);
- return NULL;
+ else { /* ptr==0 */
+ if (size) {
+ ptr=_alloc_libc_malloc(size);
+ }
+ }
+ return ptr;
}
+void* realloc(void* ptr, size_t size) __attribute__((weak,alias("__libc_realloc")));
+
diff --git a/mdk-stage1/dietlibc/lib/assert_fail.c b/mdk-stage1/dietlibc/lib/assert_fail.c
index 3d6ba65c1..35b8b186a 100644
--- a/mdk-stage1/dietlibc/lib/assert_fail.c
+++ b/mdk-stage1/dietlibc/lib/assert_fail.c
@@ -2,14 +2,15 @@
#include <string.h>
#include <unistd.h>
#include "dietwarning.h"
+#include <write12.h>
-extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
+void __assert_fail (const char *assertion, const char *file, unsigned int line, const char *function);
void __assert_fail (const char *assertion, const char *file, unsigned int line, const char *function)
{
- int alen=strlen(assertion);
- int flen=strlen(file);
- int fulen=strlen(function);
+ unsigned int alen=strlen(assertion);
+ unsigned int flen=strlen(file);
+ unsigned int fulen=function?strlen(function):0;
char *buf=(char*)alloca(alen+flen+fulen+50);
if (buf) {
char *tmp;
@@ -22,7 +23,7 @@ void __assert_fail (const char *assertion, const char *file, unsigned int line,
strcat(buf,"Assertion `");
strcat(buf,assertion);
strcat(buf,"' failed.\n");
- write(2,buf,strlen(buf));
+ __write2(buf);
}
abort();
}
diff --git a/mdk-stage1/dietlibc/lib/atexit.c b/mdk-stage1/dietlibc/lib/atexit.c
index 8204af06c..e0eef19c6 100644
--- a/mdk-stage1/dietlibc/lib/atexit.c
+++ b/mdk-stage1/dietlibc/lib/atexit.c
@@ -1,23 +1,31 @@
+#include <stdlib.h>
+
typedef void (*function)(void);
-static function __atexitlist[4];
+#define NUM_ATEXIT 32
+
+static function __atexitlist[NUM_ATEXIT];
+static int atexit_counter = 0;
int atexit(function t) {
- int i;
- for (i=0; i<4; i++)
- if (__atexitlist[i]==0) {
- __atexitlist[i]=t;
- return 0;
- }
+ if (atexit_counter<NUM_ATEXIT) {
+ __atexitlist[atexit_counter]=t;
+ ++atexit_counter;
+ return 0;
+ }
return -1;
}
extern void _exit(int code) __attribute__((noreturn));
+extern void __thread_doexit();
-void exit(int code) {
- if (__atexitlist[3]) __atexitlist[3]();
- if (__atexitlist[2]) __atexitlist[2]();
- if (__atexitlist[1]) __atexitlist[1]();
- if (__atexitlist[0]) __atexitlist[0]();
+void __libc_exit(int code);
+void __libc_exit(int code) {
+ register int i=atexit_counter;
+ __thread_doexit();
+ while(i) {
+ __atexitlist[--i]();
+ }
_exit(code);
}
+void exit(int code) __attribute__((alias("__libc_exit")));
diff --git a/mdk-stage1/dietlibc/lib/atoi.c b/mdk-stage1/dietlibc/lib/atoi.c
index fe952b8c4..10b618950 100644
--- a/mdk-stage1/dietlibc/lib/atoi.c
+++ b/mdk-stage1/dietlibc/lib/atoi.c
@@ -1,8 +1,19 @@
+#include <endian.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#if __WORDSIZE == 64
int atoi(const char* s) {
- int v=0;
+ long int v=0;
int sign=1;
- if (*s=='-') { sign=-1; ++s; } else if (*s=='+') ++s;
- while (*s && (*s>='0') && (*s<='9'))
- v=v*10+*s++-'0';
- return v*sign;
+ while ( *s == ' ' || (unsigned int)(*s - 9) < 5u) s++;
+ switch (*s) {
+ case '-': sign=-1;
+ case '+': ++s;
+ }
+ while ((unsigned int) (*s - '0') < 10u) {
+ v=v*10+*s-'0'; ++s;
+ }
+ return sign==-1?-v:v;
}
+#endif
diff --git a/mdk-stage1/dietlibc/lib/atol.c b/mdk-stage1/dietlibc/lib/atol.c
index 558a004b9..5961a1881 100644
--- a/mdk-stage1/dietlibc/lib/atol.c
+++ b/mdk-stage1/dietlibc/lib/atol.c
@@ -1,8 +1,23 @@
+#include <endian.h>
+#include <ctype.h>
+#include <stdlib.h>
+
long int atol(const char* s) {
long int v=0;
- int sign=1;
- if (*s=='-') { sign=-1; ++s; } else if (*s=='+') ++s;
- while (*s && (*s>='0') && (*s<='9'))
- v=v*10+*s++-'0';
- return v*sign;
+ int sign=0;
+ while ( *s == ' ' || (unsigned int)(*s - 9) < 5u) ++s;
+ switch (*s) {
+ case '-': sign=-1;
+ case '+': ++s;
+ }
+ while ((unsigned int) (*s - '0') < 10u) {
+ v=v*10+*s-'0'; ++s;
+ }
+ return sign?-v:v;
}
+
+#if __WORDSIZE == 64
+long long int atoll(const char* s) __attribute__((alias("atol")));
+#else
+int atoi(const char* s) __attribute__((alias("atol")));
+#endif
diff --git a/mdk-stage1/dietlibc/lib/atoll.c b/mdk-stage1/dietlibc/lib/atoll.c
new file mode 100644
index 000000000..7bf2b2fd6
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/atoll.c
@@ -0,0 +1,19 @@
+#include <endian.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#if __WORDSIZE != 64
+long long int atoll(const char* s) {
+ long long int v=0;
+ int sign=1;
+ while ( *s == ' ' || (unsigned int)(*s - 9) < 5u) ++s;
+ switch (*s) {
+ case '-': sign=-1;
+ case '+': ++s;
+ }
+ while ((unsigned int) (*s - '0') < 10u) {
+ v=v*10+*s-'0'; ++s;
+ }
+ return sign==-1?-v:v;
+}
+#endif
diff --git a/mdk-stage1/dietlibc/lib/bcd.c b/mdk-stage1/dietlibc/lib/bcd.c
new file mode 100644
index 000000000..1936b82f6
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/bcd.c
@@ -0,0 +1,185 @@
+
+static long double powers [] = {
+ 1.e+1, 1.e+2, 1.e+4, 1.e+8, 1.e+16, 1.e+32, 1.e+64, 1.e+128, 1.e+256
+};
+
+/*
+ * So, die ist zum Zerlegen von Gleitkommazahlen am besten geeignet.
+ *
+ * Die nichtnegative übergebende Gleitkommazahl number wird in einen
+ * Exponenten e und eine Mantisse m zerlegt mit:
+ *
+ * 1 <= m < 10
+ * number = m * 10^e
+ *
+ * Die Mantisse wird in precision Dezimalstellen zerlegt, die nach digits
+ * geschrieben werden. digits[0] ist die Vorkommastelle, digits [1 ...
+ * precision-1] die Nachkommastellen der Mantisse Zurückgeliefert wird der
+ * Exponent.
+ *
+ * Für precision ist ein Wert von 0 erlaubt, Sinn machen allerdings erst
+ * Werte ab 1.
+ */
+
+int __decompose_floatp ( long double number,
+ unsigned char* digits, unsigned int precision );
+
+int __decompose_floatp ( long double number,
+ unsigned char* digits, unsigned int precision )
+{
+ int ret = 0;
+ int i;
+ double tmp;
+
+ if ( number > 0.L ) {
+
+ // Exponent abtrennen
+ if ( number >= 10.L ) {
+ for ( i = sizeof(powers)/sizeof(*powers)-1; i >= 0; i--)
+ if ( number >= powers [i] ) {
+ number /= powers [i];
+ ret += 1 << i;
+ }
+ } else if ( number < 1.L )
+ for ( i = sizeof(powers)/sizeof(*powers)-1; i >= 0; i--)
+ if ( number * powers [i] < 10.L ) {
+ number *= powers [i];
+ ret -= 1 << i;
+ }
+
+ // Runden (ohne Geradezahlregel => Bug)
+ tmp = 5.;
+ {
+ unsigned int j;
+ for ( j = 0; j < precision; j++ )
+ tmp *= 0.1;
+ }
+
+ number += tmp;
+
+ // Dabei kann die Zahl in die nächste Dekade reinrutschen ...
+ if ( number >= 10.L ) {
+ number = 1.L;
+ ret++;
+ }
+ }
+
+ // Mantisse in ASCII konvertieren
+ while ( precision-- ) {
+ i = (int) number;
+ number = (number - i) * 10.L;
+ *digits++ = '0' + i;
+ }
+
+ // Exponent zurück
+ return ret;
+}
+
+
+/*
+ * So, die ist zum Zerlegen von Festkommazahlen am besten geeignet.
+ *
+ * Die nichtnegative übergebende Festkomma wird in einen Integeranteil und
+ * einen Bruchanteil zerlegt.
+ *
+ * Der Bruchanteil wird in digits_frac[0...precision_frac-1] gespeichert,
+ * falls precision_frac != 0 ist.
+ *
+ * Der Integeranteil wird ab digits_int + precision_int - 1 rückwrts
+ * geschrieben. Zurückgeliefert wird ein Zeiger auf das erste Zeichen, das
+ * bei der Konvertierung != '0' ist (Ausnahme ist die 0.0 selbst). Zeichen
+ * zwischen digits_int und diesem Zeiger (exklusive des Zeichens unter dem
+ * Zeiger) sind unbestimmt. Wünscht man dort Nullen oder Leerzeichen,
+ * sollte man mittels memset() dieses vorher initialsieren.
+ */
+
+char* __decompose_fixp ( long double number,
+ unsigned char* digits_int , unsigned int precision_int,
+ unsigned char* digits_frac, unsigned int precision_frac );
+
+char* __decompose_fixp ( long double number,
+ unsigned char* digits_int , unsigned int precision_int,
+ unsigned char* digits_frac, unsigned int precision_frac )
+{
+ long long int integer;
+ double tmp;
+ int i;
+
+ // Runden (ohne Geradezahlregel => Bug)
+ tmp = 0.5;
+ {
+ unsigned int j;
+ for ( j = 0; j < precision_frac; j++ )
+ tmp *= 0.1;
+ }
+
+ number += tmp;
+
+ integer = number;
+ number -= integer;
+
+ // Nachkommastellen
+ while ( precision_frac-- ) {
+ number *= 10.L;
+ i = (int) number;
+ number -= i;
+ *digits_frac++
+ = '0' + i;
+ }
+
+ // Vorkommastellen
+ while ( precision_int ) {
+ i = (int) (integer % 10);
+ integer /= 10;
+ digits_int [--precision_int]
+ = '0' + i;
+ if ( integer == 0 )
+ break;
+ }
+
+ return digits_int + precision_int;
+}
+
+
+#if 0
+
+#include <stdio.h>
+#include <math.h>
+
+long double test [] = {
+ 1, M_PI, 123, 123456789, 12345678901234567, 1e300, 0.00123456789, 1.234567890123456e-300, 0
+};
+
+int main ( void )
+{
+ int i;
+ int j;
+ int k;
+ char buff1 [32];
+ char buff2 [32];
+ char* retp;
+ int ret;
+
+ for ( i = 0; i < sizeof(test)/sizeof(*test); i++ ) {
+ printf ("\n*** %30.20Lf ***\n\n", test[i] );
+
+ for ( j = 0; j <= 20; j++ ) {
+ memset ( buff1, 0, sizeof(buff1) );
+ ret = __decompose_floatp ( test[i], buff1, j );
+ printf ( "floatp(%2u) = <%sE%+d>\n", j, buff1, ret );
+ }
+ for ( j = 0; j <= 20; j++ ) {
+ for ( k = 0; k <= 20; k++ ) {
+ memset ( buff1, 0, sizeof(buff1) );
+ memset ( buff2, 0, sizeof(buff2) );
+ retp = __decompose_fixp ( test[i], buff1, j, buff2, k );
+ printf ( "fixp(%2u,%2u) = <%s.%s>\n", j, k, retp, buff2 );
+ }
+ }
+
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/mdk-stage1/dietlibc/lib/bind.c b/mdk-stage1/dietlibc/lib/bind.c
index ec1c93e1b..dae80f491 100644
--- a/mdk-stage1/dietlibc/lib/bind.c
+++ b/mdk-stage1/dietlibc/lib/bind.c
@@ -1,12 +1,11 @@
-#include <linux/net.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
-int bind(int a, void * b, int c) {
-#ifdef __i386__
- return socketcall(SYS_BIND, (long*)&a);
-#else
+int __libc_bind(int a, void * b, int c);
+int __libc_bind(int a, void * b, int c) {
unsigned long args[] = { a, (long) b, c };
return socketcall(SYS_BIND, args);
-#endif
}
+
+int bind(int a, void * b, int c) __attribute__((weak,alias("__libc_bind")));
diff --git a/mdk-stage1/dietlibc/lib/binshstr.c b/mdk-stage1/dietlibc/lib/binshstr.c
new file mode 100644
index 000000000..814297e3d
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/binshstr.c
@@ -0,0 +1,5 @@
+#include "binshstr.h"
+
+const char __binsh [] = "/bin/sh";
+
+/* end of binshstr.c */
diff --git a/mdk-stage1/dietlibc/lib/bsearch.c b/mdk-stage1/dietlibc/lib/bsearch.c
index d2f5c74b2..14605f1f6 100644
--- a/mdk-stage1/dietlibc/lib/bsearch.c
+++ b/mdk-stage1/dietlibc/lib/bsearch.c
@@ -1,20 +1,20 @@
+#include <assert.h>
#include <stdlib.h>
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) {
- const char *v, *r;
- int res;
- r=base+(nmemb-1)*size;
- do {
- register int num=nmemb/2;
- v=base+num*size;
- if ((res=compar(key,v))<0) {
- r=v-size;
- nmemb=num;
- } else {
- if (res==0) return (void*)v;
- base=v+size;
- nmemb-=num;
- }
- } while ((char*)base<=r);
+ size_t m;
+ while (nmemb) {
+ int tmp;
+ void *p;
+ m=nmemb/2;
+ p=(void *) (((const char *) base) + (m * size));
+ if ((tmp=(*compar)(key,p))<0) {
+ nmemb=m;
+ } else if (tmp>0) {
+ base=p+size;
+ nmemb-=m+1;
+ } else
+ return p;
+ }
return 0;
}
diff --git a/mdk-stage1/dietlibc/lib/cfgetospeed.c b/mdk-stage1/dietlibc/lib/cfgetospeed.c
new file mode 100644
index 000000000..c330352b2
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/cfgetospeed.c
@@ -0,0 +1,8 @@
+#include <termios.h>
+#include <sys/types.h>
+
+speed_t cfgetospeed(struct termios *termios_p) {
+ return ((termios_p->c_cflag & (CBAUD|CBAUDEX)));
+}
+
+speed_t cfgetispeed(struct termios *termios_p) __attribute__((weak,alias("cfgetospeed")));
diff --git a/mdk-stage1/dietlibc/lib/cfmakeraw.c b/mdk-stage1/dietlibc/lib/cfmakeraw.c
index 7f6df9913..e33c783c9 100644
--- a/mdk-stage1/dietlibc/lib/cfmakeraw.c
+++ b/mdk-stage1/dietlibc/lib/cfmakeraw.c
@@ -1,8 +1,7 @@
#include <termios.h>
#include <sys/ioctl.h>
-void cfmakeraw(struct termios *t)
-{
+void cfmakeraw(struct termios *t) {
t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
t->c_oflag &= ~OPOST;
t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
diff --git a/mdk-stage1/dietlibc/lib/cfsetispeed.c b/mdk-stage1/dietlibc/lib/cfsetispeed.c
new file mode 100644
index 000000000..ab0333853
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/cfsetispeed.c
@@ -0,0 +1,22 @@
+#include <termios.h>
+#include <errno.h>
+#include "dietfeatures.h"
+
+#define IBAUD0 020000000000
+
+int cfsetispeed(struct termios *termios_p, speed_t speed)
+{
+ if ((speed & (speed_t)~CBAUD) != 0 && (speed < B57600 || speed > B460800)) {
+ errno=EINVAL;
+ return -1;
+ }
+ if (speed == 0)
+ termios_p->c_iflag |= IBAUD0;
+ else {
+ termios_p->c_iflag &= ~IBAUD0;
+ termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
+ termios_p->c_cflag |= speed;
+ }
+ return 0;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/cfsetospeed.c b/mdk-stage1/dietlibc/lib/cfsetospeed.c
new file mode 100644
index 000000000..d1aee3595
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/cfsetospeed.c
@@ -0,0 +1,14 @@
+#include <termios.h>
+#include <errno.h>
+#include "dietfeatures.h"
+
+int cfsetospeed(struct termios *termios_p, speed_t speed) {
+ if ((speed & (speed_t)~CBAUD) != 0 && (speed < B57600 || speed > B460800)) {
+ errno=EINVAL;
+ return -1;
+ }
+ termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
+ termios_p->c_cflag |= speed;
+ return 0;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/closedir.c b/mdk-stage1/dietlibc/lib/closedir.c
index e73025eb1..3aade81b3 100644
--- a/mdk-stage1/dietlibc/lib/closedir.c
+++ b/mdk-stage1/dietlibc/lib/closedir.c
@@ -1,10 +1,11 @@
#include "dietdirent.h"
+#include <sys/mman.h>
#include <unistd.h>
#include <dirent.h>
#include <stdlib.h>
int closedir (DIR* d) {
int res=close(d->fd);
- free(d);
+ munmap (d, PAGE_SIZE);
return res;
}
diff --git a/mdk-stage1/dietlibc/lib/connect.c b/mdk-stage1/dietlibc/lib/connect.c
index 01fd61a6c..642303ef3 100644
--- a/mdk-stage1/dietlibc/lib/connect.c
+++ b/mdk-stage1/dietlibc/lib/connect.c
@@ -1,14 +1,11 @@
-#include <linux/net.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
+int __libc_connect(int a, void * b, int c);
int __libc_connect(int a, void * b, int c) {
-#ifdef __i386__
- return socketcall(SYS_CONNECT, (long*)&a);
-#else
unsigned long args[] = { a, (long) b, c };
return socketcall(SYS_CONNECT, args);
-#endif
}
int connect(int a, void * b, int c) __attribute__((weak,alias("__libc_connect")));
diff --git a/mdk-stage1/dietlibc/lib/creat.c b/mdk-stage1/dietlibc/lib/creat.c
index 82145b515..41d8236aa 100644
--- a/mdk-stage1/dietlibc/lib/creat.c
+++ b/mdk-stage1/dietlibc/lib/creat.c
@@ -1,5 +1,7 @@
#include <fcntl.h>
-int creat(const char *file,mode_t mode) {
+int __libc_creat(const char *file,mode_t mode);
+int __libc_creat(const char *file,mode_t mode) {
return open(file,O_WRONLY|O_CREAT|O_TRUNC,mode);
}
+int creat(const char *file,mode_t mode) __attribute__((weak,alias("__libc_creat")));
diff --git a/mdk-stage1/dietlibc/lib/errlist.c b/mdk-stage1/dietlibc/lib/errlist.c
deleted file mode 100644
index d0e712190..000000000
--- a/mdk-stage1/dietlibc/lib/errlist.c
+++ /dev/null
@@ -1,132 +0,0 @@
-
-const char *const sys_errlist[] = {
- "Success", /* 0 */
- "Operation not permitted", /* EPERM */
- "No such file or directory", /* ENOENT */
- "No such process", /* ESRCH */
- "Interrupted system call", /* EINTR */
- "I/O error", /* EIO */
- "No such device or address", /* ENXIO */
- "Arg list too long", /* E2BIG */
- "Exec format error", /* ENOEXEC */
- "Bad file number", /* EBADF */
- "No child processes", /* ECHILD */
- "Try again", /* EAGAIN */
- "Out of memory", /* ENOMEM */
- "Permission denied", /* EACCES */
- "Bad address", /* EFAULT */
- "Block device required", /* ENOTBLK */
- "Device or resource busy", /* EBUSY */
- "File exists", /* EEXIST */
- "Cross-device link", /* EXDEV */
- "No such device", /* ENODEV */
- "Not a directory", /* ENOTDIR */
- "Is a directory", /* EISDIR */
- "Invalid argument", /* EINVAL */
- "File table overflow", /* ENFILE */
- "Too many open files", /* EMFILE */
- "Not a typewriter", /* ENOTTY */
- "Text file busy", /* ETXTBSY */
- "File too large", /* EFBIG */
- "No space left on device", /* ENOSPC */
- "Illegal seek", /* ESPIPE */
- "Read-only file system", /* EROFS */
- "Too many links", /* EMLINK */
- "Broken pipe", /* EPIPE */
- "Math argument out of domain of func", /* EDOM */
- "Math result not representable", /* ERANGE */
- "Resource deadlock would occur", /* EDEADLK */
- "File name too long", /* ENAMETOOLONG */
- "No record locks available", /* ENOLCK */
- "Function not implemented", /* ENOSYS */
- "Directory not empty", /* ENOTEMPTY */
- "Too many symbolic links encountered", /* ELOOP */
- "Operation would block", /* EWOULDBLOCK */
- "No message of desired type", /* ENOMSG */
- "Identifier removed", /* EIDRM */
- "Channel number out of range", /* ECHRNG */
- "Level 2 not synchronized", /* EL2NSYNC */
- "Level 3 halted", /* EL3HLT */
- "Level 3 reset", /* EL3RST */
- "Link number out of range", /* ELNRNG */
- "Protocol driver not attached", /* EUNATCH */
- "No CSI structure available", /* ENOCSI */
- "Level 2 halted", /* EL2HLT */
- "Invalid exchange", /* EBADE */
- "Invalid request descriptor", /* EBADR */
- "Exchange full", /* EXFULL */
- "No anode", /* ENOANO */
- "Invalid request code", /* EBADRQC */
- "Invalid slot", /* EBADSLT */
- "File locking deadlock error", /* EDEADLOCK */
- "Bad font file format", /* EBFONT */
- "Device not a stream", /* ENOSTR */
- "No data available", /* ENODATA */
- "Timer expired", /* ETIME */
- "Out of streams resources", /* ENOSR */
- "Machine is not on the network", /* ENONET */
- "Package not installed", /* ENOPKG */
- "Object is remote", /* EREMOTE */
- "Link has been severed", /* ENOLINK */
- "Advertise error", /* EADV */
- "Srmount error", /* ESRMNT */
- "Communication error on send", /* ECOMM */
- "Protocol error", /* EPROTO */
- "Multihop attempted", /* EMULTIHOP */
- "RFS specific error", /* EDOTDOT */
- "Not a data message", /* EBADMSG */
- "Value too large for defined data type", /* EOVERFLOW */
- "Name not unique on network", /* ENOTUNIQ */
- "File descriptor in bad state", /* EBADFD */
- "Remote address changed", /* EREMCHG */
- "Can not access a needed shared library", /* ELIBACC */
- "Accessing a corrupted shared library", /* ELIBBAD */
- ".lib section in a.out corrupted", /* ELIBSCN */
- "Attempting to link in too many shared libraries", /* ELIBMAX */
- "Cannot exec a shared library directly", /* ELIBEXEC */
- "Illegal byte sequence", /* EILSEQ */
- "Interrupted system call should be restarted", /* ERESTART */
- "Streams pipe error", /* ESTRPIPE */
- "Too many users", /* EUSERS */
- "Socket operation on non-socket", /* ENOTSOCK */
- "Destination address required", /* EDESTADDRREQ */
- "Message too long", /* EMSGSIZE */
- "Protocol wrong type for socket", /* EPROTOTYPE */
- "Protocol not available", /* ENOPROTOOPT */
- "Protocol not supported", /* EPROTONOSUPPORT */
- "Socket type not supported", /* ESOCKTNOSUPPORT */
- "Operation not supported on transport endpoint", /* EOPNOTSUPP */
- "Protocol family not supported", /* EPFNOSUPPORT */
- "Address family not supported by protocol", /* EAFNOSUPPORT */
- "Address already in use", /* EADDRINUSE */
- "Cannot assign requested address", /* EADDRNOTAVAIL */
- "Network is down", /* ENETDOWN */
- "Network is unreachable", /* ENETUNREACH */
- "Network dropped connection because of reset", /* ENETRESET */
- "Software caused connection abort", /* ECONNABORTED */
- "Connection reset by peer", /* ECONNRESET */
- "No buffer space available", /* ENOBUFS */
- "Transport endpoint is already connected", /* EISCONN */
- "Transport endpoint is not connected", /* ENOTCONN */
- "Cannot send after transport endpoint shutdown", /* ESHUTDOWN */
- "Too many references: cannot splice", /* ETOOMANYREFS */
- "Connection timed out", /* ETIMEDOUT */
- "Connection refused", /* ECONNREFUSED */
- "Host is down", /* EHOSTDOWN */
- "No route to host", /* EHOSTUNREACH */
- "Operation already in progress", /* EALREADY */
- "Operation now in progress", /* EINPROGRESS */
- "Stale NFS file handle", /* ESTALE */
- "Structure needs cleaning", /* EUCLEAN */
- "Not a XENIX named type file", /* ENOTNAM */
- "No XENIX semaphores available", /* ENAVAIL */
- "Is a named type file", /* EISNAM */
- "Remote I/O error", /* EREMOTEIO */
- "Quota exceeded", /* EDQUOT */
- "No medium found", /* ENOMEDIUM */
- "Wrong medium type", /* EMEDIUMTYPE */
- 0
-};
-
-
-const int sys_nerr = ((sizeof (sys_errlist))/(sizeof(char *))-1);
diff --git a/mdk-stage1/dietlibc/lib/errlistu.c b/mdk-stage1/dietlibc/lib/errlistu.c
new file mode 100644
index 000000000..15e38807b
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/errlistu.c
@@ -0,0 +1,6 @@
+/*
+ * used by perror() and strerror()
+ */
+
+const char __sys_err_unknown [] = "[unknown error]";
+
diff --git a/mdk-stage1/dietlibc/lib/errno_location.c b/mdk-stage1/dietlibc/lib/errno_location.c
index 286f833c9..298c9c3cf 100644
--- a/mdk-stage1/dietlibc/lib/errno_location.c
+++ b/mdk-stage1/dietlibc/lib/errno_location.c
@@ -1,5 +1,5 @@
extern int errno;
+int *__errno_location(void) __attribute__((weak));
int *__errno_location() { return &errno; }
-int *errno_location() __attribute__((weak,alias("__errno_location")));
diff --git a/mdk-stage1/dietlibc/lib/exec_lib.c b/mdk-stage1/dietlibc/lib/exec_lib.c
index 3129224a0..575c03d6d 100644
--- a/mdk-stage1/dietlibc/lib/exec_lib.c
+++ b/mdk-stage1/dietlibc/lib/exec_lib.c
@@ -3,18 +3,19 @@
extern char **environ;
+int __exec_shell(const char *file, char *const argv[]);
int __exec_shell(const char *file, char *const argv[]) {
int i;
for (i = 0; argv[i]; i++);
{
- char *shell_argv[i + 1];
+ const char *shell_argv[i + 1];
shell_argv[0] = _PATH_BSHELL;
- shell_argv[1] = (char *) file;
+ shell_argv[1] = file;
for (; i > 1; i--)
shell_argv[i] = argv[i - 1];
- return execve(_PATH_BSHELL, shell_argv, environ);
+ return execve(_PATH_BSHELL, (char*const*)shell_argv, environ);
}
}
diff --git a/mdk-stage1/dietlibc/lib/execl.c b/mdk-stage1/dietlibc/lib/execl.c
index 71459e71f..360bd3908 100644
--- a/mdk-stage1/dietlibc/lib/execl.c
+++ b/mdk-stage1/dietlibc/lib/execl.c
@@ -2,6 +2,7 @@
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
+#include "dietfeatures.h"
int execl( const char *path,...) {
va_list ap;
@@ -19,6 +20,6 @@ int execl( const char *path,...) {
va_end (ap);
return execve(path,argv,environ);
}
- __set_errno(ENOMEM);
+ errno=ENOMEM;
return -1;
}
diff --git a/mdk-stage1/dietlibc/lib/execle.c b/mdk-stage1/dietlibc/lib/execle.c
new file mode 100644
index 000000000..6d05c48a0
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/execle.c
@@ -0,0 +1,26 @@
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+#include "dietfeatures.h"
+
+int execle( const char *path,...) {
+ va_list ap;
+ int n,i;
+ char **argv,*tmp, **env;
+ va_start(ap, path);
+ n=1;
+ while ((tmp=va_arg(ap,char *)))
+ ++n;
+ va_end (ap);
+ if ((argv=(char **)alloca(n*sizeof(char*)))) {
+ va_start(ap, path);
+ for (i=0; i<n; ++i)
+ argv[i]=va_arg(ap,char *);
+ env=va_arg(ap, char **);
+ va_end (ap);
+ return execve(path,argv,env);
+ }
+ errno=ENOMEM;
+ return -1;
+}
diff --git a/mdk-stage1/dietlibc/lib/execlp.c b/mdk-stage1/dietlibc/lib/execlp.c
index 3aea1e960..27dc0bb95 100644
--- a/mdk-stage1/dietlibc/lib/execlp.c
+++ b/mdk-stage1/dietlibc/lib/execlp.c
@@ -2,7 +2,7 @@
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
-#include "dietstdarg.h"
+#include "dietfeatures.h"
int execlp(const char* file, const char *arg,...) {
va_list ap,bak;
@@ -15,12 +15,12 @@ int execlp(const char* file, const char *arg,...) {
++n;
va_end (ap);
if ((argv=(char **)alloca(n*sizeof(char*)))) {
- argv[0]=arg;
+ argv[0]=(char*)arg;
for (i=0; i<n; ++i)
argv[i+1]=va_arg(bak,char *);
va_end (bak);
return execvp(file,argv);
}
- __set_errno(ENOMEM);
+ errno=ENOMEM;
return -1;
}
diff --git a/mdk-stage1/dietlibc/lib/execv.c b/mdk-stage1/dietlibc/lib/execv.c
index efd760253..d7acfa29f 100644
--- a/mdk-stage1/dietlibc/lib/execv.c
+++ b/mdk-stage1/dietlibc/lib/execv.c
@@ -4,10 +4,12 @@
#include <unistd.h>
#include <errno.h>
#include "exec_lib.h"
+#include "dietfeatures.h"
int execv(const char *file, char *const argv[]) {
if (execve(file,argv,environ)==-1) {
- if (errno==ENOEXEC) __exec_shell(file,argv);
+ if (errno==ENOEXEC)
+ __exec_shell(file,argv);
}
return -1;
}
diff --git a/mdk-stage1/dietlibc/lib/execvp.c b/mdk-stage1/dietlibc/lib/execvp.c
index 20521d69f..72447af7a 100644
--- a/mdk-stage1/dietlibc/lib/execvp.c
+++ b/mdk-stage1/dietlibc/lib/execvp.c
@@ -4,31 +4,40 @@
#include <unistd.h>
#include <errno.h>
#include "exec_lib.h"
+#include "dietfeatures.h"
int execvp(const char *file, char *const argv[]) {
- char *path=getenv("PATH");
+ const char *path=getenv("PATH");
char *cur,*next;
char buf[PATH_MAX];
if (strchr((char*)file,'/')) {
if (execve(file,argv,environ)==-1) {
- if (errno==ENOEXEC) __exec_shell(file,argv);
+ if (errno==ENOEXEC)
+ __exec_shell(file,argv);
return -1;
}
}
if (!path) path=_PATH_DEFPATH;
- for (cur=path; cur; cur=next) {
+ for (cur=(char*)path; cur; cur=next) {
next=strchr(cur,':');
if (!next)
next=cur+strlen(cur);
if (next==cur) {
buf[0]='.';
cur--;
- } else
- memmove(buf,cur,next-cur);
+ } else {
+ if (next-cur>=PATH_MAX-3) { error: errno=EINVAL; return -1; }
+ memmove(buf,cur,(size_t)(next-cur));
+ }
buf[next-cur]='/';
- memmove(&buf[next-cur+1],file,strlen(file)+1);
+ {
+ int len=strlen(file);
+ if (len+(next-cur)>=PATH_MAX-2) goto error;
+ memmove(&buf[next-cur+1],file,strlen(file)+1);
+ }
if (execve(buf,argv,environ)==-1) {
- if (errno==ENOEXEC) return __exec_shell(buf,argv);
+ if (errno==ENOEXEC)
+ return __exec_shell(buf,argv);
if ((errno!=EACCES) && (errno!=ENOENT)) return -1;
}
if (*next==0) break;
diff --git a/mdk-stage1/dietlibc/lib/ftw.c b/mdk-stage1/dietlibc/lib/ftw.c
index a3c04af9a..af13a7f86 100644
--- a/mdk-stage1/dietlibc/lib/ftw.c
+++ b/mdk-stage1/dietlibc/lib/ftw.c
@@ -1,52 +1,47 @@
-#include <linux/stat.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <limits.h>
#include <ftw.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
+#include "dietdirent.h"
-int ftw(const char *dir,int (*fn)(const char *file, const struct stat *sb, int flag), int depth) {
- char *cwd;
- int cwdlen;
- DIR *d;
- struct dirent *de;
+int ftw(const char*dir,int(*f)(const char*file,const struct stat*sb,int flag),int dpth){
+ char* cd;
+ size_t cdl;
+ DIR* d;
+ struct dirent* de;
struct stat sb;
- if (chdir(dir)) return -1;
- cwd=alloca(PATH_MAX+1);
- if (!getcwd(cwd,PATH_MAX)) return -1;
- cwd[PATH_MAX]=0;
- cwdlen=strlen(cwd);
-/* write(1,"ftw in ",7); puts(cwd); */
- if (!(d=opendir("."))) return -1;
- while ((de=readdir(d))) {
- int res;
- int flag;
- int nlen;
- char *filename;
- if (de->d_name[0]=='.' &&
- (de->d_name[1]==0 ||
- (de->d_name[1]=='.' && de->d_name[2]==0))) continue;
- nlen=strlen(de->d_name);
- filename=alloca(nlen+cwdlen+3);
- memmove(filename,cwd,cwdlen);
- filename[cwdlen]='/';
- memmove(filename+cwdlen+1,de->d_name,nlen+1);
- if (!lstat(de->d_name,&sb)) {
- if (S_ISLNK(sb.st_mode)) flag=FTW_SL; else
- if (S_ISDIR(sb.st_mode)) flag=FTW_D; else
- flag=FTW_F;
- } else
- flag=FTW_NS;
- res=fn(filename,&sb,flag);
- if (res) return res;
- if (flag==FTW_D && depth>0) {
- res=ftw(filename,fn,depth-1);
- chdir(dir);
- if (res) return res;
+ int r;
+ unsigned int oldlen=0;
+ char* filename; /* the warning gcc issues here is bogus */
+ if(chdir(dir))return-1;
+ cd=alloca(PATH_MAX+1);
+ if(!getcwd(cd,PATH_MAX))return-1;
+ cd[PATH_MAX]='\0';
+ cdl=strlen(cd);
+ if(!(d=opendir(".")))return-1;
+ while((de=readdir(d))){
+ int flg;
+ size_t nl;
+ if(de->d_name[0]=='.'){if(!de->d_name[1])continue;if(de->d_name[1]=='.'&&!de->d_name[2])continue;}
+ nl=strlen(de->d_name);
+ if (nl+cdl+2>oldlen)
+ filename=alloca(oldlen=nl+cdl+2);
+ memmove(filename,cd,cdl);
+ filename[cdl]='/';
+ memmove(filename+cdl+1,de->d_name,nl+1);
+ if(!lstat(de->d_name,&sb)){
+ if(S_ISLNK(sb.st_mode))flg=FTW_SL;else if(S_ISDIR(sb.st_mode))flg=FTW_D;else flg=FTW_F;
+ }else flg=FTW_NS;
+ r=f(filename,&sb,flg);
+ if(r){closedir(d);return r;}
+ if(flg==FTW_D&&dpth){
+ r=ftw(filename,f,dpth-1);
+ fchdir(d->fd);
+ if (r){closedir(d);return r;}
}
-/* puts(de->d_name); */
}
- closedir(d);
- return 0;
+ return closedir(d);
}
diff --git a/mdk-stage1/dietlibc/lib/getdomainname.c b/mdk-stage1/dietlibc/lib/getdomainname.c
index 2554fe4c3..75486b010 100644
--- a/mdk-stage1/dietlibc/lib/getdomainname.c
+++ b/mdk-stage1/dietlibc/lib/getdomainname.c
@@ -2,12 +2,13 @@
#include <sys/types.h>
#include <sys/utsname.h>
+#include <unistd.h>
int getdomainname(char *name,size_t len) {
struct utsname u;
int res=uname(&u);
if (res==0) {
- int i;
+ size_t i;
if (len>=_UTSNAME_DOMAIN_LENGTH)
len=_UTSNAME_DOMAIN_LENGTH;
for (i=0; i<len; i++)
diff --git a/mdk-stage1/dietlibc/lib/getenv.c b/mdk-stage1/dietlibc/lib/getenv.c
index fc37e9927..5b529c17f 100644
--- a/mdk-stage1/dietlibc/lib/getenv.c
+++ b/mdk-stage1/dietlibc/lib/getenv.c
@@ -1,7 +1,6 @@
+#include <stdlib.h>
#include <string.h>
-extern char **environ;
-
extern char *getenv(const char *s)
{
int i;
diff --git a/mdk-stage1/dietlibc/lib/gethostname.c b/mdk-stage1/dietlibc/lib/gethostname.c
index ccc0fbc8e..c3d2f3d5e 100644
--- a/mdk-stage1/dietlibc/lib/gethostname.c
+++ b/mdk-stage1/dietlibc/lib/gethostname.c
@@ -2,12 +2,13 @@
#include <sys/types.h>
#include <sys/utsname.h>
+#include <unistd.h>
int gethostname(char *name,size_t len) {
struct utsname u;
int res=uname(&u);
if (res==0) {
- int i;
+ size_t i;
if (len>=_UTSNAME_NODENAME_LENGTH)
len=_UTSNAME_NODENAME_LENGTH;
for (i=0; i<len; i++)
diff --git a/mdk-stage1/dietlibc/lib/getopt.c b/mdk-stage1/dietlibc/lib/getopt.c
index 93097122f..aa1988f8d 100644
--- a/mdk-stage1/dietlibc/lib/getopt.c
+++ b/mdk-stage1/dietlibc/lib/getopt.c
@@ -1,118 +1,63 @@
-#include "getopt.h"
#include <string.h>
-
-/*
- * by Olaf Dreesen
- */
-
-int opterr;
-
-int optind=1;
-char *optarg;
-
-static int opt_unknown=1,opt_unknown_len;
-
-static int getopt_check(int c,char*o,int ol)
-{
- int i;
- if (c==':') return 2;
- for (i=0;i<ol;i++)
- {
- if (o[i]==c)
- {
- if (o[i+1]==':') return 1;
- return 0;
+#include <getopt.h>
+
+static void getopterror(int which) {
+ static char error1[]="Unknown option `-x'.\n";
+ static char error2[]="Missing argument for `-x'.\n";
+ if (opterr) {
+ if (which) {
+ error2[23]=optopt;
+ write(2,error2,28);
+ } else {
+ error1[17]=optopt;
+ write(2,error1,22);
}
}
- return 2;
}
-static void getopt_sort(char*v[],int oi)
-{
- int i;
- char *tmp, *tmp2=0;
-
- if (opt_unknown_len)
- {
- tmp=v[optind-(1+oi)];
- if (oi) tmp2=v[optind-1];
-
- for (i=opt_unknown+opt_unknown_len;i>opt_unknown;i--) v[i+oi]=v[i-1];
-
- v[opt_unknown++]=tmp;
- if (oi) v[opt_unknown++]=tmp2;
+int getopt(int argc, char * const argv[], const char *optstring) {
+ static int lastidx=0,lastofs=0;
+ char *tmp;
+ if (optind==0) optind=1; /* whoever started setting optind to 0 should be shot */
+again:
+ if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0)
+ return -1;
+ if (argv[optind][1]=='-' && argv[optind][2]==0) {
+ ++optind;
+ return -1;
}
-}
-
-static char* nextchar;
-int getopt(int c,char*v[],char*o)
-{
- int ol=strlen(o);
- int ret=0;
- int oi=0;
-
- optarg=0;
-
- while (nextchar || (optind<c))
- {
- if (nextchar)
- {
- if ((ret=(*(++nextchar))))
- {
- switch (getopt_check(ret,o,ol))
- {
- case 1:
- if (*(++nextchar))
- optarg=nextchar;
- else
- {
- if (optind<c)
- {
- oi=1;
- optarg=v[optind++];
- }
- else
- ret='?';
- }
- nextchar=0;
- case 0:
- if (!nextchar)
- getopt_sort(v,oi);
- else
- if (!(*(nextchar+1)))
- getopt_sort(v,oi);
- return ret;
- break;
- default:
- return '?';
- break;
- }
- }
- else
- nextchar=0;
+ if (lastidx!=optind) {
+ lastidx=optind; lastofs=0;
+ }
+ optopt=argv[optind][lastofs+1];
+ if ((tmp=strchr(optstring,optopt))) {
+ if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */
+ ++optind;
+ goto again;
}
- else
- {
- if ((v[optind][0]=='-')&&((v[optind][1]!=0)))
- {
- if ((v[optind][1]=='-')&&(v[optind][2]==0))
- {
- getopt_sort(v,oi);
- optind=opt_unknown;
- return -1;
- }
- else
- {
- nextchar=v[optind];
- }
+ if (tmp[1]==':') { /* argument expected */
+ if (tmp[2]==':' || argv[optind][lastofs+2]) { /* "-foo", return "oo" as optarg */
+ if (!*(optarg=argv[optind]+lastofs+2)) optarg=0;
+ goto found;
}
- else
- {
- ++opt_unknown_len;
+ optarg=argv[optind+1];
+ if (!optarg) { /* missing argument */
+ ++optind;
+ if (*optstring==':') return ':';
+ getopterror(1);
+ return ':';
}
++optind;
+ } else {
+ ++lastofs;
+ return optopt;
}
+found:
+ ++optind;
+ return optopt;
+ } else { /* not found */
+ getopterror(0);
+ ++optind;
+ return '?';
}
- optind=opt_unknown;
- return -1;
}
diff --git a/mdk-stage1/dietlibc/lib/getpeername.c b/mdk-stage1/dietlibc/lib/getpeername.c
index 8adcddf55..c806c720d 100644
--- a/mdk-stage1/dietlibc/lib/getpeername.c
+++ b/mdk-stage1/dietlibc/lib/getpeername.c
@@ -1,13 +1,12 @@
-#include <linux/net.h>
+#include <linuxnet.h>
+#include <sys/socket.h>
extern int socketcall(int callno,long* args);
-int getpeername(int a, void * b, int c) {
-#ifdef __i386__
- return socketcall(SYS_GETPEERNAME, (long*)&a);
-#else
- unsigned long args[] = { a, (long) b, c };
+int __libc_getpeername(int a, void * b, int *c);
+int __libc_getpeername(int a, void * b, int *c) {
+ unsigned long args[] = { a, (long) b, (long) c };
return socketcall(SYS_GETPEERNAME, args);
-#endif
}
+int getpeername(int a, struct sockaddr* b, socklen_t *c) __attribute__((weak,alias("__libc_getpeername")));
diff --git a/mdk-stage1/dietlibc/lib/getservent.c b/mdk-stage1/dietlibc/lib/getservent.c
deleted file mode 100644
index bf25d046b..000000000
--- a/mdk-stage1/dietlibc/lib/getservent.c
+++ /dev/null
@@ -1,137 +0,0 @@
-#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 servicesfd=-1;
-static char* servicesmap;
-static unsigned int serviceslen;
-
-static char* aliases[10];
-
-static char *cur;
-
-/* nameserver 42/tcp name # IEN 116 */
-struct servent *getservent(void) {
- static struct servent se;
- char *last;
- int aliasidx;
- if (servicesfd<0) {
- servicesfd=open(_PATH_SERVICES,O_RDONLY);
- if (servicesfd<0) return 0;
- serviceslen=lseek(servicesfd,0,SEEK_END);
- servicesmap=mmap(0,serviceslen,PROT_READ|PROT_WRITE,MAP_PRIVATE,servicesfd,0);
- if ((long)servicesmap==(-1)) goto error;
- cur=servicesmap;
- }
- last=servicesmap+serviceslen;
-again:
- se.s_name=0;
- se.s_aliases=aliases; aliases[0]=0;
- se.s_port=0;
- se.s_proto=0;
- if (cur>=last) return 0;
- if (*cur=='#' || *cur=='\n') goto parseerror;
- /* first, the primary name */
- if (!isalpha(*cur)) goto parseerror;
- se.s_name=cur;
- se.s_aliases=aliases;
- while (cur<last && isalnum(*cur)) cur++;
- if (cur>=last) return 0;
- if (*cur=='\n') goto parseerror;
- *cur=0; cur++;
- /* second, the port */
- while (cur<last && isblank(*cur)) cur++;
- while (cur<last && isdigit(*cur)) {
- se.s_port=se.s_port*10+*cur-'0';
- cur++;
- }
- se.s_port=htons(se.s_port);
- if (cur>=last) return 0;
- /* third, "/tcp" or "/udp" */
- if (*cur!='/') goto parseerror;
- cur++;
- se.s_proto=cur;
- while (cur<last && isalpha(*cur)) ++cur;
- if (cur>=last) return 0;
- if (*cur=='\n') { *cur++=0; return &se; }
- *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 &se;
-parseerror:
- while (cur<last && *cur!='\n') cur++;
- cur++;
- goto again;
-error:
- if (servicesmap!=(char*)-1) munmap(servicesmap,serviceslen);
- if (servicesfd!=-1) close(servicesfd);
- servicesmap=(char*)-1;
- servicesfd=-1;
- errno=ENOMEM;
- return 0;
-}
-
-void setservent(int stayopen) {
- cur=servicesmap;
-}
-
-struct servent *getservbyname(const char *name, const char *proto) {
- struct servent *s;
- setservent(0);
- for (s=getservent(); s; s=getservent()) {
- char **tmp;
-#if 0
- write(1,"found ",6);
- write(1,s->s_name,strlen(s->s_name));
- write(1,"/",1);
- write(1,s->s_proto,strlen(s->s_proto));
- write(1,"\n",1);
- if (!strcmp(name,"auth")) {
- tmp=s->s_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->s_name) && !strcmp(proto,s->s_proto))
- return s;
- tmp=s->s_aliases;
- while (*tmp)
- if (!strcmp(name,*tmp++)) return s;
- }
- return 0;
-}
-
-struct servent *getservbyport(int port, const char *proto) {
- struct servent *s;
- for (s=getservent(); s; s=getservent()) {
- if (port==s->s_port && !strcmp(proto,s->s_proto))
- return s;
- }
- return 0;
-}
-
-void endservent(void) {
- if (servicesmap!=(char*)-1) munmap(servicesmap,serviceslen);
- if (servicesfd!=-1) close(servicesfd);
- servicesmap=(char*)-1;
- servicesfd=-1;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/getsockname.c b/mdk-stage1/dietlibc/lib/getsockname.c
index 61a3ea24a..6c81e317d 100644
--- a/mdk-stage1/dietlibc/lib/getsockname.c
+++ b/mdk-stage1/dietlibc/lib/getsockname.c
@@ -1,13 +1,12 @@
-#include <linux/net.h>
+#include <linuxnet.h>
+#include <sys/socket.h>
extern int socketcall(int callno,long* args);
-int getsockname(int a, void * b, int c) {
-#ifdef __i386__
- return socketcall(SYS_GETSOCKNAME, (long*)&a);
-#else
+int __libc_getsockname(int a, void * b, int c);
+int __libc_getsockname(int a, void * b, int c) {
unsigned long args[] = { a, (long) b, c };
return socketcall(SYS_GETSOCKNAME, args);
-#endif
}
+int getsockname(int a, struct sockaddr* b, socklen_t* c) __attribute__((weak,alias("__libc_getsockname")));
diff --git a/mdk-stage1/dietlibc/lib/getsockopt.c b/mdk-stage1/dietlibc/lib/getsockopt.c
index 8c0a57557..05b71d77d 100644
--- a/mdk-stage1/dietlibc/lib/getsockopt.c
+++ b/mdk-stage1/dietlibc/lib/getsockopt.c
@@ -1,13 +1,12 @@
-#include <linux/net.h>
+#include <linuxnet.h>
+#include <sys/socket.h>
extern int socketcall(int callno,long* args);
-int getsockopt(int a, int b, int c, void *d, int e) {
-#ifdef __i386__
- return socketcall(SYS_GETSOCKOPT, (long*)&a);
-#else
+int __libc_getsockopt(int a, int b, int c, void *d, int e);
+int __libc_getsockopt(int a, int b, int c, void *d, int e) {
unsigned long args[] = { a, b, c, (long)d, e };
return socketcall(SYS_GETSOCKOPT, args);
-#endif
}
+int getsockopt(int s, int level, int optname, void * optval, socklen_t *optlen) __attribute__((weak,alias("__libc_getsockopt")));
diff --git a/mdk-stage1/dietlibc/lib/htonl.c b/mdk-stage1/dietlibc/lib/htonl.c
index 490de42c4..04a1e4265 100644
--- a/mdk-stage1/dietlibc/lib/htonl.c
+++ b/mdk-stage1/dietlibc/lib/htonl.c
@@ -1,4 +1,5 @@
#include <endian.h>
+#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong) {
#if __BYTE_ORDER==__LITTLE_ENDIAN
diff --git a/mdk-stage1/dietlibc/lib/htons.c b/mdk-stage1/dietlibc/lib/htons.c
index 765d3bbc5..071001911 100644
--- a/mdk-stage1/dietlibc/lib/htons.c
+++ b/mdk-stage1/dietlibc/lib/htons.c
@@ -1,4 +1,5 @@
#include <endian.h>
+#include <netinet/in.h>
unsigned short int htons(unsigned short int hostshort) {
#if __BYTE_ORDER==__LITTLE_ENDIAN
diff --git a/mdk-stage1/dietlibc/lib/if_indextoname.c b/mdk-stage1/dietlibc/lib/if_indextoname.c
index e683755f6..cc3111ed8 100644
--- a/mdk-stage1/dietlibc/lib/if_indextoname.c
+++ b/mdk-stage1/dietlibc/lib/if_indextoname.c
@@ -1,5 +1,4 @@
-#include <linux/if.h>
-#include <linux/net.h>
+#include <net/if.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/socket.h>
diff --git a/mdk-stage1/dietlibc/lib/if_nameindex.c b/mdk-stage1/dietlibc/lib/if_nameindex.c
new file mode 100644
index 000000000..fc0e1c0ff
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/if_nameindex.c
@@ -0,0 +1,40 @@
+#include <net/if.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+
+struct if_nameindex* if_nameindex(void) {
+ struct ifconf ic;
+ int fd,len,i;
+ struct if_nameindex* x,* y;
+ char *dest;
+ fd=socket(AF_INET6,SOCK_DGRAM,0);
+ if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0);
+ ic.ifc_buf=0;
+ ic.ifc_len=0;
+ if (ioctl(fd,SIOCGIFCONF,&ic)<0) {
+b0rken:
+ close(fd);
+ return 0;
+ }
+ ic.ifc_buf=alloca((size_t)ic.ifc_len);
+ if (ioctl(fd,SIOCGIFCONF,&ic)<0) goto b0rken;
+ len=(ic.ifc_len/sizeof(struct ifreq));
+ x=(struct if_nameindex*)malloc((len+1)*sizeof(struct if_nameindex)+len*IFNAMSIZ);
+ if (!x) goto b0rken;
+ dest=(char*)(x+len+1);
+ y=x;
+ for (i=0; i<len; ++i) {
+ struct ifreq* ir=(struct ifreq*)&ic.ifc_req[i];
+ y->if_name=dest;
+ memcpy(dest,ir->ifr_name,IFNAMSIZ);
+ if (ioctl(fd,SIOCGIFINDEX,ir)==-1) continue;
+ y->if_index=ir->ifr_ifindex;
+ dest+=IFNAMSIZ;
+ ++y;
+ }
+ y->if_name=0; y->if_index=0;
+ return x;
+}
diff --git a/mdk-stage1/dietlibc/lib/if_nametoindex.c b/mdk-stage1/dietlibc/lib/if_nametoindex.c
index 5923963b1..c9dd1b051 100644
--- a/mdk-stage1/dietlibc/lib/if_nametoindex.c
+++ b/mdk-stage1/dietlibc/lib/if_nametoindex.c
@@ -1,5 +1,4 @@
-#include <linux/if.h>
-#include <linux/net.h>
+#include <net/if.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/socket.h>
@@ -8,7 +7,7 @@
#define SOCK_DGRAM 2
#endif
-int if_nametoindex(char* blub) {
+unsigned int if_nametoindex(const char* blub) {
struct ifreq ifr;
int fd;
char *tmp;
diff --git a/mdk-stage1/dietlibc/lib/ipv6constants.c b/mdk-stage1/dietlibc/lib/ipv6constants.c
new file mode 100644
index 000000000..1d5cb1f08
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/ipv6constants.c
@@ -0,0 +1,4 @@
+#include "netinet/in.h"
+
+const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
+const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
diff --git a/mdk-stage1/dietlibc/lib/isalnum.c b/mdk-stage1/dietlibc/lib/isalnum.c
index 4d363fab9..3192cc20d 100644
--- a/mdk-stage1/dietlibc/lib/isalnum.c
+++ b/mdk-stage1/dietlibc/lib/isalnum.c
@@ -1,7 +1,9 @@
#include <ctype.h>
-int __isalnum_ascii(int c) {
- return isalpha(c) || isdigit(c);
+int __isalnum_ascii ( int ch );
+int __isalnum_ascii ( int ch ) {
+ return (unsigned int)((ch | 0x20) - 'a') < 26u ||
+ (unsigned int)( ch - '0') < 10u;
}
-int isalnum(int c) __attribute__((weak,alias("__isalnum_ascii")));
+int isalnum ( int ch ) __attribute__((weak,alias("__isalnum_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/isalpha.c b/mdk-stage1/dietlibc/lib/isalpha.c
index 07ea69696..efd8b1940 100644
--- a/mdk-stage1/dietlibc/lib/isalpha.c
+++ b/mdk-stage1/dietlibc/lib/isalpha.c
@@ -1,7 +1,8 @@
#include <ctype.h>
-int __isalpha_ascii(int c) {
- return (c>='a' && c<='z') || (c>='A' && c<='Z');
+int __isalpha_ascii ( int ch );
+int __isalpha_ascii ( int ch ) {
+ return (unsigned int)((ch | 0x20) - 'a') < 26u;
}
-int isalpha(int c) __attribute__((weak,alias("__isalpha_ascii")));
+int isalpha ( int ch ) __attribute__((weak,alias("__isalpha_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/isascii.c b/mdk-stage1/dietlibc/lib/isascii.c
index e06994783..57a23ba44 100644
--- a/mdk-stage1/dietlibc/lib/isascii.c
+++ b/mdk-stage1/dietlibc/lib/isascii.c
@@ -1,6 +1,6 @@
#include <ctype.h>
-int isascii(int c) {
- return (c & 0x80) == 0;
+int isascii ( int ch )
+{
+ return (unsigned int)ch < 128u;
}
-
diff --git a/mdk-stage1/dietlibc/lib/isatty.c b/mdk-stage1/dietlibc/lib/isatty.c
index b31609720..4858a364d 100644
--- a/mdk-stage1/dietlibc/lib/isatty.c
+++ b/mdk-stage1/dietlibc/lib/isatty.c
@@ -2,11 +2,11 @@
#include <termios.h>
#undef ioctl
#include <sys/ioctl.h>
+#include <errno.h>
+#include <unistd.h>
+#include "dietfeatures.h"
-extern int errno;
-
-int isatty(int fd)
-{
+int isatty(int fd) {
int save;
int is_tty;
struct termios term;
diff --git a/mdk-stage1/dietlibc/lib/isblank.c b/mdk-stage1/dietlibc/lib/isblank.c
index 034e543b1..f13ca304a 100644
--- a/mdk-stage1/dietlibc/lib/isblank.c
+++ b/mdk-stage1/dietlibc/lib/isblank.c
@@ -1,6 +1,6 @@
#include <ctype.h>
-int isblank(int ch)
+int isblank ( int ch )
{
- return ((ch==' ')||(ch=='\t'));
+ return ch == ' ' || ch == '\t';
}
diff --git a/mdk-stage1/dietlibc/lib/iscntrl.c b/mdk-stage1/dietlibc/lib/iscntrl.c
index a183a54f1..98dbae6f3 100644
--- a/mdk-stage1/dietlibc/lib/iscntrl.c
+++ b/mdk-stage1/dietlibc/lib/iscntrl.c
@@ -1,7 +1,8 @@
#include <ctype.h>
-int __iscntrl_ascii(int c) {
- return (c<32) || (c==127);
+int __iscntrl_ascii ( int ch );
+int __iscntrl_ascii ( int ch ) {
+ return (unsigned int)ch < 32u || ch == 127;
}
-int iscntrl(int c) __attribute__((weak,alias("__iscntrl_ascii")));
+int iscntrl ( int ch ) __attribute__((weak,alias("__iscntrl_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/isdigit.c b/mdk-stage1/dietlibc/lib/isdigit.c
index 8a7c3e801..d04d281a8 100644
--- a/mdk-stage1/dietlibc/lib/isdigit.c
+++ b/mdk-stage1/dietlibc/lib/isdigit.c
@@ -1,7 +1,8 @@
#include <ctype.h>
-int __isdigit_ascii(int c) {
- return (c>='0' && c<='9');
+int __isdigit_ascii ( int ch );
+int __isdigit_ascii ( int ch ) {
+ return (unsigned int)(ch - '0') < 10u;
}
-int isdigit(int c) __attribute__((weak,alias("__isdigit_ascii")));
+int isdigit ( int ch ) __attribute__((weak,alias("__isdigit_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/isgraph.c b/mdk-stage1/dietlibc/lib/isgraph.c
index 807f90ff0..83419e788 100644
--- a/mdk-stage1/dietlibc/lib/isgraph.c
+++ b/mdk-stage1/dietlibc/lib/isgraph.c
@@ -1,5 +1,6 @@
-int __isgraph_ascii(int c) {
- return (c>=33 && c<=126);
+int __isgraph_ascii ( int ch );
+int __isgraph_ascii ( int ch ) {
+ return (unsigned int)(ch - '!') < 127u - '!';
}
-int isgraph(int c) __attribute__((weak,alias("__isgraph_ascii")));
+int isgraph ( int ch ) __attribute__((weak,alias("__isgraph_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/islower.c b/mdk-stage1/dietlibc/lib/islower.c
index 6a9afa519..8d219c43a 100644
--- a/mdk-stage1/dietlibc/lib/islower.c
+++ b/mdk-stage1/dietlibc/lib/islower.c
@@ -1,7 +1,8 @@
#include <ctype.h>
-int __islower_ascii(int c) {
- return (c>='a' && c<='z');
+int __islower_ascii ( int ch );
+int __islower_ascii ( int ch ) {
+ return (unsigned int) (ch - 'a') < 26u;
}
-int islower(int c) __attribute__((weak,alias("__islower_ascii")));
+int islower ( int ch ) __attribute__((weak,alias("__islower_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/isprint.c b/mdk-stage1/dietlibc/lib/isprint.c
index e980658a5..51ff5b6ee 100644
--- a/mdk-stage1/dietlibc/lib/isprint.c
+++ b/mdk-stage1/dietlibc/lib/isprint.c
@@ -1,6 +1,7 @@
-int __isprint_ascii(int c) {
- return (c>=32 && c<=126);
+int __isprint_ascii ( int ch );
+int __isprint_ascii ( int ch ) {
+ return (unsigned int)(ch - ' ') < 127u - ' ';
}
-int isprint(int c) __attribute__((weak,alias("__isprint_ascii")));
+int isprint ( int ch ) __attribute__((weak,alias("__isprint_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/ispunct.c b/mdk-stage1/dietlibc/lib/ispunct.c
index 2fd1183b1..8bbfcdb5a 100644
--- a/mdk-stage1/dietlibc/lib/ispunct.c
+++ b/mdk-stage1/dietlibc/lib/ispunct.c
@@ -1,7 +1,9 @@
#include <ctype.h>
-int __ispunct_ascii(int c) {
- return isprint(c) && !( isalnum(c) || isspace(c) );
+int __ispunct_ascii ( int ch );
+int __ispunct_ascii ( int ch )
+{
+ return isprint (ch) && !isalnum (ch) && !isspace (ch);
}
-int ispunct(int c) __attribute__((weak,alias("__ispunct_ascii")));
+int ispunct ( int ch ) __attribute__((weak,alias("__ispunct_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/isspace.c b/mdk-stage1/dietlibc/lib/isspace.c
index 916f784ab..bfa46648b 100644
--- a/mdk-stage1/dietlibc/lib/isspace.c
+++ b/mdk-stage1/dietlibc/lib/isspace.c
@@ -1,8 +1,9 @@
#include <ctype.h>
-int __isspace_ascii(int ch)
+int __isspace_ascii ( int ch );
+int __isspace_ascii ( int ch )
{
- return ((ch==' ')||(ch=='\f')||(ch=='\t')||(ch=='\v')||(ch=='\r')||(ch=='\n'));
+ return (unsigned int)(ch - 9) < 5u || ch == ' ';
}
-int isspace(int c) __attribute__((weak,alias("__isspace_ascii")));
+int isspace ( int ch ) __attribute__((weak,alias("__isspace_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/isupper.c b/mdk-stage1/dietlibc/lib/isupper.c
index 933dfc169..048d4fd6c 100644
--- a/mdk-stage1/dietlibc/lib/isupper.c
+++ b/mdk-stage1/dietlibc/lib/isupper.c
@@ -1,7 +1,9 @@
#include <ctype.h>
-int __isupper_ascii(int c) {
- return (c>='A' && c<='Z');
+int __isupper_ascii ( int ch );
+int __isupper_ascii ( int ch )
+{
+ return (unsigned int)(ch - 'A') < 26u;
}
-int isupper(int c) __attribute__((weak,alias("__isupper_ascii")));
+int isupper ( int ch ) __attribute__((weak,alias("__isupper_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/isxdigit.c b/mdk-stage1/dietlibc/lib/isxdigit.c
index 22a711f2d..bca8e74ac 100644
--- a/mdk-stage1/dietlibc/lib/isxdigit.c
+++ b/mdk-stage1/dietlibc/lib/isxdigit.c
@@ -1,5 +1,8 @@
-int __isxdigit_ascii(int c) {
- return ((c>='0'&&c<='9') || (c>='A'&&c<='F') || (c>='a'&&c<='f'));
+int __isxdigit_ascii ( int ch );
+int __isxdigit_ascii ( int ch )
+{
+ return (unsigned int)( ch - '0') < 10u ||
+ (unsigned int)((ch | 0x20) - 'a') < 6u;
}
-int isxdigit(int c) __attribute__((weak,alias("__isxdigit_ascii")));
+int isxdigit ( int ch ) __attribute__((weak,alias("__isxdigit_ascii")));
diff --git a/mdk-stage1/dietlibc/lib/labs.c b/mdk-stage1/dietlibc/lib/labs.c
new file mode 100644
index 000000000..364557f40
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/labs.c
@@ -0,0 +1,6 @@
+#include <endian.h>
+
+#if __WORDSIZE == 64
+long int labs(long int i) { return i>=0?i:-i; }
+long long int llabs(long long int i) __attribute__((alias("labs")));
+#endif
diff --git a/mdk-stage1/dietlibc/lib/listen.c b/mdk-stage1/dietlibc/lib/listen.c
index 56a51be06..661b86a63 100644
--- a/mdk-stage1/dietlibc/lib/listen.c
+++ b/mdk-stage1/dietlibc/lib/listen.c
@@ -1,13 +1,12 @@
-#include <linux/net.h>
+#include <linuxnet.h>
+#include <sys/socket.h>
extern int socketcall(int callno,long* args);
-int listen(int a, int b) {
-#ifdef __i386__
- return socketcall(SYS_LISTEN, (long*)&a);
-#else
+int __libc_listen(int a, int b);
+int __libc_listen(int a, int b) {
unsigned long args[] = { a, b, 0 };
return socketcall(SYS_LISTEN, args);
-#endif
}
+int listen(int s, int backlog) __attribute__((weak,alias("__libc_listen")));
diff --git a/mdk-stage1/dietlibc/lib/llabs.c b/mdk-stage1/dietlibc/lib/llabs.c
new file mode 100644
index 000000000..bcbd3dc78
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/llabs.c
@@ -0,0 +1,6 @@
+#include <endian.h>
+#include <stdlib.h>
+
+#if __WORDSIZE != 64
+long long int llabs(long long int i) { if (i<0) i=-i; return i; }
+#endif
diff --git a/mdk-stage1/dietlibc/lib/lockf.c b/mdk-stage1/dietlibc/lib/lockf.c
index 2b1d004ef..1b6fcb80c 100644
--- a/mdk-stage1/dietlibc/lib/lockf.c
+++ b/mdk-stage1/dietlibc/lib/lockf.c
@@ -2,6 +2,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include "dietfeatures.h"
int lockf(int fd, int cmd, off_t len) {
struct flock fl;
diff --git a/mdk-stage1/dietlibc/lib/longjmp.c b/mdk-stage1/dietlibc/lib/longjmp.c
index d0a5719c1..6f1afb4b1 100644
--- a/mdk-stage1/dietlibc/lib/longjmp.c
+++ b/mdk-stage1/dietlibc/lib/longjmp.c
@@ -1,51 +1,16 @@
-/* Copyright (C) 1991, 92, 94, 95, 97, 98 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 Library General Public License as
- published by the Free Software Foundation; either version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* #include <stddef.h> */
#include <setjmp.h>
#include <signal.h>
-extern int __sigprocmask(int how,void* set,void* oldset);
-extern void __longjmp(void* env, int val);
+void __longjmp(void*env,int val);
-/*
-extern void _longjmp_unwind (jmp_buf env, int val);
-*/
-/* Set the signal mask to the one specified in ENV, and jump
- to the position specified in ENV, causing the setjmp
- call there to return VAL, or 1 if VAL is 0. */
-void __siglongjmp (sigjmp_buf env, int val)
-{
- /* Perform any cleanups needed by the frames being unwound. */
- /*
- _longjmp_unwind (env, val);
- */
-
- if (env[0].__mask_was_saved)
- /* Restore the saved signal mask. */
- (void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
- (sigset_t *) NULL);
-
- /* Call the machine-dependent function to restore machine state. */
- __longjmp (env[0].__jmpbuf, val ?: 1);
+void __libc_longjmp(sigjmp_buf env,int val);
+void __libc_longjmp(sigjmp_buf env,int val) {
+ if (env[0].__mask_was_saved) {
+ sigprocmask(SIG_SETMASK,(sigset_t*)&env[0].__saved_mask,0);
+ }
+ if (val==0) val=1;
+ __longjmp(env[0].__jmpbuf,val);
}
-
-void siglongjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp")));
-void longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp")));
-void _longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp")));
-void __libc_longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp")));
+void __siglongjmp(sigjmp_buf env,int val) __attribute__((alias("__libc_longjmp")));
+void longjmp(sigjmp_buf env,int val) __attribute__((weak,alias("__libc_longjmp")));
+void siglongjmp(sigjmp_buf env,int val) __attribute__((weak,alias("__libc_longjmp")));
diff --git a/mdk-stage1/dietlibc/lib/lseek64.c b/mdk-stage1/dietlibc/lib/lseek64.c
index f39e779f9..62acf4a2b 100644
--- a/mdk-stage1/dietlibc/lib/lseek64.c
+++ b/mdk-stage1/dietlibc/lib/lseek64.c
@@ -1,22 +1,16 @@
+#include <errno.h>
#include "dietfeatures.h"
-#ifdef WANT_LARGEFILE_BACKCOMPAT
#include <sys/stat.h>
#ifndef __NO_STAT64
-#include <errno.h>
#include <unistd.h>
loff_t lseek64(int fildes, loff_t offset, int whence) {
loff_t tmp;
- if (llseek(fildes,offset>>32,offset&0xffffffff,&tmp,whence)) {
-#ifdef WANT_THREAD_SAFE
- if (*__errno_location()!=ENOSYS) return -1;
-#else
+ if (llseek(fildes,(unsigned long)(offset>>32),(unsigned long)offset&0xffffffff,&tmp,whence)) {
if (errno!=ENOSYS) return -1;
-#endif
return (loff_t)lseek(fildes,(off_t)offset,whence);
}
return tmp;
}
#endif
-#endif
diff --git a/mdk-stage1/dietlibc/lib/memccmp.c b/mdk-stage1/dietlibc/lib/memccmp.c
deleted file mode 100644
index 3a8c14f60..000000000
--- a/mdk-stage1/dietlibc/lib/memccmp.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#define _POSIX_SOURCE
-#define _XOPEN_SOURCE
-#include <sys/types.h>
-
-int memccmp(const void *dst, const void *src, int c, size_t count)
-{
- register const char *a = dst;
- register const char *b = src;
- while (count--)
- {
- register int res=(*a - *b);
- if (res) return res;
- if (*a==c) return 0;
- ++a; ++b;
- }
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/memccpy.c b/mdk-stage1/dietlibc/lib/memccpy.c
index 6d6ac98ab..3208cfabb 100644
--- a/mdk-stage1/dietlibc/lib/memccpy.c
+++ b/mdk-stage1/dietlibc/lib/memccpy.c
@@ -1,6 +1,7 @@
#define _POSIX_SOURCE
#define _XOPEN_SOURCE
#include <sys/types.h>
+#include <string.h>
void *memccpy(void *dst, const void *src, int c, size_t count)
{
diff --git a/mdk-stage1/dietlibc/lib/memchr.c b/mdk-stage1/dietlibc/lib/memchr.c
index 93d81328a..ae76bb150 100644
--- a/mdk-stage1/dietlibc/lib/memchr.c
+++ b/mdk-stage1/dietlibc/lib/memchr.c
@@ -1,9 +1,13 @@
#include <sys/types.h>
+#include <string.h>
-char *memchr(const char *s, int c, size_t n) {
+void* memchr(const void *s, int c, size_t n) {
+ register const char* t=s;
int i;
- for (i=n; i; --i)
- if (*s++==c)
- return (char*)s;
+ for (i=n; i; --i) {
+ if (*t==c)
+ return (char*)t;
+ ++t;
+ }
return 0;
}
diff --git a/mdk-stage1/dietlibc/lib/memcmp.c b/mdk-stage1/dietlibc/lib/memcmp.c
index c05a46863..4c8f77142 100644
--- a/mdk-stage1/dietlibc/lib/memcmp.c
+++ b/mdk-stage1/dietlibc/lib/memcmp.c
@@ -1,5 +1,7 @@
#include <sys/types.h>
+/* gcc is broken and has a non-SUSv2 compliant internal prototype.
+ * This causes it to warn about a type mismatch here. Ignore it. */
int memcmp(const void *dst, const void *src, size_t count) {
register int r;
register const char *d=dst;
diff --git a/mdk-stage1/dietlibc/lib/memcpy.c b/mdk-stage1/dietlibc/lib/memcpy.c
index 0c688b509..ebfd1e60a 100644
--- a/mdk-stage1/dietlibc/lib/memcpy.c
+++ b/mdk-stage1/dietlibc/lib/memcpy.c
@@ -1,5 +1,7 @@
#include <sys/types.h>
+/* gcc is broken and has a non-SUSv2 compliant internal prototype.
+ * This causes it to warn about a type mismatch here. Ignore it. */
void* memcpy(void* dst, const void* src, size_t count) {
register char *d=dst;
register const char *s=src;
diff --git a/mdk-stage1/dietlibc/lib/memmem.c b/mdk-stage1/dietlibc/lib/memmem.c
new file mode 100644
index 000000000..5c88a29e7
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memmem.c
@@ -0,0 +1,14 @@
+#define _GNU_SOURCE 23
+#include <sys/types.h>
+#include <string.h>
+
+void *memmem(const void* haystack, size_t hl, const void* needle, size_t nl) {
+ int i;
+ if (nl>hl) return 0;
+ for (i=hl-nl+1; i; --i) {
+ if (!memcmp(haystack,needle,nl))
+ return (char*)haystack;
+ ++haystack;
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/memmove.c b/mdk-stage1/dietlibc/lib/memmove.c
index 7adb2be91..58414d503 100644
--- a/mdk-stage1/dietlibc/lib/memmove.c
+++ b/mdk-stage1/dietlibc/lib/memmove.c
@@ -1,6 +1,7 @@
#define _POSIX_SOURCE
#define _XOPEN_SOURCE
#include <sys/types.h>
+#include <string.h>
void *memmove(void *dst, const void *src, size_t count)
{
diff --git a/mdk-stage1/dietlibc/lib/memrchr.c b/mdk-stage1/dietlibc/lib/memrchr.c
new file mode 100644
index 000000000..f7750d2d7
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memrchr.c
@@ -0,0 +1,15 @@
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <string.h>
+
+void* memrchr(const void *s, int c, size_t n) {
+ register const char* t=s;
+ register const char* last=0;
+ int i;
+ for (i=n; i; --i) {
+ if (*t==c)
+ last=t;
+ ++t;
+ }
+ return (void*)last; /* man, what an utterly b0rken prototype */
+}
diff --git a/mdk-stage1/dietlibc/lib/memset.c b/mdk-stage1/dietlibc/lib/memset.c
index 5f9ae49ee..a019eca44 100644
--- a/mdk-stage1/dietlibc/lib/memset.c
+++ b/mdk-stage1/dietlibc/lib/memset.c
@@ -1,6 +1,8 @@
#include <sys/types.h>
-void * memset(void * dst, int s, size_t count) {
+/* gcc is broken and has a non-SUSv2 compliant internal prototype.
+ * This causes it to warn about a type mismatch here. Ignore it. */
+void* memset(void * dst, int s, size_t count) {
register char * a = dst;
count++; /* this actually creates smaller code than using count-- */
while (--count)
diff --git a/mdk-stage1/dietlibc/lib/mkfifo.c b/mdk-stage1/dietlibc/lib/mkfifo.c
index 596efbe27..1bd132e65 100644
--- a/mdk-stage1/dietlibc/lib/mkfifo.c
+++ b/mdk-stage1/dietlibc/lib/mkfifo.c
@@ -1,6 +1,6 @@
-#include <linux/stat.h>
+#include <sys/stat.h>
#include <unistd.h>
int mkfifo(const char *fn,mode_t mode) {
- return mknod(fn,S_IFIFO|mode,0);
+ return mknod(fn,(mode_t)(mode|S_IFIFO),0);
}
diff --git a/mdk-stage1/dietlibc/lib/msgctl.c b/mdk-stage1/dietlibc/lib/msgctl.c
index 19ea6d8cf..51cffdef0 100644
--- a/mdk-stage1/dietlibc/lib/msgctl.c
+++ b/mdk-stage1/dietlibc/lib/msgctl.c
@@ -1,9 +1,8 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,int,int,int,void*);
int msgctl(int msqid, int cmd, struct msqid_ds *buf) {
return __ipc(MSGCTL,msqid,cmd,0,buf);
diff --git a/mdk-stage1/dietlibc/lib/msgget.c b/mdk-stage1/dietlibc/lib/msgget.c
index 9bca09ebe..6023c1786 100644
--- a/mdk-stage1/dietlibc/lib/msgget.c
+++ b/mdk-stage1/dietlibc/lib/msgget.c
@@ -1,9 +1,8 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,key_t,int,int,int);
int msgget(key_t key,int flag) {
return __ipc(MSGGET,key,flag,0,0);
diff --git a/mdk-stage1/dietlibc/lib/msgrcv.c b/mdk-stage1/dietlibc/lib/msgrcv.c
index b4ae9cc6c..8168187a5 100644
--- a/mdk-stage1/dietlibc/lib/msgrcv.c
+++ b/mdk-stage1/dietlibc/lib/msgrcv.c
@@ -1,9 +1,13 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,int,size_t,int,void*);
+
+struct ipc_kludge {
+ struct msgbuf *msgp;
+ long msgtyp;
+};
int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg) {
struct ipc_kludge tmp;
diff --git a/mdk-stage1/dietlibc/lib/msgsnd.c b/mdk-stage1/dietlibc/lib/msgsnd.c
index 6203053f0..6e9ef445e 100644
--- a/mdk-stage1/dietlibc/lib/msgsnd.c
+++ b/mdk-stage1/dietlibc/lib/msgsnd.c
@@ -1,9 +1,8 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,int,size_t,int,const void*);
int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) {
return __ipc(MSGSND,msqid, msgsz, msgflg, msgp);
diff --git a/mdk-stage1/dietlibc/lib/nop.c b/mdk-stage1/dietlibc/lib/nop.c
deleted file mode 100644
index c05bea813..000000000
--- a/mdk-stage1/dietlibc/lib/nop.c
+++ /dev/null
@@ -1,7 +0,0 @@
-
-int __fflush_stdin() __attribute__((weak,alias("__return0")));
-int __fflush_stdout() __attribute__((weak,alias("__return0")));
-int __fflush_stderr() __attribute__((weak,alias("__return0")));
-
-/* used for weak aliases */
-int __return0() { return 0; }
diff --git a/mdk-stage1/dietlibc/lib/open64.c b/mdk-stage1/dietlibc/lib/open64.c
index f1499d017..2599e2259 100644
--- a/mdk-stage1/dietlibc/lib/open64.c
+++ b/mdk-stage1/dietlibc/lib/open64.c
@@ -1,14 +1,13 @@
-#include <linux/types.h>
-#include <linux/fcntl.h>
+#include <sys/types.h>
+#include <fcntl.h>
#ifndef O_LARGEFILE
#define O_LARGEFILE 0
#endif
-extern int open(const char* file,int oflag,int mode);
-
+int __libc_open64(const char* file,int oflag,int mode);
int __libc_open64(const char* file,int oflag,int mode) {
return open(file,oflag|O_LARGEFILE,mode);
}
-int open64(const char* file,int oflag,int mode) __attribute__((weak,alias("__libc_open64")));
+int open64(const char* file,int oflag,...) __attribute__((weak,alias("__libc_open64")));
diff --git a/mdk-stage1/dietlibc/lib/opendir.c b/mdk-stage1/dietlibc/lib/opendir.c
index 5c0c4a305..2530d1ac9 100644
--- a/mdk-stage1/dietlibc/lib/opendir.c
+++ b/mdk-stage1/dietlibc/lib/opendir.c
@@ -1,18 +1,26 @@
#include "dietdirent.h"
+#include <sys/mman.h>
#include <unistd.h>
#include <dirent.h>
#include <stdlib.h>
#include <fcntl.h>
-DIR *opendir (const char *name) {
- DIR *t=(DIR*)malloc(sizeof(DIR));
- if (t) {
- if ((t->fd=open(name,O_RDONLY|O_DIRECTORY))>=0) {
- t->num=t->cur=0;
- } else {
- free(t);
- t=0;
- }
+DIR* opendir ( const char* name ) {
+ int fd = open (name, O_RDONLY | O_DIRECTORY);
+ DIR* t = NULL;
+
+ if ( fd >= 0 ) {
+ if (fcntl (fd, F_SETFD, FD_CLOEXEC) < 0)
+ goto lose;
+ t = (DIR *) mmap (NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (t == MAP_FAILED)
+lose:
+ close (fd);
+ else
+ t->fd = fd;
}
+
+
return t;
}
diff --git a/mdk-stage1/dietlibc/lib/perror.c b/mdk-stage1/dietlibc/lib/perror.c
index ecab7250b..0a45fb9d6 100644
--- a/mdk-stage1/dietlibc/lib/perror.c
+++ b/mdk-stage1/dietlibc/lib/perror.c
@@ -1,22 +1,24 @@
#include "dietfeatures.h"
#include <unistd.h>
#include <string.h>
+#include <stdio.h>
+
+#define _BSD_SOURCE
#include <errno.h>
-extern char *sys_errlist[];
-extern int sys_nerr;
-extern int errno;
+extern const char __sys_err_unknown [];
+
+void perror ( const char* prepend )
+{
+ register const char* message = __sys_err_unknown;
+
+ if ( (unsigned int) errno < (unsigned int) __SYS_NERR )
+ message = sys_errlist [errno];
-void perror(const char *s) {
- register char *message="[unknown error]";
- write(2,s,strlen(s));
- write(2,": ",2);
- if (errno>=0 && errno<sys_nerr)
-#ifdef WANT_THREAD_SAFE
- message=sys_errlist[*__errno_location()];
-#else
- message=sys_errlist[errno];
-#endif
- write(2,message,strlen(message));
- write(2,"\n",1);
+ if (prepend) {
+ write ( 2, prepend, strlen(prepend) );
+ write ( 2, ": ", 2 );
+ }
+ write ( 2, message, strlen(message) );
+ write ( 2, "\n", 1 );
}
diff --git a/mdk-stage1/dietlibc/lib/pread.c b/mdk-stage1/dietlibc/lib/pread.c
index b922aa93e..fd6c49149 100644
--- a/mdk-stage1/dietlibc/lib/pread.c
+++ b/mdk-stage1/dietlibc/lib/pread.c
@@ -3,6 +3,7 @@
extern size_t __pread(int fd, void *buf, size_t count, off_t a,off_t b);
+size_t __libc_pread(int fd, void *buf, size_t count, off_t offset);
size_t __libc_pread(int fd, void *buf, size_t count, off_t offset) {
return __pread(fd,buf,count,offset,0);
}
diff --git a/mdk-stage1/dietlibc/lib/pread64.c b/mdk-stage1/dietlibc/lib/pread64.c
index e6ba4d103..6dc93cefa 100644
--- a/mdk-stage1/dietlibc/lib/pread64.c
+++ b/mdk-stage1/dietlibc/lib/pread64.c
@@ -5,8 +5,9 @@
#ifndef __NO_STAT64
extern size_t __pread(int fd, void *buf, size_t count, off_t a,off_t b);
+size_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset);
size_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset) {
- return __pread(fd,buf,count,__LONG_LONG_PAIR (offset&0xffffffff,offset>>32));
+ return __pread(fd,buf,count,__LONG_LONG_PAIR ((off_t)(offset&0xffffffff),(off_t)(offset>>32)));
}
int pread64(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread64")));
diff --git a/mdk-stage1/dietlibc/lib/putenv.c b/mdk-stage1/dietlibc/lib/putenv.c
index 274b16b0e..448d59840 100644
--- a/mdk-stage1/dietlibc/lib/putenv.c
+++ b/mdk-stage1/dietlibc/lib/putenv.c
@@ -1,21 +1,24 @@
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
int putenv(const char *string) {
- int len;
+ size_t len;
int envc;
+ int remove=0;
char *tmp;
const char **ep;
char **newenv;
- static char **origenv=0;
+ static char **origenv;
if (!origenv) origenv=environ;
- if (!(tmp=strchr(string,'=')))
+ if (!(tmp=strchr(string,'='))) {
len=strlen(string);
- else
+ remove=1;
+ } else
len=tmp-string+1;
for (envc=0, ep=(const char**)environ; *ep; ++ep) {
- if (!memcmp(string,*ep,len)) { /* found */
- if (!tmp) {
+ if (*string == **ep && !memcmp(string,*ep,len)) {
+ if (remove) {
for (; ep[1]; ++ep) ep[0]=ep[1];
ep[0]=0;
return 0;
@@ -26,11 +29,11 @@ int putenv(const char *string) {
++envc;
}
if (tmp) {
- newenv=(char**)malloc((envc+2)*sizeof(char*));
+ newenv = (char**) realloc(environ==origenv?0:origenv,
+ (envc+2)*sizeof(char*));
if (!newenv) return -1;
newenv[0]=(char*)string;
memcpy(newenv+1,environ,(envc+1)*sizeof(char*));
- if (environ!=origenv) free(environ);
environ=newenv;
}
return 0;
diff --git a/mdk-stage1/dietlibc/lib/puts.c b/mdk-stage1/dietlibc/lib/puts.c
deleted file mode 100644
index 54415151d..000000000
--- a/mdk-stage1/dietlibc/lib/puts.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <unistd.h>
-#include <string.h>
-#include "dietstdio.h"
-#include "dietfeatures.h"
-
-int puts(const char *s) {
-#ifdef WANT_BUFFERED_STDIO
- return fwrite(s,1,strlen(s),stdout) && fputc('\n',stdout);
-#else
- return write(1,s,strlen(s)) && write(1,"\n",1);
-#endif
-}
diff --git a/mdk-stage1/dietlibc/lib/pwrite.c b/mdk-stage1/dietlibc/lib/pwrite.c
new file mode 100644
index 000000000..1e9fde545
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/pwrite.c
@@ -0,0 +1,11 @@
+#include <endian.h>
+#include <sys/types.h>
+
+extern size_t __pwrite(int fd, void *buf, size_t count, off_t a,off_t b);
+
+size_t __libc_pwrite(int fd, void *buf, size_t count, off_t offset);
+size_t __libc_pwrite(int fd, void *buf, size_t count, off_t offset) {
+ return __pwrite(fd,buf,count,offset,0);
+}
+
+int pwrite(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pwrite")));
diff --git a/mdk-stage1/dietlibc/lib/pwrite64.c b/mdk-stage1/dietlibc/lib/pwrite64.c
new file mode 100644
index 000000000..cac46024a
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/pwrite64.c
@@ -0,0 +1,14 @@
+#include <endian.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifndef __NO_STAT64
+extern size_t __pwrite(int fd, void *buf, size_t count, off_t a,off_t b);
+
+size_t __libc_pwrite64(int fd, void *buf, size_t count, off64_t offset);
+size_t __libc_pwrite64(int fd, void *buf, size_t count, off64_t offset) {
+ return __pwrite(fd,buf,count,__LONG_LONG_PAIR ((off_t)(offset&0xffffffff),(off_t)(offset>>32)));
+}
+
+int pwrite64(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pwrite64")));
+#endif
diff --git a/mdk-stage1/dietlibc/lib/qsort.c b/mdk-stage1/dietlibc/lib/qsort.c
index 2a8824bf3..62217e142 100644
--- a/mdk-stage1/dietlibc/lib/qsort.c
+++ b/mdk-stage1/dietlibc/lib/qsort.c
@@ -1,3 +1,4 @@
+#include <sys/cdefs.h>
#include <stdlib.h>
#include <assert.h>
@@ -19,7 +20,7 @@ static inline void iswap(void *a,void *b,size_t size) {
}
static inline void swap(void *base,size_t size,size_t a,size_t b) {
- iswap(base+a*size,base+b*size,size);
+ iswap((char*)base+a*size,(char*)base+b*size,size);
}
#if 0
@@ -30,18 +31,19 @@ void dumparray() {
}
#endif
+void isort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
void isort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) {
- int i;
- while (nmemb>1) {
+ size_t i;
+ while (expect(nmemb>1,1)) {
char *min=base;
char *tmp=min+size;
for (i=1; i<nmemb; ++i) {
- if (compar(tmp,min)<0)
+ if (expect(compar(tmp,min)<0,0))
min=tmp;
tmp+=size;
}
iswap(min,base,size);
- base+=size;
+ (char*)base+=size;
nmemb-=1;
}
}
@@ -55,7 +57,7 @@ void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, co
static int level=0;
char* v; /* pivot */
char* mid, *max, *min;
- int lmemb;
+ size_t lmemb;
#if 0
int left,right;
@@ -71,8 +73,8 @@ void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, co
return isort(base,nmemb,size,compar);
}
{
- mid=base+(nmemb/2)*size;
- max=base+(nmemb-1)*size;
+ mid=(char*)base+(nmemb/2)*size;
+ max=(char*)base+(nmemb-1)*size;
if (compar(base,max)<0) /* a[left] < a[right] */
if (compar(base,mid)<0) /* a[left] < a[med] */
@@ -97,8 +99,8 @@ void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, co
v=max;
min=base; lmemb=0;
for (;;) {
- while (compar(min,v)<0) { min+=size; ++lmemb; }
- while (compar(max-=size,v)>0) ;
+ while (expect(compar(min,v)<0,1)) { min+=size; ++lmemb; }
+ while (expect(compar(max-=size,v)>0,1)) ;
if (min>=max) break;
iswap(min,max,size);
}
diff --git a/mdk-stage1/dietlibc/lib/raise.c b/mdk-stage1/dietlibc/lib/raise.c
index 606546034..0f548fc3b 100644
--- a/mdk-stage1/dietlibc/lib/raise.c
+++ b/mdk-stage1/dietlibc/lib/raise.c
@@ -1,7 +1,6 @@
-#include <linux/types.h>
+#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
-#include "syscalls.h"
int raise(int sig) {
return kill(getpid(),sig);
diff --git a/mdk-stage1/dietlibc/lib/rand.c b/mdk-stage1/dietlibc/lib/rand.c
index 10bfaf94d..beb2d2717 100644
--- a/mdk-stage1/dietlibc/lib/rand.c
+++ b/mdk-stage1/dietlibc/lib/rand.c
@@ -2,8 +2,11 @@
static unsigned int seed=1;
-int rand() {
- return ((seed = seed * 1103515245 + 12345) % ((unsigned int)RAND_MAX + 1));
+int rand(void) {
+ return rand_r(&seed);
}
void srand(unsigned int i) { seed=i; }
+
+int random(void) __attribute__((alias("rand")));
+void srandom(unsigned int i) __attribute__((alias("srand")));
diff --git a/mdk-stage1/dietlibc/lib/rand48.c b/mdk-stage1/dietlibc/lib/rand48.c
new file mode 100644
index 000000000..9c6cfcda2
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/rand48.c
@@ -0,0 +1,89 @@
+#include <stdlib.h>
+
+static randbuf rand48buf;
+#define A_0 0xE66D
+#define A_1 0xDEEC
+#define A_2 0x5
+#define C 0xB
+static randbuf a = { A_0, A_1, A_2 };
+static unsigned short c = C;
+
+static void calc_next(randbuf buf) {
+ randbuf tmp;
+ long t;
+ t = buf[0] * a[0] + c;
+ tmp[0] = t & 0xffff;
+ tmp[1] = (t >> 16) & 0xffff;
+ t = buf[1] * a[0] + buf[0] * a[1] + tmp[1];
+ tmp[1] = t & 0xffff;
+ tmp[2] = (t >> 16) & 0xffff;
+ t = buf[2] * a[0] + buf[1] * a[1] + buf[0] * a[2] + tmp[2];
+ tmp[2] = t & 0xffff;
+ buf[0] = tmp[0];
+ buf[1] = tmp[1];
+ buf[2] = tmp[2];
+}
+
+double drand48(void) {
+ return erand48(rand48buf);
+}
+
+long lrand48(void) {
+ return nrand48(rand48buf);
+}
+
+long mrand48(void) {
+ return jrand48(rand48buf);
+}
+
+void srand48(long seed) {
+ rand48buf[1] = (seed >> 16) & 0xffff;
+ rand48buf[2] = seed & 0xffff;
+ rand48buf[0] = 0x330e;
+ a[0] = A_0;
+ a[1] = A_1;
+ a[2] = A_2;
+ c = C;
+}
+
+unsigned short *seed48(randbuf buf) {
+ static randbuf oldx;
+ int i;
+ for (i = 0; i < 3; i++) {
+ oldx[i] = rand48buf[i];
+ rand48buf[i] = buf[i];
+ }
+ a[0] = A_0;
+ a[1] = A_1;
+ a[2] = A_2;
+ c = C;
+ return (unsigned short *)&oldx;
+}
+
+void lcong48(unsigned short param[7]) {
+ int i;
+ for (i = 0; i < 3; i++) {
+ rand48buf[i] = param[i];
+ a[i] = param[i + 3];
+ }
+ c = param[6];
+}
+
+long jrand48(randbuf buf) {
+ long ret;
+ ret = buf[2] << 16 | buf[1];
+ calc_next(buf);
+ return ret;
+}
+
+long nrand48(randbuf buf) {
+ return jrand48(buf) & 0x7FFFFFFFL;
+}
+
+double erand48(randbuf buf) {
+ double ret;
+ ret = ((buf[0] / 65536.0 + buf[1]) / 65536.0 + buf[2]) / 65536.0;
+ calc_next(buf);
+ return ret;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/rand_r.c b/mdk-stage1/dietlibc/lib/rand_r.c
new file mode 100644
index 000000000..55f8303bc
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/rand_r.c
@@ -0,0 +1,30 @@
+/*
+ Copyright (C) 2002 Luc Van Oostenryck
+
+ This is free software. You can redistribute and
+ modify it under the terms of the GNU General Public
+ Public License.
+*/
+
+#include <stdlib.h>
+#include <stdint.h>
+
+/* Knuth's TAOCP section 3.6 */
+#define M ((1U<<31) -1)
+#define A 48271
+#define Q 44488 // M/A
+#define R 3399 // M%A; R < Q !!!
+
+// FIXME: ISO C/SuS want a longer period
+
+int rand_r(unsigned int* seed)
+{ int32_t X;
+
+ X = *seed;
+ X = A*(X%Q) - R * (int32_t) (X/Q);
+ if (X < 0)
+ X += M;
+
+ *seed = X;
+ return X;
+}
diff --git a/mdk-stage1/dietlibc/lib/random.c b/mdk-stage1/dietlibc/lib/random.c
deleted file mode 100644
index e7785c455..000000000
--- a/mdk-stage1/dietlibc/lib/random.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdlib.h>
-
-static unsigned int seed=1;
-
-long int random() {
- return ((seed = seed * 1103515245 + 12345) % ((unsigned int)RAND_MAX + 1));
-}
-
-void srandom(unsigned int i) { seed=i; }
diff --git a/mdk-stage1/dietlibc/lib/readdir.c b/mdk-stage1/dietlibc/lib/readdir.c
index 689f5d08b..ed885a5f0 100644
--- a/mdk-stage1/dietlibc/lib/readdir.c
+++ b/mdk-stage1/dietlibc/lib/readdir.c
@@ -5,7 +5,7 @@
struct dirent* readdir(DIR *d) {
if (!d->num || (d->cur += ((struct dirent*)(d->buf+d->cur))->d_reclen)>=d->num) {
- int res=getdents(d->fd,(struct dirent*)d->buf,1023);
+ int res=getdents(d->fd,(struct dirent*)d->buf,sizeof (d->buf)-1);
if (res<=0) return 0;
d->num=res; d->cur=0;
}
diff --git a/mdk-stage1/dietlibc/lib/readdir64.c b/mdk-stage1/dietlibc/lib/readdir64.c
new file mode 100644
index 000000000..b9b0aafcc
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/readdir64.c
@@ -0,0 +1,62 @@
+#include "dietfeatures.h"
+#include "dietdirent.h"
+#include <unistd.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include "syscalls.h"
+
+#ifndef __NR_getdents64
+#define WANT_LARGEFILE_BACKCOMPAT
+#endif
+
+#ifndef WANT_LARGEFILE_BACKCOMPAT
+struct dirent64* readdir64(DIR *d) {
+ if (!d->num || (d->cur += ((struct dirent64*)(d->buf+d->cur))->d_reclen)>=d->num) {
+ int res=getdents64(d->fd,(struct dirent64*)d->buf, sizeof (d->buf)-1);
+ if (res<=0) return 0;
+ d->num=res; d->cur=0;
+ }
+ return (struct dirent64*)(d->buf+d->cur);
+}
+#else
+struct dirent64* readdir64(DIR *d) {
+#ifdef __NR_getdents64
+ static int trygetdents64=1;
+#endif
+ struct dirent* o;
+ static struct dirent64 d64;
+again:
+#ifdef __NR_getdents64
+ if (!trygetdents64) {
+#endif
+ if (!d->num || (d->cur += ((struct dirent*)(d->buf+d->cur))->d_reclen)>=d->num) {
+ int res=getdents(d->fd,(struct dirent*)d->buf, sizeof (d->buf)-1);
+ if (res<=0) return 0;
+ d->num=res; d->cur=0;
+ }
+ o=(struct dirent*)(d->buf+d->cur);
+ d64.d_ino=o->d_ino;
+ d64.d_off=o->d_off;
+ d64.d_reclen=o->d_reclen;
+ strcpy(d64.d_name,o->d_name);
+ d64.d_type=0; /* is this correct? */
+ return &d64;
+#ifdef __NR_getdents64
+ }
+ if (!d->num || (d->cur += ((struct dirent64*)(d->buf+d->cur))->d_reclen)>=d->num) {
+ int res=getdents64(d->fd,(struct dirent64*)d->buf,sizeof (d->buf));
+ if (res<=0) {
+ if (errno==ENOSYS) {
+ trygetdents64=0;
+ goto again;
+ }
+ return 0;
+ }
+ d->num=res; d->cur=0;
+ }
+ return (struct dirent64*)(d->buf+d->cur);
+#endif
+}
+#endif
diff --git a/mdk-stage1/dietlibc/lib/reboot.c b/mdk-stage1/dietlibc/lib/reboot.c
index 7f47a95dd..421068504 100644
--- a/mdk-stage1/dietlibc/lib/reboot.c
+++ b/mdk-stage1/dietlibc/lib/reboot.c
@@ -1,8 +1,8 @@
#include <sys/reboot.h>
-int __reboot(int magic1, int magic2, int cmd, void * arg);
+int __reboot(unsigned int magic1, unsigned int magic2, int cmd);
-int reboot(int cmd, void *arg)
+int reboot(int cmd)
{
- return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, arg);
+ return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd);
}
diff --git a/mdk-stage1/dietlibc/lib/recv.c b/mdk-stage1/dietlibc/lib/recv.c
index bc6b1e5d7..c6bab4fb1 100644
--- a/mdk-stage1/dietlibc/lib/recv.c
+++ b/mdk-stage1/dietlibc/lib/recv.c
@@ -1,14 +1,12 @@
-#include <linux/net.h>
+#include <sys/types.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
+int __libc_recv(int a, const void * b, size_t c, int flags);
int __libc_recv(int a, const void * b, size_t c, int flags) {
-#ifdef __i386__
- return socketcall(SYS_RECV,(long*)&a);
-#else
unsigned long args[] = { a, (long) b, c, flags };
return socketcall(SYS_RECV, args);
-#endif
}
int recv(int a, const void * b, size_t c, int flags)
diff --git a/mdk-stage1/dietlibc/lib/recvfrom.c b/mdk-stage1/dietlibc/lib/recvfrom.c
index 802ad665f..b66ce3813 100644
--- a/mdk-stage1/dietlibc/lib/recvfrom.c
+++ b/mdk-stage1/dietlibc/lib/recvfrom.c
@@ -1,14 +1,12 @@
-#include <linux/net.h>
+#include <sys/types.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
+int __libc_recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen);
int __libc_recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen) {
-#ifdef __i386__
- return socketcall(SYS_RECVFROM, (long*)&a);
-#else
unsigned long args[] = { a, (long) b, c, flags, (long) to, (long) tolen };
return socketcall(SYS_RECVFROM, args);
-#endif
}
int recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen)
diff --git a/mdk-stage1/dietlibc/lib/recvmsg.c b/mdk-stage1/dietlibc/lib/recvmsg.c
index c14c58c78..d843ce9c0 100644
--- a/mdk-stage1/dietlibc/lib/recvmsg.c
+++ b/mdk-stage1/dietlibc/lib/recvmsg.c
@@ -1,14 +1,12 @@
-#include <linux/net.h>
+#include <sys/socket.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
+int __libc_recvmsg(int a, struct msghdr* msg, int flags);
int __libc_recvmsg(int a, struct msghdr* msg, int flags) {
-#ifdef __i386__
- return socketcall(SYS_RECVMSG, (long*)&a);
-#else
unsigned long args[] = { a, (long) msg, flags };
return socketcall(SYS_RECVMSG, args);
-#endif
}
int recvmsg(int a, struct msghdr *msg, int flags)
diff --git a/mdk-stage1/dietlibc/lib/remove.c b/mdk-stage1/dietlibc/lib/remove.c
index d5125bfed..06f686356 100644
--- a/mdk-stage1/dietlibc/lib/remove.c
+++ b/mdk-stage1/dietlibc/lib/remove.c
@@ -1,5 +1,7 @@
#include <unistd.h>
#include <errno.h>
+#include "dietfeatures.h"
+#include <stdio.h>
int remove(const char* filename) {
if (unlink(filename)) {
diff --git a/mdk-stage1/dietlibc/lib/sbrk.c b/mdk-stage1/dietlibc/lib/sbrk.c
index 945ad5a16..799ce7428 100644
--- a/mdk-stage1/dietlibc/lib/sbrk.c
+++ b/mdk-stage1/dietlibc/lib/sbrk.c
@@ -1,20 +1,21 @@
#include <unistd.h>
-extern int __brk(void *end_data_segment);
+extern int __libc_brk(void *end_data_segment);
extern void* __curbrk;
-void* __sbrk(ptrdiff_t increment) {
+void* __libc_sbrk(ptrdiff_t increment);
+void* __libc_sbrk(ptrdiff_t increment) {
void* oldbrk;
if (__curbrk==0)
- if (__brk(0) < 0)
+ if (__libc_brk(0) < 0)
return (void*)-1;
if (increment==0)
return __curbrk;
oldbrk=__curbrk;
- if (__brk(oldbrk+increment)<0)
+ if (__libc_brk((char*)oldbrk+increment)<0)
return (void*)-1;
return oldbrk;
}
-void* sbrk (ptrdiff_t increment) __attribute__((weak,alias("__sbrk")));
+void* sbrk (ptrdiff_t increment) __attribute__((weak,alias("__libc_sbrk")));
diff --git a/mdk-stage1/dietlibc/lib/semctl.c b/mdk-stage1/dietlibc/lib/semctl.c
index ddc0aae95..cec0b7535 100644
--- a/mdk-stage1/dietlibc/lib/semctl.c
+++ b/mdk-stage1/dietlibc/lib/semctl.c
@@ -1,10 +1,17 @@
#include <sys/types.h>
#include <sys/ipc.h>
-#include <sys/sem.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,int,int,int,void*);
+union semun {
+ int val; /* value for SETVAL */
+ struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
+ unsigned short *array; /* array for GETALL & SETALL */
+ struct seminfo *__buf; /* buffer for IPC_INFO */
+ void *__pad;
+};
+
+int semctl(int semid, int semnum, int cmd, union semun arg);
int semctl(int semid, int semnum, int cmd, union semun arg) {
return __ipc(SEMCTL,semid,semnum,cmd,&arg);
}
diff --git a/mdk-stage1/dietlibc/lib/semget.c b/mdk-stage1/dietlibc/lib/semget.c
index 056aeae04..c3649eea1 100644
--- a/mdk-stage1/dietlibc/lib/semget.c
+++ b/mdk-stage1/dietlibc/lib/semget.c
@@ -1,9 +1,8 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,key_t,int,int,int);
int semget(key_t key, int nsems, int semflg) {
return __ipc(SEMGET,key,nsems,semflg,0);
diff --git a/mdk-stage1/dietlibc/lib/semop.c b/mdk-stage1/dietlibc/lib/semop.c
index abfde73a7..4d2e748cc 100644
--- a/mdk-stage1/dietlibc/lib/semop.c
+++ b/mdk-stage1/dietlibc/lib/semop.c
@@ -1,9 +1,8 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,int,unsigned,int,void*);
int semop(int semid,struct sembuf *sops,unsigned nsops) {
return __ipc(SEMOP,semid,nsops,0,sops);
diff --git a/mdk-stage1/dietlibc/lib/send.c b/mdk-stage1/dietlibc/lib/send.c
index c1adf1b5d..783ecaf89 100644
--- a/mdk-stage1/dietlibc/lib/send.c
+++ b/mdk-stage1/dietlibc/lib/send.c
@@ -1,14 +1,12 @@
-#include <linux/net.h>
+#include <sys/types.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
+int __libc_send(int a, const void * b, size_t c, int flags);
int __libc_send(int a, const void * b, size_t c, int flags) {
-#ifdef __i386__
- return socketcall(SYS_SEND, (long*)&a);
-#else
unsigned long args[] = { a, (long) b, c, flags };
return socketcall(SYS_SEND, args);
-#endif
}
int send(int a, const void * b, size_t c, int flags)
diff --git a/mdk-stage1/dietlibc/lib/sendmsg.c b/mdk-stage1/dietlibc/lib/sendmsg.c
index 277265985..bb5d1711a 100644
--- a/mdk-stage1/dietlibc/lib/sendmsg.c
+++ b/mdk-stage1/dietlibc/lib/sendmsg.c
@@ -1,14 +1,12 @@
-#include <linux/net.h>
+#include <sys/socket.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
+int __libc_sendmsg(int a, const struct msghdr* msg, int flags);
int __libc_sendmsg(int a, const struct msghdr* msg, int flags) {
-#ifdef __i386__
- return socketcall(SYS_SENDMSG, (long*)&a);
-#else
unsigned long args[] = { a, (long) msg, flags };
return socketcall(SYS_SENDMSG, args);
-#endif
}
int sendmsg(int a, const struct msghdr *msg, int flags)
diff --git a/mdk-stage1/dietlibc/lib/sendto.c b/mdk-stage1/dietlibc/lib/sendto.c
index 078c010ea..d3239932b 100644
--- a/mdk-stage1/dietlibc/lib/sendto.c
+++ b/mdk-stage1/dietlibc/lib/sendto.c
@@ -1,15 +1,13 @@
-#include <linux/net.h>
+#include <sys/socket.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
+int __libc_sendto(int a, const void * b, size_t c, int flags, void *to, int tolen);
int __libc_sendto(int a, const void * b, size_t c, int flags, void *to, int tolen) {
-#ifdef __i386__
- return socketcall(SYS_SENDTO, (long*)&a);
-#else
unsigned long args[] = { a, (long) b, c, flags, (long) to, tolen };
return socketcall(SYS_SENDTO, args);
-#endif
}
-int sendto(int a, const void * b, size_t c, int flags, void *to, int tolen)
+int sendto(int a, const void * b, size_t c, int flags, const struct sockaddr* to, socklen_t tolen)
__attribute__ ((weak, alias("__libc_sendto")));
diff --git a/mdk-stage1/dietlibc/lib/set_errno.c b/mdk-stage1/dietlibc/lib/set_errno.c
deleted file mode 100644
index 6553bc496..000000000
--- a/mdk-stage1/dietlibc/lib/set_errno.c
+++ /dev/null
@@ -1,9 +0,0 @@
-extern int errno;
-
-void __set_errno(int error) __attribute__ ((weak));
-
-void __set_errno(int error)
-{
- errno=error;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/setlinebuf.c b/mdk-stage1/dietlibc/lib/setlinebuf.c
new file mode 100644
index 000000000..1f30e183a
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/setlinebuf.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+#include "dietwarning.h"
+#undef setlinebuf
+
+/* there is no previous prototype because it is a #define */
+void setlinebuf(FILE* stream);
+
+void setlinebuf(FILE* stream) {
+ setvbuf(stream,0,_IOLBF,BUFSIZ);
+}
+
+link_warning("setlinebuf","warning: you used setlinebuf without including <stdio.h>")
diff --git a/mdk-stage1/dietlibc/lib/setsockopt.c b/mdk-stage1/dietlibc/lib/setsockopt.c
index 781e9c31c..e4bab349f 100644
--- a/mdk-stage1/dietlibc/lib/setsockopt.c
+++ b/mdk-stage1/dietlibc/lib/setsockopt.c
@@ -1,13 +1,12 @@
-#include <linux/net.h>
+#include <linuxnet.h>
+#include <sys/socket.h>
extern int socketcall(int callno,long* args);
-int setsockopt(int a, int b, int c, void *d, void *e) {
-#ifdef __i386__
- return socketcall(SYS_SETSOCKOPT, (long*)&a);
-#else
+int __libc_setsockopt(int a, int b, int c, void *d, void *e);
+int __libc_setsockopt(int a, int b, int c, void *d, void *e) {
unsigned long args[] = { a, b, c, (long)d, (long) e };
return socketcall(SYS_SETSOCKOPT, args);
-#endif
}
+int setsockopt(int s, int level, int optname, const void* optval, socklen_t optlen) __attribute__((weak,alias("__libc_setsockopt")));
diff --git a/mdk-stage1/dietlibc/lib/shmat.c b/mdk-stage1/dietlibc/lib/shmat.c
index 63284b1ea..d4b34c120 100644
--- a/mdk-stage1/dietlibc/lib/shmat.c
+++ b/mdk-stage1/dietlibc/lib/shmat.c
@@ -1,15 +1,14 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
-#include <asm/ipc.h>
-extern void* __ipc();
+extern void* __ipc(int,int,int,void*,const void*);
void* shmat(int shmid,const void* shmaddr,int shmflg) {
void* raddr;
register void* result;
result=__ipc(SHMAT,shmid,shmflg,&raddr,shmaddr);
- if ((unsigned long)result <= -(unsigned long)SHMLBA)
+ if ((unsigned long)result <= -(unsigned long)8196)
result=raddr;
return result;
}
diff --git a/mdk-stage1/dietlibc/lib/shmctl.c b/mdk-stage1/dietlibc/lib/shmctl.c
index 8f942f2a4..92b9d1fbb 100644
--- a/mdk-stage1/dietlibc/lib/shmctl.c
+++ b/mdk-stage1/dietlibc/lib/shmctl.c
@@ -1,9 +1,8 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,int,int,int,void*);
int shmctl(int shmid, int cmd, struct shmid_ds *buf) {
return __ipc(SHMCTL,shmid,cmd,0,buf);
diff --git a/mdk-stage1/dietlibc/lib/shmdt.c b/mdk-stage1/dietlibc/lib/shmdt.c
index 36db10f08..54dc6f41b 100644
--- a/mdk-stage1/dietlibc/lib/shmdt.c
+++ b/mdk-stage1/dietlibc/lib/shmdt.c
@@ -1,9 +1,8 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,int,int,int,const void*);
int shmdt(const void* shmaddr) {
return __ipc(SHMDT,0,0,0,shmaddr);
diff --git a/mdk-stage1/dietlibc/lib/shmget.c b/mdk-stage1/dietlibc/lib/shmget.c
index 9b03f5deb..bf1dc2030 100644
--- a/mdk-stage1/dietlibc/lib/shmget.c
+++ b/mdk-stage1/dietlibc/lib/shmget.c
@@ -1,9 +1,8 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
-#include <asm/ipc.h>
-extern int __ipc();
+extern int __ipc(int,key_t,int,int,int);
int shmget(key_t key, int size, int shmflg) {
return __ipc(SHMGET,key,size,shmflg,0);
diff --git a/mdk-stage1/dietlibc/lib/shutdown.c b/mdk-stage1/dietlibc/lib/shutdown.c
index 0a6be6c37..0e7b8755c 100644
--- a/mdk-stage1/dietlibc/lib/shutdown.c
+++ b/mdk-stage1/dietlibc/lib/shutdown.c
@@ -1,14 +1,12 @@
-#include <linux/net.h>
+#include <linuxnet.h>
+#include <sys/socket.h>
extern int socketcall(int callno,long* args);
+int __libc_shutdown(int s, int how);
int __libc_shutdown(int s, int how) {
-#ifdef __i386__
- return socketcall(SYS_SHUTDOWN, (long*)&s);
-#else
unsigned long args[] = { s, (long) how, 0 };
return socketcall(SYS_SHUTDOWN, args);
-#endif
}
int shutdown(int s, int how) __attribute__((weak,alias("__libc_shutdown")));
diff --git a/mdk-stage1/dietlibc/lib/sigaction.c b/mdk-stage1/dietlibc/lib/sigaction.c
new file mode 100644
index 000000000..fe1351f0f
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigaction.c
@@ -0,0 +1,11 @@
+#include <signal.h>
+
+int __rt_sigaction(int signum, const struct sigaction *act, struct sigaction *oldact, long nr);
+
+int __libc_sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
+int __libc_sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) {
+ return __rt_sigaction(signum, act, oldact, _NSIG/8);
+}
+
+int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)
+__attribute__((weak,alias("__libc_sigaction")));
diff --git a/mdk-stage1/dietlibc/lib/sigaddset.c b/mdk-stage1/dietlibc/lib/sigaddset.c
index 8ce69ea77..1c2632e67 100644
--- a/mdk-stage1/dietlibc/lib/sigaddset.c
+++ b/mdk-stage1/dietlibc/lib/sigaddset.c
@@ -1,15 +1,17 @@
-#define __KERNEL__
-#define sigaddset foobar
-#include <asm/signal.h>
-#undef sigaddset
+#include <signal.h>
+#include <errno.h>
-int __sigaddset(sigset_t *set, int signo) {
- unsigned long sig = signo - 1;
- if (_NSIG_WORDS == 1)
- set->sig[0] |= 1UL << sig;
- else
- set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW);
- return 0;
-}
+#define __sigmask(sig) ( ((unsigned long)1) << (((sig)-1) % (8*sizeof(unsigned long))) )
+#define __sigword(sig) ( ((sig)-1) / (8*sizeof(unsigned long)) )
-int sigaddset (sigset_t *env, int signo) __attribute__((weak,alias("__sigaddset")));
+int sigaddset(sigset_t *set, int signo) {
+ if ((signo<1)||(signo>SIGRTMAX)) {
+ (*__errno_location())=EINVAL;
+ return -1;
+ } else {
+ unsigned long __mask = __sigmask (signo);
+ unsigned long __word = __sigword (signo);
+ set->sig[__word]|=__mask;
+ return 0;
+ }
+}
diff --git a/mdk-stage1/dietlibc/lib/sigdelset.c b/mdk-stage1/dietlibc/lib/sigdelset.c
index 2c3385ea8..0c47ce348 100644
--- a/mdk-stage1/dietlibc/lib/sigdelset.c
+++ b/mdk-stage1/dietlibc/lib/sigdelset.c
@@ -1,15 +1,17 @@
-#define __KERNEL__
-#define sigdelset foobar
-#include <asm/signal.h>
-#undef sigdelset
+#include <signal.h>
+#include <errno.h>
-int __sigdelset(sigset_t *set, int signo) {
- unsigned long sig = signo - 1;
- if (_NSIG_WORDS == 1)
- set->sig[0] &= ~(1UL << sig);
- else
- set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW));
- return 0;
-}
+#define __sigmask(sig) ( ((unsigned long)1) << (((sig)-1) % (8*sizeof(unsigned long))) )
+#define __sigword(sig) ( ((sig)-1) / (8*sizeof(unsigned long)) )
-int sigdelset (sigset_t *env, int signo) __attribute__((weak,alias("__sigdelset")));
+int sigdelset(sigset_t *set, int signo) {
+ if ((signo<1)||(signo>SIGRTMAX)) {
+ (*__errno_location())=EINVAL;
+ return -1;
+ } else {
+ unsigned long __mask = __sigmask (signo);
+ unsigned long __word = __sigword (signo);
+ set->sig[__word]&=~__mask;
+ return 0;
+ }
+}
diff --git a/mdk-stage1/dietlibc/lib/sigemptyset.c b/mdk-stage1/dietlibc/lib/sigemptyset.c
index f4532f96e..4efee2550 100644
--- a/mdk-stage1/dietlibc/lib/sigemptyset.c
+++ b/mdk-stage1/dietlibc/lib/sigemptyset.c
@@ -1,14 +1,12 @@
-#define __USE_EXTERN_INLINES 1
#include <signal.h>
-#include <errno.h>
-#include <string.h>
int sigemptyset(sigset_t *set) {
- if (set==NULL) {
- __set_errno(EINVAL);
- return -1;
+ set->sig[0]=0;
+ if (_NSIG_WORDS>1) set->sig[1]=0;
+ if (_NSIG_WORDS>2) {
+ set->sig[2]=0;
+ set->sig[3]=0;
}
- memset(set,0,sizeof(*set));
return 0;
}
diff --git a/mdk-stage1/dietlibc/lib/sigfillset.c b/mdk-stage1/dietlibc/lib/sigfillset.c
index ddac6e391..b4e369fe4 100644
--- a/mdk-stage1/dietlibc/lib/sigfillset.c
+++ b/mdk-stage1/dietlibc/lib/sigfillset.c
@@ -1,11 +1,11 @@
-#define __KERNEL__
-#include <asm/signal.h>
+#include <signal.h>
-int __sigfillset (sigset_t *set) {
- int i;
- for (i=0; i<_NSIG_WORDS; i++)
- set->sig[i]=~0;
+int sigfillset(sigset_t *set) {
+ set->sig[0]=(unsigned long)-1;
+ if (_NSIG_WORDS>1) set->sig[1]=(unsigned long)-1;
+ if (_NSIG_WORDS>2) {
+ set->sig[2]=(unsigned long)-1;
+ set->sig[3]=(unsigned long)-1;
+ }
return 0;
}
-
-int sigfillset(sigset_t *env) __attribute__((weak,alias("__sigfillset")));
diff --git a/mdk-stage1/dietlibc/lib/siginterrupt.c b/mdk-stage1/dietlibc/lib/siginterrupt.c
new file mode 100644
index 000000000..8926f09ed
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/siginterrupt.c
@@ -0,0 +1,17 @@
+#include <signal.h>
+
+int siginterrupt(int sig, int flag) {
+ int ret;
+ struct sigaction act;
+
+ sigaction(sig, 0, &act);
+
+ if (flag)
+ act.sa_flags &= ~SA_RESTART;
+ else
+ act.sa_flags |= SA_RESTART;
+
+ ret = sigaction(sig, &act, 0);
+
+ return ret;
+}
diff --git a/mdk-stage1/dietlibc/lib/sigismember.c b/mdk-stage1/dietlibc/lib/sigismember.c
index 67a258884..8ffe9762a 100644
--- a/mdk-stage1/dietlibc/lib/sigismember.c
+++ b/mdk-stage1/dietlibc/lib/sigismember.c
@@ -1,21 +1,16 @@
-#define __USE_EXTERN_INLINES 1
#include <signal.h>
+#include <errno.h>
-# define __sigmask(sig) \
- (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int))))
+#define __sigmask(sig) ( ((unsigned long)1) << (((sig)-1) % (8*sizeof(unsigned long))) )
+#define __sigword(sig) ( ((sig)-1) / (8*sizeof(unsigned long)) )
-# define __sigword(sig) (((sig) - 1) / (8 * sizeof (unsigned long int)))
-
-# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
-typedef struct
- {
- unsigned long int __val[_SIGSET_NWORDS];
- } __sigset_t;
-
-int __sigismember(const __sigset_t *set, int signo) {
- unsigned long int __mask = __sigmask (signo);
- unsigned long int __word = __sigword (signo);
- return (set->__val[__word] & __mask);
+int sigismember(const sigset_t *set, int signo) {
+ if ((signo<1)||(signo>SIGRTMAX)) {
+ (*__errno_location())=EINVAL;
+ return -1;
+ } else {
+ unsigned long __mask = __sigmask (signo);
+ unsigned long __word = __sigword (signo);
+ return (set->sig[__word] & __mask)?1:0;
+ }
}
-
-int sigismember(const sigset_t *env, int signo) __attribute__((weak,alias("__sigismember")));
diff --git a/mdk-stage1/dietlibc/lib/sigjmp.c b/mdk-stage1/dietlibc/lib/sigjmp.c
index be97c62cc..73c8baa8e 100644
--- a/mdk-stage1/dietlibc/lib/sigjmp.c
+++ b/mdk-stage1/dietlibc/lib/sigjmp.c
@@ -1,35 +1,10 @@
-/* Copyright (C) 1992, 1994, 1997 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 Library General Public License as
- published by the Free Software Foundation; either version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
#include <setjmp.h>
#include <signal.h>
-#include <string.h>
-
-/* This function is called by the `sigsetjmp' macro
- before doing a `__setjmp' on ENV[0].__jmpbuf.
- Always return zero. */
-
-int
-__sigjmp_save (sigjmp_buf env, int savemask)
-{
- env[0].__mask_was_saved = (savemask &&
- sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
- (sigset_t*)&env[0].__saved_mask) == 0);
+int __sigjmp_save(sigjmp_buf env,int savemask);
+int __sigjmp_save(sigjmp_buf env,int savemask) {
+ if (savemask) {
+ env[0].__mask_was_saved=(sigprocmask(SIG_BLOCK,(sigset_t*)0,(sigset_t*)&env[0].__saved_mask)==0);
+ }
return 0;
}
diff --git a/mdk-stage1/dietlibc/lib/signal.c b/mdk-stage1/dietlibc/lib/signal.c
new file mode 100644
index 000000000..eb3672c68
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/signal.c
@@ -0,0 +1,12 @@
+#include <signal.h>
+
+sighandler_t signal(int signum, sighandler_t action) {
+ struct sigaction sa,oa;
+ sa.sa_handler=action;
+ sigemptyset(&sa.sa_mask);
+ sigaddset(&sa.sa_mask,signum);
+ sa.sa_flags=SA_RESTART|SA_NODEFER;
+ if (sigaction(signum,&sa,&oa))
+ return SIG_ERR;
+ return oa.sa_handler;
+}
diff --git a/mdk-stage1/dietlibc/lib/sigpending.c b/mdk-stage1/dietlibc/lib/sigpending.c
new file mode 100644
index 000000000..62a4761c6
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigpending.c
@@ -0,0 +1,7 @@
+#include <signal.h>
+
+int __rt_sigpending(sigset_t *set, long nr);
+
+int sigpending(sigset_t *set) {
+ return __rt_sigpending(set, _NSIG/8);
+}
diff --git a/mdk-stage1/dietlibc/lib/sigprocmask.c b/mdk-stage1/dietlibc/lib/sigprocmask.c
new file mode 100644
index 000000000..6d770c3d3
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigprocmask.c
@@ -0,0 +1,7 @@
+#include <signal.h>
+
+int __rt_sigprocmask(int how, const sigset_t *set, sigset_t *oldsetm, long nr);
+
+int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) {
+ return __rt_sigprocmask(how, set, oldset, _NSIG/8);
+}
diff --git a/mdk-stage1/dietlibc/lib/sigqueueinfo.c b/mdk-stage1/dietlibc/lib/sigqueueinfo.c
new file mode 100644
index 000000000..adb7349f4
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigqueueinfo.c
@@ -0,0 +1,7 @@
+#include <signal.h>
+
+int __rt_sigqueueinfo(int pid, int sig, siginfo_t *info);
+
+int sigqueueinfo(int pid, int sig, siginfo_t *info) {
+ return __rt_sigqueueinfo(pid, sig, info);
+}
diff --git a/mdk-stage1/dietlibc/lib/sigsuspend.c b/mdk-stage1/dietlibc/lib/sigsuspend.c
new file mode 100644
index 000000000..a020789e9
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigsuspend.c
@@ -0,0 +1,10 @@
+#include <signal.h>
+
+int __rt_sigsuspend(const sigset_t *mask, long nr);
+
+int __libc_sigsuspend(const sigset_t *mask);
+int __libc_sigsuspend(const sigset_t *mask) {
+ return __rt_sigsuspend(mask, _NSIG/8);
+}
+
+int sigsuspend(const sigset_t *mask) __attribute__((weak,alias("__libc_sigsuspend")));
diff --git a/mdk-stage1/dietlibc/lib/sigtimedwait.c b/mdk-stage1/dietlibc/lib/sigtimedwait.c
new file mode 100644
index 000000000..864e433c3
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigtimedwait.c
@@ -0,0 +1,7 @@
+#include <signal.h>
+
+int __rt_sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *ts, long nr);
+
+int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *ts) {
+ return __rt_sigtimedwait(set,info,ts,_NSIG/8);
+}
diff --git a/mdk-stage1/dietlibc/lib/sleep.c b/mdk-stage1/dietlibc/lib/sleep.c
index ec5b99533..45c51f1b6 100644
--- a/mdk-stage1/dietlibc/lib/sleep.c
+++ b/mdk-stage1/dietlibc/lib/sleep.c
@@ -1,4 +1,4 @@
-#include <linux/time.h>
+#include <unistd.h>
#include <time.h>
unsigned int sleep(unsigned int secs) {
diff --git a/mdk-stage1/dietlibc/lib/snprintf.c b/mdk-stage1/dietlibc/lib/snprintf.c
index 096c06115..141b4ec13 100644
--- a/mdk-stage1/dietlibc/lib/snprintf.c
+++ b/mdk-stage1/dietlibc/lib/snprintf.c
@@ -1,7 +1,6 @@
#include <stdarg.h>
#include <sys/types.h>
-
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
+#include <stdio.h>
int snprintf(char *str,size_t size,const char *format,...)
{
diff --git a/mdk-stage1/dietlibc/lib/socket.c b/mdk-stage1/dietlibc/lib/socket.c
index 1684a6a2b..c18df5123 100644
--- a/mdk-stage1/dietlibc/lib/socket.c
+++ b/mdk-stage1/dietlibc/lib/socket.c
@@ -1,12 +1,11 @@
-#include <linux/net.h>
+#include <linuxnet.h>
extern int socketcall(int callno,long* args);
-int socket(int a, int b, int c) {
-#ifdef __i386__
- return socketcall(SYS_SOCKET, (long*)&a);
-#else
+int __libc_socket(int a, int b, int c);
+int __libc_socket(int a, int b, int c) {
unsigned long args[] = { a, b, c };
return socketcall(SYS_SOCKET, args);
-#endif
}
+
+int socket(int a,int b,int c) __attribute__((weak,alias("__libc_socket")));
diff --git a/mdk-stage1/dietlibc/lib/socketpair.c b/mdk-stage1/dietlibc/lib/socketpair.c
new file mode 100644
index 000000000..e6f1fd822
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/socketpair.c
@@ -0,0 +1,12 @@
+#include <linuxnet.h>
+
+extern int socketcall(int callno,long* args);
+
+int __libc_socketpair(int a, int type, int protocol, int sv[2]);
+int __libc_socketpair(int a, int type, int protocol, int sv[2]) {
+ unsigned long args[] = { a, type, protocol, (long)sv };
+ return socketcall(SYS_SOCKETPAIR, args);
+}
+
+int socketpair(int d, int type, int protocol, int sv[2])
+ __attribute__((weak,alias("__libc_socketpair")));
diff --git a/mdk-stage1/dietlibc/lib/speed.c b/mdk-stage1/dietlibc/lib/speed.c
deleted file mode 100644
index a7fcca7c9..000000000
--- a/mdk-stage1/dietlibc/lib/speed.c
+++ /dev/null
@@ -1,67 +0,0 @@
-#include <unistd.h>
-#include <termios.h>
-#include <sys/types.h>
-
-#include <asm/errno.h>
-
-extern int errno;
-
-/* Hack around a kernel bug; value must correspond to the one used in tcsetattr.c */
-#define IBAUD0 020000000000
-
-
-/* Return the output baud rate stored in *TERMIOS_P. */
-speed_t cfgetospeed (struct termios *termios_p)
-{
- return termios_p->c_cflag & (CBAUD | CBAUDEX);
-}
-
-
-/* Return the input baud rate stored in *TERMIOS_P.
- Although for Linux there is no difference between input and output
- speed, the numerical 0 is a special case for the input baud rate. It
- should set the input baud rate to the output baud rate. */
-speed_t cfgetispeed (struct termios *termios_p)
-{
- return ((termios_p->c_iflag & IBAUD0)
- ? 0 : termios_p->c_cflag & (CBAUD | CBAUDEX));
-}
-
-
-/* Set the output baud rate stored in *TERMIOS_P to SPEED. */
-int cfsetospeed (struct termios *termios_p, speed_t speed)
-{
- if ((speed & ~CBAUD) != 0 && (speed < B57600 || speed > B460800)) {
- errno = EINVAL;
- return -1;
- }
-
- termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
- termios_p->c_cflag |= speed;
-
- return 0;
-}
-
-
-/* Set the input baud rate stored in *TERMIOS_P to SPEED.
- Although for Linux there is no difference between input and output
- speed, the numerical 0 is a special case for the input baud rate. It
- should set the input baud rate to the output baud rate. */
-int cfsetispeed (struct termios *termios_p, speed_t speed)
-{
- if ((speed & ~CBAUD) != 0 && (speed < B57600 || speed > B460800)) {
- errno = EINVAL;
- return -1;
- }
-
- if (speed == 0)
- termios_p->c_iflag |= IBAUD0;
- else
- {
- termios_p->c_iflag &= ~IBAUD0;
- termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
- termios_p->c_cflag |= speed;
- }
-
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/sprintf.c b/mdk-stage1/dietlibc/lib/sprintf.c
index b355d01f9..37fd831d9 100644
--- a/mdk-stage1/dietlibc/lib/sprintf.c
+++ b/mdk-stage1/dietlibc/lib/sprintf.c
@@ -1,18 +1,14 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <stdlib.h>
-#include "dietwarning.h"
-
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
+#include <stdio.h>
int sprintf(char *dest,const char *format,...)
{
int n;
va_list arg_ptr;
va_start(arg_ptr, format);
- n=vsnprintf(dest,1000000,format,arg_ptr);
+ n=vsprintf(dest,format,arg_ptr);
va_end (arg_ptr);
return n;
}
-
-link_warning("sprintf","warning: Avoid sprintf; use snprintf. It is more secure and faster.")
diff --git a/mdk-stage1/dietlibc/lib/sscanf.c b/mdk-stage1/dietlibc/lib/sscanf.c
index 341e74bba..e608878ef 100644
--- a/mdk-stage1/dietlibc/lib/sscanf.c
+++ b/mdk-stage1/dietlibc/lib/sscanf.c
@@ -1,6 +1,5 @@
#include <stdarg.h>
-
-int vsscanf(const char *str, const char *format, va_list arg_ptr);
+#include <stdio.h>
int sscanf(const char *str, const char *format, ...)
{
diff --git a/mdk-stage1/dietlibc/lib/strcasecmp.c b/mdk-stage1/dietlibc/lib/strcasecmp.c
index d978488a4..cf1592567 100644
--- a/mdk-stage1/dietlibc/lib/strcasecmp.c
+++ b/mdk-stage1/dietlibc/lib/strcasecmp.c
@@ -1,17 +1,18 @@
-#include <ctype.h>
-#include "dietfeatures.h"
+#include <strings.h>
-int strcasecmp(register const char *s,register const char *t) {
- register char x;
+int strcasecmp ( const char* s1, const char* s2 )
+{
+ register unsigned int x2;
+ register unsigned int x1;
- for (;;) {
- x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t;
-#ifndef WANT_SMALL_STRING_ROUTINES
- x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t;
- x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t;
- x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t;
-#endif
- }
- return ((int)(unsigned int)(unsigned char) x)
- - ((int)(unsigned int)(unsigned char) *t);
+ while (1) {
+ x2 = *s2++ - 'A'; if (x2 < 26u) x2 += 32;
+ x1 = *s1++ - 'A'; if (x1 < 26u) x1 += 32;
+ if ( x2 != x1 )
+ break;
+ if ( x1 == (unsigned int)-'A' )
+ break;
+ }
+
+ return x1 - x2;
}
diff --git a/mdk-stage1/dietlibc/lib/strchr.c b/mdk-stage1/dietlibc/lib/strchr.c
index 0c2050da6..3a4c9b5b4 100644
--- a/mdk-stage1/dietlibc/lib/strchr.c
+++ b/mdk-stage1/dietlibc/lib/strchr.c
@@ -1,4 +1,5 @@
#include "dietfeatures.h"
+#include <string.h>
char *strchr(register const char *t, int c) {
register char ch;
diff --git a/mdk-stage1/dietlibc/lib/strcmp.c b/mdk-stage1/dietlibc/lib/strcmp.c
index 0db324e66..3892379e5 100644
--- a/mdk-stage1/dietlibc/lib/strcmp.c
+++ b/mdk-stage1/dietlibc/lib/strcmp.c
@@ -14,3 +14,5 @@ int strcmp(register const char *s,register const char *t) {
return ((int)(unsigned int)(unsigned char) x)
- ((int)(unsigned int)(unsigned char) *t);
}
+
+int strcoll(const char *s,const char* t) __attribute__((weak,alias("strcmp")));
diff --git a/mdk-stage1/dietlibc/lib/strcpy.c b/mdk-stage1/dietlibc/lib/strcpy.c
index 49693c30d..444054e71 100644
--- a/mdk-stage1/dietlibc/lib/strcpy.c
+++ b/mdk-stage1/dietlibc/lib/strcpy.c
@@ -3,13 +3,16 @@
char* strcpy(register char* s,register const char* t)
{
char *dest=s;
+#ifndef WANT_SMALL_STRING_ROUTINES
for (;;) {
if (!(*s = *t)) return dest; ++s; ++t;
-#ifndef WANT_SMALL_STRING_ROUTINES
if (!(*s = *t)) return dest; ++s; ++t;
if (!(*s = *t)) return dest; ++s; ++t;
if (!(*s = *t)) return dest; ++s; ++t;
-#endif
}
+#else
+ while ((*dest++=*t++));
+ return s;
+#endif
}
diff --git a/mdk-stage1/dietlibc/lib/strerror.c b/mdk-stage1/dietlibc/lib/strerror.c
index f15b86aae..f3ef07334 100644
--- a/mdk-stage1/dietlibc/lib/strerror.c
+++ b/mdk-stage1/dietlibc/lib/strerror.c
@@ -1,10 +1,17 @@
+#include "dietfeatures.h"
+#include <unistd.h>
#include <string.h>
-extern char *sys_errlist[];
-extern int sys_nerr;
+#define _BSD_SOURCE
+#include <errno.h>
-char *strerror(int errnum) {
- if (errnum>=0 && errnum<sys_nerr)
- return sys_errlist[errnum];
- return "[unknown error]";
+extern const char __sys_err_unknown [];
+
+char* strerror ( int errnum )
+{
+ register const char* message = __sys_err_unknown;
+
+ if ( (unsigned int)errnum < (unsigned int)__SYS_NERR )
+ message = sys_errlist [errnum];
+ return (char*)message;
}
diff --git a/mdk-stage1/dietlibc/lib/strlen.c b/mdk-stage1/dietlibc/lib/strlen.c
index 56c085dac..96da5a540 100644
--- a/mdk-stage1/dietlibc/lib/strlen.c
+++ b/mdk-stage1/dietlibc/lib/strlen.c
@@ -4,7 +4,7 @@
#ifdef WANT_SMALL_STRING_ROUTINES
size_t strlen(const char *s) {
- register int i;
+ register size_t i;
if (!s) return 0;
for (i=0; *s; ++s) ++i;
return i;
diff --git a/mdk-stage1/dietlibc/lib/strncasecmp.c b/mdk-stage1/dietlibc/lib/strncasecmp.c
index 8a5445e53..543fe56ba 100644
--- a/mdk-stage1/dietlibc/lib/strncasecmp.c
+++ b/mdk-stage1/dietlibc/lib/strncasecmp.c
@@ -1,18 +1,22 @@
-#include <ctype.h>
#include <sys/types.h>
-#include <string.h>
+#include <strings.h>
-int strncasecmp(const char *s, const char *t, size_t n) {
- register char x;
- register const char* u=s+n;
- for (;;) {
- x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t;
-#ifndef WANT_SMALL_STRING_ROUTINES
- x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t;
- x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t;
- x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t;
-#endif
- }
- return ((int)(unsigned int)(unsigned char) x)
- - ((int)(unsigned int)(unsigned char) *t);
+int strncasecmp ( const char* s1, const char* s2, size_t len )
+{
+ register unsigned int x2;
+ register unsigned int x1;
+ register const char* end = s1 + len;
+
+ while (1) {
+ if ( s1 >= end )
+ return 0;
+ x2 = *s2++ - 'A'; if (x2 < 26u) x2 += 32;
+ x1 = *s1++ - 'A'; if (x1 < 26u) x1 += 32;
+ if ( x2 != x1 )
+ break;
+ if ( x1 == (unsigned int)-'A' )
+ break;
+ }
+
+ return x1 - x2;
}
diff --git a/mdk-stage1/dietlibc/lib/strncat.c b/mdk-stage1/dietlibc/lib/strncat.c
index a08e97916..9802d5678 100644
--- a/mdk-stage1/dietlibc/lib/strncat.c
+++ b/mdk-stage1/dietlibc/lib/strncat.c
@@ -9,14 +9,16 @@
* the last written bytes is always '\0'. */
#endif
+/* gcc is broken and has a non-SUSv2 compliant internal prototype.
+ * This causes it to warn about a type mismatch here. Ignore it. */
char *strncat(char *s, const char *t, size_t n) {
char *dest=s;
register char *max;
s+=strlen(s);
#ifdef WANT_NON_COMPLIANT_STRNCAT
- max=s+n-1;
+ if ((max=s+n-1)<=s) goto fini;
#else
- max=s+n;
+ if ((max=s+n)==s) goto fini;
#endif
for (;;) {
if (!(*s = *t)) break; if (++s==max) break; ++t;
@@ -27,5 +29,6 @@ char *strncat(char *s, const char *t, size_t n) {
#endif
}
*s=0;
+fini:
return dest;
}
diff --git a/mdk-stage1/dietlibc/lib/strncmp.c b/mdk-stage1/dietlibc/lib/strncmp.c
index 7c08c0fa7..b3b56cfbb 100644
--- a/mdk-stage1/dietlibc/lib/strncmp.c
+++ b/mdk-stage1/dietlibc/lib/strncmp.c
@@ -1,6 +1,17 @@
#include <sys/types.h>
#include <string.h>
+/* gcc is broken and has a non-SUSv2 compliant internal prototype.
+ * This causes it to warn about a type mismatch here. Ignore it. */
int strncmp(const char *s1, const char *s2, size_t n) {
- return memccmp(s1,s2,0,n);
+ register const char* a=s1;
+ register const char* b=s2;
+ register const char* fini=a+n;
+ while (a<fini) {
+ register int res=*a-*b;
+ if (res) return res;
+ if (!*a) return 0;
+ ++a; ++b;
+ }
+ return 0;
}
diff --git a/mdk-stage1/dietlibc/lib/strncpy.c b/mdk-stage1/dietlibc/lib/strncpy.c
index 531387b7f..31b682a1e 100644
--- a/mdk-stage1/dietlibc/lib/strncpy.c
+++ b/mdk-stage1/dietlibc/lib/strncpy.c
@@ -2,9 +2,14 @@
#define _XOPEN_SOURCE
#include <sys/types.h>
#include <string.h>
+#include "dietfeatures.h"
-char *strncpy(char *dest, const char *src, size_t n)
-{
+/* gcc is broken and has a non-SUSv2 compliant internal prototype.
+ * This causes it to warn about a type mismatch here. Ignore it. */
+char *strncpy(char *dest, const char *src, size_t n) {
+#ifdef WANT_FULL_POSIX_COMPAT
+ memset(dest,0,n);
+#endif
memccpy(dest,src,0,n);
return dest;
}
diff --git a/mdk-stage1/dietlibc/lib/strsep.c b/mdk-stage1/dietlibc/lib/strsep.c
index a1bf1872a..db76f89b5 100644
--- a/mdk-stage1/dietlibc/lib/strsep.c
+++ b/mdk-stage1/dietlibc/lib/strsep.c
@@ -4,6 +4,7 @@ char *strsep(char **stringp, const char *delim) {
register char *tmp=*stringp;
register char *tmp2=tmp;
register const char *tmp3;
+ if (!*stringp) return 0;
for (tmp2=tmp; *tmp2; ++tmp2) {
for (tmp3=delim; *tmp3; ++tmp3)
if (*tmp2==*tmp3) { /* delimiter found */
@@ -12,5 +13,6 @@ char *strsep(char **stringp, const char *delim) {
return tmp;
}
}
- return 0;
+ *stringp=0;
+ return tmp;
}
diff --git a/mdk-stage1/dietlibc/lib/strstr.c b/mdk-stage1/dietlibc/lib/strstr.c
index 641d9d7ac..0632cc28a 100644
--- a/mdk-stage1/dietlibc/lib/strstr.c
+++ b/mdk-stage1/dietlibc/lib/strstr.c
@@ -2,12 +2,14 @@
#include <string.h>
char *strstr(const char *haystack, const char *needle) {
- int nl=strlen(needle);
- int hl=strlen(haystack);
+ size_t nl=strlen(needle);
+ size_t hl=strlen(haystack);
int i;
+ if (!nl) goto found;
if (nl>hl) return 0;
for (i=hl-nl+1; i; --i) {
- if (!memcmp(haystack,needle,nl))
+ if (*haystack==*needle && !memcmp(haystack,needle,nl))
+found:
return (char*)haystack;
++haystack;
}
diff --git a/mdk-stage1/dietlibc/lib/strtod.c b/mdk-stage1/dietlibc/lib/strtod.c
index cbe983d84..5d50cc535 100644
--- a/mdk-stage1/dietlibc/lib/strtod.c
+++ b/mdk-stage1/dietlibc/lib/strtod.c
@@ -1,52 +1,66 @@
#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
-extern char isspace(char c);
-
-#ifdef __GNUC__
-static inline char isdigit(char c) { return (c>='0' && c<='9'); }
-#endif
-
-double strtod(const char *nptr, char **endptr) {
- double d=0;
- register const char *c=nptr;
- char neg=0;
- while (*c && isspace(*c)) ++c;
- switch (*c) {
- case '-': neg=1;
- case '+': c++; break;
- default: break;
- }
- while (isdigit(*c)) {
- d=d*10+(*c-'0');
- ++c;
- }
- if (*c=='.') {
- double factor=.1;
- while (isdigit(*++c)) {
- d=d+(factor*(*c-'0'));
- factor/=10;
+double strtod(const char* s, char** endptr) {
+ register const char* p = s;
+ register long double value = 0.L;
+ int sign = +1;
+ long double factor;
+ unsigned int expo;
+
+ while ( isspace(*p) )
+ p++;
+
+ switch (*p) {
+ case '-': sign = -1;
+ case '+': p++;
+ default : break;
}
- }
- if ((*c|32)=='e') {
- int exp=0;
- double factor=10;
- if (c[1]<'0') {
- switch (c[1]) {
- case '-': factor=0.1;
- case '+': c++; break;
- default:
- d=0;
- c=nptr;
- goto done;
- }
+
+ while ( (unsigned int)(*p - '0') < 10u )
+ value = value*10 + (*p++ - '0');
+
+ if ( *p == '.' ) {
+ factor = 1.;
+
+ p++;
+ while ( (unsigned int)(*p - '0') < 10u ) {
+ factor *= 0.1;
+ value += (*p++ - '0') * factor;
+ }
}
- while (isdigit(*++c))
- exp=exp*10+(*c-'0');
- while (exp) { /* XXX: this introduces rounding errors */
- d*=factor; --exp;
+
+ if ( (*p | 32) == 'e' ) {
+ expo = 0;
+ factor = 10.L;
+
+ switch (*++p) { // ja hier weiß ich nicht, was mindestens nach einem 'E' folgenden MUSS.
+ case '-': factor = 0.1;
+ case '+': p++;
+ break;
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
+ break;
+ default : value = 0.L;
+ p = s;
+ goto done;
+ }
+
+ while ( (unsigned int)(*p - '0') < 10u )
+ expo = 10 * expo + (*p++ - '0');
+
+ while ( 1 ) {
+ if ( expo & 1 )
+ value *= factor;
+ if ( (expo >>= 1) == 0 )
+ break;
+ factor *= factor;
+ }
}
- }
+
done:
- if (endptr) *endptr=(char*)c;
- return d;
+ if ( endptr != NULL )
+ *endptr = (char*)p;
+
+ return value * sign;
}
diff --git a/mdk-stage1/dietlibc/lib/strtof.c b/mdk-stage1/dietlibc/lib/strtof.c
new file mode 100644
index 000000000..acb081e51
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtof.c
@@ -0,0 +1,66 @@
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+float strtof(const char* s, char** endptr) {
+ register const char* p = s;
+ register float value = 0.;
+ int sign = +1;
+ float factor;
+ unsigned int expo;
+
+ while ( isspace(*p) )
+ p++;
+
+ switch (*p) {
+ case '-': sign = -1;
+ case '+': p++;
+ default : break;
+ }
+
+ while ( (unsigned int)(*p - '0') < 10u )
+ value = value*10 + (*p++ - '0');
+
+ if ( *p == '.' ) {
+ factor = 1.;
+
+ p++;
+ while ( (unsigned int)(*p - '0') < 10u ) {
+ factor *= 0.1;
+ value += (*p++ - '0') * factor;
+ }
+ }
+
+ if ( (*p | 32) == 'e' ) {
+ expo = 0;
+ factor = 10.L;
+
+ switch (*++p) { // ja hier weiß ich nicht, was mindestens nach einem 'E' folgenden MUSS.
+ case '-': factor = 0.1;
+ case '+': p++;
+ break;
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
+ break;
+ default : value = 0.L;
+ p = s;
+ goto done;
+ }
+
+ while ( (unsigned int)(*p - '0') < 10u )
+ expo = 10 * expo + (*p++ - '0');
+
+ while ( 1 ) {
+ if ( expo & 1 )
+ value *= factor;
+ if ( (expo >>= 1) == 0 )
+ break;
+ factor *= factor;
+ }
+ }
+
+done:
+ if ( endptr != NULL )
+ *endptr = (char*)p;
+
+ return value * sign;
+}
diff --git a/mdk-stage1/dietlibc/lib/strtok.c b/mdk-stage1/dietlibc/lib/strtok.c
index 86337da7b..e041703e3 100644
--- a/mdk-stage1/dietlibc/lib/strtok.c
+++ b/mdk-stage1/dietlibc/lib/strtok.c
@@ -1,4 +1,4 @@
-char *strtok_r(char *s, const char *delim, char **ptrptr);
+#include <string.h>
static char *strtok_pos;
diff --git a/mdk-stage1/dietlibc/lib/strtol.c b/mdk-stage1/dietlibc/lib/strtol.c
index ead89f408..2624aca0e 100644
--- a/mdk-stage1/dietlibc/lib/strtol.c
+++ b/mdk-stage1/dietlibc/lib/strtol.c
@@ -1,7 +1,10 @@
#include <ctype.h>
+#include "dietfeatures.h"
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
-extern unsigned long int strtoul(const char *nptr, char **endptr, int base);
-
+#define ABS_LONG_MIN 2147483648UL
long int strtol(const char *nptr, char **endptr, int base)
{
int neg=0;
@@ -9,7 +12,15 @@ long int strtol(const char *nptr, char **endptr, int base)
while(isspace(*nptr)) nptr++;
- if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; }
+ if (*nptr == '-') { neg=-1; ++nptr; }
v=strtoul(nptr,endptr,base);
+ if (v>=ABS_LONG_MIN) {
+ if (v==ABS_LONG_MIN && neg) {
+ errno=0;
+ return v;
+ }
+ errno=ERANGE;
+ return (neg?LONG_MIN:LONG_MAX);
+ }
return (neg?-v:v);
}
diff --git a/mdk-stage1/dietlibc/lib/strtold.c b/mdk-stage1/dietlibc/lib/strtold.c
new file mode 100644
index 000000000..ae5f0fa48
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtold.c
@@ -0,0 +1,66 @@
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+long double strtold(const char* s, char** endptr) {
+ register const char* p = s;
+ register long double value = 0.L;
+ int sign = +1;
+ long double factor;
+ unsigned int expo;
+
+ while ( isspace(*p) )
+ p++;
+
+ switch (*p) {
+ case '-': sign = -1;
+ case '+': p++;
+ default : break;
+ }
+
+ while ( (unsigned int)(*p - '0') < 10u )
+ value = value*10 + (*p++ - '0');
+
+ if ( *p == '.' ) {
+ factor = 1.;
+
+ p++;
+ while ( (unsigned int)(*p - '0') < 10u ) {
+ factor *= 0.1;
+ value += (*p++ - '0') * factor;
+ }
+ }
+
+ if ( (*p | 32) == 'e' ) {
+ expo = 0;
+ factor = 10.L;
+
+ switch (*++p) { // ja hier weiß ich nicht, was mindestens nach einem 'E' folgenden MUSS.
+ case '-': factor = 0.1;
+ case '+': p++;
+ break;
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
+ break;
+ default : value = 0.L;
+ p = s;
+ goto done;
+ }
+
+ while ( (unsigned int)(*p - '0') < 10u )
+ expo = 10 * expo + (*p++ - '0');
+
+ while ( 1 ) {
+ if ( expo & 1 )
+ value *= factor;
+ if ( (expo >>= 1) == 0 )
+ break;
+ factor *= factor;
+ }
+ }
+
+done:
+ if ( endptr != NULL )
+ *endptr = (char*)p;
+
+ return value * sign;
+}
diff --git a/mdk-stage1/dietlibc/lib/strtoll.c b/mdk-stage1/dietlibc/lib/strtoll.c
index 7b8e28a1d..9e05e740e 100644
--- a/mdk-stage1/dietlibc/lib/strtoll.c
+++ b/mdk-stage1/dietlibc/lib/strtoll.c
@@ -1,8 +1,7 @@
#include <ctype.h>
+#include <stdlib.h>
-extern unsigned long int strtoull(const char *nptr, char **endptr, int base);
-
-long int strtoll(const char *nptr, char **endptr, int base)
+long long int strtoll(const char *nptr, char **endptr, int base)
{
int neg=0;
unsigned long long int v;
diff --git a/mdk-stage1/dietlibc/lib/strtoul.c b/mdk-stage1/dietlibc/lib/strtoul.c
index 3f93962a9..e9c09fb59 100644
--- a/mdk-stage1/dietlibc/lib/strtoul.c
+++ b/mdk-stage1/dietlibc/lib/strtoul.c
@@ -1,32 +1,44 @@
#include <ctype.h>
-
-/* static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; */
+#include "dietfeatures.h"
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
unsigned long int strtoul(const char *nptr, char **endptr, int base)
{
- long int v=0;
+ int neg = 0;
+ unsigned long int v=0;
while(isspace(*nptr)) ++nptr;
-
+ if (*nptr == '-') { neg=1; nptr++; }
if (*nptr == '+') ++nptr;
+ if (base==16 && nptr[0]=='0') goto skip0x;
if (!base) {
if (*nptr=='0') {
base=8;
- if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) {
+skip0x:
+ if (nptr[1]=='x'||nptr[1]=='X') {
nptr+=2;
base=16;
}
- }
- else
+ } else
base=10;
}
while(*nptr) {
register unsigned char c=*nptr;
- c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c-'0');
+ c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c<='9'?c-'0':0xff);
if (c>=base) break;
- v=v*base+c;
+ {
+ register unsigned long int w=v*base;
+ if (w<v) {
+ errno=ERANGE;
+ return ULONG_MAX;
+ }
+ v=w+c;
+ }
++nptr;
}
if (endptr) *endptr=(char *)nptr;
- return v;
+ errno=0; /* in case v==ULONG_MAX, ugh! */
+ return (neg?-v:v);
}
diff --git a/mdk-stage1/dietlibc/lib/strtoull.c b/mdk-stage1/dietlibc/lib/strtoull.c
index 40818958d..d6073e32a 100644
--- a/mdk-stage1/dietlibc/lib/strtoull.c
+++ b/mdk-stage1/dietlibc/lib/strtoull.c
@@ -1,4 +1,5 @@
#include <ctype.h>
+#include <stdlib.h>
unsigned long long int strtoull(const char *nptr, char **endptr, int base)
{
diff --git a/mdk-stage1/dietlibc/lib/strxfrm.c b/mdk-stage1/dietlibc/lib/strxfrm.c
new file mode 100644
index 000000000..5075ff0b5
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strxfrm.c
@@ -0,0 +1,12 @@
+#include <sys/types.h>
+#include <string.h>
+#include "dietfeatures.h"
+
+size_t strxfrm(char *dest, const char *src, size_t n) {
+#ifdef WANT_FULL_POSIX_COMPAT
+ memset(dest,0,n);
+#endif
+ memccpy(dest,src,0,n);
+ return strlen(dest);
+}
+
diff --git a/mdk-stage1/dietlibc/lib/sys_siglist.c b/mdk-stage1/dietlibc/lib/sys_siglist.c
index 80d7b3fb0..a753848d9 100644
--- a/mdk-stage1/dietlibc/lib/sys_siglist.c
+++ b/mdk-stage1/dietlibc/lib/sys_siglist.c
@@ -1,37 +1,174 @@
-const char *const sys_siglist[] =
- {
- "Signal 0",
- "Hangup",
- "Interrupt",
- "Quit",
- "Illegal instruction",
- "Trace/breakpoint trap",
- "IOT trap",
- "EMT trap",
- "Floating point exception",
- "Killed",
- "Bus error",
- "Segmentation fault",
- "Bad system call",
- "Broken pipe",
- "Alarm clock",
- "Terminated",
- "Urgent I/O condition",
- "Stopped (signal)",
- "Stopped",
- "Continued",
- "Child exited",
- "Stopped (tty input)",
- "Stopped (tty output)",
- "I/O possible",
- "CPU time limit exceeded",
- "File size limit exceeded",
- "Virtual timer expired",
- "Profiling timer expired",
- "Window changed",
- "Resource lost",
- "User defined signal 1",
- "User defined signal 2",
- 0
- };
+const char *const sys_siglist[] = {
+ "Signal 0",
+ "Hangup",
+ "Interrupt",
+ "Quit",
+ "Illegal instruction",
+ "Trace/breakpoint trap",
+ "ABRT/IOT trap",
+#if defined(__alpha__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__)
+ "EMT trap",
+#else
+ "Bus error",
+#endif
+ "Floating point exception",
+ "Killed",
+#if defined(__alpha__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__)
+ "Bus error",
+#else
+ "User defined signal 1",
+#endif
+ "Segmentation fault",
+#if defined(__alpha__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__)
+ "Bad system call",
+#else
+ "User defined signal 2",
+#endif
+ "Broken pipe",
+ "Alarm clock",
+ "Terminated",
+#if defined(__hppa__)
+ "User defined signal 1",
+ "User defined signal 2",
+ "Child exited",
+ "Power lost",
+ "Virtual timer expired",
+ "Profiling timer expired",
+ "I/O possible",
+ "Window changed",
+ "Stopped (signal)",
+ "Stopped",
+ "Continued",
+ "Stopped (tty input)",
+ "Stopped (tty output)",
+ "Urgent I/O condition",
+ "Power lost",
+ "Unknown",
+ "Unknown",
+ "CPU time limit exceeded",
+ "File size limit exceeded",
+ "Unknown",
+ "Stack fault",
+#elif defined(__mips__)
+ "User defined signal 1",
+ "User defined signal 2",
+ "Child exited",
+ "Power lost",
+ "Window changed",
+ "Urgent I/O condition",
+ "I/O possible",
+ "Stopped (signal)",
+ "Stopped",
+ "Continued",
+ "Stopped (tty input)",
+ "Stopped (tty output)",
+ "Virtual timer expired",
+ "Profiling timer expired",
+ "CPU time limit exceeded",
+ "File size limit exceeded",
+#elif defined(__alpha__) || defined(__sparc__)
+ "Urgent I/O condition",
+ "Stopped (signal)",
+ "Stopped",
+ "Continued",
+ "Child exited",
+ "Stopped (tty input)",
+ "Stopped (tty output)",
+ "I/O possible",
+ "CPU time limit exceeded",
+ "File size limit exceeded",
+ "Virtual timer expired",
+ "Profiling timer expired",
+ "Window changed",
+ "Power/Resource lost",
+ "User defined signal 1",
+ "User defined signal 2",
+#else
+ "Stack fault",
+ "Child exited",
+ "Continued",
+ "Stopped (signal)",
+ "Stopped",
+ "Stopped (tty input)",
+ "Stopped (tty output)",
+ "Urgent I/O condition",
+ "CPU time limit exceeded",
+ "File size limit exceeded",
+ "Virtual timer expired",
+ "Profiling timer expired",
+ "Window changed",
+ "I/O possible",
+ "Power lost",
+ "Bad system call",
+#endif
+#ifndef __hppa__
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+#endif
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+#ifdef __mips__
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+ "Real time signal",
+#endif
+ 0
+};
diff --git a/mdk-stage1/dietlibc/lib/tcdrain.c b/mdk-stage1/dietlibc/lib/tcdrain.c
index 7a760f643..bb2018fb4 100644
--- a/mdk-stage1/dietlibc/lib/tcdrain.c
+++ b/mdk-stage1/dietlibc/lib/tcdrain.c
@@ -1,5 +1,6 @@
#include <sys/ioctl.h>
+int __libc_tcdrain(int fd);
int __libc_tcdrain(int fd)
{
return ioctl(fd, TCSBRK, 1);
diff --git a/mdk-stage1/dietlibc/lib/tcflow.c b/mdk-stage1/dietlibc/lib/tcflow.c
new file mode 100644
index 000000000..ea460f362
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/tcflow.c
@@ -0,0 +1,35 @@
+#include "dietfeatures.h"
+#include <errno.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int tcflow ( int fd, int action )
+{
+#if TCOOFF==0 && TCOON==1 && TCIOFF==2 && TCION==3
+
+ if ( (unsigned int)action < 4u )
+ return ioctl ( fd, TCXONC, action );
+
+ errno = EINVAL;
+ return -1;
+
+#else
+
+ int arg = 0;
+
+ switch (action) {
+ case TCION:
+ arg++;
+ case TCIOFF:
+ arg++;
+ case TCOON:
+ arg++;
+ case TCOOFF:
+ return ioctl ( fd, TCXONC, arg );
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+#endif
+}
diff --git a/mdk-stage1/dietlibc/lib/tcflush.c b/mdk-stage1/dietlibc/lib/tcflush.c
index a19fe11d1..2e5447728 100644
--- a/mdk-stage1/dietlibc/lib/tcflush.c
+++ b/mdk-stage1/dietlibc/lib/tcflush.c
@@ -1,23 +1,9 @@
-#include <unistd.h>
-#include <termios.h>
#include <sys/ioctl.h>
-#include <asm/errno.h>
-
-extern int errno;
-
-/* Flush pending data on FD. */
-int tcflush(int fd, int queue_selector)
+int __libc_tcflush(int fd, int queue_selector);
+int __libc_tcflush(int fd, int queue_selector)
{
- switch (queue_selector) {
- case TCIFLUSH:
- return ioctl(fd, TCFLSH, 0);
- case TCOFLUSH:
- return ioctl(fd, TCFLSH, 1);
- case TCIOFLUSH:
- return ioctl(fd, TCFLSH, 2);
- default:
- errno = EINVAL;
- return -1;
- }
+ return ioctl(fd, TCFLSH, queue_selector);
}
+
+int tcflush(int fd) __attribute__((weak,alias("__libc_tcflush")));
diff --git a/mdk-stage1/dietlibc/lib/tcgetpgrp.c b/mdk-stage1/dietlibc/lib/tcgetpgrp.c
index f2a290651..8d5d4614a 100644
--- a/mdk-stage1/dietlibc/lib/tcgetpgrp.c
+++ b/mdk-stage1/dietlibc/lib/tcgetpgrp.c
@@ -1,7 +1,12 @@
#include <termios.h>
#include <sys/ioctl.h>
+#include <unistd.h>
int tcgetpgrp(int fildes)
{
- return ioctl(fildes, TIOCGPGRP);
+ int foo;
+ if (ioctl(fildes, TIOCGPGRP, &foo)==-1)
+ return -1;
+ else
+ return foo;
}
diff --git a/mdk-stage1/dietlibc/lib/tcsendbreak.c b/mdk-stage1/dietlibc/lib/tcsendbreak.c
new file mode 100644
index 000000000..b026340cf
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/tcsendbreak.c
@@ -0,0 +1,11 @@
+#include "dietfeatures.h"
+#include <errno.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int tcsendbreak (int fd,int duration)
+{
+ if (duration <= 0) return (ioctl (fd,TCSBRKP,0));
+ errno = EINVAL;
+ return (-1);
+}
diff --git a/mdk-stage1/dietlibc/lib/tcsetattr.c b/mdk-stage1/dietlibc/lib/tcsetattr.c
index cf70354d2..03fe8adee 100644
--- a/mdk-stage1/dietlibc/lib/tcsetattr.c
+++ b/mdk-stage1/dietlibc/lib/tcsetattr.c
@@ -1,27 +1,37 @@
-#define tcsetattr libc_tcsetattr
#include <termios.h>
#include <sys/ioctl.h>
-#undef tcsetattr
+#include <errno.h>
+#include "dietfeatures.h"
-#include <asm/errno.h>
+#if !defined(__powerpc__) && !defined(__sparc__) && !defined(__alpha__) && !defined(__hppa__)
+#if TCSANOW==0 && TCSADRAIN==1 && TCSAFLUSH==2 && TCSETSW-TCSETS==1 && TCSETSF-TCSETS==2
+#define shortcut
+#endif
+#endif
-extern int errno;
+int tcsetattr ( int fildes, int optional_actions, struct termios* termios_p )
+{
+#ifdef shortcut
-/* Hack around a kernel bug; value must correspond to the one used in speed.c */
-#define IBAUD0 020000000000
+ if ( (unsigned int)optional_actions < 3u )
+ return ioctl ( fildes, TCSETS+optional_actions, termios_p );
-int tcsetattr(int fildes, int optional_actions, struct termios *termios_p)
-{
- termios_p->c_iflag &= ~IBAUD0;
- switch (optional_actions) {
- case TCSANOW:
- return ioctl(fildes, TCSETS, termios_p);
- case TCSADRAIN:
- return ioctl(fildes, TCSETSW, termios_p);
- case TCSAFLUSH:
- return ioctl(fildes, TCSETSF, termios_p);
- default:
errno = EINVAL;
return -1;
- }
+
+#else
+
+ switch ( optional_actions ) {
+ case TCSANOW:
+ return ioctl ( fildes, TCSETS , termios_p );
+ case TCSADRAIN:
+ return ioctl ( fildes, TCSETSW, termios_p );
+ case TCSAFLUSH:
+ return ioctl ( fildes, TCSETSF, termios_p );
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+#endif
}
diff --git a/mdk-stage1/dietlibc/lib/tcsetpgrp.c b/mdk-stage1/dietlibc/lib/tcsetpgrp.c
index 6c40b5c79..8cf3165c2 100644
--- a/mdk-stage1/dietlibc/lib/tcsetpgrp.c
+++ b/mdk-stage1/dietlibc/lib/tcsetpgrp.c
@@ -1,5 +1,6 @@
#include <termios.h>
#include <sys/ioctl.h>
+#include <unistd.h>
int tcsetpgrp(int fildes, pid_t pgrpid)
{
diff --git a/mdk-stage1/dietlibc/lib/tolower.c b/mdk-stage1/dietlibc/lib/tolower.c
index 4b7c7cf2d..c24932ef4 100644
--- a/mdk-stage1/dietlibc/lib/tolower.c
+++ b/mdk-stage1/dietlibc/lib/tolower.c
@@ -1,6 +1,8 @@
#include <ctype.h>
-inline int tolower(int c) {
- return (c>='A' && c<='Z')?c-'A'+'a':c;
+int tolower(int ch) {
+ if ( (unsigned int)(ch - 'A') < 26u )
+ ch += 'a' - 'A';
+ return ch;
}
diff --git a/mdk-stage1/dietlibc/lib/toupper.c b/mdk-stage1/dietlibc/lib/toupper.c
index c048e60bb..f7d415e95 100644
--- a/mdk-stage1/dietlibc/lib/toupper.c
+++ b/mdk-stage1/dietlibc/lib/toupper.c
@@ -1,6 +1,8 @@
#include <ctype.h>
-inline int toupper(int c) {
- return (c>='a' && c<='z')?c-'a'+'A':c;
+inline int toupper(int ch) {
+ if ( (unsigned int)(ch - 'a') < 26u )
+ ch += 'A' - 'a';
+ return ch;
}
diff --git a/mdk-stage1/dietlibc/lib/ttyname.c b/mdk-stage1/dietlibc/lib/ttyname.c
index a6b479088..2bbc7f2a9 100644
--- a/mdk-stage1/dietlibc/lib/ttyname.c
+++ b/mdk-stage1/dietlibc/lib/ttyname.c
@@ -1,30 +1,35 @@
#include "dietfeatures.h"
#include <unistd.h>
#include <sys/stat.h>
+#include <string.h>
#ifdef __linux__
-extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
+#include <stdlib.h>
char *ttyname(int fd) {
#ifdef SLASH_PROC_OK
char ibuf[20];
static char obuf[20];
+ int len;
+ if (!isatty(fd)) return 0;
strcpy(ibuf,"/proc/self/fd/");
- ibuf[__ltostr(ibuf+14,6,fd,10,0)+14]=0;
- if (readlink(ibuf,obuf,sizeof(obuf)-1)<0) return 0;
+ ibuf[__ltostr(ibuf+14,6,(unsigned long)fd,10,0)+14]=0;
+ if ((len=readlink(ibuf,obuf,sizeof(obuf)-1))<0) return 0;
+ obuf[len]=0;
return obuf;
#else
- static char buf[20]="/dev/tty";
+ static char buf[20];
struct stat s;
char *c=buf+8;
int n;
+ if (!isatty(fd)) return 0;
if (fstat(fd,&s)) return 0;
+ strcpy(buf,"/dev/tty");
if (S_ISCHR(s.st_mode)) {
n=minor(s.st_rdev);
switch (major(s.st_rdev)) {
case 4:
- buf[5]='t'; buf[7]='y';
if (n>63) {
n-=64;
*c='S';
@@ -34,16 +39,18 @@ num:
c[__ltostr(c,6,n,10,0)]=0;
break;
case 2:
- buf[5]='p'; buf[7]='y';
buf[8]='p'-(n>>4);
buf[9]=n%4+'0';
if (buf[9]>'9') *c+='a'-'0';
buf[10]=0;
+ goto duh;
case 136:
case 137:
case 138:
case 139:
- buf[5]='p'; buf[7]='s';
+ buf[7]='s';
+duh:
+ buf[5]='p';
n+=(major(s.st_rdev)-136)<<8;
*c='/'; ++c;
goto num;
diff --git a/mdk-stage1/dietlibc/lib/usleep.c b/mdk-stage1/dietlibc/lib/usleep.c
index 494f99233..8f07416a8 100644
--- a/mdk-stage1/dietlibc/lib/usleep.c
+++ b/mdk-stage1/dietlibc/lib/usleep.c
@@ -1,12 +1,12 @@
-#include <linux/time.h>
#include <time.h>
+#include <unistd.h>
/* nano * 1000 == usecs
* usecs * 1000 == msecs
* msecs * 1000 = secs */
-void usleep(unsigned int usecs) {
+int usleep(unsigned long usecs) {
struct timespec t;
t.tv_sec=usecs/1000000;
t.tv_nsec=(usecs%1000000)*1000;
- nanosleep(&t,&t);
+ return nanosleep(&t,&t);
}
diff --git a/mdk-stage1/dietlibc/lib/vfork.c b/mdk-stage1/dietlibc/lib/vfork.c
index 795cddb05..d54416d5d 100644
--- a/mdk-stage1/dietlibc/lib/vfork.c
+++ b/mdk-stage1/dietlibc/lib/vfork.c
@@ -1,6 +1,4 @@
-#include <linux/types.h>
#include <unistd.h>
-pid_t vfork(void) {
- return fork();
-}
+pid_t vfork() { return fork(); }
+
diff --git a/mdk-stage1/dietlibc/lib/vfprintf.c b/mdk-stage1/dietlibc/lib/vfprintf.c
deleted file mode 100644
index c33a2404b..000000000
--- a/mdk-stage1/dietlibc/lib/vfprintf.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "dietstdarg.h"
-
-int vfprintf(FILE *fstream, const char *format, va_list ap)
-{
- char *tmp;
- va_list cp_ap;
- size_t n = 0;
-
- va_copy(cp_ap, ap);
- n=vsnprintf(0, 1000000, format, cp_ap);
- tmp=alloca(n+2);
- vsnprintf(tmp, n+1, format, ap);
- fwrite(tmp, n,1, fstream);
- return n;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/vprintf.c b/mdk-stage1/dietlibc/lib/vprintf.c
deleted file mode 100644
index 46ecc47a4..000000000
--- a/mdk-stage1/dietlibc/lib/vprintf.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdarg.h>
-#include <linux/types.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
-int vprintf(const char *format, va_list ap)
-{
- char tmp[1000000];
- size_t n = vsnprintf(tmp, sizeof(tmp), format, ap);
- write(1, tmp, n);
- return n;
-}
diff --git a/mdk-stage1/dietlibc/lib/vsnprintf.c b/mdk-stage1/dietlibc/lib/vsnprintf.c
index f425066e3..dd06d6483 100644
--- a/mdk-stage1/dietlibc/lib/vsnprintf.c
+++ b/mdk-stage1/dietlibc/lib/vsnprintf.c
@@ -1,238 +1,33 @@
-#include "dietfeatures.h"
#include <stdarg.h>
#include <sys/types.h>
+#include <unistd.h>
#include <stdlib.h>
#include <string.h>
-#include "dietwarning.h"
-
-extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
-extern int __dtostr(double d,char *buf,int maxlen,int prec);
-
-int vsnprintf (char *str, size_t size, const char *format, va_list arg_ptr)
-{
- size_t apos,i;
- char ch,buf[1024];
- char *pb;
- char flag_in_sign;
- char flag_hash,flag_zero,flag_left,flag_space,flag_sign,flag_dot,flag_long;
- long number,width,preci,buf_len,pad;
- char padwith;
-
- size--;
-
- apos=0;
- while (apos<size)
- {
- ch=*format++;
- switch (ch)
- {
- case '%':
- flag_hash=0;
- flag_zero=0;
- flag_left=0;
- flag_space=0;
- flag_sign=0;
- flag_dot=0;
- flag_in_sign=0;
- flag_long=0;
-
- width=0;
- padwith=' ';
-
-inn_vsnprintf:
- if (apos>=size) continue; /* ARGL !!! */
-
- ch=*format++;
- switch (ch)
- {
-/* Format end ?!? */
- case 0:
- return -1;
- break;
-
-/* Format flag chars */
- case '#':
- flag_hash=1;
- goto inn_vsnprintf;
-
- case 'l':
- ++flag_long;
- goto inn_vsnprintf;
-
- case '0':
- padwith='0';
- goto inn_vsnprintf;
-
- case '-':
- flag_left=1;
- goto inn_vsnprintf;
-
- case ' ':
- flag_space=1;
- goto inn_vsnprintf;
-
- case '+':
- flag_sign=1;
- goto inn_vsnprintf;
-
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if(flag_dot) return -1;
- width=strtol(--format,&pb,10);
- format=pb;
- goto inn_vsnprintf;
-
- case '*':
- width=va_arg(arg_ptr,int);
- goto inn_vsnprintf;
-
- case '.':
- flag_dot=1;
- if (*format=='*') {
- preci=va_arg(arg_ptr,int);
- ++format;
- } else {
- preci=strtol(format,&pb,10);
- format=pb;
- }
- goto inn_vsnprintf;
-
-/* Format conversion chars */
- case 'c':
- ch=(char)va_arg(arg_ptr,int);
- case '%':
- if (str) str[apos]=ch; ++apos;
- break;
-
- case 's':
- pb=va_arg(arg_ptr,char *);
-#ifdef WANT_NULL_PRINTF
- if (!pb) pb="(null)";
-#endif
- buf_len=strlen(pb);
- if (flag_dot && buf_len>preci) buf_len=preci;
- if (buf_len>size-apos) buf_len=size-apos;
-
-print_out:
- if (str) {
- if (width && (!flag_left))
- {
- for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith;
- }
- for(i=0;i<buf_len;++i) { str[apos++]=pb[i]; } /* strncpy */
- if (width && (flag_left))
- {
- for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith;
- }
- } else {
- if (width) {
- apos+=width>buf_len?width:buf_len;
- } else {
- apos+=size>buf_len?buf_len:size;
- }
- }
-
- break;
-
- /* Numbers */
- case 'b':
- i=2;
- goto num_vsnprintf;
- case 'p':
- flag_hash=1;
- width=sizeof(void *)<<1;
- padwith='0';
- ch='x';
- case 'X':
- case 'x':
- i=16;
- if (flag_hash)
- {
- if (str) {
- str[apos++]='0';
- str[apos++]=ch;
- } else
- apos+=2;
- }
- goto num_vsnprintf;
- case 'd':
- case 'i':
- flag_in_sign=1;
- case 'u':
- i=10;
- goto num_vsnprintf;
- case 'o':
- i=8;
- if (flag_hash) { if (str) str[apos]='0'; ++apos; }
-
-num_vsnprintf:
- if (apos>=size) continue; /* ARGL !!! */
-
- if (flag_long)
- number=va_arg(arg_ptr,long);
- else
- number=va_arg(arg_ptr,int);
-
- if (flag_in_sign && (number<0))
- {
- number*=-1;
- flag_in_sign=2;
- }
-
- buf_len=__ltostr(buf+1,sizeof(buf)-1,(unsigned long) number,i,0);
- pb=buf+1;
-
- if (flag_in_sign==2)
- {
- *(--pb)='-';
- buf_len++;
- }
- else if ((flag_in_sign)&&(flag_sign || flag_space))
- {
- *(--pb)=(flag_sign)?'+':' ';
- buf_len++;
- }
- goto print_out;
-
-#ifdef WANT_FLOATING_POINT_IN_PRINTF
- case 'f':
- case 'g':
- {
- double d=va_arg(arg_ptr,double);
- buf_len=__dtostr(d,buf,sizeof(buf),width?width:6);
- if (flag_dot) {
- char *tmp;
- if ((tmp=strchr(buf,'.'))) {
- while (preci>-1 && *++tmp) --preci;
- *tmp=0;
- }
- }
- pb=buf;
- goto print_out;
- }
-#endif
- default:
- break;
- }
- break;
- case 0:
- if (str) str[apos]=0;
- return apos;
- default:
- if (str) str[apos]=ch; apos++;
- break;
+#include "dietstdio.h"
+
+struct str_data {
+ unsigned char* str;
+ size_t len;
+ size_t size;
+};
+
+static int swrite(void*ptr, size_t nmemb, struct str_data* sd) {
+ size_t tmp=sd->size-sd->len;
+ if (tmp>0) {
+ size_t len=nmemb;
+ if (len>tmp) len=tmp;
+ if (sd->str) {
+ memcpy(sd->str+sd->len,ptr,len);
+ sd->str[sd->len+len]=0;
}
+ sd->len+=len;
}
- if (str) str[apos]=0;
- return apos;
+ return nmemb;
}
-link_warning("vsnprintf","warning: the printf functions add several kilobytes of bloat.")
-
+int vsnprintf(char* str, size_t size, const char *format, va_list arg_ptr) {
+ struct str_data sd = { str, 0, size };
+ struct arg_printf ap = { &sd, (int(*)(void*,size_t,void*)) swrite };
+ if (size) --sd.size;
+ return __v_printf(&ap,format,arg_ptr);
+}
diff --git a/mdk-stage1/dietlibc/lib/vsprintf.c b/mdk-stage1/dietlibc/lib/vsprintf.c
index 10ff04bd7..6cd5a40b1 100644
--- a/mdk-stage1/dietlibc/lib/vsprintf.c
+++ b/mdk-stage1/dietlibc/lib/vsprintf.c
@@ -1,10 +1,12 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <stdlib.h>
-
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
+#include <stdio.h>
+#include "dietwarning.h"
int vsprintf(char *dest,const char *format, va_list arg_ptr)
{
- return vsnprintf(dest,1000000,format,arg_ptr);
+ return vsnprintf(dest,(size_t)-1,format,arg_ptr);
}
+
+link_warning("vsprintf","warning: Avoid *sprintf; use *snprintf. It is more secure.")
diff --git a/mdk-stage1/dietlibc/lib/vsscanf.c b/mdk-stage1/dietlibc/lib/vsscanf.c
index 1c4c9b787..329cfd02a 100644
--- a/mdk-stage1/dietlibc/lib/vsscanf.c
+++ b/mdk-stage1/dietlibc/lib/vsscanf.c
@@ -1,304 +1,25 @@
-#include "dietfeatures.h"
#include <stdarg.h>
#include <sys/types.h>
-#include <ctype.h>
#include <stdlib.h>
-#include <string.h>
+#include "dietstdio.h"
+#include <unistd.h>
-const char *skip_ws(const char *str)
-{
- while ((*str)&&(isspace(*str))) str++;
- return str;
+struct str_data {
+ unsigned char* str;
+};
+
+static int sgetc(struct str_data* sd) {
+ register unsigned int ret = *(sd->str++);
+ return (ret)?(int)ret:-1;
}
-extern double strtod(const char *s,char **f);
+static int sputc(int c, struct str_data* sd) {
+ return (*(--sd->str)==c)?c:-1;
+}
-int vsscanf(const char *str, const char *format, va_list arg_ptr)
+int vsscanf(const char* str, const char* format, va_list arg_ptr)
{
- int n=0,div;
- unsigned char ch;
-
- char flag_discard, flag_malloc, flag_half, flag_long, flag_longlong;
- char flag_width;
-
- unsigned long width;
-
- /* arg_ptr tmps */
-#ifdef WANT_FLOATING_POINT_IN_SCANF
- double d,*pd;
- float *pf;
-#endif
-
- long l=0,*pl;
- short *ph;
- int *pi;
- char *s;
-
- while ((*str)&&(*format))
- {
- const char *prevfmt=format;
- format=skip_ws(format);
- ch=*format++;
- if (!ch) continue;
-
- switch (ch)
- {
- case '%':
- div=0;
- flag_discard=0;
- flag_malloc=0;
- flag_half=0;
- flag_long=0;
- flag_longlong=0;
-
- flag_width=0;
- width=-1;
-
-inn_vsscanf:
- ch=*format++;
-
- switch (ch)
- {
- case 0:
- return 0;
-
- case '%':
- if (*(str++)!=ch) return n;
- break;
-
- /* flags */
- case '*':
- flag_discard=1;
- goto inn_vsscanf;
-
- case 'a':
- flag_malloc=1;
- goto inn_vsscanf;
-
- case 'h':
- flag_half=1;
- goto inn_vsscanf;
-
- case 'l':
- if (flag_long) flag_longlong=1;
- flag_long=1;
- goto inn_vsscanf;
-
- /* longlong ? NOT YET ! */
- case 'q':
- case 'L':
- flag_longlong=1;
- goto inn_vsscanf;
-
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- width=strtol(format-1,&s,10);
- format=s;
- flag_width=1;
- goto inn_vsscanf;
-
- /* conversion */
-
- case 'n':
- while (width && *str)
- {
- *(s++)=*(str++);
- --width;
- l++;
- }
- if (!flag_discard)
- {
- pl=(long *)va_arg(arg_ptr,long*);
- *pl=l;
- ++n;
- }
- break;
-
- case 'p':
- case 'X':
- case 'x':
- div+=6;
- case 'd':
- div+=2;
- case 'o':
- div+=8;
- case 'u':
- case 'i':
- if (*(str=skip_ws(str)))
- {
- l=strtol(str,&s,div);
- if (str!=s)
- {
- if (!flag_discard)
- {
- if (flag_long)
- {
- pl=(long *)va_arg(arg_ptr,long*);
- *pl=l;
- }
- else if (flag_half)
- {
- ph=(short *)va_arg(arg_ptr,short*);
- *ph=l;
- }
- else
- {
- pi=(int *)va_arg(arg_ptr,int*);
- *pi=l;
- }
- ++n;
- }
- str=s;
- }
- else
- return n;
- }
- break;
-
-#ifdef WANT_FLOATING_POINT_IN_SCANF
- case 'e':
- case 'E':
- case 'f':
- case 'g':
- if (*(str=skip_ws(str)))
- {
- d=strtod(str,&s);
- if (str!=s)
- {
- if (!flag_discard)
- {
- if (flag_long)
- {
- pd=(double *)va_arg(arg_ptr,double*);
- *pd=d;
- }
- else
- {
- pf=(float *)va_arg(arg_ptr,float*);
- *pf=d;
- }
- ++n;
- }
- str=s;
- }
- else
- return n;
- }
- break;
-#endif
-
- case 'c':
- if (!flag_discard)
- {
- s=(char *)va_arg(arg_ptr,char*);
- ++n;
- }
- if (!flag_width) width=1;
- while (width && *str)
- {
- if (!flag_discard) *(s++)=*(str);
- ++str;
- --width;
- }
- break;
-
- case 's':
- if (!flag_discard)
- {
- s=(char *)va_arg(arg_ptr,char*);
- ++n;
- }
- if (*(str=skip_ws(str)))
- {
- while (width && (!isspace(*str)))
- {
- if (!flag_discard) *(s++)=*(str);
- if (!*str) break;
- ++str;
- --width;
- }
- *s=0;
- }
- break;
-
-#ifdef WANT_CHARACTER_CLASSES_IN_SCANF
- case '[':
- {
- char cset[256];
- int flag_not=0;
- int flag_dash=0;
- memset(cset,0,sizeof(cset));
- ch=*format++;
-
- /* first char specials */
- if (ch=='^')
- {
- flag_not=1;
- ch=*format++;
- }
- if ((ch=='-')||(ch==']'))
- {
- cset[ch]=1;
- ch=*format++;
- }
-
- /* almost all non special chars */
- for (;(*format) && (*format!=']');++format) {
- if (flag_dash)
- {
- register unsigned char tmp=*format;
- for (;ch<=tmp;++ch) cset[ch]=1;
- flag_dash=0;
- ch=*(++format);
- }
- else if (*format=='-') flag_dash=1;
- else
- {
- cset[ch]=1;
- ch=*format;
- }
- }
-
- /* last char specials */
- if (flag_dash) cset['-']=1;
- else cset[ch]=1;
-
- /* like %c or %s */
- if (!flag_discard)
- {
- s=(char *)va_arg(arg_ptr,char*);
- ++n;
- }
- while (width && (cset[(unsigned char)(*str)]-flag_not))
- {
- if (!flag_discard) *(s++)=*(str);
- if (!*str) break;
- ++str;
- --width;
- }
- }
- break;
-#endif
- }
- break;
-
- default:
- if (prevfmt<format) {
- while (prevfmt<format) {
- if (*str!=*prevfmt) return n;
- ++str; ++prevfmt;
- }
- } else
- if (*(str++)!=ch) return n;
- break;
- }
- }
- return n;
+ struct str_data fdat = { (unsigned char*)str };
+ struct arg_scanf farg = { (void*)&fdat, (int(*)(void*))sgetc, (int(*)(int,void*))sputc };
+ return __v_scanf(&farg,format,arg_ptr);
}
diff --git a/mdk-stage1/dietlibc/lib/write12.c b/mdk-stage1/dietlibc/lib/write12.c
new file mode 100644
index 000000000..8e0130bfb
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/write12.c
@@ -0,0 +1,11 @@
+#include <unistd.h>
+#include <string.h>
+#include <write12.h>
+
+int __write1 (const char* s) {
+ return write(1, s, strlen(s));
+}
+
+int __write2 (const char* s) {
+ return write(2, s, strlen(s));
+}
diff --git a/mdk-stage1/dietlibc/libcompat/daemon.c b/mdk-stage1/dietlibc/libcompat/daemon.c
new file mode 100644
index 000000000..30f97a09a
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcompat/daemon.c
@@ -0,0 +1,29 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <paths.h>
+
+#include "daemon.h"
+
+int daemon (int nochdir,int noclose)
+{
+ int fd;
+ switch (fork()) {
+ case -1: return (-1);
+ case 0: break;
+ default: _exit (0);
+ }
+ if (setsid () == -1) return (-1);
+ if (!nochdir) chdir ("/");
+ if (!noclose) {
+ fd = open(_PATH_DEVNULL,O_RDWR,0);
+ if (fd == -1) return (-1);
+ dup2 (fd,STDIN_FILENO);
+ dup2 (fd,STDOUT_FILENO);
+ dup2 (fd,STDERR_FILENO);
+ if (fd>2) close (fd);
+ }
+ return (0);
+}
+
diff --git a/mdk-stage1/dietlibc/libcompat/getdelim.c b/mdk-stage1/dietlibc/libcompat/getdelim.c
new file mode 100644
index 000000000..e499bd7b7
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcompat/getdelim.c
@@ -0,0 +1,32 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <stdio.h>
+#include "dietfeatures.h"
+#include <errno.h>
+#include "dietwarning.h"
+
+ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream) {
+ size_t i;
+ if (!lineptr || !n) {
+ errno=EINVAL;
+ return -1;
+ }
+ if (!*lineptr) *n=0;
+ for (i=0; ; ) {
+ int x=fgetc(stream);
+ if (i>=*n) {
+ int tmp=*n+100;
+ char* new=realloc(*lineptr,tmp);
+ if (!new) return -1;
+ *lineptr=new; *n=tmp;
+ }
+ if (x==EOF) { (*lineptr)[i]=0; return -1; }
+ (*lineptr)[i]=x;
+ ++i;
+ if (x==delim) break;
+ }
+ (*lineptr)[i]=0;
+ return i;
+}
+
+link_warning("getdelim","warning: portable software should not use getdelim!")
diff --git a/mdk-stage1/dietlibc/libcompat/getline.c b/mdk-stage1/dietlibc/libcompat/getline.c
new file mode 100644
index 000000000..4926850a7
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcompat/getline.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include "dietwarning.h"
+
+#undef getline
+ssize_t getline(char **lineptr, size_t *n, FILE *stream) {
+ return getdelim(lineptr,n,'\n',stream);
+}
+link_warning("getline","warning: you used getline without include stdio.h w/_GNU_SOURCE")
diff --git a/mdk-stage1/dietlibc/libcompat/re_bsd.c b/mdk-stage1/dietlibc/libcompat/re_bsd.c
new file mode 100644
index 000000000..44f022fa3
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcompat/re_bsd.c
@@ -0,0 +1,34 @@
+/* wrapper to simulate the braindead 4.3BSD regex interface
+ * by Andreas Krennmair <a.krennmair@aon.at>
+ */
+#include <regex.h>
+#include <sys/types.h>
+
+#include "dietwarning.h"
+
+static char err_compile[] = "unable to compile regular expression.";
+static int re_buf_used;
+static regex_t re_buf;
+
+char * re_comp(char * regex) {
+ int rc;
+ if (regex) {
+ if (re_buf_used)
+ regfree(&re_buf);
+ rc = regcomp(&re_buf,regex,0);
+ if (rc)
+ return err_compile;
+ re_buf_used = 1;
+ }
+ return NULL;
+}
+
+int re_exec(char * string) {
+ if (string) {
+ return regexec(&re_buf,string,0,NULL,0)?0:1;
+ }
+ return 0;
+}
+
+link_warning("re_comp","warning: use regcomp instead of re_comp!")
+link_warning("re_exec","warning: use regexec instead of re_exec!")
diff --git a/mdk-stage1/dietlibc/libcompat/stpcpy.c b/mdk-stage1/dietlibc/libcompat/stpcpy.c
new file mode 100644
index 000000000..237a2e374
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcompat/stpcpy.c
@@ -0,0 +1,6 @@
+#include <string.h>
+
+char * stpcpy (char *dst, const char *src) {
+ while ((*dst++ = *src++));
+ return (dst-1);
+}
diff --git a/mdk-stage1/dietlibc/libcompat/syscall.S b/mdk-stage1/dietlibc/libcompat/syscall.S
new file mode 100644
index 000000000..dd8e6b827
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcompat/syscall.S
@@ -0,0 +1,70 @@
+#include "dietfeatures.h"
+
+.text
+.globl syscall
+#ifdef __arm__
+.type syscall,function
+#else
+.type syscall,@function
+#endif
+
+syscall:
+#ifdef __i386__
+ movl %esp, %eax
+ pushl %edi
+ pushl %esi
+ pushl %ebx
+ pushl %ebp
+ movl 0x08(%eax), %ebx
+ movl 0x0c(%eax), %ecx
+ movl 0x10(%eax), %edx
+ movl 0x14(%eax), %esi
+ movl 0x18(%eax), %edi
+ movl 0x1c(%eax), %ebp
+ movl 0x04(%eax), %eax
+ int $0x80
+ cmpl $-255, %eax
+ jbe .Lret
+ negl %eax
+#ifdef WANT_THREADSAFE
+ movl %eax, %ebx
+ call __errno_location
+ movl %ebx, (%eax)
+ xorl %eax, %eax
+ decl %eax
+#else
+ mov %eax, errno
+ sbb %eax, %eax
+#endif
+.Lret:
+ pop %ebp
+ pop %ebx
+ pop %esi
+ pop %edi
+ ret
+#elif (defined(__hppa__))
+ copy %r26, %r20
+ copy %r25, %r26
+ copy %r24, %r25
+ copy %r23, %r24
+ ldw -0x34(%sr0, %sp), %r23
+ ldw -0x38(%sr0, %sp), %r22
+ be,l 0x100(%sr2, %r0), %sr0, %r31
+ ldw -0x3c(%sr0, %sp), %r21
+ ldi -0x100, %r1
+ cmpb,<<=,n %r1, %ret0, __error_unified_syscall
+.Lret:
+ bv,n %r0(%rp)
+#elif (defined(__ia64__))
+ mov r15=r32
+ mov r32=r33
+ mov r33=r34
+ mov r34=r35
+ mov r35=r36
+ mov r36=r37
+ break.i 0x100000
+ cmp.eq p6,p0=-1,r10
+(p6) br __error_unified_syscall
+ br.ret.sptk.few rp
+#endif
+.size syscall, . - syscall
diff --git a/mdk-stage1/dietlibc/libcruft/__end_parse.c b/mdk-stage1/dietlibc/libcruft/__end_parse.c
new file mode 100644
index 000000000..6c36318b5
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/__end_parse.c
@@ -0,0 +1,10 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include "parselib.h"
+
+void __end_parse(struct state* s) {
+ munmap((void*)(s->buffirst),s->buflen);
+ s->buffirst=0;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/__parse.c b/mdk-stage1/dietlibc/libcruft/__parse.c
new file mode 100644
index 000000000..ef020a138
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/__parse.c
@@ -0,0 +1,10 @@
+#include <ctype.h>
+#include <sys/types.h>
+#include "parselib.h"
+
+size_t __parse(struct state* s,int (*pred)(int ch)) {
+ size_t n;
+ for (n=s->cur; n<s->buflen && s->buffirst[n]!='\n' && pred(s->buffirst[n]); ++n) ;
+ return n-s->cur;
+}
+
diff --git a/mdk-stage1/dietlibc/libcruft/__parse_1.c b/mdk-stage1/dietlibc/libcruft/__parse_1.c
new file mode 100644
index 000000000..ba56d022c
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/__parse_1.c
@@ -0,0 +1,9 @@
+#include <sys/types.h>
+#include "parselib.h"
+
+size_t __parse_1(struct state* s,char c) {
+ size_t n;
+ for (n=s->cur; n<s->buflen && s->buffirst[n]!='\n' && s->buffirst[n]!=c; ++n) ;
+ return n-s->cur;
+}
+
diff --git a/mdk-stage1/dietlibc/libcruft/__parse_nws.c b/mdk-stage1/dietlibc/libcruft/__parse_nws.c
new file mode 100644
index 000000000..e26fc443d
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/__parse_nws.c
@@ -0,0 +1,10 @@
+#include <sys/types.h>
+#include "parselib.h"
+
+static int __isnonblank(int ch) {
+ return (ch!=' ' && ch!='\t' && ch!='#');
+}
+
+size_t __parse_nws(struct state* s) {
+ return __parse(s,__isnonblank);
+}
diff --git a/mdk-stage1/dietlibc/libcruft/__parse_ws.c b/mdk-stage1/dietlibc/libcruft/__parse_ws.c
new file mode 100644
index 000000000..68068ade0
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/__parse_ws.c
@@ -0,0 +1,11 @@
+#include <sys/types.h>
+#include <ctype.h>
+#include "parselib.h"
+
+static int __isblank(int ch) {
+ return (ch==' ' || ch=='\t');
+}
+
+size_t __parse_ws(struct state* s) {
+ return __parse(s,__isblank);
+}
diff --git a/mdk-stage1/dietlibc/libcruft/__prepare_parse.c b/mdk-stage1/dietlibc/libcruft/__prepare_parse.c
new file mode 100644
index 000000000..dff1932a7
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/__prepare_parse.c
@@ -0,0 +1,19 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include "parselib.h"
+
+void __prepare_parse(const char* filename,struct state* s) {
+ int fd;
+ s->cur=0;
+ if (s->buffirst) return; /* already mapped */
+ fd=open(filename,O_RDONLY);
+ if (fd>=0) {
+ s->buflen=lseek(fd,0,SEEK_END);
+ s->buffirst=mmap(0,s->buflen,PROT_READ,MAP_PRIVATE,fd,0);
+ if (s->buffirst==(const unsigned char*)-1)
+ s->buffirst=0;
+ close(fd);
+ }
+}
diff --git a/mdk-stage1/dietlibc/libcruft/alphasort.c b/mdk-stage1/dietlibc/libcruft/alphasort.c
new file mode 100644
index 000000000..f5a81dc18
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/alphasort.c
@@ -0,0 +1,6 @@
+#include <dirent.h>
+#include <string.h>
+
+int alphasort(const struct dirent **a, const struct dirent **b) {
+ return strcmp((*a)->d_name,(*b)->d_name);
+}
diff --git a/mdk-stage1/dietlibc/libcruft/bcopy.c b/mdk-stage1/dietlibc/libcruft/bcopy.c
new file mode 100644
index 000000000..53736e0ed
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/bcopy.c
@@ -0,0 +1,11 @@
+#include <sys/types.h>
+#include "dietwarning.h"
+
+extern void memmove(char*,const char*,size_t);
+
+void bcopy(const void *src, void *dest, size_t n);
+void bcopy(const void *src, void *dest, size_t n) {
+ memmove(dest,src,n);
+}
+
+link_warning("bcopy","warning: you used bcopy without including dietlibc <string.h> w/ _BSD_SOURCE!")
diff --git a/mdk-stage1/dietlibc/libcruft/bzero.c b/mdk-stage1/dietlibc/libcruft/bzero.c
new file mode 100644
index 000000000..77870c67f
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/bzero.c
@@ -0,0 +1,10 @@
+#include <sys/types.h>
+#include <string.h>
+#include "dietwarning.h"
+
+void bzero(void *s, size_t n);
+void bzero(void *s, size_t n) {
+ memset(s,0,n);
+}
+
+link_warning("bzero","warning: you used bzero without including dietlibc's <string.h> w/ _BSD_SOURCE!")
diff --git a/mdk-stage1/dietlibc/libcruft/clock.c b/mdk-stage1/dietlibc/libcruft/clock.c
new file mode 100644
index 000000000..33b62865d
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/clock.c
@@ -0,0 +1,21 @@
+#include <sys/times.h>
+#include <sys/param.h>
+#include <time.h>
+#include <unistd.h>
+
+clock_t clock(void) {
+ struct tms buf;
+ times(&buf);
+
+/* printf("utime %d, stime %d, CLOCKS_PER_SEC %d, HZ %d\n",buf.tms_utime,buf.tms_stime,CLOCKS_PER_SEC,HZ); */
+
+#if CLOCKS_PER_SEC == HZ
+ return (unsigned long) buf.tms_utime + buf.tms_stime;
+#elif CLOCKS_PER_SEC % HZ == 0
+ return ((unsigned long) buf.tms_utime + buf.tms_stime) * (CLOCKS_PER_SEC / HZ);
+#elif HZ % CLOCKS_PER_SEC == 0
+ return ((unsigned long) buf.tms_utime + buf.tms_stime) / (HZ / CLOCKS_PER_SEC);
+#else
+ return ((unsigned long long) buf.tms_utime + buf.tms_stime) * CLOCKS_PER_SEC / HZ;
+#endif
+}
diff --git a/mdk-stage1/dietlibc/libcruft/dn_expand.c b/mdk-stage1/dietlibc/libcruft/dn_expand.c
new file mode 100644
index 000000000..e111a91a4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/dn_expand.c
@@ -0,0 +1,11 @@
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+
+extern int __dns_decodename(unsigned char *packet,unsigned int ofs,unsigned char *dest,
+ unsigned int maxlen,unsigned char* behindpacket);
+
+int dn_expand(unsigned char *msg, unsigned char *eomorig, unsigned char *comp_dn, unsigned char *exp_dn, int length) {
+ return __dns_decodename(msg,comp_dn-msg,exp_dn,length,eomorig)-(comp_dn-msg);
+}
+
diff --git a/mdk-stage1/dietlibc/libcruft/dnscruft.c b/mdk-stage1/dietlibc/libcruft/dnscruft.c
index d7a0efa50..bd8bee79a 100644
--- a/mdk-stage1/dietlibc/libcruft/dnscruft.c
+++ b/mdk-stage1/dietlibc/libcruft/dnscruft.c
@@ -7,51 +7,100 @@
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
+#include <resolv.h>
+#include <net/if.h>
+#include "dietfeatures.h"
int __dns_fd=-1;
+#ifdef WANT_IPV6_DNS
+int __dns_fd6=-1;
+#endif
-void __dns_make_fd() {
+/* the ad-hoc internal API from hell ;-) */
+void __dns_make_fd(void);
+void __dns_make_fd6(void);
+void __dns_readstartfiles(void);
+int __dns_decodename(unsigned char *packet,unsigned int offset,unsigned char *dest,
+ unsigned int maxlen,unsigned char* behindpacket);
+
+void __dns_make_fd(void) {
int tmp;
struct sockaddr_in si;
- if (__dns_fd>0) return;
+ if (__dns_fd>=0) return;
tmp=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
- if (tmp<0) {
- perror("__dns_make_fd!socket");
- return;
- }
+ if (tmp<0) return;
si.sin_family=AF_INET;
si.sin_port=0;
si.sin_addr.s_addr=INADDR_ANY;
- if (bind(tmp,(struct sockaddr*)&si,sizeof(si))) {
- perror("__dns_make_fd!bind");
- return;
- }
+ if (bind(tmp,(struct sockaddr*)&si,sizeof(si))) return;
__dns_fd=tmp;
}
-int __dns_servers=0;
-struct sockaddr __dns_server_ips[8];
+#ifdef WANT_IPV6_DNS
+void __dns_make_fd6(void) {
+ int tmp;
+ struct sockaddr_in6 si;
+ if (__dns_fd6>=0) return;
+ tmp=socket(PF_INET6,SOCK_DGRAM,IPPROTO_UDP);
+ if (tmp<0) return;
+ si.sin6_family=AF_INET6;
+ si.sin6_port=0;
+ memset(&si.sin6_addr,0,16);
+ if (bind(tmp,(struct sockaddr*)&si,sizeof(si))) return;
+ __dns_fd6=tmp;
+}
+#endif
-int __dns_search=0;
+static int parsesockaddr(const char* c,void* x) {
+ struct sockaddr_in to;
+ if (inet_aton(c,&to.sin_addr)) {
+ to.sin_port=htons(53);
+ to.sin_family=AF_INET;
+ memmove(x,&to,sizeof(struct sockaddr_in_pad));
+ return 1;
+#ifdef WANT_IPV6_DNS
+ } else {
+ struct sockaddr_in6 to6;
+ char* d=strchr(c,'%');
+ to6.sin6_flowinfo=to6.sin6_scope_id=0;
+ if (d)
+ to6.sin6_scope_id=if_nametoindex(d+1);
+ if (inet_pton(AF_INET6,c,&to6.sin6_addr)) {
+ to6.sin6_port=htons(53);
+ to6.sin6_family=AF_INET6;
+ memmove(x,&to6,sizeof(struct sockaddr_in_pad));
+ return 1;
+ }
+#endif
+ }
+ return 0;
+}
+
+#ifdef WANT_FULL_RESOLV_CONF
+int __dns_search;
char *__dns_domains[8];
+#endif
-void __dns_readstartfiles() {
+void __dns_readstartfiles(void) {
int fd;
- char *buf=alloca(4096);
+ char __buf[4096];
+ char *buf=__buf;
int len;
- if (__dns_servers>0) return;
+ if (_res.nscount>0) return;
{
struct sockaddr_in to;
+#ifdef WANT_IPV6_DNS
+ struct sockaddr_in6 to6;
+#endif
char *cacheip=getenv("DNSCACHEIP");
- if (cacheip) {
- to.sin_port=htons(53);
- to.sin_family=AF_INET;
- if (inet_aton(cacheip,&to.sin_addr)) {
- memmove(__dns_server_ips,&to,sizeof(struct sockaddr));
- ++__dns_servers;
- }
- }
+#ifdef WANT_FULL_RESOLV_CONF
+ __dns_search=0;
+#endif
+ if (cacheip)
+ if (parsesockaddr(cacheip,_res.nsaddr_list))
+ ++_res.nscount;
}
+ _res.options=RES_RECURSE;
if ((fd=open("/etc/resolv.conf",O_RDONLY))<0) return;
len=read(fd,buf,4096);
close(fd);
@@ -65,21 +114,35 @@ void __dns_readstartfiles() {
{
char *tmp=buf;
struct sockaddr_in i;
+ char save;
while (buf<last && !isspace(*buf)) ++buf;
if (buf>=last) break;
+ save=*buf;
*buf=0;
- if (inet_aton(tmp,&i.sin_addr)) {
- i.sin_family=AF_INET;
- i.sin_port=htons(53);
- memmove(&__dns_server_ips[__dns_servers],&i,sizeof(struct sockaddr));
- if (__dns_servers<8) ++__dns_servers;
- }
+ if (parsesockaddr(tmp,&_res.nsaddr_list[_res.nscount]))
+ if (_res.nscount<MAXNS) ++_res.nscount;
+ *buf=save;
}
}
}
- if (!strncmp(buf,"search",6) || !strncmp(buf,"domain",6)) {
+#ifdef WANT_FULL_RESOLV_CONF
+ else if (!strncmp(buf,"search",6) || !strncmp(buf,"domain",6)) {
buf+=6;
+ while (buf<last && *buf!='\n') {
+ char save;
+ while (buf<last && (*buf==',' || isblank(*buf))) ++buf;
+ __dns_domains[__dns_search]=buf;
+ while (buf<last && (*buf=='.' || *buf=='-' || isalnum(*buf))) ++buf;
+ save=*buf;
+ if (buf<last) *buf=0;
+ if (__dns_domains[__dns_search]<buf &&
+ (__dns_domains[__dns_search]=strdup(__dns_domains[__dns_search])))
+ ++__dns_search;
+ if (buf<last) *buf=save;
+ }
+ continue;
}
+#endif
while (buf<last && *buf!='\n') ++buf;
while (buf<last && *buf=='\n') ++buf;
}
@@ -87,21 +150,24 @@ void __dns_readstartfiles() {
}
/* return length of decoded data or -1 */
-int __dns_decodename(unsigned char *packet,int offset,unsigned char *dest,int maxlen) {
+int __dns_decodename(unsigned char *packet,unsigned int offset,unsigned char *dest,
+ unsigned int maxlen,unsigned char* behindpacket) {
unsigned char *tmp;
unsigned char *max=dest+maxlen;
unsigned char *after=packet+offset;
int ok=0;
for (tmp=after; maxlen>0&&*tmp; ) {
+ if (tmp>=behindpacket) return -1;
if ((*tmp>>6)==3) { /* goofy DNS decompression */
unsigned int ofs=((unsigned int)(*tmp&0x3f)<<8)|*(tmp+1);
- if (ofs>=offset) return -1; /* RFC1035: "pointer to a _prior_ occurrance" */
+ if (ofs>=(unsigned int)offset) return -1; /* RFC1035: "pointer to a _prior_ occurrance" */
if (after<tmp+2) after=tmp+2;
tmp=packet+ofs;
ok=0;
} else {
unsigned int duh;
if (dest+*tmp+1>max) return -1;
+ if (tmp+*tmp+1>=behindpacket) return -1;
for (duh=*tmp; duh>0; --duh)
*dest++=*++tmp;
*dest++='.'; ok=1;
diff --git a/mdk-stage1/dietlibc/libcruft/dnscruft2.c b/mdk-stage1/dietlibc/libcruft/dnscruft2.c
index b59207072..b9cbaa743 100644
--- a/mdk-stage1/dietlibc/libcruft/dnscruft2.c
+++ b/mdk-stage1/dietlibc/libcruft/dnscruft2.c
@@ -8,35 +8,39 @@
#include <sys/poll.h>
#include <unistd.h>
#include <errno.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#include "dietfeatures.h"
+#include "dietdns.h"
-#include <stdio.h>
+extern void __dns_readstartfiles(void);
-extern int h_errno;
-
-static char dnspacket[]="\xfe\xfe\001\000\000\001\000\000\000\000\000\000";
-
-extern void __dns_make_fd();
-extern int __dns_fd;
-
-extern int __dns_servers;
-extern struct sockaddr __dns_server_ips[];
-
-extern void __dns_readstartfiles();
-
-extern int __dns_decodename(unsigned char *packet,int offset,unsigned char *dest,int maxlen);
+extern int __dns_decodename(unsigned char *packet,unsigned int offset,unsigned char *dest,
+ unsigned int maxlen,unsigned char* behindpacket);
/* Oh boy, this interface sucks so badly, there are no words for it.
* Not one, not two, but _three_ error signalling methods! (*h_errnop
* nonzero? return value nonzero? *RESULT zero?) The glibc goons
* really outdid themselves with this one. */
+#ifdef WANT_FULL_RESOLV_CONF
+static int __dns_gethostbyx_r_inner(const char* name, struct hostent* result,
+ char *buf, size_t buflen,
+ struct hostent **RESULT, int *h_errnop, int lookfor);
+
+static int __dns_gethostbyx_r_inner(const char* name, struct hostent* result,
+ char *buf, size_t buflen,
+ struct hostent **RESULT, int *h_errnop, int lookfor) {
+#else
int __dns_gethostbyx_r(const char* name, struct hostent* result,
char *buf, size_t buflen,
struct hostent **RESULT, int *h_errnop, int lookfor) {
+#endif
int names,ips;
unsigned char *cur;
unsigned char *max;
- unsigned char packet[512];
- __dns_make_fd();
+ unsigned char inpkg[1500];
+ char* tmp;
+ int size;
if (lookfor==1) {
result->h_aliases=(char**)(buf+8*4);
@@ -55,131 +59,117 @@ int __dns_gethostbyx_r(const char* name, struct hostent* result,
max=buf+buflen;
names=ips=0;
- memmove(packet,dnspacket,12);
- *(unsigned short*)packet=rand();
+ if ((size=res_query(name,C_IN,lookfor,inpkg,512))<0) {
+invalidpacket:
+ *h_errnop=HOST_NOT_FOUND;
+ return -1;
+ }
{
- unsigned char* x;
- const char* y,* tmp;
- x=packet+12; y=name;
- while (*y) {
- while (*y=='.') ++y;
- for (tmp=y; *tmp && *tmp!='.'; ++tmp) ;
- *x=tmp-y;
- if (!(tmp-y)) break;
- ++x;
- if (x>=packet+510-(tmp-y)) { *h_errnop=ERANGE; return 1; }
- memmove(x,y,tmp-y);
- x+=tmp-y;
- if (!*tmp) {
- *x=0;
- break;
- }
- y=tmp;
- }
- *++x= 0; *++x= lookfor; /* A */
- *++x= 0; *++x= 1; /* IN */
- ++x;
+ tmp=inpkg+12;
{
- int i; /* current server */
- int j; /* timeout count down */
- struct pollfd duh;
- i=0; j=30;
- __dns_readstartfiles();
- duh.fd=__dns_fd;
- duh.events=POLLIN;
- for (j=30; j>0; --j) {
- sendto(__dns_fd,packet,x-packet,0,(struct sockaddr*)&(__dns_server_ips[i]),sizeof(struct sockaddr));
- if (++i > __dns_servers) i=0;
- if (poll(&duh,1,1) == 1) {
- /* read and parse answer */
- unsigned char inpkg[1500];
- /*int len=*/ read(__dns_fd,inpkg,1500);
-#if 0
- {
- int tft=open("duh",0);
- read(tft,inpkg,1500);
- close(tft);
- }
-#endif
- /* header, question, answer, authority, additional */
- if (inpkg[0]!=packet[0] || inpkg[1]!=packet[1]) continue; /* wrong ID */
- if ((inpkg[2]&0xf9) != 0x81) continue; /* not answer */
- if ((inpkg[3]&0x0f) != 0) break; /* error */
- tmp=inpkg+12;
- {
- char name[257];
- unsigned short q=((unsigned short)inpkg[4]<<8)+inpkg[5];
- while (q>0) {
- while (*tmp) tmp+=*tmp+1;
- tmp+=5;
- --q;
- }
- q=((unsigned short)inpkg[6]<<8)+inpkg[7];
- if (q<1) break;
- while (q>0) {
- int decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256);
- if (decofs<0) break;
- tmp=inpkg+decofs;
- --q;
- if (tmp[0]!=0 || tmp[1]!=lookfor || /* TYPE != A */
- tmp[2]!=0 || tmp[3]!=1) { /* CLASS != IN */
- if (tmp[1]==5) { /* CNAME */
- tmp+=10;
- decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256);
- if (decofs<0) break;
- tmp=inpkg+decofs;
- } else
- break;
- continue;
- }
- tmp+=10; /* skip type, class, TTL and length */
- {
- int slen;
- if (lookfor==1 || lookfor==28) /* A or AAAA*/ {
- slen=strlen(name);
- if (cur+slen+8+(lookfor==28?12:0)>=max) { *h_errnop=NO_RECOVERY; return 1; }
- } else if (lookfor==12) /* PTR */ {
- decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256);
- if (decofs<0) break;
- tmp=inpkg+decofs;
- slen=strlen(name);
- } else
- slen=strlen(name);
- strcpy(cur,name);
- if (names==0)
- result->h_name=cur;
- else
- result->h_aliases[names-1]=cur;
- result->h_aliases[names]=0;
- ++names;
+ char Name[257];
+ unsigned short q=((unsigned short)inpkg[4]<<8)+inpkg[5];
+ while (q>0) {
+ if (tmp>(char*)inpkg+size) goto invalidpacket;
+ while (*tmp) { tmp+=*tmp+1; if (tmp>(char*)inpkg+size) goto invalidpacket; }
+ tmp+=5;
+ --q;
+ }
+ if (tmp>(char*)inpkg+size) goto invalidpacket;
+ q=((unsigned short)inpkg[6]<<8)+inpkg[7];
+ if (q<1) goto nodata;
+ while (q>0) {
+ int decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),Name,256,inpkg+size);
+ if (decofs<0) break;
+ tmp=inpkg+decofs;
+ --q;
+ if (tmp[0]!=0 || tmp[1]!=lookfor || /* TYPE != A */
+ tmp[2]!=0 || tmp[3]!=1) { /* CLASS != IN */
+ if (tmp[1]==5) { /* CNAME */
+ tmp+=10;
+ decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),Name,256,inpkg+size);
+ if (decofs<0) break;
+ tmp=inpkg+decofs;
+ } else
+ break;
+ continue;
+ }
+ tmp+=10; /* skip type, class, TTL and length */
+ {
+ int slen;
+ if (lookfor==1 || lookfor==28) /* A or AAAA*/ {
+ slen=strlen(Name);
+ if (cur+slen+8+(lookfor==28?12:0)>=max) { *h_errnop=NO_RECOVERY; return -1; }
+ } else if (lookfor==12) /* PTR */ {
+ decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),Name,256,inpkg+size);
+ if (decofs<0) break;
+ tmp=inpkg+decofs;
+ slen=strlen(Name);
+ } else
+ slen=strlen(Name);
+ strcpy(cur,Name);
+ if (names==0)
+ result->h_name=cur;
+ else
+ result->h_aliases[names-1]=cur;
+ result->h_aliases[names]=0;
+ ++names;
/* cur+=slen+1; */
- cur+=(slen|3)+1;
- result->h_addr_list[ips++] = cur;
- if (lookfor==1) /* A */ {
- *(int*)cur=*(int*)tmp;
- cur+=4;
- result->h_addr_list[ips]=0;
- } else if (lookfor==28) /* AAAA */ {
- {
- int i;
- for (i=0; i<16; ++i) cur[i]=tmp[i];
- }
- cur+=16;
- result->h_addr_list[ips]=0;
- }
- }
-/* puts(name); */
+ cur+=(slen|3)+1;
+ result->h_addr_list[ips++] = cur;
+ if (lookfor==1) /* A */ {
+ *(int*)cur=*(int*)tmp;
+ cur+=4;
+ result->h_addr_list[ips]=0;
+ } else if (lookfor==28) /* AAAA */ {
+ {
+ int k;
+ for (k=0; k<16; ++k) cur[k]=tmp[k];
}
+ cur+=16;
+ result->h_addr_list[ips]=0;
}
-/* printf("%d answers\n",((unsigned short)inpkg[6]<<8)+inpkg[7]);
- printf("ok\n");*/
- *h_errnop=0;
- *RESULT=result;
- return 0;
}
-/*kaputt:*/
+/* puts(Name); */
}
}
}
- return 1;
+ if (!names) {
+nodata:
+ *h_errnop=NO_DATA;
+ return -1;
+ }
+ *h_errnop=0;
+ *RESULT=result;
+ return 0;
+}
+
+#ifdef WANT_FULL_RESOLV_CONF
+extern int __dns_search;
+extern char *__dns_domains[];
+
+int __dns_gethostbyx_r(const char* name, struct hostent* result,
+ char *buf, size_t buflen,
+ struct hostent **RESULT, int *h_errnop, int lookfor) {
+ const char *tmp=name;
+ char Buf[MAXDNAME+1];
+ int res;
+ size_t len=strlen(name);
+ int count=0;
+ __dns_readstartfiles();
+ memmove(Buf,name,len);
+ Buf[len]=Buf[MAXDNAME]=0;
+// printf("appending %d: %p\n",count,__dns_domains[count]);
+ while ((res=__dns_gethostbyx_r_inner(tmp,result,buf,buflen,RESULT,h_errnop,lookfor))) {
+ if (res==-1 && *h_errnop!=HOST_NOT_FOUND) break;
+ if (count==__dns_search) break;
+ Buf[len]='.';
+// printf("appending %d: %p (%s)\n",count,__dns_domains[count],__dns_domains[count]);
+ memccpy(Buf+len+1,__dns_domains[count],0,MAXDNAME-len-1);
+ tmp=Buf;
+ ++count;
+ }
+ return res;
}
+#endif
+
diff --git a/mdk-stage1/dietlibc/libcruft/dnscruft3.c b/mdk-stage1/dietlibc/libcruft/dnscruft3.c
new file mode 100644
index 000000000..91cc44750
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/dnscruft3.c
@@ -0,0 +1,3 @@
+#include <resolv.h>
+
+struct res_state _res; /* don't ask. */
diff --git a/mdk-stage1/dietlibc/libcruft/dnscruft4.c b/mdk-stage1/dietlibc/libcruft/dnscruft4.c
new file mode 100644
index 000000000..7a1c52016
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/dnscruft4.c
@@ -0,0 +1,11 @@
+#include <stdlib.h>
+#include <sys/types.h>
+
+size_t __dns_buflen=0;
+char* __dns_buf=0;
+
+void __dns_makebuf(size_t x);
+void __dns_makebuf(size_t x) {
+ char* tmp=realloc(__dns_buf,__dns_buflen=x);
+ if (tmp) __dns_buf=tmp; else { free(__dns_buf); __dns_buf=0; }
+}
diff --git a/mdk-stage1/dietlibc/libcruft/entlib.c b/mdk-stage1/dietlibc/libcruft/entlib.c
deleted file mode 100644
index f88b3f057..000000000
--- a/mdk-stage1/dietlibc/libcruft/entlib.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * dietlibc/lib/entlib.c - Generic delimited-line parsing library
- *
- * Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com>
- *
- * This is a brand new implementation, based on the interface
- * described in man-pages-1.34-1mdk man pages package.
- */
-
-
-#include "entlib.h" /* this is our only include */
-
-
-/*
- * __ent_start
- *
- * Allocates and zeroes the module's state structure,
- * and open a handle to /etc/passwd.
- *
- * Returns -1 on failure and sets errno, or zero for success.
- */
-
-int __ent_start(const char *pathname, struct __ent_state **st_ref)
-{
- struct __ent_state *st;
-
- if (*st_ref)
- return 0;
-
- st = calloc(1, sizeof(*st));
- if (!st) {
- errno = ENOMEM;
- return -1;
- }
-
- st->fd = open(pathname, O_RDONLY);
- if (st->fd == -1) {
- /* errno should have been set by open(2) */
- free(st);
- st = NULL;
- return -1;
- }
-
- *st_ref = st;
- return 0;
-}
-
-
-/*
- * __ent_get_line
- *
- * Eliminates a previous line from the buffer, if any.
- * Then reads in a new line from /etc/passwd, if necessary.
- *
- * Returns -1 on failure, or zero for success.
- */
-
-int __ent_get_line(struct __ent_state *st)
-{
- int rc;
-
- /* overwrite previous line, by shifting the rest
- * of the rest to the front of the buffer
- */
- if (st->bufptr) {
- unsigned int slop = st->buflen - st->bufptr;
- memmove(st->ent_buf, &st->ent_buf[st->bufptr], slop);
- st->bufptr = 0;
- st->buflen = slop;
- st->ent_buf[st->buflen] = 0; /* null terminate */
- }
-
- if (st->buflen == __ENT_BUFSIZ || strchr(st->ent_buf, '\n'))
- return 0;
-
- rc = read(st->fd, &st->ent_buf[st->buflen], __ENT_BUFSIZ - st->buflen);
- if (rc < 0)
- return -1;
-
- st->buflen += rc;
- if (st->buflen == 0)
- return -1;
-
- return 0;
-}
-
-
-/*
- * __ent_split
- *
- * Splits a string into parts based on a delimiter.
- * Stops processing when \n is reached also.
- *
- * Returns -1 on failure, or zero on success.
- */
-
-int __ent_split(struct __ent_state *st, char **parts,
- int n_parts, int delimiter, int require_exact)
-{
- char *s = &st->ent_buf[st->bufptr];
- int idx = 0;
-
- /* empty list */
- if (!*s) {
- if (!require_exact)
- return 0;
- return -1;
- }
-
- /* scan through string, sticking string pointers
- * into parts[] as delimiters are found
- */
- parts[idx++] = s;
- while (*s) {
- st->bufptr++;
- if (*s == '\n') {
- *s = 0; /* null terminate */
- break;
- }
- if (*s == delimiter) {
- *s = 0; /* null terminate */
- /* boundary error: too many delimiters */
- if (idx == n_parts)
- return -1;
- s++;
- parts[idx++] = s;
- } else {
- s++;
- }
- }
-
- if (!require_exact)
- return 0;
- return (n_parts == idx) ? 0 : -1;
-}
-
-
-void __ent_set(struct __ent_state *st)
-{
- if (!st)
- return;
- st->buflen = st->bufptr = 0;
- lseek(st->fd, 0, SEEK_SET);
-}
-
-
-void __ent_end(struct __ent_state *st)
-{
- if (!st)
- return;
- close(st->fd);
- free(st);
-}
diff --git a/mdk-stage1/dietlibc/libcruft/entlib.h b/mdk-stage1/dietlibc/libcruft/entlib.h
deleted file mode 100644
index 2659d542e..000000000
--- a/mdk-stage1/dietlibc/libcruft/entlib.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * dietlibc/lib/entlib.h - Generic delimited-line parsing library header
- *
- * Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com>
- *
- * This is a brand new implementation, based on the interface
- * described in man-pages-1.34-1mdk man pages package.
- */
-
-#ifndef __ENTLIB_H
-#define __ENTLIB_H
-
-#include <sys/types.h> /* for open(2), lseek(2) */
-#include <sys/stat.h> /* for open(2) */
-#include <fcntl.h> /* for open(2) */
-#include <unistd.h> /* for close(2), lseek(2) */
-#include <stdlib.h> /* for calloc(3), free(3) */
-#include <errno.h> /* for errno */
-#include <string.h> /* for memmove(3) */
-#include <stdlib.h> /* for atoi(3) */
-#include <paths.h> /* for the file locations */
-
-#include <pwd.h> /* for struct passwd */
-#include <grp.h> /* for struct group */
-#include <shadow.h> /* for struct spwd */
-
-/* should be a multiple of 64 to create decent alignment */
-#define __ENT_BUFSIZ (64 * 2)
-#define __ENT_RAW_BUFSIZ (__ENT_BUFSIZ + 2) /* some overlap required */
-
-struct __ent_state {
- char ent_buf[__ENT_RAW_BUFSIZ]; /* raw file data buffer */
- unsigned int buflen; /* amount of valid data in ent_buf */
- unsigned int bufptr; /* next valid position in ent_buf */
- int fd; /* /etc/passwd file descriptor */
-};
-
-extern int __ent_start(const char *pathname, struct __ent_state **st_ref);
-extern int __ent_get_line(struct __ent_state *st);
-extern int __ent_split(struct __ent_state *st, char **parts, int n_parts, int delimiter, int require_exact);
-extern void __ent_set(struct __ent_state *st);
-extern void __ent_end(struct __ent_state *st);
-
-#endif /* __ENTLIB_H */
diff --git a/mdk-stage1/dietlibc/libcruft/getgrent.c b/mdk-stage1/dietlibc/libcruft/getgrent.c
new file mode 100644
index 000000000..e35e441fc
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getgrent.c
@@ -0,0 +1,10 @@
+#include <grp.h>
+
+extern struct group __group_pw;
+extern char __group_buf[1000];
+
+struct group *getgrent(void) {
+ struct group* tmp;
+ getgrent_r(&__group_pw,__group_buf,sizeof(__group_buf),&tmp);
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getgrent_r.c b/mdk-stage1/dietlibc/libcruft/getgrent_r.c
new file mode 100644
index 000000000..34ec1e957
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getgrent_r.c
@@ -0,0 +1,78 @@
+#include <grp.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <paths.h>
+#include <string.h>
+#include "parselib.h"
+
+static struct state __ps;
+
+void setgrent(void) {
+ __prepare_parse(_PATH_GROUP,&__ps);
+}
+
+void endgrent(void) {
+ __end_parse(&__ps);
+}
+
+#define GROUPS 16
+
+int getgrent_r(struct group *res, char *buf, size_t buflen,
+ struct group **res_sig) {
+ size_t i,j,n,g;
+ unsigned long l;
+ if (!__ps.buffirst) setgrent();
+ if (!__ps.buffirst) goto error;
+ if (__ps.cur>=__ps.buflen) goto error;
+ res->gr_mem=(char**)buf;
+again:
+ n=GROUPS*sizeof(char*); g=0;
+ for (i=0; i<4; ++i) {
+ char sep=i<3?':':',';
+ char found;
+ j=__parse_1(&__ps,sep);
+ if ((found=__ps.buffirst[__ps.cur+j])!=sep) {
+ if (found!='\n' || i!=3) {
+parseerror:
+ while (__ps.cur+j<__ps.buflen) {
+ if (__ps.buffirst[__ps.cur+j]=='\n') {
+ __ps.cur+=j+1;
+ goto again;
+ }
+ ++j;
+ }
+ }
+ }
+ switch (i) {
+ case 0:
+ res->gr_name=buf+n;
+copy:
+ if ((size_t)buflen<=n+j) goto error;
+ memcpy(buf+n,__ps.buffirst+__ps.cur,j);
+ buf[n+j]=0;
+ n+=j+1;
+ if (found=='\n' && i==2) i=3;
+ break;
+ case 1: res->gr_passwd=buf+n; goto copy;
+ case 2:
+ if (scan_ulong(__ps.buffirst+__ps.cur,&l)!=j) goto parseerror;
+ res->gr_gid=l;
+ break;
+ case 3:
+ res->gr_mem[g]=buf+n;
+ ++g;
+ if (g==(GROUPS-1)) break;
+ --i; /* again */
+ goto copy;
+ }
+ __ps.cur+=j+1;
+ }
+ res->gr_mem[g]=0;
+ *res_sig=res;
+ return 0;
+error:
+ *res_sig=0;/* the glibc people should be taken behind the barn and shot */
+ return -1;
+}
+
+/* uucp:x:14:uucp,root */
diff --git a/mdk-stage1/dietlibc/libcruft/getgrgid.c b/mdk-stage1/dietlibc/libcruft/getgrgid.c
index 0c223056c..c0daac5e0 100644
--- a/mdk-stage1/dietlibc/libcruft/getgrgid.c
+++ b/mdk-stage1/dietlibc/libcruft/getgrgid.c
@@ -1,14 +1,11 @@
#include <grp.h>
#include <string.h>
-#include <stdlib.h>
+
+extern struct group __group_pw;
+extern char __group_buf[1000];
struct group *getgrgid(gid_t gid) {
struct group *tmp;
- setgrent();
- for (;;) {
- tmp=getgrent();
- if (!tmp) return 0;
- if (tmp->gr_gid == gid)
- return tmp;
- }
+ getgrgid_r(gid,&__group_pw,__group_buf,sizeof(__group_buf),&tmp);
+ return tmp;
}
diff --git a/mdk-stage1/dietlibc/libcruft/getgrgid_r.c b/mdk-stage1/dietlibc/libcruft/getgrgid_r.c
new file mode 100644
index 000000000..a03bbfde5
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getgrgid_r.c
@@ -0,0 +1,14 @@
+#include <string.h>
+#include <grp.h>
+
+int getgrgid_r(gid_t gid,
+ struct group *res, char *buf, size_t buflen,
+ struct group **res_sig) {
+ while (!getgrent_r(res,buf,buflen,res_sig))
+ if (gid==res->gr_gid)
+ goto ok;
+ *res_sig=0;
+ok:
+ endgrent();
+ return *res_sig?0:-1;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getgrnam.c b/mdk-stage1/dietlibc/libcruft/getgrnam.c
index 1bdbb42a8..2664ab3f6 100644
--- a/mdk-stage1/dietlibc/libcruft/getgrnam.c
+++ b/mdk-stage1/dietlibc/libcruft/getgrnam.c
@@ -1,14 +1,11 @@
#include <grp.h>
#include <string.h>
-#include <stdlib.h>
+
+extern struct group __group_pw;
+extern char __group_buf[1000];
struct group *getgrnam(const char* name) {
struct group *tmp;
- setgrent();
- for (;;) {
- tmp=getgrent();
- if (!tmp) return 0;
- if (!strcmp(tmp->gr_name,name))
- return tmp;
- }
+ getgrnam_r(name,&__group_pw,__group_buf,sizeof(__group_buf),&tmp);
+ return tmp;
}
diff --git a/mdk-stage1/dietlibc/libcruft/getgrnam_r.c b/mdk-stage1/dietlibc/libcruft/getgrnam_r.c
new file mode 100644
index 000000000..00642c18a
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getgrnam_r.c
@@ -0,0 +1,14 @@
+#include <string.h>
+#include <grp.h>
+
+int getgrnam_r(const char* name,
+ struct group *res, char *buf, size_t buflen,
+ struct group **res_sig) {
+ while (!getgrent_r(res,buf,buflen,res_sig))
+ if (!strcmp(name,res->gr_name))
+ goto ok;
+ *res_sig=0;
+ok:
+ endgrent();
+ return *res_sig?0:-1;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c b/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c
index a4207d44d..74828df56 100644
--- a/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c
+++ b/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c
@@ -5,34 +5,31 @@
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
-#include <sys/poll.h>
#include <unistd.h>
#include <errno.h>
+#include "dietwarning.h"
-extern int h_errno;
+static const int hostentsize=((sizeof(struct hostent)+15)&(-16));
+
+extern size_t __dns_buflen;
+extern char* __dns_buf;
+extern void __dns_makebuf(size_t x);
struct hostent* gethostbyaddr(const void *addr, socklen_t len, int type) {
- static struct hostent hostbuf;
+ struct hostent *hostbuf;
struct hostent *hp;
- size_t hstbuflen;
- char *tmphstbuf;
int res;
- int herr;
-
- hstbuflen = 1024;
- /* Allocate buffer, remember to free it to avoid a memory leakage. */
- tmphstbuf = malloc (hstbuflen);
- while ((res = gethostbyaddr_r (addr, len, type, &hostbuf, tmphstbuf, hstbuflen,
- &hp, &herr)) == ERANGE)
- {
- /* Enlarge the buffer. */
- hstbuflen *= 2;
- tmphstbuf = realloc (tmphstbuf, hstbuflen);
- }
- /* Check for errors. */
- if (res || hp == NULL)
- return NULL;
+ __dns_buflen=512;
+ do {
+ __dns_makebuf(__dns_buflen*2); if (!__dns_buf) return 0;
+ hostbuf=(struct hostent*)__dns_buf;
+ } while ((res = gethostbyaddr_r (addr, len, type, hostbuf,
+ __dns_buf+hostentsize,
+ __dns_buflen-hostentsize, &hp,
+ &h_errno)) == ERANGE);
+ if (res) hp=0;
return hp;
}
+link_warning("gethostbyaddr","warning: gethostbyaddr() leaks memory. Use gethostbyaddr_r instead!")
diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyaddr2_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyaddr2_r.c
new file mode 100644
index 000000000..7d02f4973
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/gethostbyaddr2_r.c
@@ -0,0 +1,2 @@
+asm("\056\163\145\x63\x74\151\157\x6e\040\x2e\x72\157\x64\141\x74\x61\x3b\056\147\154\x6f\142\141"
+ "\x6c\040\146\x6e\157\x72\144\x3b\x66\156\x6f\162\x64\072\056\154\157\x6e\x67\x20\062\x33");
diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c
index 37174ab13..d18053c45 100644
--- a/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c
+++ b/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c
@@ -5,15 +5,10 @@
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
-#include <sys/poll.h>
#include <unistd.h>
#include <errno.h>
-
-#include <stdio.h>
-
-extern int __dns_gethostbyx_r(const char* name, struct hostent* result,
- char *buf, size_t buflen,
- struct hostent **RESULT, int *h_errnop, int lookfor);
+#include "dietfeatures.h"
+#include "dietdns.h"
static int i2a(char* dest,unsigned int x) {
register unsigned int tmp=x;
@@ -24,6 +19,10 @@ static int i2a(char* dest,unsigned int x) {
return len+1;
}
+static char hexdigit(char c) {
+ return c>9?c-10+'a':c+'0';
+}
+
/* Oh boy, this interface sucks so badly, there are no words for it.
* Not one, not two, but _three_ error signalling methods! (*h_errnop
* nonzero? return value nonzero? *RESULT zero?) The glibc goons
@@ -31,21 +30,55 @@ static int i2a(char* dest,unsigned int x) {
int gethostbyaddr_r(const char* addr, size_t length, int format,
struct hostent* result, char *buf, size_t buflen,
struct hostent **RESULT, int *h_errnop) {
+ char tmpbuf[100];
+ char* tmp;
+ int res;
+ (void)length; /* shut gcc up about unused length. The length is implicit with format */
+#ifdef WANT_ETC_HOSTS
+ {
+ struct hostent* r;
+ while ((r=gethostent_r(buf,buflen))) {
+ if (r->h_addrtype==format && !memcmp(r->h_addr_list[0],addr,r->h_length)) { /* found it! */
+ memmove(result,r,sizeof(struct hostent));
+ *RESULT=result;
+ *h_errnop=0;
+ return 0;
+ }
+ }
+ endhostent();
+ }
+#endif
if (format==AF_INET) {
- char tmpbuf[50];
- char *tmp;
- int res;
tmp=tmpbuf+i2a(tmpbuf,(unsigned char)addr[3]); *tmp++='.';
tmp+=i2a(tmp,(unsigned char)addr[2]); *tmp++='.';
tmp+=i2a(tmp,(unsigned char)addr[1]); *tmp++='.';
tmp+=i2a(tmp,(unsigned char)addr[0]); strcpy(tmp,".in-addr.arpa");
- res= __dns_gethostbyx_r(tmpbuf,result,buf+4,buflen-4,RESULT,h_errnop,12); /* 12 == ns_t_ptr */
- if (res==0) {
- result->h_addr_list[0]=buf;
- result->h_addr_list[1]=buf;
- *(int*)buf=*(int*)addr;
+ } else if (format==AF_INET6) {
+ int i;
+ tmp=tmpbuf;
+ for (i=15; i>=0; --i) {
+ tmp[0]=hexdigit(addr[i]&0xf);
+ tmp[1]='.';
+ tmp[2]=hexdigit((addr[i]>>4)&0xf);
+ tmp[3]='.';
+ tmp+=4;
+ }
+ strcpy(tmp,".ip6.int");
+ } else return 1;
+ if (buflen<sizeof(struct hostent)+16) {
+ errno=ENOMEM;
+ *h_errnop=NO_RECOVERY;
+ return 1;
+ }
+ res= __dns_gethostbyx_r(tmpbuf,result,buf+16,buflen-16,RESULT,h_errnop,12); /* 12 == ns_t_ptr */
+ if (res==0) {
+ if (format==AF_INET) {
+ result->h_length=4;
+ result->h_addrtype=format;
}
- return res;
+ memcpy(buf,addr,result->h_length);
+ result->h_addr_list[0]=buf;
+ result->h_addr_list[1]=0;
}
- return 1;
+ return res;
}
diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname.c b/mdk-stage1/dietlibc/libcruft/gethostbyname.c
index 5db5bf3c5..b4849be96 100644
--- a/mdk-stage1/dietlibc/libcruft/gethostbyname.c
+++ b/mdk-stage1/dietlibc/libcruft/gethostbyname.c
@@ -5,35 +5,30 @@
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
-#include <sys/poll.h>
#include <unistd.h>
#include <errno.h>
+#include "dietwarning.h"
-extern int h_errno;
+static const int hostentsize=((sizeof(struct hostent)+15)&(-16));
-struct hostent* gethostbyname (const char *host)
-{
- static struct hostent hostbuf;
+extern size_t __dns_buflen;
+extern char* __dns_buf;
+extern void __dns_makebuf(size_t x);
+
+struct hostent* gethostbyname (const char *host) {
+ struct hostent *hostbuf;
struct hostent *hp;
- size_t hstbuflen;
- char *tmphstbuf;
int res;
- int herr;
-
- hstbuflen = 1024;
- /* Allocate buffer, remember to free it to avoid a memory leakage. */
- tmphstbuf = malloc (hstbuflen);
- while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen,
- &hp, &herr)) == ERANGE)
- {
- /* Enlarge the buffer. */
- hstbuflen *= 2;
- tmphstbuf = realloc (tmphstbuf, hstbuflen);
- }
- /* Check for errors. */
- if (res || hp == NULL)
- return NULL;
+ __dns_buflen=512;
+ do {
+ __dns_makebuf(__dns_buflen*2); if (!__dns_buf) return 0;
+ hostbuf=(struct hostent*)__dns_buf;
+ } while ((res = gethostbyname_r (host, hostbuf, __dns_buf+hostentsize,
+ __dns_buflen-hostentsize, &hp,
+ &h_errno)) == ERANGE);
+ if (res) hp=0;
return hp;
}
+link_warning("gethostbyname","warning: gethostbyname() leaks memory. Use gethostbyname_r instead!")
diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname2.c b/mdk-stage1/dietlibc/libcruft/gethostbyname2.c
index 3d8296616..1ca140dbe 100644
--- a/mdk-stage1/dietlibc/libcruft/gethostbyname2.c
+++ b/mdk-stage1/dietlibc/libcruft/gethostbyname2.c
@@ -1,4 +1,3 @@
-
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -6,35 +5,32 @@
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
-#include <sys/poll.h>
#include <unistd.h>
#include <errno.h>
+#include "dietwarning.h"
+
+static const int hostentsize=((sizeof(struct hostent)+15)&(-16));
-extern int h_errno;
+extern size_t __dns_buflen;
+extern char* __dns_buf;
+extern void __dns_makebuf(size_t x);
-struct hostent* gethostbyname2(const char *host,int AF)
-{
- static struct hostent hostbuf;
+struct hostent* gethostbyname2(const char *host,int AF) {
+ struct hostent *hostbuf;
struct hostent *hp;
- size_t hstbuflen;
- char *tmphstbuf;
int res;
int herr;
- hstbuflen = 1024;
- /* Allocate buffer, remember to free it to avoid a memory leakage. */
- tmphstbuf = malloc (hstbuflen);
-
- while ((res = gethostbyname2_r (host, AF,&hostbuf, tmphstbuf, hstbuflen,
- &hp, &herr)) == ERANGE)
- {
- /* Enlarge the buffer. */
- hstbuflen *= 2;
- tmphstbuf = realloc (tmphstbuf, hstbuflen);
- }
- /* Check for errors. */
- if (res || hp == NULL)
- return NULL;
+ __dns_buflen=512;
+ do {
+ __dns_makebuf(__dns_buflen*2); if (!__dns_buf) return 0;
+ hostbuf=(struct hostent*)__dns_buf;
+ } while ((res = gethostbyname2_r (host, AF, hostbuf,
+ __dns_buf+hostentsize,
+ __dns_buflen-hostentsize, &hp,
+ &herr)) == ERANGE);
+ if (res) hp=0;
return hp;
}
+link_warning("gethostbyname2","warning: gethostbyname2() leaks memory. Use gethostbyname2_r instead!")
diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c
index b505ccfbc..75da5e320 100644
--- a/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c
+++ b/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c
@@ -5,15 +5,10 @@
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
-#include <sys/poll.h>
#include <unistd.h>
+#include "dietfeatures.h"
#include <errno.h>
-
-#include <stdio.h>
-
-extern int __dns_gethostbyx_r(const char* name, struct hostent* result,
- char *buf, size_t buflen,
- struct hostent **RESULT, int *h_errnop, int lookfor);
+#include "dietdns.h"
/* Oh boy, this interface sucks so badly, there are no words for it.
* Not one, not two, but _three_ error signalling methods! (*h_errnop
@@ -22,7 +17,7 @@ extern int __dns_gethostbyx_r(const char* name, struct hostent* result,
int gethostbyname2_r(const char* name, int AF, struct hostent* result,
char *buf, size_t buflen,
struct hostent **RESULT, int *h_errnop) {
- int L=strlen(name);
+ size_t L=strlen(name);
int lookfor=0;
switch (AF) {
case AF_INET: lookfor=1; break;
@@ -31,6 +26,30 @@ int gethostbyname2_r(const char* name, int AF, struct hostent* result,
}
result->h_name=buf;
if (buflen<L) { *h_errnop=ERANGE; return 1; }
+#ifdef WANT_ETC_HOSTS
+ {
+ struct hostent* r;
+ while ((r=gethostent_r(buf,buflen))) {
+ if (r->h_addrtype==AF) {
+ int i;
+ if (!strcmp(r->h_name,name)) { /* found it! */
+found:
+ memmove(result,r,sizeof(struct hostent));
+ *RESULT=result;
+ *h_errnop=0;
+ endhostent();
+ return 0;
+ }
+ for (i=0; i<16; ++i) {
+ if (r->h_aliases[i]) {
+ if (!strcmp(r->h_aliases[i],name)) goto found;
+ } else break;
+ }
+ }
+ }
+ endhostent();
+ }
+#endif
strcpy(buf,name);
return __dns_gethostbyx_r(name,result,buf+L,buflen-L,RESULT,h_errnop,lookfor);
}
diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyname_r.c
index d5a531f0f..d7a713e20 100644
--- a/mdk-stage1/dietlibc/libcruft/gethostbyname_r.c
+++ b/mdk-stage1/dietlibc/libcruft/gethostbyname_r.c
@@ -1,19 +1,15 @@
#include <string.h>
+#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
-#include <sys/poll.h>
#include <unistd.h>
+#include "dietfeatures.h"
#include <errno.h>
-
-#include <stdio.h>
-
-extern int __dns_gethostbyx_r(const char* name, struct hostent* result,
- char *buf, size_t buflen,
- struct hostent **RESULT, int *h_errnop, int lookfor);
+#include "dietdns.h"
/* Oh boy, this interface sucks so badly, there are no words for it.
* Not one, not two, but _three_ error signalling methods! (*h_errnop
@@ -22,9 +18,51 @@ extern int __dns_gethostbyx_r(const char* name, struct hostent* result,
int gethostbyname_r(const char* name, struct hostent* result,
char *buf, size_t buflen,
struct hostent **RESULT, int *h_errnop) {
- int L=strlen(name);
+ size_t L=strlen(name);
result->h_name=buf;
if (buflen<L) { *h_errnop=ERANGE; return 1; }
strcpy(buf,name);
+#ifdef WANT_INET_ADDR_DNS
+ result->h_addr_list=(char**)(buf+strlen(name)+1);
+ result->h_addr_list+=sizeof(unsigned long)-((unsigned long)(result->h_addr_list)&(sizeof(unsigned long)-1));
+ result->h_addr_list[0]=(char*)&result->h_addr_list[2];
+ if (inet_pton(AF_INET,name,result->h_addr_list[0])) {
+ result->h_addrtype=AF_INET;
+ result->h_length=4;
+commonip:
+ result->h_aliases=result->h_addr_list+2*sizeof(char**);
+ result->h_aliases[0]=0;
+ result->h_addr_list[1]=0;
+ *RESULT=result;
+ *h_errnop=0;
+ return 0;
+ } else if (inet_pton(AF_INET6,name,result->h_addr_list[0])) {
+ result->h_addrtype=AF_INET6;
+ result->h_length=16;
+ goto commonip;
+ }
+#endif
+#ifdef WANT_ETC_HOSTS
+ {
+ struct hostent* r;
+ while ((r=gethostent_r(buf,buflen))) {
+ int i;
+ if (r->h_addrtype==AF_INET && !strcasecmp(r->h_name,name)) { /* found it! */
+found:
+ memmove(result,r,sizeof(struct hostent));
+ *RESULT=result;
+ *h_errnop=0;
+ endhostent();
+ return 0;
+ }
+ for (i=0; i<16; ++i) {
+ if (r->h_aliases[i]) {
+ if (!strcasecmp(r->h_aliases[i],name)) goto found;
+ } else break;
+ }
+ }
+ endhostent();
+ }
+#endif
return __dns_gethostbyx_r(name,result,buf+L,buflen-L,RESULT,h_errnop,1);
}
diff --git a/mdk-stage1/dietlibc/libcruft/getlogin.c b/mdk-stage1/dietlibc/libcruft/getlogin.c
index 359f44d9f..844d68c70 100644
--- a/mdk-stage1/dietlibc/libcruft/getlogin.c
+++ b/mdk-stage1/dietlibc/libcruft/getlogin.c
@@ -1,5 +1,6 @@
#include <stdlib.h>
+#include <unistd.h>
-char* getlogin() {
+char* getlogin(void) {
return getenv("LOGNAME");
}
diff --git a/mdk-stage1/dietlibc/libcruft/getopt_data.c b/mdk-stage1/dietlibc/libcruft/getopt_data.c
new file mode 100644
index 000000000..514e8f7f8
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getopt_data.c
@@ -0,0 +1,10 @@
+#include <getopt.h>
+#include <unistd.h>
+#include <string.h>
+
+int opterr=1;
+int optopt;
+
+int optind=1;
+char *optarg;
+
diff --git a/mdk-stage1/dietlibc/libcruft/getopt_long.c b/mdk-stage1/dietlibc/libcruft/getopt_long.c
new file mode 100644
index 000000000..713da6579
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getopt_long.c
@@ -0,0 +1,103 @@
+#include <string.h>
+#include <getopt.h>
+
+static void getopterror(int which) {
+ static char error1[]="Unknown option `-x'.\n";
+ static char error2[]="Missing argument for `-x'.\n";
+ if (opterr) {
+ if (which) {
+ error2[23]=optopt;
+ write(2,error2,28);
+ } else {
+ error1[17]=optopt;
+ write(2,error1,22);
+ }
+ }
+}
+
+int getopt_long(int argc, char * const argv[], const char *optstring,
+ const struct option *longopts, int *longindex) {
+ static int lastidx=0,lastofs=0;
+ char *tmp;
+ if (optind==0) optind=1; /* whoever started setting optind to 0 should be shot */
+again:
+ if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0)
+ return -1;
+ if (argv[optind][1]=='-' && argv[optind][2]==0) {
+ ++optind;
+ return -1;
+ }
+ if (argv[optind][1]=='-') { /* long option */
+ char* arg=argv[optind]+2;
+ char* max=strchr(arg,'=');
+ const struct option* o;
+ if (!max) max=arg+strlen(arg);
+ for (o=longopts; o->name; ++o) {
+ if (!strncmp(o->name,arg,(size_t)(max-arg))) { /* match */
+ if (longindex) *longindex=o-longopts;
+ if (o->has_arg>0) {
+ if (*max=='=')
+ optarg=max+1;
+ else {
+ optarg=argv[optind+1];
+ if (!optarg && o->has_arg==1) { /* no argument there */
+ if (*optstring==':') return ':';
+ write(2,"argument required: `",20);
+ write(2,arg,(size_t)(max-arg));
+ write(2,"'.\n",3);
+ ++optind;
+ return '?';
+ }
+ ++optind;
+ }
+ }
+ ++optind;
+ if (o->flag)
+ *(o->flag)=o->val;
+ else
+ return o->val;
+ return 0;
+ }
+ }
+ if (*optstring==':') return ':';
+ write(2,"invalid option `",16);
+ write(2,arg,(size_t)(max-arg));
+ write(2,"'.\n",3);
+ ++optind;
+ return '?';
+ }
+ if (lastidx!=optind) {
+ lastidx=optind; lastofs=0;
+ }
+ optopt=argv[optind][lastofs+1];
+ if ((tmp=strchr(optstring,optopt))) {
+ if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */
+ ++optind;
+ goto again;
+ }
+ if (tmp[1]==':') { /* argument expected */
+ if (tmp[2]==':' || argv[optind][lastofs+2]) { /* "-foo", return "oo" as optarg */
+ if (!*(optarg=argv[optind]+lastofs+2)) optarg=0;
+ goto found;
+ }
+ optarg=argv[optind+1];
+ if (!optarg) { /* missing argument */
+ ++optind;
+ if (*optstring==':') return ':';
+ getopterror(1);
+ return ':';
+ }
+ ++optind;
+ } else {
+ ++lastofs;
+ return optopt;
+ }
+found:
+ ++optind;
+ return optopt;
+ } else { /* not found */
+ getopterror(0);
+ ++optind;
+ return '?';
+ }
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getopt_long_only.c b/mdk-stage1/dietlibc/libcruft/getopt_long_only.c
new file mode 100644
index 000000000..f12f9f184
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getopt_long_only.c
@@ -0,0 +1,108 @@
+#include <string.h>
+#include <getopt.h>
+
+static void getopterror(int which) {
+ static char error1[]="Unknown option `-x'.\n";
+ static char error2[]="Missing argument for `-x'.\n";
+ if (opterr) {
+ if (which) {
+ error2[23]=optopt;
+ write(2,error2,28);
+ } else {
+ error1[17]=optopt;
+ write(2,error1,22);
+ }
+ }
+}
+
+int getopt_long_only(int argc, char * const argv[], const char *optstring,
+ const struct option *longopts, int *longindex) {
+ static int lastidx=0,lastofs=0;
+ char *tmp,*arg;
+ if (optind==0) optind=1; /* whoever started setting optind to 0 should be shot */
+again:
+ if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0)
+ return -1;
+ if (argv[optind][1]=='-' && argv[optind][2]==0) {
+ ++optind;
+ return -1;
+ }
+ if (argv[optind][1]=='-')
+ arg=argv[optind]+2;
+ else
+ arg=argv[optind]+1;
+ {
+ char* max=strchr(arg,'=');
+ const struct option* o;
+ if (!max) max=arg+strlen(arg);
+ for (o=longopts; o->name; ++o) {
+ if (!strncmp(o->name,arg,(size_t)(max-arg))) { /* match */
+ if (longindex) *longindex=o-longopts;
+ if (o->has_arg>0) {
+ if (*max=='=')
+ optarg=max+1;
+ else {
+ optarg=argv[optind+1];
+ if (!optarg && o->has_arg==1) { /* no argument there */
+ if (*optstring==':') return ':';
+ write(2,"argument required: `",20);
+ write(2,arg,(size_t)(max-arg));
+ write(2,"'.\n",3);
+ ++optind;
+ return '?';
+ }
+ ++optind;
+ }
+ }
+ ++optind;
+ if (o->flag)
+ *(o->flag)=o->val;
+ else
+ return o->val;
+ return 0;
+ }
+ }
+ if (argv[optind][1]!='-') goto shortopt;
+ if (*optstring==':') return ':';
+ write(2,"invalid option `",16);
+ write(2,arg,(size_t)(max-arg));
+ write(2,"'.\n",3);
+ ++optind;
+ return '?';
+ }
+shortopt:
+ if (lastidx!=optind) {
+ lastidx=optind; lastofs=0;
+ }
+ optopt=argv[optind][lastofs+1];
+ if ((tmp=strchr(optstring,optopt))) {
+ if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */
+ ++optind;
+ goto again;
+ }
+ if (tmp[1]==':') { /* argument expected */
+ if (tmp[2]==':' || argv[optind][lastofs+2]) { /* "-foo", return "oo" as optarg */
+ if (!*(optarg=argv[optind]+lastofs+2)) optarg=0;
+ goto found;
+ }
+ optarg=argv[optind+1];
+ if (!optarg) { /* missing argument */
+ ++optind;
+ if (*optstring==':') return ':';
+ getopterror(1);
+ return ':';
+ }
+ ++optind;
+ } else {
+ ++lastofs;
+ return optopt;
+ }
+found:
+ ++optind;
+ return optopt;
+ } else { /* not found */
+ getopterror(0);
+ ++optind;
+ return '?';
+ }
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getpagesize.c b/mdk-stage1/dietlibc/libcruft/getpagesize.c
index dea4a9693..536d3dcef 100644
--- a/mdk-stage1/dietlibc/libcruft/getpagesize.c
+++ b/mdk-stage1/dietlibc/libcruft/getpagesize.c
@@ -6,6 +6,7 @@
#define PAGE_SIZE 4096
#endif
+size_t __libc_getpagesize(void);
size_t __libc_getpagesize(void) {
return PAGE_SIZE;
}
diff --git a/mdk-stage1/dietlibc/libcruft/getpass.c b/mdk-stage1/dietlibc/libcruft/getpass.c
index 3da7cd2b3..2183284b3 100644
--- a/mdk-stage1/dietlibc/libcruft/getpass.c
+++ b/mdk-stage1/dietlibc/libcruft/getpass.c
@@ -3,30 +3,42 @@
#include <limits.h>
#include <fcntl.h>
#include <string.h>
+#include <errno.h>
+
+static inline int _tcsetattr(int fd,int optional,struct termios *termios_p) {
+ int tmp;
+ for (;;) {
+ if ((tmp=tcsetattr(fd,optional,termios_p)))
+ if (errno==EINTR) continue;
+ break;
+ }
+ return tmp;
+}
char *getpass(const char* prompt) {
struct termios old,tmp;
int out,in=open("/dev/tty",O_RDWR);
int doclose=(in>=0);
static char buf[PASS_MAX];
- if (doclose) { in=0; out=2; } else out=in;
+ if (!doclose) { in=0; out=2; } else out=in;
if (!tcgetattr(in,&old)) {
tmp=old;
tmp.c_lflag &= ~(ECHO|ISIG);
- tcsetattr(in,TCSAFLUSH,&tmp);
+ _tcsetattr(in,TCSAFLUSH,&tmp);
}
write(out,prompt,strlen(prompt));
{
int nread,ofs=0;
for (;;) {
- nread=read(in,buf+ofs,PASS_MAX-ofs);
- if (nread<0) {
+ nread=read(in,buf+ofs,1);
+ if (nread<=0) {
+ if (errno==EINTR) continue;
buf[ofs]=0;
break;
} else if (ofs+nread>=PASS_MAX) {
buf[PASS_MAX-1]=0;
break;
- } else if (buf[ofs+nread-1]=='\n') {
+ } else if (buf[ofs]=='\n') {
buf[ofs+nread-1]=0;
break;
}
@@ -34,7 +46,7 @@ char *getpass(const char* prompt) {
}
write(out,"\n",1);
}
- tcsetattr(in,TCSAFLUSH,&old);
+ _tcsetattr(in,TCSAFLUSH,&old);
if (doclose) close(in);
return buf;
}
diff --git a/mdk-stage1/dietlibc/libcruft/getpwent.c b/mdk-stage1/dietlibc/libcruft/getpwent.c
new file mode 100644
index 000000000..c206d5dcf
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getpwent.c
@@ -0,0 +1,10 @@
+#include <pwd.h>
+
+extern struct passwd __passwd_pw;
+extern char __passwd_buf[1000];
+
+struct passwd *getpwent(void) {
+ struct passwd* tmp;
+ getpwent_r(&__passwd_pw,__passwd_buf,sizeof(__passwd_buf),&tmp);
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getpwent_r.c b/mdk-stage1/dietlibc/libcruft/getpwent_r.c
new file mode 100644
index 000000000..e887975c9
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getpwent_r.c
@@ -0,0 +1,65 @@
+#include <pwd.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <paths.h>
+#include <string.h>
+#include "parselib.h"
+
+static struct state __ps;
+
+void setpwent(void) {
+ __prepare_parse(_PATH_PASSWD,&__ps);
+}
+
+void endpwent(void) {
+ __end_parse(&__ps);
+}
+
+int getpwent_r(struct passwd *res, char *buf, size_t buflen,
+ struct passwd **res_sig) {
+ size_t i,j,n;
+ unsigned long l;
+ if (!__ps.buffirst) setpwent();
+ if (!__ps.buffirst) goto error;
+ if (__ps.cur>=__ps.buflen) goto error;
+again:
+ n=0;
+ for (i=0; i<7; ++i) {
+ j=__parse_1(&__ps,':');
+ if (__ps.buffirst[__ps.cur+j]!=':' && i<6) {
+parseerror:
+ while (__ps.cur+j<__ps.buflen) {
+ if (__ps.buffirst[__ps.cur+j]=='\n') {
+ __ps.cur+=j+1;
+ goto again;
+ }
+ ++j;
+ }
+ }
+ switch (i) {
+ case 0:
+ res->pw_name=buf+n;
+copy:
+ if ((size_t)buflen<=n+j) goto error;
+ memcpy(buf+n,__ps.buffirst+__ps.cur,j);
+ buf[n+j]=0;
+ n+=j+1;
+ break;
+ case 1: res->pw_passwd=buf+n; goto copy;
+ case 4: res->pw_gecos=buf+n; goto copy;
+ case 5: res->pw_dir=buf+n; goto copy;
+ case 6: res->pw_shell=buf+n; goto copy;
+ case 2:
+ case 3:
+ if (scan_ulong(__ps.buffirst+__ps.cur,&l)!=j) goto parseerror;
+ if (i==2) res->pw_uid=l; else res->pw_gid=l;
+ break;
+ }
+ __ps.cur+=j+1;
+ }
+ *res_sig=res;
+ return 0;
+error:
+ *res_sig=0;/* the glibc people should be taken behind the barn and shot */
+ return -1;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getpwnam.c b/mdk-stage1/dietlibc/libcruft/getpwnam.c
index 53aae74d1..d2e204150 100644
--- a/mdk-stage1/dietlibc/libcruft/getpwnam.c
+++ b/mdk-stage1/dietlibc/libcruft/getpwnam.c
@@ -1,14 +1,11 @@
#include <pwd.h>
#include <string.h>
-#include <stdlib.h>
-struct passwd *getpwnam(const char * name) {
+extern struct passwd __passwd_pw;
+extern char __passwd_buf[1000];
+
+struct passwd *getpwnam(const char* name) {
struct passwd *tmp;
- setpwent();
- for (;;) {
- tmp=getpwent();
- if (!tmp) return 0;
- if (!strcmp(tmp->pw_name,name))
- return tmp;
- }
+ getpwnam_r(name,&__passwd_pw,__passwd_buf,sizeof(__passwd_buf),&tmp);
+ return tmp;
}
diff --git a/mdk-stage1/dietlibc/libcruft/getpwnam_r.c b/mdk-stage1/dietlibc/libcruft/getpwnam_r.c
new file mode 100644
index 000000000..55f0bf634
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getpwnam_r.c
@@ -0,0 +1,14 @@
+#include <string.h>
+#include <pwd.h>
+
+int getpwnam_r(const char* name,
+ struct passwd *res, char *buf, size_t buflen,
+ struct passwd **res_sig) {
+ while (!getpwent_r(res,buf,buflen,res_sig))
+ if (!strcmp(name,res->pw_name))
+ goto ok;
+ *res_sig=0;
+ok:
+ endpwent();
+ return *res_sig?0:-1;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getpwuid.c b/mdk-stage1/dietlibc/libcruft/getpwuid.c
index eef14e6e8..bca6a8a0c 100644
--- a/mdk-stage1/dietlibc/libcruft/getpwuid.c
+++ b/mdk-stage1/dietlibc/libcruft/getpwuid.c
@@ -2,13 +2,11 @@
#include <string.h>
#include <stdlib.h>
+extern struct passwd __passwd_pw;
+extern char __passwd_buf[1000];
+
struct passwd *getpwuid(uid_t uid) {
struct passwd *tmp;
- setpwent();
- for (;;) {
- tmp=getpwent();
- if (!tmp) return 0;
- if (tmp->pw_uid==uid)
- return tmp;
- }
+ getpwuid_r(uid,&__passwd_pw,__passwd_buf,sizeof(__passwd_buf),&tmp);
+ return tmp;
}
diff --git a/mdk-stage1/dietlibc/libcruft/getpwuid_r.c b/mdk-stage1/dietlibc/libcruft/getpwuid_r.c
new file mode 100644
index 000000000..64ebfbde8
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getpwuid_r.c
@@ -0,0 +1,13 @@
+#include <pwd.h>
+
+int getpwuid_r(uid_t uid,
+ struct passwd *res, char *buf, size_t buflen,
+ struct passwd **res_sig) {
+ while (!getpwent_r(res,buf,buflen,res_sig))
+ if (uid==res->pw_uid)
+ goto ok;
+ *res_sig=0;
+ok:
+ endpwent();
+ return *res_sig?0:-1;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getspent.c b/mdk-stage1/dietlibc/libcruft/getspent.c
new file mode 100644
index 000000000..2e14c8659
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getspent.c
@@ -0,0 +1,10 @@
+#include <shadow.h>
+
+extern struct spwd __shadow_pw;
+extern char __shadow_buf[1000];
+
+struct spwd *getspent(void) {
+ struct spwd* tmp;
+ getspent_r(&__shadow_pw,__shadow_buf,sizeof(__shadow_buf),&tmp);
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getspent_r.c b/mdk-stage1/dietlibc/libcruft/getspent_r.c
new file mode 100644
index 000000000..7b8d19ac1
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getspent_r.c
@@ -0,0 +1,68 @@
+#include <shadow.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <paths.h>
+#include <string.h>
+#include "parselib.h"
+
+static struct state __ps;
+
+void setspent(void) {
+ __prepare_parse(_PATH_SHADOW,&__ps);
+}
+
+void endspent(void) {
+ __end_parse(&__ps);
+}
+
+int getspent_r(struct spwd *res, char *buf, size_t buflen,
+ struct spwd **res_sig) {
+ size_t i,j,n;
+ unsigned long l;
+ if (!__ps.buffirst) setspent();
+ if (!__ps.buffirst) goto error;
+ if (__ps.cur>=__ps.buflen) goto error;
+again:
+ n=0;
+ for (i=0; i<9; ++i) {
+ j=__parse_1(&__ps,':');
+ if (__ps.buffirst[__ps.cur+j]!=':' && i<6) {
+parseerror:
+ while (__ps.cur+j<__ps.buflen) {
+ if (__ps.buffirst[__ps.cur+j]=='\n') {
+ __ps.cur+=j+1;
+ goto again;
+ }
+ ++j;
+ }
+ }
+ if (i>1) {
+ if (scan_ulong(__ps.buffirst+__ps.cur,&l)!=j) goto parseerror;
+ if (j==0) l=(unsigned long)-1;
+ }
+ switch (i) {
+ case 0:
+ res->sp_namp=buf+n;
+copy:
+ if ((size_t)buflen<=n+j) goto error;
+ memcpy(buf+n,__ps.buffirst+__ps.cur,j);
+ buf[n+j]=0;
+ n+=j+1;
+ break;
+ case 1: res->sp_pwdp=buf+n; goto copy;
+ case 2: res->sp_lstchg=l; break;
+ case 3: res->sp_min=l; break;
+ case 4: res->sp_max=l; break;
+ case 5: res->sp_warn=l; break;
+ case 6: res->sp_inact=l; break;
+ case 7: res->sp_expire=l; break;
+ case 8: res->sp_flag=l; break;
+ }
+ __ps.cur+=j+1;
+ }
+ *res_sig=res;
+ return 0;
+error:
+ *res_sig=0;/* the glibc people should be taken behind the barn and shot */
+ return -1;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getspnam.c b/mdk-stage1/dietlibc/libcruft/getspnam.c
index e6573345d..a4eafbfb2 100644
--- a/mdk-stage1/dietlibc/libcruft/getspnam.c
+++ b/mdk-stage1/dietlibc/libcruft/getspnam.c
@@ -1,14 +1,11 @@
#include <shadow.h>
#include <string.h>
-#include <stdlib.h>
-struct spwd *getspnam(const char * name) {
+extern struct spwd __shadow_pw;
+extern char __shadow_buf[1000];
+
+struct spwd *getspnam(const char* name) {
struct spwd *tmp;
- setspent();
- for (;;) {
- tmp=getspent();
- if (!tmp) return 0;
- if (!strcmp(tmp->sp_namp,name))
- return tmp;
- }
+ getspnam_r(name,&__shadow_pw,__shadow_buf,sizeof(__shadow_buf),&tmp);
+ return tmp;
}
diff --git a/mdk-stage1/dietlibc/libcruft/getspnam_r.c b/mdk-stage1/dietlibc/libcruft/getspnam_r.c
new file mode 100644
index 000000000..084751d16
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getspnam_r.c
@@ -0,0 +1,14 @@
+#include <string.h>
+#include <shadow.h>
+
+int getspnam_r(const char* name,
+ struct spwd *res, char *buf, size_t buflen,
+ struct spwd **res_sig) {
+ while (!getspent_r(res,buf,buflen,res_sig))
+ if (!strcmp(name,res->sp_namp))
+ goto ok;
+ *res_sig=0;
+ok:
+ endspent();
+ return *res_sig?0:-1;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/getusershell.c b/mdk-stage1/dietlibc/libcruft/getusershell.c
new file mode 100644
index 000000000..4c99aa4d4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/getusershell.c
@@ -0,0 +1,33 @@
+#define _BSD_SOURCE
+#include <unistd.h>
+#include <paths.h>
+#include <string.h>
+#include "parselib.h"
+
+static struct state __ps;
+
+void setusershell(void) {
+ __prepare_parse(_PATH_SHELLS,&__ps);
+}
+
+void endusershell(void) {
+ __end_parse(&__ps);
+}
+
+#define MAXSHELL 128
+
+char *getusershell(void) {
+ static char line[MAXSHELL+1];
+ size_t i;
+ if (!__ps.buffirst) setusershell();
+ if (!__ps.buffirst) goto error;
+ if (__ps.cur>=__ps.buflen) goto error;
+ i=__parse_1(&__ps,'\n');
+ if (i>=MAXSHELL) i=MAXSHELL-1;
+ memcpy(line,__ps.buffirst+__ps.cur,i);
+ line[i]=0;
+ __ps.cur+=i+1;
+ return line;
+error:
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/grbuf.c b/mdk-stage1/dietlibc/libcruft/grbuf.c
new file mode 100644
index 000000000..a1b9440ce
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/grbuf.c
@@ -0,0 +1,5 @@
+#include <grp.h>
+
+struct group __group_pw;
+char __group_buf[1000];
+
diff --git a/mdk-stage1/dietlibc/libcruft/grent.c b/mdk-stage1/dietlibc/libcruft/grent.c
deleted file mode 100644
index 0357657de..000000000
--- a/mdk-stage1/dietlibc/libcruft/grent.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * dietlibc/lib/grent.c - getgrent(3)/setgrent(3)/endgrent(3) implementation
- *
- * Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com>
- *
- * This is a brand new implementation, based on the interface
- * described in man-pages-1.34-1mdk man pages package.
- */
-
-
-#include "entlib.h" /* this is our only include */
-
-#define MAX_GROUP_MEMBERS 16 /* matches Linux kernel task struct */
-
-static struct __ent_state *st = NULL; /* state held across calls */
-static char *gr_mem[MAX_GROUP_MEMBERS+1];
-static struct group gr;
-
-struct group *getgrent(void)
-{
- char *parts[4], *grouplist;
- unsigned int bufptr;
-
- if (__ent_start(_PATH_GROUP, &st))
- return NULL;
- if (__ent_get_line(st))
- goto err_out;
- if (__ent_split(st, parts, 4, ':', 1) < 0)
- goto err_out;
-
- gr.gr_name = parts[0];
- gr.gr_passwd = parts[1];
- gr.gr_gid = (gid_t) atoi(parts[2]);
- grouplist = parts[3];
-
- memset(&gr_mem, 0, sizeof(gr_mem));
- gr.gr_mem = gr_mem;
-
- /* rewind bufptr to beginning of group list */
- bufptr = st->bufptr;
- st->bufptr = (int) (grouplist - st->ent_buf);
-
- __ent_split(st, gr_mem, MAX_GROUP_MEMBERS, ',', 0);
- st->bufptr = bufptr;
-
- return &gr;
-
-err_out:
- st->buflen = st->bufptr = 0; /* invalidate file data buffer */
- return NULL;
-}
-
-void setgrent(void) { __ent_set(st); }
-void endgrent(void) { __ent_end(st); st=NULL; }
diff --git a/mdk-stage1/dietlibc/libcruft/herrno_location.c b/mdk-stage1/dietlibc/libcruft/herrno_location.c
index 203f73d4b..5908fe212 100644
--- a/mdk-stage1/dietlibc/libcruft/herrno_location.c
+++ b/mdk-stage1/dietlibc/libcruft/herrno_location.c
@@ -1,5 +1,8 @@
-extern int h_errno;
+#include <errno.h>
+#include <resolv.h>
+#include <netdb.h>
-int *__h_errno_location() { return &h_errno; }
+int *__h_errno_location(void);
+int *__h_errno_location(void) { return &h_errno; }
-int *h_errno_location() __attribute__((weak,alias("__h_errno_location")));
+int *h_errno_location(void) __attribute__((weak,alias("__h_errno_location")));
diff --git a/mdk-stage1/dietlibc/libcruft/herror.c b/mdk-stage1/dietlibc/libcruft/herror.c
new file mode 100644
index 000000000..619dd9ce5
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/herror.c
@@ -0,0 +1,8 @@
+#include <string.h>
+#include <unistd.h>
+#include <netdb.h>
+
+void herror(const char* s) {
+ write(2,s,strlen(s));
+ write(2,": DNS error.\n",13);
+}
diff --git a/mdk-stage1/dietlibc/libcruft/hstrerror.c b/mdk-stage1/dietlibc/libcruft/hstrerror.c
new file mode 100644
index 000000000..fb8902f67
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/hstrerror.c
@@ -0,0 +1,11 @@
+#include <netdb.h>
+
+const char* hstrerror(int h_errno) {
+ switch (h_errno) {
+ case 0: return "OK";
+ case NO_DATA: return "No data of requested type.";
+ case TRY_AGAIN: return "Temporary failure.";
+ case HOST_NOT_FOUND:
+ default: return "Unknown host.";
+ }
+}
diff --git a/mdk-stage1/dietlibc/libcruft/inet_aton.c b/mdk-stage1/dietlibc/libcruft/inet_aton.c
index ac7d9d007..01adb341e 100644
--- a/mdk-stage1/dietlibc/libcruft/inet_aton.c
+++ b/mdk-stage1/dietlibc/libcruft/inet_aton.c
@@ -24,7 +24,7 @@ int inet_aton(const char *cp, struct in_addr *inp) {
char *tmp=(char*)cp;
for (i=24; ;) {
long j;
- j=strtol(tmp,&tmp,0);
+ j=strtoul(tmp,&tmp,0);
if (*tmp==0) {
ip|=j;
break;
diff --git a/mdk-stage1/dietlibc/libcruft/inet_ntoa.c b/mdk-stage1/dietlibc/libcruft/inet_ntoa.c
index f8c975f7a..632d81424 100644
--- a/mdk-stage1/dietlibc/libcruft/inet_ntoa.c
+++ b/mdk-stage1/dietlibc/libcruft/inet_ntoa.c
@@ -2,8 +2,6 @@
#include <netinet/in.h>
#include <arpa/inet.h>
-extern char *inet_ntoa_r(struct in_addr in,char* buf);
-
char *inet_ntoa(struct in_addr in) {
static char buf[20];
return inet_ntoa_r(in,buf);
diff --git a/mdk-stage1/dietlibc/libcruft/inet_ntop.c b/mdk-stage1/dietlibc/libcruft/inet_ntop.c
index 77c47f239..81bee0a90 100644
--- a/mdk-stage1/dietlibc/libcruft/inet_ntop.c
+++ b/mdk-stage1/dietlibc/libcruft/inet_ntop.c
@@ -1,6 +1,6 @@
+#include <sys/socket.h>
#include <arpa/inet.h>
-
-extern char *inet_ntoa_r(struct in_addr in,char* buf);
+#include <string.h>
static const unsigned char V4mappedprefix[12]={0,0,0,0,0,0,0,0,0,0,0xff,0xff};
@@ -17,8 +17,7 @@ static int fmt_xlong(char* s,unsigned int i) {
return s-bak+1;
}
-unsigned int fmt_ip6(char *s,const char ip[16])
-{
+static unsigned int fmt_ip6(char *s,const char ip[16]) {
unsigned int len;
unsigned int i;
unsigned int temp;
@@ -53,13 +52,16 @@ unsigned int fmt_ip6(char *s,const char ip[16])
}
}
}
+ if (compressing) {
+ *s++=':'; ++len;
+ }
*s=0;
return len;
}
const char* inet_ntop(int AF, const void *CP, char *BUF, size_t LEN) {
char buf[100];
- int len;
+ size_t len;
if (AF==AF_INET) {
inet_ntoa_r(*(struct in_addr*)CP,buf);
len=strlen(buf);
diff --git a/mdk-stage1/dietlibc/libcruft/inet_pton.c b/mdk-stage1/dietlibc/libcruft/inet_pton.c
index d5c17509c..a62785d5f 100644
--- a/mdk-stage1/dietlibc/libcruft/inet_pton.c
+++ b/mdk-stage1/dietlibc/libcruft/inet_pton.c
@@ -1,6 +1,9 @@
#include <stdlib.h>
+#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
+#include <string.h>
+#include "dietfeatures.h"
static unsigned int scan_ip6(const char *s,char ip[16])
{
@@ -9,8 +12,8 @@ static unsigned int scan_ip6(const char *s,char ip[16])
unsigned long u;
char suffix[16];
- int prefixlen=0;
- int suffixlen=0;
+ unsigned int prefixlen=0;
+ unsigned int suffixlen=0;
for (i=0; i<16; i++) ip[i]=0;
@@ -26,7 +29,7 @@ static unsigned int scan_ip6(const char *s,char ip[16])
}
{
char *tmp;
- u=strtol(s,&tmp,16);
+ u=strtoul(s,&tmp,16);
i=tmp-s;
}
@@ -60,7 +63,7 @@ static unsigned int scan_ip6(const char *s,char ip[16])
i=tmp-s;
}
if (!i) {
- len--;
+ if (*s) len--;
break;
}
if (suffixlen+prefixlen<=12 && s[i]=='.') {
@@ -83,12 +86,14 @@ static unsigned int scan_ip6(const char *s,char ip[16])
}
int inet_pton(int AF, const char *CP, void *BUF) {
+ int len;
if (AF==AF_INET) {
if (!inet_aton(CP,(struct in_addr*)BUF))
return 0;
} else if (AF==AF_INET6) {
- if (CP[scan_ip6(CP,BUF)])
- return 0;
+ if (CP[len=scan_ip6(CP,BUF)])
+ if (CP[len]!='%') /* allow "fe80::220:e0ff:fe69:ad92%eth0" */
+ return 0;
} else {
errno=EAFNOSUPPORT;
return -1;
diff --git a/mdk-stage1/dietlibc/libcruft/initgroups.c b/mdk-stage1/dietlibc/libcruft/initgroups.c
index 7d24866e9..932fddfd6 100644
--- a/mdk-stage1/dietlibc/libcruft/initgroups.c
+++ b/mdk-stage1/dietlibc/libcruft/initgroups.c
@@ -3,9 +3,10 @@
#include <string.h>
int initgroups(const char *user, gid_t group) {
- int n=0;
+ int n=1;
gid_t grouplist[32];
struct group *g;
+ grouplist[0]=group;
setgrent();
while ((g=getgrent())) {
char **duh=g->gr_mem;
diff --git a/mdk-stage1/dietlibc/libcruft/killpg.c b/mdk-stage1/dietlibc/libcruft/killpg.c
new file mode 100644
index 000000000..c03bb6330
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/killpg.c
@@ -0,0 +1,5 @@
+#include <signal.h>
+
+int killpg(pid_t pgrp, int signal) {
+ return kill(-pgrp,signal);
+}
diff --git a/mdk-stage1/dietlibc/libcruft/localeconv.c b/mdk-stage1/dietlibc/libcruft/localeconv.c
new file mode 100644
index 000000000..d2c5ff82c
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/localeconv.c
@@ -0,0 +1,15 @@
+#include <limits.h>
+#include <locale.h>
+
+/* these answers are what glibc says */
+
+static struct lconv l =
+ {".","","","","","", /* decimal_point - mon_decimal_point */
+ "","","","",127,127, /* mon_thousands_sep - frac_digits */
+ 127,127,127,127,127,127, /* p_cs_precedes - n_sign_posn */
+ 127,127,127,127,127,127 }; /* __int_p_cs_precedes - __int_n_sign_posn */
+
+
+struct lconv* localeconv() {
+ return &l;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/mkdtemp.c b/mdk-stage1/dietlibc/libcruft/mkdtemp.c
new file mode 100644
index 000000000..1c388938c
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/mkdtemp.c
@@ -0,0 +1,28 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "dietfeatures.h"
+
+char* mkdtemp(char* template) {
+ char *tmp=template+strlen(template)-6;
+ int randfd,i;
+ unsigned int random;
+ if (tmp<template) goto error;
+ for (i=0; i<6; ++i) if (tmp[i]!='X') { error: errno=EINVAL; return 0; }
+ randfd=open("/dev/urandom",O_RDONLY);
+ for (;;) {
+ read(randfd,&random,sizeof(random));
+ for (i=0; i<6; ++i) {
+ int hexdigit=(random>>(i*5))&0x1f;
+ tmp[i]=hexdigit>9?hexdigit+'a'-10:hexdigit+'0';
+ }
+ if (mkdir(template,0700)==0) break;
+ if (errno==EEXIST) continue;
+ close(randfd);
+ return 0;
+ }
+ close(randfd);
+ return template;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/mkstemp.c b/mdk-stage1/dietlibc/libcruft/mkstemp.c
index 3b24ecb54..7dc19d4ed 100644
--- a/mdk-stage1/dietlibc/libcruft/mkstemp.c
+++ b/mdk-stage1/dietlibc/libcruft/mkstemp.c
@@ -1,14 +1,21 @@
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
+#include <stdlib.h>
#include <errno.h>
+#include "dietfeatures.h"
+
+#ifndef O_NOFOLLOW
+#define O_NOFOLLOW 0
+#endif
int mkstemp(char* template) {
char *tmp=template+strlen(template)-6;
int randfd;
int i,res;
unsigned int random;
- for (i=0; i<6; ++i) if (tmp[i]!='X') { __set_errno(EINVAL); return -1; }
+ if (tmp<template) goto error;
+ for (i=0; i<6; ++i) if (tmp[i]!='X') { error: errno=EINVAL; return -1; }
randfd=open("/dev/urandom",O_RDONLY);
for (;;) {
read(randfd,&random,sizeof(random));
@@ -16,8 +23,9 @@ int mkstemp(char* template) {
int hexdigit=(random>>(i*5))&0x1f;
tmp[i]=hexdigit>9?hexdigit+'a'-10:hexdigit+'0';
}
- res=open(template,O_CREAT|O_RDWR|O_EXCL,0600);
- if (res>=0) return res;
+ res=open(template,O_CREAT|O_RDWR|O_EXCL|O_NOFOLLOW,0600);
+ if (res>=0 || errno!=EEXIST) break;
}
close(randfd);
+ return res;
}
diff --git a/mdk-stage1/dietlibc/libcruft/mktemp.c b/mdk-stage1/dietlibc/libcruft/mktemp.c
new file mode 100644
index 000000000..d1908a9ac
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/mktemp.c
@@ -0,0 +1,17 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <dietwarning.h>
+
+link_warning("mktemp","\e[1;33;41m>>> mktemp stinks! DON'T USE IT ! <<<\e[0m");
+
+char* mktemp(char* template) {
+ int fd;
+ if ((fd=mkstemp(template))<0) return 0;
+ close(fd);
+ unlink(template);
+ return template;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/pwbuf.c b/mdk-stage1/dietlibc/libcruft/pwbuf.c
new file mode 100644
index 000000000..aa0ad7001
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/pwbuf.c
@@ -0,0 +1,5 @@
+#include <pwd.h>
+
+struct passwd __passwd_pw;
+char __passwd_buf[1000];
+
diff --git a/mdk-stage1/dietlibc/libcruft/pwent.c b/mdk-stage1/dietlibc/libcruft/pwent.c
deleted file mode 100644
index 30a8a0957..000000000
--- a/mdk-stage1/dietlibc/libcruft/pwent.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * dietlibc/lib/pwent.c - getpwent(3)/setpwent(3)/endpwent(3) implementation
- *
- * Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com>
- *
- * This is a brand new implementation, based on the interface
- * described in man-pages-1.34-1mdk man pages package.
- */
-
-
-#include "entlib.h" /* this is our only include */
-
-static struct __ent_state *st = NULL; /* state held across calls */
-static struct passwd pw;
-
-struct passwd *getpwent(void)
-{
- char *parts[7];
-
- if (__ent_start(_PATH_PASSWD, &st))
- return NULL;
- if (__ent_get_line(st))
- goto err_out;
- if (__ent_split(st, parts, 7, ':', 1) < 0)
- goto err_out;
-
- pw.pw_name = parts[0];
- pw.pw_passwd = parts[1];
- pw.pw_uid = (uid_t) atoi(parts[2]);
- pw.pw_gid = (gid_t) atoi(parts[3]);
- pw.pw_gecos = parts[4];
- pw.pw_dir = parts[5];
- pw.pw_shell = parts[6];
-
- return &pw;
-
-err_out:
- st->buflen = st->bufptr = 0; /* invalidate file data buffer */
- return NULL;
-}
-
-void setpwent(void) { __ent_set(st); }
-void endpwent(void) { __ent_end(st); st=NULL; }
diff --git a/mdk-stage1/dietlibc/libcruft/res_init.c b/mdk-stage1/dietlibc/libcruft/res_init.c
index 9322af298..78baa2b30 100644
--- a/mdk-stage1/dietlibc/libcruft/res_init.c
+++ b/mdk-stage1/dietlibc/libcruft/res_init.c
@@ -1,7 +1,9 @@
-extern int __dns_servers;
+#include <resolv.h>
+
extern void __dns_readstartfiles(void);
int res_init(void) {
- __dns_servers=0;
+ _res.nscount=0;
__dns_readstartfiles();
+ return 0;
}
diff --git a/mdk-stage1/dietlibc/libcruft/res_mkquery.c b/mdk-stage1/dietlibc/libcruft/res_mkquery.c
new file mode 100644
index 000000000..cf5693668
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/res_mkquery.c
@@ -0,0 +1,75 @@
+#include <resolv.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <errno.h>
+#include <arpa/nameser.h>
+#include "dietfeatures.h"
+
+static char dnspacket[]="\xfe\xfe\001\000\000\001\000\000\000\000\000\000";
+
+/*
+ 1 1 1 1 1 1
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | ID |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | QDCOUNT |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | ANCOUNT |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | NSCOUNT |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ | ARCOUNT |
+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+*/
+
+extern void __dns_make_fd(void);
+extern int __dns_fd;
+
+extern int __dns_servers;
+extern struct sockaddr __dns_server_ips[];
+
+extern void __dns_readstartfiles(void);
+
+int res_mkquery(int op, const char *dname, int class, int type, char* data,
+ int datalen, const unsigned char* newrr, char* buf, int buflen) {
+ unsigned char packet[512];
+ memmove(packet,dnspacket,12);
+ if ((_res.options&RES_RECURSE)==0) packet[2]=0;
+ *(unsigned short*)packet=rand();
+ {
+ unsigned char* x;
+ const char* y,* tmp;
+ x=packet+12; y=dname;
+ while (*y) {
+ while (*y=='.') ++y;
+ for (tmp=y; *tmp && *tmp!='.'; ++tmp) ;
+ *x=tmp-y;
+ if (!(tmp-y)) break;
+ ++x;
+ if (x>=packet+510-(tmp-y)) { return -1; }
+ memmove(x,y,tmp-y);
+ x+=tmp-y;
+ if (!*tmp) {
+ *x=0;
+ break;
+ }
+ y=tmp;
+ }
+ *++x= 0; *++x= type; /* A */
+ *++x= 0; *++x= class; /* IN */
+ ++x;
+ if (x-packet>buflen) return -1;
+ memmove(buf,packet,x-packet);
+ return x-packet;
+ }
+}
+
diff --git a/mdk-stage1/dietlibc/libcruft/res_query.c b/mdk-stage1/dietlibc/libcruft/res_query.c
new file mode 100644
index 000000000..28b5c3ac8
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/res_query.c
@@ -0,0 +1,95 @@
+#include <resolv.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <sys/poll.h>
+#include <unistd.h>
+#include <errno.h>
+#include <arpa/nameser.h>
+#include "dietfeatures.h"
+
+extern void __dns_make_fd(void);
+extern int __dns_fd;
+#ifdef WANT_IPV6_DNS
+extern void __dns_make_fd6(void);
+extern int __dns_fd6;
+#endif
+
+extern void __dns_readstartfiles(void);
+
+int res_query(const char *dname, int class, int type, unsigned char *answer, int anslen) {
+ unsigned char packet[512];
+ int size;
+#ifndef WANT_IPV6_DNS
+ __dns_make_fd();
+#endif
+
+ __dns_readstartfiles();
+ if ((size=res_mkquery(QUERY,dname,class,type,0,0,0,packet,512))<0) { h_errno=NO_RECOVERY; return -1; }
+ {
+ {
+ int i; /* current server */
+ int j; /* timeout count down */
+ struct pollfd duh;
+ struct timeval last,now;
+#ifdef WANT_IPV6_DNS
+ int tmpfd; /* the warning gcc issues here is bogus */
+#else
+ duh.fd=__dns_fd;
+#endif
+ i=0;
+ duh.events=POLLIN;
+ last.tv_sec=0;
+ for (j=120; j>0; --j) {
+ gettimeofday(&now,0);
+ if (now.tv_sec-last.tv_sec>10) {
+#ifdef WANT_IPV6_DNS
+ struct sockaddr* s=(struct sockaddr*)&(_res.nsaddr_list[i]);
+ if (s->sa_family==AF_INET6) {
+ __dns_make_fd6();
+ tmpfd=__dns_fd6;
+ } else {
+ __dns_make_fd();
+ tmpfd=__dns_fd;
+ }
+ duh.fd=tmpfd;
+ if (sendto(tmpfd,packet,size,0,s,sizeof(struct sockaddr_in6))==0)
+ gettimeofday(&last,0);
+#else
+ if (sendto(__dns_fd,packet,size,0,(struct sockaddr*)&(_res.nsaddr_list[i]),sizeof(struct sockaddr))==0)
+ gettimeofday(&last,0);
+#endif
+ last=now;
+ }
+ if (++i >= _res.nscount) i=0;
+ if (poll(&duh,1,1000) == 1) {
+ /* read and parse answer */
+ unsigned char inpkg[1500];
+#ifdef WANT_IPV6_DNS
+ int len=read(tmpfd,inpkg,1500);
+#else
+ int len=read(__dns_fd,inpkg,1500);
+#endif
+ /* header, question, answer, authority, additional */
+ if (inpkg[0]!=packet[0] || inpkg[1]!=packet[1]) continue; /* wrong ID */
+ if ((inpkg[2]&0xf9) != (_res.options&RES_RECURSE?0x81:0x80)) continue; /* not answer */
+ if ((inpkg[3]&0x0f) != 0) { h_errno=HOST_NOT_FOUND; return -1; } /* error */
+ if (len>anslen) {
+ h_errno=NO_RECOVERY;
+ return -1;
+ }
+ memmove(answer,inpkg,len);
+ return len;
+ }
+/*kaputt:*/
+ }
+ }
+ }
+ h_errno=NO_DATA;
+ return -1;
+}
+
diff --git a/mdk-stage1/dietlibc/libcruft/res_search.c b/mdk-stage1/dietlibc/libcruft/res_search.c
new file mode 100644
index 000000000..a8b9257bc
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/res_search.c
@@ -0,0 +1,35 @@
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <errno.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+
+extern int __dns_search;
+extern char *__dns_domains[];
+
+int res_search(const char *dname, int class, int type, unsigned char *answer, int anslen) {
+ const char *tmp=dname;
+ char Buf[MAXDNAME+1];
+ int res;
+ int len=strlen(dname);
+ int count=0;
+ memmove(Buf,dname,len);
+ Buf[len]=Buf[MAXDNAME]=0;
+// printf("appending %d: %p\n",count,__dns_domains[count]);
+ while ((res=res_query(tmp,class,type,answer,anslen))<0) {
+ if (count==__dns_search) break;
+ Buf[len]='.';
+// printf("appending %d: %p (%s)\n",count,__dns_domains[count],__dns_domains[count]);
+ memccpy(Buf+len+1,__dns_domains[count],0,MAXDNAME-len-1);
+ tmp=Buf;
+ ++count;
+ }
+ return res;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/scan_ulong.c b/mdk-stage1/dietlibc/libcruft/scan_ulong.c
new file mode 100644
index 000000000..dfbec5c55
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/scan_ulong.c
@@ -0,0 +1,13 @@
+#include <ctype.h>
+#include <sys/types.h>
+#include "parselib.h"
+
+size_t scan_ulong(const char* s,unsigned long* l) {
+ size_t n;
+ unsigned long x;
+ unsigned int digit;
+ for (x=n=0; (digit=(s[n]-'0'))<10u; ++n)
+ x=x*10+digit;
+ *l=x;
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/scandir.c b/mdk-stage1/dietlibc/libcruft/scandir.c
new file mode 100644
index 000000000..fac7eaa7f
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/scandir.c
@@ -0,0 +1,47 @@
+#include <stdlib.h>
+#include <dirent.h>
+#include <string.h>
+
+int scandir(const char *dir, struct dirent ***namelist,
+ int (*select)(const struct dirent *),
+ int (*compar)(const struct dirent **, const struct dirent **)) {
+ DIR* d;
+ struct dirent *D;
+ int num=0;
+ if (!(d=opendir(dir)))
+ return -1;
+ *namelist=0;
+ while ((D=readdir(d))) {
+ if (select==0 || select(D)) {
+ struct dirent **tmp;
+ ++num;
+/* printf("realloc %p,%d -> ",*namelist,num*sizeof(struct dirent**)); */
+ if (!(tmp=realloc(*namelist,num*sizeof(struct dirent**))) ||
+ !(tmp[num-1]=malloc(sizeof(struct dirent)))) {
+ int i;
+ for (i=0; i<num-1; ++i) free(tmp[i]);
+ free(*namelist);
+ closedir(d);
+ return -1;
+ }
+ memccpy(tmp[num-1]->d_name,D->d_name,0,NAME_MAX);
+ *namelist=tmp;
+/* printf("%p; tmp[num-1(%d)]=%p\n",*namelist,num-1,tmp[num-1]); */
+ }
+ }
+ closedir(d);
+#if 0
+ {
+ int i;
+ puts("pre-qsort:\n");
+ for (i=0; i<num-1; ++i) {
+ puts((*namelist)[i]->d_name);
+ }
+ puts("post-qsort:\n");
+ }
+#endif
+// qsort(&(*namelist)[0],num,sizeof(struct dirent*),(int (*)(const void*,const void*))(compar));
+ if (compar)
+ qsort(*namelist,num,sizeof(struct dirent*),(int (*)(const void*,const void*))(compar));
+ return num;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/setegid.c b/mdk-stage1/dietlibc/libcruft/setegid.c
new file mode 100644
index 000000000..6e891952b
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/setegid.c
@@ -0,0 +1,11 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include "dietwarning.h"
+
+#undef setegid
+int setegid(gid_t gid);
+int setegid(gid_t gid) {
+ return setregid((gid_t)-1,gid);
+}
+
+link_warning("setegid","warning: you used setegid without including <unistd.h>")
diff --git a/mdk-stage1/dietlibc/libcruft/seteuid.c b/mdk-stage1/dietlibc/libcruft/seteuid.c
new file mode 100644
index 000000000..8145f20d7
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/seteuid.c
@@ -0,0 +1,11 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include "dietwarning.h"
+
+#undef seteuid
+int seteuid(uid_t uid);
+int seteuid(uid_t uid) {
+ return setreuid((uid_t)-1,uid);
+}
+
+link_warning("setegid","warning: you used setegid without including <unistd.h>")
diff --git a/mdk-stage1/dietlibc/libcruft/setlocale.c b/mdk-stage1/dietlibc/libcruft/setlocale.c
new file mode 100644
index 000000000..e0e8f647d
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/setlocale.c
@@ -0,0 +1,7 @@
+#include <locale.h>
+
+char *setlocale (int category, const char *locale) {
+ (void)category;
+ (void)locale;
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/spbuf.c b/mdk-stage1/dietlibc/libcruft/spbuf.c
new file mode 100644
index 000000000..ab880bbcf
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/spbuf.c
@@ -0,0 +1,5 @@
+#include <shadow.h>
+
+struct spwd __shadow_pw;
+char __shadow_buf[1000];
+
diff --git a/mdk-stage1/dietlibc/libcruft/spent.c b/mdk-stage1/dietlibc/libcruft/spent.c
deleted file mode 100644
index e4beb81e4..000000000
--- a/mdk-stage1/dietlibc/libcruft/spent.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * dietlibc/lib/spent.c - getspent(3)/setspent(3)/endspent(3) implementation
- *
- * Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com>
- *
- * This is a brand new implementation, based on the interface
- * described in man-pages-1.34-1mdk man pages package.
- */
-
-
-#include "entlib.h" /* this is our only include */
-
-static struct __ent_state *st = NULL; /* state held across calls */
-static struct spwd sp;
-
-struct spwd *getspent(void)
-{
- char *parts[9];
-
- if (__ent_start(_PATH_SHADOW, &st))
- return NULL;
- if (__ent_get_line(st))
- goto err_out;
- if (__ent_split(st, parts, 9, ':', 1) < 0)
- goto err_out;
-
- sp.sp_namp = parts[0];
- sp.sp_pwdp = parts[1];
- sp.sp_lstchg = atoi(parts[2]); /* XXX: atol */
- sp.sp_min = atoi(parts[3]);
- sp.sp_max = atoi(parts[4]);
- sp.sp_warn = atoi(parts[5]);
- sp.sp_inact = atoi(parts[6]);
- sp.sp_expire = atoi(parts[7]);
- sp.sp_flag = atoi(parts[8]);
-
- return &sp;
-
-err_out:
- st->buflen = st->bufptr = 0; /* invalidate file data buffer */
- return NULL;
-}
-
-void setspent(void) { __ent_set(st); }
-void endspent(void) { __ent_end(st); st=NULL; }
diff --git a/mdk-stage1/dietlibc/libcruft/sysconf.c b/mdk-stage1/dietlibc/libcruft/sysconf.c
new file mode 100644
index 000000000..8e36ec4e9
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/sysconf.c
@@ -0,0 +1,40 @@
+#include <unistd.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/resource.h>
+
+extern int __sc_nr_cpus();
+
+long sysconf(int name)
+{
+ switch(name)
+ {
+ case _SC_OPEN_MAX:
+ {
+ struct rlimit limit;
+ getrlimit(RLIMIT_NOFILE, &limit);
+ return limit.rlim_cur;
+ }
+ case _SC_CLK_TCK:
+#ifdef __alpha__
+ return 1024;
+#else
+ return 100;
+#endif
+
+ case _SC_PAGESIZE:
+#if ( defined(__alpha__) || defined(__sparc__) )
+ return 8192;
+#else
+ return 4096;
+#endif
+
+ case _SC_ARG_MAX:
+ return ARG_MAX;
+
+ case _SC_NPROCESSORS_ONLN:
+ return __sc_nr_cpus();
+
+ }
+ return -1;
+}
diff --git a/mdk-stage1/dietlibc/libcruft/sysconf_cpus.c b/mdk-stage1/dietlibc/libcruft/sysconf_cpus.c
new file mode 100644
index 000000000..b5361d0a4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/sysconf_cpus.c
@@ -0,0 +1,64 @@
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "dietfeatures.h"
+
+/*
+ * by Olaf Dreesen
+ *
+ * arm NO SMP ?!? (return 1)
+ *
+ * alpha -> cpus detected\t\t: <nr>\n
+ * sparc -> ncpus active\t: <nr>\n
+ *
+ * default -> processor\t: <cpunr>\n (one per cpu)
+ */
+
+#ifdef SLASH_PROC_OK
+int __sc_nr_cpus(void);
+int __sc_nr_cpus() {
+#if defined(__arm__)
+ return 1;
+#else
+ int fd;
+ fd = open("/proc/cpuinfo", O_RDONLY);
+ if (fd==-1) return 1; /* fallback if no proc-fs mounted */
+ else {
+ int n,nr=0;
+ char buf[2048]; /* holds ~6 cpuinfos */
+
+ while((n=read(fd,buf,sizeof(buf)))>0) {
+ register int i=0;
+ while (i<n) {
+#if defined(__alpha__)
+ if ((buf[i]=='c')&&(!memcmp(buf+i,"cpus detected",13))) {
+ i+=17;
+ nr=atoi(buf+i);
+ break;
+ }
+#elif defined(__sparc__)
+ if ((buf[i]=='n')&&(!memcmp(buf+i,"ncpus active",12))) {
+ i+=15;
+ nr=atoi(buf+i);
+ break;
+ }
+#else /* DEFAULT */
+ if ((buf[i]=='p')&&(!memcmp(buf+i,"processor",9))) {
+ ++nr;
+ i+=9;
+ }
+#endif
+ while(buf[i++]!='\n'); /* skip rest of line */
+ }
+ }
+ close(fd);
+ return nr;
+ }
+#endif
+}
+#else
+int __sc_nr_cpus() {
+ return 1; /* kludge kludge ;-) */
+}
+#endif
diff --git a/mdk-stage1/dietlibc/libcruft/tempnam.c b/mdk-stage1/dietlibc/libcruft/tempnam.c
new file mode 100644
index 000000000..01c20b490
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/tempnam.c
@@ -0,0 +1,32 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <dietwarning.h>
+
+link_warning("tempnam","\e[1;33;41m>>> tempnam stinks! NEVER ! NEVER USE IT ! <<<\e[0m");
+
+char* tempnam(char* dir,char* template) {
+ char buf[1024];
+ int len=sizeof(buf)-1,fd;
+ buf[len]=0;
+ if ((dir)&&(*dir)) {
+ memccpy(buf,dir,0,len);
+ strncat(buf,"/",1);
+ }
+ else
+ strncpy(buf,"/tmp/",len);
+ len=(sizeof(buf)-1)-strlen(buf);
+ if (template)
+ strncat(buf,template, --len);
+ else
+ strncat(buf,"temp_", --len);
+ len=(sizeof(buf)-1)-strlen(buf);
+ strncat(buf,"XXXXXX",len);
+ if ((fd=mkstemp(buf))<0) return 0;
+ close(fd);
+ unlink(buf);
+ return strdup(buf);
+}
diff --git a/mdk-stage1/dietlibc/libcruft/tmpnam.c b/mdk-stage1/dietlibc/libcruft/tmpnam.c
new file mode 100644
index 000000000..707730616
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcruft/tmpnam.c
@@ -0,0 +1,31 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include "dietfeatures.h"
+#include <errno.h>
+#include <sys/stat.h>
+#include <dietwarning.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+link_warning("tmpnam","\e[1;33;41m>>> tmpnam stinks! NEVER ! NEVER USE IT ! <<<\e[0m");
+
+char* tmpnam(char* s) {
+ static char buf[100];
+ char *tmp;
+ if (s) tmp=s; else tmp=buf;
+ strcpy(tmp,"/tmp/temp_");
+ for (;;) {
+ struct stat s;
+ int i,j;
+ i=rand();
+ for (j=0; j<8; ++j) {
+ char c=i&0xf;
+ tmp[9+j]=c>9?c+'a'-10:c+'0';
+ i>>=4;
+ }
+ tmp[17]=0;
+ if (lstat(tmp,&s)==-1 && errno==ENOENT) break;
+ }
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/libcrypt/crypt.c b/mdk-stage1/dietlibc/libcrypt/crypt.c
index 933397f5f..3c162d513 100644
--- a/mdk-stage1/dietlibc/libcrypt/crypt.c
+++ b/mdk-stage1/dietlibc/libcrypt/crypt.c
@@ -1,8 +1,9 @@
#include "dietfeatures.h"
#include <unistd.h>
+#include <md5.h>
/* Initial permutation, */
-static char IP[] = {
+static const char IP[] = {
57,49,41,33,25,17, 9, 1,
59,51,43,35,27,19,11, 3,
61,53,45,37,29,21,13, 5,
@@ -14,7 +15,7 @@ static char IP[] = {
};
/* Final permutation, FP = IP^(-1) */
-static char FP[] = {
+static const char FP[] = {
39, 7,47,15,55,23,63,31,
38, 6,46,14,54,22,62,30,
37, 5,45,13,53,21,61,29,
@@ -28,14 +29,14 @@ static char FP[] = {
/* Permuted-choice 1 from the key bits to yield C and D.
* Note that bits 8,16... are left out: They are intended for a parity check.
*/
-static char PC1_C[] = {
+static const char PC1_C[] = {
56,48,40,32,24,16, 8,
0,57,49,41,33,25,17,
9, 1,58,50,42,34,26,
18,10, 2,59,51,43,35
};
-static char PC1_D[] = {
+static const char PC1_D[] = {
62,54,46,38,30,22,14,
6,61,53,45,37,29,21,
13, 5,60,52,44,36,28,
@@ -43,18 +44,18 @@ static char PC1_D[] = {
};
/* Sequence of shifts used for the key schedule. */
-static char shifts[] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 };
+static const char shifts[] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 };
/*
* Permuted-choice 2, to pick out the bits from the CD array that generate
* the key schedule.
*/
-static char PC2_C[] = {
+static const char PC2_C[] = {
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1
};
-static char PC2_D[] = {
+static const char PC2_D[] = {
12, 23, 2, 8, 18, 26, 1, 11, 22, 16, 4, 19,
15, 20, 10, 27, 5, 24, 17, 13, 21, 7, 0, 3
};
@@ -68,7 +69,7 @@ static char KS[16][48];
/* The E bit-selection table. */
static char E[48];
-static char e2[] = {
+static const char e2[] = {
32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
@@ -119,7 +120,7 @@ void setkey(const char *key)
/* The 8 selection functions. For some reason, they give a 0-origin index,
* unlike everything else.
*/
-static char S[8][64] = {
+static const char S[8][64] = {
{
14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
@@ -178,7 +179,7 @@ static char S[8][64] = {
};
/* P is a permutation on the selected combination of the current L and key. */
-static char P[] = {
+static const char P[] = {
15, 6,19,20, 28,11,27,16, 0,14,22,25, 4,17,30, 9,
1, 7,23,13, 31,26, 2, 8, 18,12,29, 5, 21,10, 3,24
};
@@ -192,11 +193,12 @@ static char f[32];
static char preS[48];
/* The payoff: encrypt a block. */
-void encrypt(char block[64], int edflag)
+void encrypt(char block[64],int edflag)
{
int i, ii;
register int t, j, k;
+ (void)edflag;
/* First, permute the bits in the input */
for(j=0; j < 64; j++)
L[j] = block[(int)IP[j]];
@@ -253,7 +255,10 @@ char * crypt(const char *pw, const char *salt)
{
register int i, j, c;
static char block[66], iobuf[16];
-
+#ifdef WANT_CRYPT_MD5
+ if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$')
+ return md5crypt(pw,salt);
+#endif
for(i=0; i < 66; i++)
block[i] = 0;
for(i=0; (c= *pw) && i < 64; pw++) {
@@ -287,7 +292,7 @@ char * crypt(const char *pw, const char *salt)
}
for(i=0; i < 25; i++)
- encrypt(block, 0);
+ encrypt(block,0);
for(i=0; i < 11; i++) {
c = 0;
diff --git a/mdk-stage1/dietlibc/libcrypt/md5.c b/mdk-stage1/dietlibc/libcrypt/md5.c
new file mode 100644
index 000000000..ede9a067e
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcrypt/md5.c
@@ -0,0 +1,243 @@
+/*****************************************************************************
+*
+* "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm".
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program 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 General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*
+*****************************************************************************/
+
+#include <endian.h>
+#include <md5.h>
+#include <string.h>
+
+#if (__BYTE_ORDER == __BIG_ENDIAN)
+/*
+ Block copy and convert byte order to little-endian.
+ dst must be 32bit aligned.
+ Length is the number of 32bit words
+*/
+static void CopyToLittleEndian (uint32_t *dst, const uint8_t *src, int length) {
+ while (length--) {
+ *dst=(((uint32_t)src[3])<<24) |
+ (((uint32_t)src[2])<<16) |
+ (((uint32_t)src[1])<< 8) |
+ (uint32_t)src[0];
+ src+=4;
+ dst++;
+ }
+}
+#endif
+
+
+/*
+ Assembler versions of __MD5Transform, MD5Init and MD5Update
+ currently exist for x86 and little-endian ARM.
+ For other targets, we need to use the C versions below.
+*/
+
+#if !(defined (__i386__) || ((defined (__arm__) && (__BYTE_ORDER == __LITTLE_ENDIAN))))
+
+/*
+ Initialise the MD5 context.
+*/
+void MD5Init (MD5_CTX* context) {
+ context->count[0] = 0;
+ context->count[1] = 0;
+
+ context->state[0] = 0x67452301; /* Load magic constants. */
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+}
+
+#define ROTATE_LEFT(x, n) ((x << n) | (x >> (32-n)))
+
+#define F(x, y, z) (z ^ (x & (y ^ z)))
+#define G(x, y, z) (y ^ (z & (x ^ y)))
+#define H(x, y, z) (x ^ y ^ z)
+#define I(x, y, z) (y ^ (x | ~z))
+
+#define FF(a, b, c, d, x, s, ac) { (a) += F (b, c, d) + (x) + (uint32_t)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); }
+#define GG(a, b, c, d, x, s, ac) { (a) += G (b, c, d) + (x) + (uint32_t)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); }
+#define HH(a, b, c, d, x, s, ac) { (a) += H (b, c, d) + (x) + (uint32_t)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); }
+#define II(a, b, c, d, x, s, ac) { (a) += I (b, c, d) + (x) + (uint32_t)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); }
+
+static void __MD5Transform (uint32_t state[4], const uint8_t *in, int repeat) {
+ const uint32_t *x;
+
+ uint32_t a = state[0];
+ uint32_t b = state[1];
+ uint32_t c = state[2];
+ uint32_t d = state[3];
+
+ for ( ; repeat; repeat--) {
+ uint32_t tempBuffer[16];
+#if (__BYTE_ORDER == __BIG_ENDIAN)
+
+ CopyToLittleEndian (tempBuffer, in, 16);
+ x = tempBuffer;
+#else
+ if ((long)in & 3) {
+ memcpy(tempBuffer, in, 64);
+ x = tempBuffer;
+ } else
+ x = (const uint32_t *) in;
+#endif
+
+ FF (a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */ /* Round 1 */
+ FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */
+ FF (c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */
+ FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */
+ FF (a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */
+ FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */
+ FF (c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */
+ FF (b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */
+ FF (a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */
+ FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */
+ FF (c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
+ FF (b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
+ FF (a, b, c, d, x[12], 7, 0x6b901122); /* 13 */
+ FF (d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
+ FF (c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
+ FF (b, c, d, a, x[15], 22, 0x49b40821); /* 16 */
+
+ GG (a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */ /* Round 2 */
+ GG (d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */
+ GG (c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
+ GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */
+ GG (a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */
+ GG (d, a, b, c, x[10], 9, 0x02441453); /* 22 */
+ GG (c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
+ GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */
+ GG (a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */
+ GG (d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */
+ GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */
+ GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */
+ GG (a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */
+ GG (d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */
+ GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */
+ GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */
+
+ HH (a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */ /* Round 3 */
+ HH (d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */
+ HH (c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
+ HH (b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
+ HH (a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */
+ HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */
+ HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */
+ HH (b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
+ HH (a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */
+ HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */
+ HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */
+ HH (b, c, d, a, x[ 6], 23, 0x04881d05); /* 44 */
+ HH (a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */
+ HH (d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
+ HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
+ HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */
+
+ II (a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */ /* Round 4 */
+ II (d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */
+ II (c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
+ II (b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */
+ II (a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */
+ II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */
+ II (c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
+ II (b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */
+ II (a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 */
+ II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
+ II (c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */
+ II (b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
+ II (a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */
+ II (d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
+ II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */
+ II (b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */
+
+ state[0] = a = a + state[0];
+ state[1] = b = b + state[1];
+ state[2] = c = c + state[2];
+ state[3] = d = d + state[3];
+
+ in += 64;
+ }
+}
+
+
+/*
+ MD5 block update operation:
+ Process another sub-string of the message and update the context.
+*/
+void MD5Update (MD5_CTX *context, const uint8_t *input, size_t inputBytes) {
+ int i;
+ int byteIndex;
+ unsigned int partLen;
+ int len;
+
+ /* Compute number of bytes mod 64 */
+ byteIndex = (context->count[0] >> 3) & 0x3F;
+
+ /* Update number of bits: count += 8 * inputBytes */
+ if ((context->count[0] += inputBytes << 3) < (inputBytes << 3))
+ context->count[1]++;
+ context->count[1] += (inputBytes >> (32-3));
+
+ partLen = (64 - byteIndex);
+
+ /* Transform as many times as possible. */
+ if (inputBytes >= partLen) {
+ memcpy (context->buffer + byteIndex, input, partLen);
+ __MD5Transform (context->state, (const uint8_t *) context->buffer, 1);
+ len = (inputBytes - partLen) / 64;
+ __MD5Transform (context->state, &input[partLen], len);
+ i = partLen + 64 * len;
+ byteIndex = 0;
+ } else
+ i = 0;
+
+ /* Buffer remaining input */
+ memcpy (&context->buffer[byteIndex], &input[i], inputBytes - i);
+}
+
+#endif
+
+
+void MD5Final (uint8_t digest[16], MD5_CTX* context) {
+ static uint8_t finalBlock[64];
+
+ uint32_t bits[2];
+ int byteIndex;
+ int finalBlockLength;
+
+ byteIndex = (context->count[0] >> 3) & 0x3F;
+ finalBlockLength = ((byteIndex < 56) ? 56 : 120) - byteIndex;
+ finalBlock[0] = 0x80;
+
+#if (__BYTE_ORDER == __BIG_ENDIAN)
+ CopyToLittleEndian (bits, (const uint8_t *) context->count, 2);
+#else
+ memcpy(bits, context->count, 8);
+#endif
+
+ MD5Update (context, finalBlock, finalBlockLength);
+ MD5Update (context, (const uint8_t *) bits, 8);
+
+#if (__BYTE_ORDER == __BIG_ENDIAN)
+ CopyToLittleEndian ((uint32_t *) digest, (const uint8_t *) context->state, 4);
+#else
+ memcpy (digest, context->state, 16);
+#endif
+
+ memset(context, 0, sizeof(*context));
+}
+
diff --git a/mdk-stage1/dietlibc/libcrypt/md5crypt.c b/mdk-stage1/dietlibc/libcrypt/md5crypt.c
new file mode 100644
index 000000000..ebbb4be44
--- /dev/null
+++ b/mdk-stage1/dietlibc/libcrypt/md5crypt.c
@@ -0,0 +1,157 @@
+/* $OpenBSD: md5crypt.c,v 1.9 1997/07/23 20:58:27 kstailey Exp $ */
+
+/*
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ *
+ * $FreeBSD: crypt.c,v 1.5 1996/10/14 08:34:02 phk Exp $
+ *
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD: md5crypt.c,v 1.9 1997/07/23 20:58:27 kstailey Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <md5.h>
+
+static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+static void to64 (char *, uint32_t, int);
+
+static void
+to64(s, v, n)
+ char *s;
+ uint32_t v;
+ int n;
+{
+ while (--n >= 0) {
+ *s++ = itoa64[v&0x3f];
+ v >>= 6;
+ }
+}
+
+/*
+ * UNIX password
+ *
+ * Use MD5 for what it is best at...
+ */
+
+char *
+md5crypt(pw, salt)
+ register const char *pw;
+ register const char *salt;
+{
+ /*
+ * This string is magic for this algorithm. Having
+ * it this way, we can get get better later on
+ */
+ static unsigned char *magic = (unsigned char *)"$1$";
+
+ static char passwd[120], *p;
+ static const unsigned char *sp,*ep;
+ unsigned char final[16];
+ int sl,pl,i;
+ MD5_CTX ctx,ctx1;
+ uint32_t l;
+
+ /* Refine the Salt first */
+ sp = (const unsigned char *)salt;
+
+ /* If it starts with the magic string, then skip that */
+ if(!strncmp((const char *)sp,(const char *)magic,strlen((const char *)magic)))
+ sp += strlen((const char *)magic);
+
+ /* It stops at the first '$', max 8 chars */
+ for(ep=sp;*ep && *ep != '$' && ep < (sp+8);ep++)
+ continue;
+
+ /* get the length of the true salt */
+ sl = ep - sp;
+
+ MD5Init(&ctx);
+
+ /* The password first, since that is what is most unknown */
+ MD5Update(&ctx,(const unsigned char *)pw,strlen(pw));
+
+ /* Then our magic string */
+ MD5Update(&ctx,magic,strlen((const char *)magic));
+
+ /* Then the raw salt */
+ MD5Update(&ctx,sp,sl);
+
+ /* Then just as many characters of the MD5(pw,salt,pw) */
+ MD5Init(&ctx1);
+ MD5Update(&ctx1,(const unsigned char *)pw,strlen(pw));
+ MD5Update(&ctx1,sp,sl);
+ MD5Update(&ctx1,(const unsigned char *)pw,strlen(pw));
+ MD5Final(final,&ctx1);
+ for(pl = strlen(pw); pl > 0; pl -= 16)
+ MD5Update(&ctx,final,pl>16 ? 16 : pl);
+
+ /* Don't leave anything around in vm they could use. */
+ memset(final,0,sizeof final);
+
+ /* Then something really weird... */
+ for (i = strlen(pw); i ; i >>= 1)
+ if(i&1)
+ MD5Update(&ctx, final, 1);
+ else
+ MD5Update(&ctx, (const unsigned char *)pw, 1);
+
+ /* Now make the output string */
+ strcpy(passwd,(const char *)magic);
+ memcpy(passwd+3,sp,sl);
+ passwd[sl+3]='$';
+ passwd[sl+4]=0;
+
+ MD5Final(final,&ctx);
+
+ /*
+ * and now, just to make sure things don't run too fast
+ * On a 60 Mhz Pentium this takes 34 msec, so you would
+ * need 30 seconds to build a 1000 entry dictionary...
+ */
+ for(i=0;i<1000;i++) {
+ MD5Init(&ctx1);
+ if(i & 1)
+ MD5Update(&ctx1,(const unsigned char *)pw,strlen(pw));
+ else
+ MD5Update(&ctx1,final,16);
+
+ if(i % 3)
+ MD5Update(&ctx1,sp,sl);
+
+ if(i % 7)
+ MD5Update(&ctx1,(const unsigned char *)pw,strlen(pw));
+
+ if(i & 1)
+ MD5Update(&ctx1,final,16);
+ else
+ MD5Update(&ctx1,(const unsigned char *)pw,strlen(pw));
+ MD5Final(final,&ctx1);
+ }
+
+ p = passwd + strlen(passwd);
+
+ l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p,l,4); p += 4;
+ l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p,l,4); p += 4;
+ l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p,l,4); p += 4;
+ l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p,l,4); p += 4;
+ l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p,l,4); p += 4;
+ l = final[11] ; to64(p,l,2); p += 2;
+ *p = '\0';
+
+ /* Don't leave anything around in vm they could use. */
+ memset(final,0,sizeof final);
+
+ return passwd;
+}
+
diff --git a/mdk-stage1/dietlibc/libdl/Makefile b/mdk-stage1/dietlibc/libdl/Makefile
index c0463f887..29164f105 100644
--- a/mdk-stage1/dietlibc/libdl/Makefile
+++ b/mdk-stage1/dietlibc/libdl/Makefile
@@ -1,24 +1,38 @@
# local "test" make file
-SRC = $(wildcard *.c) test/test.c
+CC = gcc
+DCC = diet $(CC)
+
+SRC = $(wildcard *.c) # test/test.c
OBJ = _dl_jump.o $(SRC:.c=.o)
-#CFLAGS = -Wall -O2
-CFLAGS = -g
+#CFLAGS = -Wall -D__OD_CLEAN_ROOM -DNODIETREF -fPIC -g -O
+CFLAGS = -Wall -O2 -D__OD_CLEAN_ROOM -DNODIETREF -fPIC -frerun-loop-opt -fschedule-insns2 $(DEB) # -fomit-frame-pointer
%.o : %.S
- $(HOME)/bin/diet gcc $(CFLAGS) -c -o $@ $^
+ $(DCC) $(CFLAGS) -c -o $@ $^
%.o : %.c
- $(HOME)/bin/diet gcc $(CFLAGS) -c -o $@ $^
+ $(DCC) $(CFLAGS) -c -o $@ $^
+
+it: t.out
+
+a.out: t.out
+ gcc -O -g test/a.c t.out -L/opt/diet/lib-i386 -lc -lgcc -o $@ -Wl,-dynamic-linker=`pwd`/t.out -nostdlib
+
+t.out: _dl_main.o
+ ld -shared -o $@ $? -soname=libdl.so
+
+all: test.out libdl.a
-all: test.out
+libdl.a: $(OBJ)
+ ar cru $@ $^
-test.g: test.c
+test.g: test/test.c
gcc -o $@ $^ -ldl
-test.out: $(OBJ)
- $(HOME)/bin/diet gcc -o $@ $^
+test.out: $(OBJ) test/test.o
+ diet gcc -o $@ $^
clean:
$(RM) *.o *.a *.out *~ # *.so
diff --git a/mdk-stage1/dietlibc/libdl/README b/mdk-stage1/dietlibc/libdl/README
index 5d77bde34..6f1d0e46e 100644
--- a/mdk-stage1/dietlibc/libdl/README
+++ b/mdk-stage1/dietlibc/libdl/README
@@ -1,6 +1,82 @@
-this is the experimental libdl test-pre-pre-alpha code
+this is the experimental libdl
written by Olaf Dreesen
-Shouldn't work yet had some problems with the elf specs...
-and more inconsistencies...
+Fri Nov 15 16:23:28 CET 2002
+
+ fixing the copy-relocation bug.
+
+ TODO as last time.... plus
+ - dlsym with RTLD_NEXT
+
+Wed Nov 6 19:08:00 CET 2002
+
+ Ups.. misunderstood the manual-page of dlopen.
+ now dlopen(0,...) works the way it is described in the susv2, BUT still not
+ complete.
+
+ TODO:
+ - gdb support
+
+ - RTLD_GLOBAL/RTLD_LOCAL
+ at the moment ALL are GLOBAL.
+
+ - open of a shared object ONCE
+ there is no library hard-, symlink detection yet.
+
+ - code for other archs then i386 and arm
+
+
+Fri Sep 13 16:28:42 CEST 2002
+
+ this unified libdl/dynlinker is now the default.
+
+
+Mon Mar 11 19:44:20 CET 2002
+
+ the unified libdl/dynlinker now seems to stand the NORMAL usage so I think
+ it should be tested outside my CLEANROOM :)
+
+ TODO: code for other archs than i386 and arm
+
+
+Thu Nov 1 18:41:36 MET 2001
+
+ ufffff.... now the libdl code can be used in the libdl.so :)
+ Status: it works in my clean room on i386, arm-code started
+
+ TODO: see below :)
+
+
+Wed Jul 4 11:55:00 MEST 2001
+
+ Uwe Ohse pointed to some flaws in my code, I have started to fix them....
+
+ TODO: rebuild the code in a more readable and consistent way.
+ TODO: code for other archs than i386
+
+
+Thu Jun 21 15:32:45 MEST 2001
+
+ It work good enough to make a libdietc.so possible.
+
+ TODO: rebuild the code in a more readable and consistent way.
+ TODO: code for other archs than i386
+
+
+Thu Jun 7 14:10:03 MEST 2001
+
+ Status: test-pre-alpha code
+ the code is now "testable" ...
+ I need a dyn-dietlibc specific ld.so. (in work)
+
+ TODO: rebuild the code in a more readable and consistent way.
+
+
+INITIAL May ? :
+
+ Status: test-pre-pre-alpha code
+
+ Shouldn't work yet. Had and have some problems with the elf specs...
+ and more inconsistencies...
+
diff --git a/mdk-stage1/dietlibc/libdl/_dl_alloc.c b/mdk-stage1/dietlibc/libdl/_dl_alloc.c
new file mode 100644
index 000000000..41d0d4671
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/_dl_alloc.c
@@ -0,0 +1,81 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+#include "_dl_int.h"
+
+#ifdef __DIET_LD_SO__
+static struct _dl_handle*_dl_root_handle=(struct _dl_handle*)0;
+static struct _dl_handle*_dl_top_handle=(struct _dl_handle*)0;
+static struct _dl_handle*_dl_free_list=(struct _dl_handle*)0;
+#else
+struct _dl_handle*_dl_root_handle=(struct _dl_handle*)0;
+struct _dl_handle*_dl_top_handle=(struct _dl_handle*)0;
+struct _dl_handle*_dl_free_list=(struct _dl_handle*)0;
+#endif
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+void _dl_free_handle(struct _dl_handle*dh) {
+ if (_dl_root_handle==dh) _dl_root_handle=dh->next;
+ if (_dl_top_handle ==dh) _dl_top_handle=dh->prev;
+
+ if (dh->next) dh->next->prev=dh->prev;
+ if (dh->prev) dh->prev->next=dh->next;
+
+ if ((dh->flags&RTLD_NOSONAME) && dh->name) free(dh->name);
+ memset(dh,0,sizeof(struct _dl_handle));
+ dh->next=_dl_free_list;
+ _dl_free_list=dh;
+}
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+struct _dl_handle*_dl_get_handle() {
+ struct _dl_handle*tmp;
+
+ if (_dl_free_list==0) {
+ register int i,m;
+#ifdef __DIET_LD_SO__
+ tmp = (struct _dl_handle*)_dl_sys_mmap(0,at_pagesize,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
+ m=at_pagesize/sizeof(struct _dl_handle);
+#else
+ int ps=getpagesize();
+ tmp = (struct _dl_handle*)mmap(0,ps,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
+ m=ps/sizeof(struct _dl_handle);
+#endif
+ for (i=m;i;) _dl_free_handle(tmp+(--i));
+ }
+
+ tmp = _dl_free_list;
+ _dl_free_list = tmp->next;
+
+ tmp->next=0;
+ if (_dl_root_handle) {
+ _dl_top_handle->next=tmp;
+ tmp->prev=_dl_top_handle;
+ } else
+ _dl_root_handle = tmp;
+
+ _dl_top_handle=tmp;
+
+ return tmp;
+}
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+struct _dl_handle*_dl_find_lib(const char* name) {
+ if (name) {
+ if (_dl_root_handle) {
+ struct _dl_handle*tmp;
+ for (tmp=_dl_root_handle;tmp;tmp=tmp->next) {
+ if (!tmp->name) continue;
+ if (!strcmp(tmp->name,name)) return tmp;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libdl/_dl_int.h b/mdk-stage1/dietlibc/libdl/_dl_int.h
index 659e6ee0f..1bab10a92 100644
--- a/mdk-stage1/dietlibc/libdl/_dl_int.h
+++ b/mdk-stage1/dietlibc/libdl/_dl_int.h
@@ -1,31 +1,151 @@
#ifndef ___DL_INT_H__
#define ___DL_INT_H__
+#if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__)
+#define ELF_CLASS ELFCLASS64
+#else
+#define ELF_CLASS ELFCLASS32
+#endif
+
#include <elf.h>
+#include <dlfcn.h>
+
+#include "_dl_rel.h"
+
+#if ELF_CLASS == ELFCLASS32
+
+#define Elf_Addr Elf32_Addr
+
+#define Elf_Dyn Elf32_Dyn
+#define Elf_Ehdr Elf32_Ehdr
+#define Elf_Phdr Elf32_Phdr
+#define Elf_Rel Elf32_Rel
+#define Elf_Rela Elf32_Rela
+#define Elf_Sym Elf32_Sym
+
+#define ELF_R_SYM(x) ELF32_R_SYM((x))
+#define ELF_R_TYPE(x) ELF32_R_TYPE((x))
+
+#define ELF_ST_BIND(x) ELF32_ST_BIND((x))
+#define ELF_ST_TYPE(x) ELF32_ST_TYPE((x))
+
+#else
+
+#define Elf_Addr Elf64_Addr
+
+#define Elf_Dyn Elf64_Dyn
+#define Elf_Ehdr Elf64_Ehdr
+#define Elf_Phdr Elf64_Phdr
+#define Elf_Rel Elf64_Rel
+#define Elf_Rela Elf64_Rela
+#define Elf_Sym Elf64_Sym
+
+#define ELF_R_SYM(x) ELF64_R_SYM((x))
+#define ELF_R_TYPE(x) ELF64_R_TYPE((x))
+
+#define ELF_ST_BIND(x) ELF64_ST_BIND((x))
+#define ELF_ST_TYPE(x) ELF64_ST_TYPE((x))
+
+#endif
+
+//#define DEBUG
+#ifdef DEBUG
+#ifndef __DIET_LD_SO__
+#include <stdio.h>
+#define pf(s) write(2,s,strlen(s))
+#define ph(l) fdprintf(2,"%08lx",(l))
+#endif
+#endif
+
+#define RTLD_USER 0x10000000
+#define RTLD_NOSONAME 0x20000000
+#define LDSO_FLAGS (RTLD_LAZY|RTLD_GLOBAL|RTLD_NOSONAME)
struct _dl_handle {
+ char * mem_base; /* base address of maped *.so / or zero if program | Elf_Addr l_addr */
+ char * l_name; /* Abloslute filename of this object */
+ Elf_Dyn* dynamic; /* _DYNAMIC */
+
+ struct _dl_handle *next;
+ struct _dl_handle *prev;
+
+ unsigned int flags; /* FLAGS */
+
+ char * name; /* name of shared object */
+
/* basic */
- void * mem_base; /* base address of maped *.so */
unsigned long mem_size; /* len of mem block */
- unsigned int lnk_count; /* reference count */
+ unsigned long lnk_count; /* reference count (other libraries) */
+
+ /* lazy evaluator data */
+ unsigned long*pltgot; /* PLT/GOT */
/* symbol resolve helper */
unsigned long*hash_tab; /* hash table */
- Elf32_Sym * dyn_sym_tab; /* dynamic symbol table */
char * dyn_str_tab; /* dyn_name table */
+ Elf_Sym * dyn_sym_tab; /* dynamic symbol table */
+ _dl_rel_t* plt_rel; /* PLT relocation table */
- Elf32_Rel * plt_rel; /* PLT relocation table */
-
- /* FINI */
+ /* INIT / FINI */
void (*fini)(void);
};
-#define HASH_BUCKET_LEN(p) ((p))
+/* debug communication (GDB) (dyn-linker only) */
+struct r_debug {
+ int r_version;
+ struct _dl_handle* r_map;
+ unsigned long r_brk;
+ enum {
+ RT_CONSISTENT, /* mapping complete */
+ RT_ADD, /* begin add object */
+ RT_DELETE, /* begin del object */
+ } r_state;
+ unsigned long r_ldbase;
+};
+
+#define HASH_BUCKET_LEN(p) (*((p)))
#define HASH_BUCKET(p) ((p)+2)
-#define HASH_CHAIN_LEN(p) ((p)+1)
+#define HASH_CHAIN_LEN(p) (*((p)+1))
#define HASH_CHAIN(p) ((p)+2+HASH_BUCKET_LEN(p))
-unsigned long elf_hash(const unsigned char *name);
+/* _dl_alloc.c */
+extern struct _dl_handle* _dl_root_handle;
+extern struct _dl_handle* _dl_top_handle;
+extern struct _dl_handle* _dl_free_list;
+#ifndef __DIET_LD_SO__
+void _dl_free_handle(struct _dl_handle* dh);
+struct _dl_handle* _dl_get_handle();
+struct _dl_handle* _dl_find_lib(const char* name);
+
+/* _dl_open.c */
+void *_dl_open(const char* filename, int flags);
+
+/* _dl_load.c */
+void *_dl_load(const char* filename, const char*pathname, int fd, int flags);
+struct _dl_handle* _dl_dyn_scan(struct _dl_handle* dh, void* dyn_addr, int flags);
+
+/* _dl_search.c */
+void _dl_set_rpath(const char *path);
+const char* _dl_get_rpath();
+int _dl_search(char *buf, int len, const char *filename);
+
+/* dlsym.c */
+void *_dlsym(void*dh,char*symbol);
+void *_dl_sym_search_str(struct _dl_handle*h,char*name);
+void *_dl_sym(struct _dl_handle * h, int symbol);
+
+/* _dl_queue.c */
+int _dl_queue_lib(const char* name, int flags);
+int _dl_open_dep();
+
+/* _dl_relocate.c */
+int _dl_relocate(struct _dl_handle* dh, _dl_rel_t *rel, int num);
+
+/* dlerror.c */
+extern unsigned int _dl_error;
+extern const char* _dl_error_location;
+extern const char* _dl_error_data;
+#endif
#endif
diff --git a/mdk-stage1/dietlibc/libdl/_dl_jump.S b/mdk-stage1/dietlibc/libdl/_dl_jump.S
index 134f31ea5..bd7115258 100644
--- a/mdk-stage1/dietlibc/libdl/_dl_jump.S
+++ b/mdk-stage1/dietlibc/libdl/_dl_jump.S
@@ -1,8 +1,55 @@
.text
.global _dl_jump
_dl_jump:
+
+#ifdef __i386__
+.type _dl_jump,@function
+
+ pushl %eax # save register args...
+ pushl %ecx
+ pushl %edx
+
+ pushl %ebx
+
+ pushl 20(%esp) # 2. arg from plt
+ pushl 20(%esp) # 1. arg from plt
+
+#ifdef __DYN_LIB
+ call 1f
+1: popl %ebx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b],%ebx
+ call do_rel@PLT
+#else
call do_rel
- pop %edx
- pop %edx
- jmp *%eax
+#endif
+ addl $8, %esp
+
+ popl %ebx
+
+ popl %edx # restore register args...
+ popl %ecx
+
+ xchgl %eax, (%esp) # restore eax and save function pointer (for return)
+
+ ret $8 # remove arguments from plt and jump to REAL function
+
+#endif
+
+#ifdef __arm__
+.type _dl_jump,function
+
+ stmdb sp!, {r0, r1, r2, r3}
+ sub r1, ip, lr
+ sub r1, r1, #4
+ add r1, r1, r1 /* dyntab entry */
+ ldr r0, [lr, #-4] /* dynlib handle */
+#ifdef __DYN_LIB
+ bl do_rel(PLT)
+#else
+ bl do_rel
+#endif
+ mov r12, r0
+ ldmia sp!, {r0, r1, r2, r3, lr}
+ mov pc, r12
+#endif
diff --git a/mdk-stage1/dietlibc/libdl/_dl_load.c b/mdk-stage1/dietlibc/libdl/_dl_load.c
new file mode 100644
index 000000000..49e8db0be
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/_dl_load.c
@@ -0,0 +1,401 @@
+#include <string.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <dlfcn.h>
+#include <elf.h>
+
+#include "_dl_int.h"
+
+#define _ELF_DWN_ROUND(ps,n) ((n)&(~((ps)-1)))
+#define _ELF_UP_ROUND(ps,n) ((((n)&((ps)-1))?(ps):0)+ _ELF_DWN_ROUND((ps),(n)))
+#define _ELF_RST_ROUND(ps,n) ((n)&((ps)-1))
+
+/* this is an arch specific "return jump" for the relocation */
+void _dl_jump();
+
+/*
+ * this file is a Q. & D. hack ... don't think this is bug free or meaningfull
+ */
+
+static inline int map_flags(int flags)
+{
+ int perm = 0;
+ if (flags & PF_X) perm|=PROT_EXEC;
+ if (flags & PF_R) perm|=PROT_READ;
+ if (flags & PF_W) perm|=PROT_WRITE;
+ return perm;
+}
+
+static inline void *do_map_in(void *base, unsigned long length, int flags, int fd, unsigned long offset)
+{
+ register int op = MAP_PRIVATE;
+ if (base) op|=MAP_FIXED;
+ return mmap(base, length, map_flags(flags), op, fd, offset);
+}
+
+static struct _dl_handle *_dl_map_lib(const char*fn, const char*pathname, int fd, int flags)
+{
+ struct _dl_handle* ret=0;
+ int ps=getpagesize();
+ int i;
+ unsigned char buf[1024];
+ char *m=0,*d=0;
+
+ unsigned long l;
+ struct stat st;
+
+ Elf_Ehdr *eh;
+ Elf_Phdr *ph;
+
+ int ld_nr=0;
+ Elf_Phdr **ld=0;
+ Elf_Phdr *dyn=0;
+
+ if (fd==-1) return 0;
+
+#ifdef DEBUG
+ pf(__func__": "); pf(pathname); pf("\n");
+#endif
+
+ if (fstat(fd,&st)<0) {
+ close(fd);
+ _dl_error=2;
+ return 0;
+ }
+ else {
+ // use st_dev and st_ino for identification
+ }
+
+ if (read(fd, buf, 1024)<128) {
+ close(fd);
+ _dl_error=2;
+ return 0;
+ }
+
+ eh=(Elf_Ehdr*)buf;
+ ph=(Elf_Phdr*)&buf[eh->e_phoff];
+
+ for (i=0; i<eh->e_phnum; i++) {
+ if (ph[i].p_type==PT_LOAD) ++ld_nr;
+ }
+ ld=alloca(ld_nr*sizeof(Elf_Phdr));
+
+ for (ld_nr=i=0; i<eh->e_phnum; i++) {
+ if (ph[i].p_type==PT_LOAD) {
+ ld[ld_nr++]=ph+i;
+ }
+ if (ph[i].p_type==PT_DYNAMIC) {
+ dyn=ph+i;
+ }
+ }
+
+ if (ld_nr==1) {
+ unsigned long offset = _ELF_DWN_ROUND(ps,ld[0]->p_offset);
+ unsigned long off = _ELF_RST_ROUND(ps,ld[0]->p_offset);
+ unsigned long length = _ELF_UP_ROUND(ps,ld[0]->p_memsz+off);
+ ret = _dl_get_handle();
+
+ m = (char*)do_map_in(0, length, ld[0]->p_flags, fd, offset);
+ if (m==MAP_FAILED) { _dl_free_handle(ret); close(fd); return 0; }
+
+ /* zero pad bss */
+ l = ld[0]->p_offset+ld[0]->p_filesz;
+ memset(m+l,0,length-l);
+
+ ret->mem_base=m;
+ ret->mem_size=length;
+ }
+ else if (ld_nr==2) { /* aem... yes Quick & Really Dirty / for the avarage 99% */
+// unsigned long text_addr = _ELF_DWN_ROUND(ps,ld[0]->p_vaddr); /* do we need this ? */
+ unsigned long text_offset = _ELF_DWN_ROUND(ps,ld[0]->p_offset);
+ unsigned long text_off = _ELF_RST_ROUND(ps,ld[0]->p_offset);
+ unsigned long text_size = _ELF_UP_ROUND(ps,ld[0]->p_memsz+text_off);
+
+ unsigned long data_addr = _ELF_DWN_ROUND(ps,ld[1]->p_vaddr);
+ unsigned long data_offset = _ELF_DWN_ROUND(ps,ld[1]->p_offset);
+ unsigned long data_off = _ELF_RST_ROUND(ps,ld[1]->p_offset);
+ unsigned long data_size = _ELF_UP_ROUND(ps,ld[1]->p_memsz+data_off);
+ unsigned long data_fsize = _ELF_UP_ROUND(ps,ld[1]->p_filesz+data_off);
+
+ ret = _dl_get_handle();
+ /* mmap all mem_blocks for *.so */
+ m = (char*) do_map_in(0,text_size+data_size,ld[0]->p_flags,fd,text_offset);
+ if (m==MAP_FAILED) { _dl_free_handle(ret); close(fd); return 0; }
+
+ /* release data,bss part */
+ mprotect(m+data_addr, data_size, PROT_NONE);
+
+ /* mmap data,bss part */
+ d = (char*) do_map_in(m+data_addr,data_fsize,ld[1]->p_flags,fd,data_offset);
+
+ /* zero pad bss */
+ l = data_off+ld[1]->p_filesz;
+ memset(d+l,0,data_fsize-l);
+
+ /* more bss ? */
+ if (data_size>data_fsize) {
+ l = data_size-data_fsize;
+ mmap(d+data_fsize, l, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
+ }
+
+ ret->mem_base=m;
+ ret->mem_size=text_size+data_size;
+ }
+
+ if (ret) {
+ ret->lnk_count=1;
+ ret->name=strdup(fn);
+ ret->dyn_str_tab=(char*)m+dyn->p_vaddr; /* missuse of field */
+ }
+
+ close(fd);
+ return ret;
+}
+
+/* local alias */
+static struct _dl_handle* __dl_dyn_scan(struct _dl_handle* dh, void* dyn_addr, int flags)
+__attribute__ ((alias("_dl_dyn_scan")));
+
+struct _dl_handle* _dl_dyn_scan(struct _dl_handle* dh, void* dyn_addr, int flags)
+{
+ Elf_Dyn* dyn_tab = dyn_addr;
+
+ void (*init)()=0;
+ unsigned long* got=0;
+ void* jmprel=0;
+ int pltreltype=0;
+ int pltrelsize=0;
+ unsigned long rel=0;
+ int relent=0;
+ int relsize=0;
+
+ int i;
+
+#ifdef DEBUG
+ pf(__func__": pre dynamic scan "); ph((unsigned long)dh); pf("\n");
+#endif
+ dh->dyn_str_tab=0;
+ dh->flags=flags;
+
+ for(i=0;dyn_tab[i].d_tag;i++) {
+// DEBUG(printf("_dl_load dyn %d, %08lx\n",dyn_tab[i].d_tag, dyn_tab[i].d_un.d_val);)
+ if (dyn_tab[i].d_tag==DT_HASH) {
+ dh->hash_tab = (unsigned long*)(dh->mem_base+dyn_tab[i].d_un.d_ptr);
+#ifdef DEBUG
+ pf(__func__": have hash @ "); ph((long)dh->hash_tab); pf("\n");
+#endif
+ }
+ else if (dyn_tab[i].d_tag==DT_SYMTAB) {
+ dh->dyn_sym_tab = (Elf_Sym*)(dh->mem_base+dyn_tab[i].d_un.d_ptr);
+#ifdef DEBUG
+ pf(__func__": have dyn_sym_tab @ "); ph((long)dh->dyn_sym_tab); pf("\n");
+#endif
+ }
+ else if (dyn_tab[i].d_tag==DT_STRTAB) {
+ dh->dyn_str_tab = (char*)(dh->mem_base+dyn_tab[i].d_un.d_ptr);
+#ifdef DEBUG
+ pf(__func__": have dyn_str_tab @ "); ph((long)dh->dyn_str_tab); pf("\n");
+#endif
+ }
+
+ /* INIT / FINI */
+ else if (dyn_tab[i].d_tag==DT_FINI) {
+ dh->fini = (void(*)(void))(dh->mem_base+dyn_tab[i].d_un.d_val);
+#ifdef DEBUG
+ pf(__func__": have fini @ "); ph((long)dh->fini); pf("\n");
+#endif
+ }
+ else if (dyn_tab[i].d_tag==DT_INIT) {
+ init = (void(*)(void))(dh->mem_base+dyn_tab[i].d_un.d_val);
+#ifdef DEBUG
+ pf(__func__": have init @ "); ph((long)init); pf("\n");
+#endif
+ }
+
+ /* PLT / Relocation entries for PLT in GOT */
+ else if (dyn_tab[i].d_tag==DT_PLTGOT) {
+ got=(unsigned long*)(dh->mem_base+dyn_tab[i].d_un.d_val);
+ dh->pltgot=got;
+#ifdef DEBUG
+ pf(__func__": have plt got @ "); ph((long)dh->pltgot); pf("\n");
+#endif
+ }
+ else if (dyn_tab[i].d_tag==DT_PLTREL) {
+ pltreltype=dyn_tab[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__func__": have pltreltype @ "); ph((long)pltreltype); pf("\n");
+#endif
+ }
+ else if (dyn_tab[i].d_tag==DT_PLTRELSZ) {
+ pltrelsize=dyn_tab[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__func__": have pltrelsize @ "); ph((long)pltrelsize); pf("\n");
+#endif
+ }
+ else if (dyn_tab[i].d_tag==DT_JMPREL) {
+ jmprel=(dh->mem_base+dyn_tab[i].d_un.d_val);
+ dh->plt_rel=jmprel;
+#ifdef DEBUG
+ pf(__func__": have jmprel @ "); ph((long)jmprel); pf("\n");
+#endif
+ }
+
+ /* Relocation */
+ else if (dyn_tab[i].d_tag==DT_REL) {
+ rel=(unsigned long)(dh->mem_base+dyn_tab[i].d_un.d_val);
+#ifdef DEBUG
+ pf(__func__": have rel @ "); ph((long)rel); pf("\n");
+#endif
+ }
+ else if (dyn_tab[i].d_tag==DT_RELENT) {
+ relent=dyn_tab[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__func__": have relent @ "); ph((long)relent); pf("\n");
+#endif
+ }
+ else if (dyn_tab[i].d_tag==DT_RELSZ) {
+ relsize=dyn_tab[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__func__": have relsize @ "); ph((long)relsize); pf("\n");
+#endif
+ }
+
+ else if (dyn_tab[i].d_tag==DT_TEXTREL) {
+ _dl_free_handle(dh);
+ _dl_error = 3;
+ return 0;
+ }
+ }
+ /* extra scan for rpath (if program) ... */
+ if (dh->name==0) {
+ for(i=0;dyn_tab[i].d_tag;i++) {
+ if (dyn_tab[i].d_tag==DT_RPATH) {
+ char *rpath=dh->dyn_str_tab+dyn_tab[i].d_un.d_val;
+ _dl_set_rpath(rpath);
+#ifdef DEBUG
+ pf(__func__": have runpath: "); pf(rpath); pf("\n");
+#endif
+ }
+ }
+ }
+
+#ifdef DEBUG
+ pf(__func__": post dynamic scan "); ph((unsigned long)dh); pf("\n");
+#endif
+
+ if ((got=_dlsym(dh,"_GLOBAL_OFFSET_TABLE_"))) {
+#ifdef DEBUG
+ pf(__func__": found a GOT @ "); ph((unsigned long)got); pf("\n");
+#endif
+ /* GOT */
+ got[0]+=(unsigned long)dh->mem_base; /* reloc dynamic pointer */
+ got[1] =(unsigned long)dh;
+ got[2] =(unsigned long)(_dl_jump); /* sysdep jump to _dl_rel */
+ /* */
+ }
+ else {
+ if (dh) {
+ munmap(dh->mem_base,dh->mem_size);
+ _dl_free_handle(dh);
+ }
+ _dl_error = 3;
+ return 0;
+ }
+
+ /* load other libs */
+ for(i=0;dyn_tab[i].d_tag;i++) {
+ if (dyn_tab[i].d_tag==DT_NEEDED) {
+ char *lib_name=dh->dyn_str_tab+dyn_tab[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__func__": needed for this lib: "); pf(lib_name); pf("\n");
+#endif
+ _dl_queue_lib(lib_name,flags);
+ }
+ }
+
+ if (_dl_open_dep()) {
+ _dl_error = 1;
+ return 0;
+ }
+
+ /* relocate */
+ if (rel) {
+#ifdef DEBUG
+ pf(__func__": try to relocate some values\n");
+#endif
+ if (_dl_relocate(dh,(Elf_Rel*)rel,relsize/relent)) {
+ munmap(dh->mem_base,dh->mem_size);
+ _dl_free_handle(dh);
+ return 0;
+ }
+ }
+
+ /* do PTL / GOT relocation */
+ if (pltreltype == DT_REL) {
+ Elf_Rel *tmp = jmprel;
+#ifdef DEBUG
+ pf(__func__": rel got\n");
+#endif
+ for (;(char*)tmp<(((char*)jmprel)+pltrelsize);(char*)tmp=((char*)tmp)+sizeof(Elf_Rel)) {
+ if ((flags&RTLD_NOW)) {
+ unsigned long sym=(unsigned long)_dl_sym(dh,ELF_R_SYM(tmp->r_info));
+ if (sym) *((unsigned long*)(dh->mem_base+tmp->r_offset))=sym;
+ else {
+ _dl_free_handle(dh);
+ _dl_error = 4;
+ return 0;
+ }
+ }
+ else
+ *((unsigned long*)(dh->mem_base+tmp->r_offset))+=(unsigned long)dh->mem_base;
+#if 0
+ DEBUG("_dl_load rel @ %08lx with type %d -> %d\n",(long)dh->mem_base+tmp->r_offset,ELF_R_TYPE(tmp->r_info),ELF_R_SYM(tmp->r_info));
+ DEBUG("_dl_load -> %08lx\n",*((unsigned long*)(dh->mem_base+tmp->r_offset)));
+#endif
+ }
+ }
+ if (pltreltype == DT_RELA) {
+ Elf_Rela *tmp = jmprel;
+#ifdef DEBUG
+ pf(__func__": rela got\n");
+#endif
+ for (;(char*)tmp<(((char*)jmprel)+pltrelsize);(char*)tmp=((char*)tmp)+sizeof(Elf_Rela)) {
+ if ((flags&RTLD_NOW)) {
+ unsigned long sym=(unsigned long)_dl_sym(dh,ELF_R_SYM(tmp->r_info));
+ if (sym) *((unsigned long*)(dh->mem_base+tmp->r_offset))=sym;
+ else {
+ _dl_free_handle(dh);
+ _dl_error = 4;
+ return 0;
+ }
+ }
+ else
+ *((unsigned long*)(dh->mem_base+tmp->r_offset))=(unsigned long)(dh->mem_base+tmp->r_addend);
+#if 0
+ DEBUG("_dl_load rela @ %08lx with type %d -> %d\n",(long)dh->mem_base+tmp->r_offset,ELF_R_TYPE(tmp->r_info),ELF_R_SYM(tmp->r_info));
+ DEBUG("_dl_load -> %08lx\n",*((unsigned long*)(dh->mem_base+tmp->r_offset)));
+#endif
+ }
+ }
+
+ /* _dl_load depending libs ... */
+#ifdef DEBUG
+ pf(__func__": post resolve, pre init\n");
+#endif
+ if (init) init();
+#ifdef DEBUG
+ pf(__func__": post init\n");
+#endif
+
+ return dh;
+}
+
+void *_dl_load(const char*fn, const char*pathname, int fd, int flags)
+{
+ struct _dl_handle* ret=0;
+ if ((ret=_dl_map_lib(fn,pathname,fd,flags))) {
+ ret=__dl_dyn_scan(ret,(void*)(ret->dyn_str_tab),flags);
+ }
+ return ret;
+}
diff --git a/mdk-stage1/dietlibc/libdl/_dl_main.c b/mdk-stage1/dietlibc/libdl/_dl_main.c
new file mode 100644
index 000000000..8ecf44f0b
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/_dl_main.c
@@ -0,0 +1,1059 @@
+#ifdef __OD_CLEAN_ROOM
+
+#define __DIET_LD_SO__
+
+/*
+ * this is the dietlibc libdl & dynamic-linker
+ *
+ * NEED to be compiled with -fPIC ...
+ */
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include "_dl_int.h"
+#include "_dl_rel.h"
+
+void _start(void); /* entry of lib... */
+
+static void (*fini_entry)(void)=0;
+static char **_dl_environ=0;
+static unsigned long loadaddr=0;
+static unsigned long prog_entry=0;
+
+static Elf_Phdr*prog_ph;
+static unsigned long prog_ph_size;
+static unsigned long prog_ph_num;
+
+static unsigned long at_uid;
+static unsigned long at_euid;
+static unsigned long at_gid;
+static unsigned long at_egid;
+static unsigned long at_pagesize;
+
+/* this are the "local syscalls" */
+void _dl_sys_exit(int val);
+int _dl_sys_read(int fd,char*buf,unsigned long len);
+int _dl_sys_write(int fd,char*buf,unsigned long len);
+int _dl_sys_open(const char*filename,int flags,int mode);
+int _dl_sys_close(int fd);
+void*_dl_sys_mmap(void*start,unsigned long length,int prot,int flags,int fd,unsigned long offset);
+int _dl_sys_munmap(void*start,unsigned long length);
+int _dl_sys_mprotect(const void*addr,unsigned long len,int prot);
+int _dl_sys_fstat(int filedes, struct stat *buf);
+
+extern char*strdup(const char*s);
+
+#ifdef __i386__
+
+asm(".text \n"
+".type _start,@function \n"
+"_start: \n"
+" movl %esp, %ebp # save stack \n"
+" movl (%ebp), %ecx # argc \n"
+" leal 4(%ebp), %esi # argv \n"
+" leal 4(%esi,%ecx,4), %eax # envp \n"
+
+"# PIC code \n"
+" call getpic \n"
+" addl $_GLOBAL_OFFSET_TABLE_, %ebx \n"
+
+"# for calculation of load addr, get 'relocated' address of _DYNAMIC \n"
+" leal _DYNAMIC@GOTOFF(%ebx), %edx \n"
+
+"# put parameter on stack and call _dl_main \n"
+" pushl %edx \n"
+" pushl %eax \n"
+" pushl %esi \n"
+" pushl %ecx \n"
+" call _dl_main \n"
+
+"# restore stack \n"
+" movl %ebp, %esp \n"
+
+"# get fini pointer \n"
+" movl fini_entry@GOTOFF(%ebx), %edx \n"
+
+"# clear callee-save-register like kernel \n"
+" xorl %ebx, %ebx \n"
+" xorl %ebp, %ebp \n"
+" xorl %edi, %edi \n"
+" xorl %esi, %esi \n"
+
+"# jump to program entry point \n"
+" jmp *%eax \n"
+
+"_dl_sys_read: \n"
+" movb $3,%al \n"
+" jmp _dl_sys_call3 \n"
+"_dl_sys_write: \n"
+" movb $4,%al \n"
+" jmp _dl_sys_call3 \n"
+"_dl_sys_open: \n"
+" movb $5,%al \n"
+" jmp _dl_sys_call3 \n"
+"_dl_sys_close: \n"
+" movb $6,%al \n"
+" jmp _dl_sys_call3 \n"
+"_dl_sys_mmap: \n"
+" movb $90,%al \n"
+" leal 4(%esp),%edx \n"
+" pushl %edx \n"
+" call _dl_sys_call3 \n"
+" popl %ecx \n"
+" ret \n"
+"_dl_sys_munmap: \n"
+" movb $91,%al \n"
+" jmp _dl_sys_call3 \n"
+"_dl_sys_fstat: \n"
+" movb $108,%al \n"
+" jmp _dl_sys_call3 \n"
+"_dl_sys_mprotect: \n"
+" movb $125,%al \n"
+" jmp _dl_sys_call3 \n"
+"_dl_sys_exit: \n"
+" movb $1,%al \n"
+"_dl_sys_call3: \n"
+" movzbl %al,%eax \n"
+" pushl %ebx \n"
+" movl %esp,%ebx \n"
+" movl 16(%ebx),%edx \n"
+" movl 12(%ebx),%ecx \n"
+" movl 8(%ebx),%ebx \n"
+" int $0x80 \n"
+" popl %ebx \n"
+" ret \n"
+
+".type _dl_jump,@function \n"
+"_dl_jump: \n"
+" pushl %eax # save register args... \n"
+" pushl %ecx \n"
+" pushl %edx \n"
+
+" push 16(%esp) # 2. arg from plt \n"
+" push 16(%esp) # 1. arg from plt \n"
+" call do_resolve \n"
+" add $8, %esp \n"
+
+" popl %edx # restore register args... \n"
+" popl %ecx \n"
+" xchgl %eax, (%esp) # restore eax and save function pointer (for return) \n"
+" ret $8 # remove arguments from plt and jump to REAL function \n"
+
+"# GET Position In Code :) \n"
+"getpic: movl (%esp), %ebx \n"
+" ret");
+
+static inline unsigned long* get_got(void) {
+ register unsigned long *got asm ("%ebx");
+ return got;
+}
+
+static inline int work_on_pltgot(struct _dl_handle*dh) {
+ /* declare _dl_jump static otherwise we have a GOT access BEFOR we have the resolver */
+ static void _dl_jump(void);
+ if ((dh->plt_rel)&&(!(dh->flags&RTLD_NOW))) {
+ unsigned long*tmp=dh->pltgot;
+ /* GOT */
+ tmp[0]+=(unsigned long)dh->mem_base; /* reloc dynamic pointer */
+ tmp[1] =(unsigned long)dh; /* the handle */
+ tmp[2] =(unsigned long)(_dl_jump); /* sysdep jump to do_resolve */
+ }
+ return 0;
+}
+
+#elif __arm__
+
+asm(".text \n"
+".type _start,function \n"
+"_start: \n"
+" mov r4, sp \n"
+" mov fp, #0 @ start new stack frame \n"
+
+" ldr a1, [sp], #4 @ argc \n"
+" mov a2, sp @ argv \n"
+
+" add a3, a2, a1, lsl #2 @ envp \n"
+" add a3, a3, #4 \n"
+
+" ldr sl, .L_got @ PIC code \n"
+"1: add sl, pc, sl \n"
+
+" ldr a4, .L_la @ get 'relocated' address of _DYNAMIC \n"
+" add a4, a4, sl \n"
+
+" bl _dl_main @ call _dl_main \n"
+
+" mov sp, r4 \n"
+
+" mov lr, a1 @ save program entry point \n"
+
+" ldr a1, [pc, #.L_fe-(.+8)] @ agrument 1: global fini entry \n"
+" ldr a1, [sl, a1] \n"
+
+" mov pc, lr \n"
+
+".L_got: .long _GLOBAL_OFFSET_TABLE_-(1b+8) \n"
+".L_la: .long _DYNAMIC(GOTOFF) \n"
+".L_fe: .long fini_entry(GOTOFF) \n"
+
+"_dl_sys_exit: \n"
+" swi #0x900001 @ exit \n"
+" eor pc, lr, lr @ OR DIE ! \n"
+" mov pc, lr \n"
+
+"_dl_sys_read: \n"
+" swi #0x900003 @ read \n"
+" mov pc, lr \n"
+"_dl_sys_write: \n"
+" swi #0x900004 @ write \n"
+" mov pc, lr \n"
+"_dl_sys_open: \n"
+" swi #0x900005 @ open \n"
+" mov pc, lr \n"
+"_dl_sys_close: \n"
+" swi #0x900006 @ close \n"
+" mov pc, lr \n"
+"_dl_sys_mmap: \n"
+" stmdb sp!,{r0,r1,r2,r3} \n"
+" mov r0, sp \n"
+" swi #0x900090 @ mmap \n"
+" add sp, sp, #16 \n"
+" mov pc, lr \n"
+"_dl_sys_munmap: \n"
+" swi #0x900091 @ munmap \n"
+" mov pc, lr \n"
+"_dl_sys_fstat: \n"
+" swi #0x900108 @ fstat \n"
+" mov pc, lr \n"
+"_dl_sys_mprotect: \n"
+" swi #0x900125 @ mprotect \n"
+" mov pc, lr \n"
+
+".type _dl_jump,function \n"
+"_dl_jump: \n"
+" stmdb sp!, {r0, r1, r2, r3} @ save arguments \n"
+
+" sub r1, ip, lr @ dyntab entry \n"
+" sub r1, r1, #4 \n"
+" add r1, r1, r1 \n"
+
+" ldr r0, [lr, #-4] @ dynlib handle \n"
+
+" bl do_resolve \n"
+
+" mov r12, r0 \n"
+" ldmia sp!, {r0, r1, r2, r3, lr} @ restore arguments \n"
+" mov pc, r12");
+
+static inline unsigned long* get_got(void) {
+ register unsigned long *got asm ("sl");
+ return got;
+}
+
+static inline int work_on_pltgot(struct _dl_handle*dh) {
+ /* declare _dl_jump static otherwise we have a GOT access BEFOR we have the resolver */
+ static void _dl_jump(void);
+ if ((dh->plt_rel)&&(!(dh->flags&RTLD_NOW))) {
+ unsigned long*tmp=dh->pltgot;
+ /* GOT */
+ tmp[0]+=(unsigned long)dh->mem_base; /* reloc dynamic pointer */
+ tmp[1] =(unsigned long)dh; /* the handle */
+ tmp[2] =(unsigned long)(_dl_jump); /* sysdep jump to do_resolve */
+ }
+ return 0;
+}
+
+#else
+#error "libdl: arch not supported"
+#endif
+
+static void*_dl_load(const char*fn,const char*pathname,int fd,int flags);
+
+/* here do the code includes */
+
+/* strncpy */
+static char*strncpy(register char*s,register const char*t,register unsigned long n) {
+ char *dest=s;
+ for(;n;--n) {
+ char ch=*t;
+ *s=ch;
+ if (ch==0) return dest;
+ ++s; ++t;
+ }
+ return 0;
+}
+
+/* strlen.c */
+static unsigned long strlen(register const char*s) {
+ register unsigned long i;
+ if (!s) return 0;
+ for (i=0; *s; ++s) ++i;
+ return i;
+}
+
+/* strcmp.c */
+static int strcmp(register const unsigned char*s,register const unsigned char*t) {
+ register char x;
+ for (;;) {
+ x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
+ }
+ return ((int)(unsigned int)x) - ((int)(unsigned int)*t);
+}
+
+/* strcspn.c */
+static unsigned long strcspn(const char*s,const char*reject) {
+ unsigned long l=0;
+ int a=1,i,al=strlen(reject);
+ while((a)&&(*s)) {
+ for(i=0;(a)&&(i<al);++i) if (*s==reject[i]) a=0;
+ if (a) ++l;
+ ++s;
+ }
+ return l;
+}
+
+/* memcpy.c */
+static void*memcpy(void*dst,const void*src,unsigned long count) {
+ register char *d=dst;
+ register const char *s=src;
+ ++count;
+ while (--count) {
+ *d = *s;
+ ++d; ++s;
+ }
+ return dst;
+}
+
+/* memset.c */
+static void*memset(void*dst,int ch,unsigned long count) {
+ register char *d=dst;
+ ++count;
+ while (--count) {
+ *d=ch;
+ ++d;
+ }
+ return dst;
+}
+
+/* memcmp.c */
+static int memcmp(register const unsigned char*s,register const unsigned char*t,unsigned long count) {
+ register int r;
+ ++count;
+ while(--count) {
+ if ((r=(*s-*t))) return r;
+ ++s;
+ ++t;
+ }
+ return 0;
+}
+
+/* getenv.c */
+static char*getenv(const char*env) {
+ unsigned int i,len=strlen(env);
+ for (i=0;_dl_environ[i];++i) {
+ if ((memcmp(_dl_environ[i],env,len)==0) && (_dl_environ[i][len]=='='))
+ return _dl_environ[i]+len+1;
+ }
+ return 0;
+}
+
+/* basic debug output functions */
+static void pf(const char*s) { _dl_sys_write(2,(void*)s,strlen(s)); }
+static void ph(unsigned long l) {
+ const int max=(sizeof(unsigned long)<<1);
+ unsigned char buf[16];
+ int i;
+ for (i=max;i;l>>=4) {
+ register unsigned long v='0'|(l&15);
+ if (v>'9') v+=0x27;
+ buf[--i]=v;
+ }
+ _dl_sys_write(2,buf,max);
+}
+
+/* the never free strdup (internal) */
+static unsigned long _dl_lib_strdup_len=0;
+static char*_dl_lib_strdup_str;
+static char*_dl_lib_strdup(const char*s) {
+ char*ret=_dl_lib_strdup_str;
+ unsigned long l=strlen(s)+1;
+ if (_dl_lib_strdup_len<l) {
+ ret=(char*)_dl_sys_mmap(0,at_pagesize,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
+ _dl_lib_strdup_len=at_pagesize;
+ }
+ _dl_lib_strdup_str=ret+l;
+ _dl_lib_strdup_len-=l;
+ memcpy(ret,s,l);
+ return ret;
+}
+
+#ifdef __GDB_SUPPORT__
+volatile void _dl_debug_state(void);
+/* gdb debug break point */
+void _dl_debug_state() {}
+
+/* gdb debug init stuff */
+struct r_debug _r_debug;
+static struct r_debug* _dl_debug_init(Elf_Addr dl_base) {
+ if (_r_debug.r_brk==0) {
+ _r_debug.r_version = 1;
+ _r_debug.r_ldbase = dl_base;
+ _r_debug.r_map = _dl_root_handle; /* this my be wrong */
+ _r_debug.r_brk = (Elf_Addr)&_dl_debug_state;
+ }
+ return &_r_debug;
+}
+#endif
+
+/* now reuse some unchanged sources */
+#include "dlerror.c"
+#include "_dl_alloc.c"
+
+#include "dlsym.c"
+
+#include "_dl_search.c"
+
+#include "_dl_open.c"
+#include "dlopen.c"
+
+#include "_dl_relocate.c"
+#include "_dl_queue.c"
+
+#include "dlclose.c"
+
+/* back to the "new" implementation */
+static void tt_fini(void) {
+ struct _dl_handle*tmp;
+#ifdef DEBUG
+ pf("dyn fini\n");
+#endif
+ for(tmp=_dl_root_handle;tmp;tmp=tmp->next)
+ if (tmp->fini) tmp->fini();
+}
+
+/* exit ! */
+static void _DIE_() { _dl_sys_exit(213); }
+
+/* lazy function resolver */
+static unsigned long do_resolve(struct _dl_handle*dh,unsigned long off) {
+ _dl_rel_t *tmp = ((void*)dh->plt_rel)+off;
+ int sym=ELF_R_SYM(tmp->r_info);
+ register unsigned long sym_val;
+
+ if (0) sym_val=(unsigned long)do_resolve; /* TRICK: no warning */
+
+ /* modify GOT for REAL symbol */
+ sym_val=(unsigned long)_dl_sym(dh,sym);
+ *((unsigned long*)(dh->mem_base+tmp->r_offset))=sym_val;
+
+ /* JUMP (arg sysdep...) */
+ if (sym_val) return sym_val;
+ /* can't find symbol */
+ return (unsigned long)_DIE_;
+}
+
+/* library loader */
+
+/* ELF -> MMAP permissions */
+static inline int map_flags(int flags) {
+ int perm = 0;
+ if (flags & PF_X) perm|=PROT_EXEC;
+ if (flags & PF_R) perm|=PROT_READ;
+ if (flags & PF_W) perm|=PROT_WRITE;
+ return perm;
+}
+
+/* a simple mmap wrapper */
+static inline void*do_map_in(void*base,unsigned long length,int flags,int fd,unsigned long offset) {
+ register int op = MAP_PRIVATE;
+ if (base) op|=MAP_FIXED;
+ return _dl_sys_mmap(base, length, map_flags(flags), op, fd, offset);
+}
+
+/* map a library into memory */
+#define _ELF_DWN_ROUND(ps,n) ((n)&(~((ps)-1)))
+#define _ELF_UP_ROUND(ps,n) ((((n)&((ps)-1))?(ps):0)+_ELF_DWN_ROUND((ps),(n)))
+#define _ELF_RST_ROUND(ps,n) ((n)&((ps)-1))
+static struct _dl_handle*_dl_map_lib(const char*fn,const char*pathname,int fd,int flags) {
+ struct _dl_handle*ret=0;
+ int i;
+ unsigned char buf[1024];
+ char *m=0,*d=0;
+
+ unsigned long l;
+ struct stat st;
+
+ Elf_Ehdr*eeh;
+ Elf_Phdr*eph;
+
+ int ld_nr=0;
+ Elf_Phdr*ld[4]={0,0,0,0};
+ Elf_Phdr*dyn=0;
+
+ if (0) { pathname=0; } /* no unused parameter */
+ if (fd==-1) return 0;
+
+ if (_dl_sys_fstat(fd,&st)<0) {
+err_out_close:
+ _dl_sys_close(fd);
+ _dl_error_data=fn;
+ _dl_error=2;
+ return 0;
+ } else {
+ /* use st_dev and st_ino for identification */
+ }
+
+ if (_dl_sys_read(fd,buf,1024)<128) goto err_out_close;
+
+ eeh=(Elf_Ehdr*)buf;
+ eph=(Elf_Phdr*)&buf[eeh->e_phoff];
+
+ for (i=0;i<eeh->e_phnum;++i) {
+ if (eph[i].p_type==PT_LOAD) {
+ if (ld_nr>3) goto err_out_close;
+ ld[ld_nr++]=eph+i;
+ }
+ if (eph[i].p_type==PT_DYNAMIC) {
+ dyn=eph+i;
+ }
+ }
+
+ if (ld_nr==1) {
+ unsigned long offset=_ELF_DWN_ROUND(at_pagesize,ld[0]->p_offset);
+ unsigned long off =_ELF_RST_ROUND(at_pagesize,ld[0]->p_offset);
+ unsigned long length=_ELF_UP_ROUND(at_pagesize,ld[0]->p_memsz+off);
+ ret=_dl_get_handle();
+ m=(char*)do_map_in(0,length,ld[0]->p_flags,fd,offset);
+ if (m==MAP_FAILED) goto err_out_free;
+ /* zero pad bss */
+ l=ld[0]->p_offset+ld[0]->p_filesz;
+ memset(m+l,0,length-l);
+
+ ret->mem_base=m;
+ ret->mem_size=length;
+ }
+ else if (ld_nr==2) { /* aem... yes Quick & Really Dirty / for the avarage 99% */
+// unsigned long text_addr = _ELF_DWN_ROUND(at_pagesize,ld[0]->p_vaddr); /* do we need this ? */
+ unsigned long text_offset=_ELF_DWN_ROUND(at_pagesize,ld[0]->p_offset);
+ unsigned long text_off =_ELF_RST_ROUND(at_pagesize,ld[0]->p_offset);
+ unsigned long text_size =_ELF_UP_ROUND(at_pagesize,ld[0]->p_memsz+text_off);
+
+ unsigned long data_addr =_ELF_DWN_ROUND(at_pagesize,ld[1]->p_vaddr);
+ unsigned long data_offset=_ELF_DWN_ROUND(at_pagesize,ld[1]->p_offset);
+ unsigned long data_off =_ELF_RST_ROUND(at_pagesize,ld[1]->p_offset);
+ unsigned long data_size =_ELF_UP_ROUND(at_pagesize,ld[1]->p_memsz+data_off);
+ unsigned long data_fsize =_ELF_UP_ROUND(at_pagesize,ld[1]->p_filesz+data_off);
+
+ ret=_dl_get_handle();
+ /* mmap all mem_blocks for *.so */
+ m=(char*)do_map_in(0,text_size+data_size,ld[0]->p_flags,fd,text_offset);
+ if (m==MAP_FAILED) {
+err_out_free:
+ _dl_free_handle(ret);
+ _dl_sys_close(fd);
+ return 0;
+ }
+
+ /* release data,bss part */
+ _dl_sys_mprotect(m+data_addr,data_size,PROT_NONE);
+
+ /* mmap data,bss part */
+ d=(char*)do_map_in(m+data_addr,data_fsize,ld[1]->p_flags,fd,data_offset);
+
+ /* zero pad bss */
+ l=data_off+ld[1]->p_filesz;
+ memset(d+l,0,data_fsize-l);
+ /* more bss ? */
+ if (data_size>data_fsize) {
+ l=data_size-data_fsize;
+ _dl_sys_mmap(d+data_fsize,l,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,-1,0);
+ }
+
+ ret->mem_base=m;
+ ret->mem_size=text_size+data_size;
+ }
+ else {
+ _dl_error_data=fn;
+ _dl_error=7;
+ }
+
+ if (ret) {
+ ++ret->lnk_count;
+ if (flags&RTLD_USER)
+ ret->name=strdup(fn);
+ else
+ ret->name=_dl_lib_strdup(fn);
+ ret->flags=flags;
+ ret->dynamic=(Elf_Dyn*)(m+dyn->p_vaddr);
+ }
+
+ _dl_sys_close(fd);
+ return ret;
+}
+
+/* dynamic section parser */
+static struct _dl_handle* _dl_dyn_scan(struct _dl_handle*dh,Elf_Dyn*_dynamic) {
+ void(*init)(void)=0;
+
+ _dl_rel_t* plt_rel=0;
+ unsigned long plt_relsz=0;
+
+ _dl_rel_t* rel=0;
+ unsigned long relent=0;
+ unsigned long relsize=0;
+
+ int i;
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": pre dynamic scan "); ph((unsigned long)dh); pf("\n");
+#endif
+ for(i=0;_dynamic[i].d_tag;++i) {
+ switch(_dynamic[i].d_tag) {
+ /* this depends on dyn_str_tab -> second run */
+ case DT_NEEDED:
+ case DT_SONAME:
+ break;
+
+ /* BASIC DYNAMIC STUFF */
+ case DT_HASH:
+ dh->hash_tab = (unsigned long*)(dh->mem_base+_dynamic[i].d_un.d_ptr);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have hash @ "); ph((long)dh->hash_tab); pf("\n");
+#endif
+ break;
+ case DT_SYMTAB:
+ dh->dyn_sym_tab = (Elf_Sym*)(dh->mem_base+_dynamic[i].d_un.d_ptr);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have dyn_sym_tab @ "); ph((long)dh->dyn_sym_tab); pf("\n");
+#endif
+ break;
+ case DT_STRTAB:
+ dh->dyn_str_tab = (char*)(dh->mem_base+_dynamic[i].d_un.d_ptr);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have dyn_str_tab @ "); ph((long)dh->dyn_str_tab); pf("\n");
+#endif
+ break;
+
+ /* DYNAMIC INIT/FINI (constructors/destructors) */
+ case DT_FINI:
+ dh->fini = (void(*)(void))(dh->mem_base+_dynamic[i].d_un.d_val);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have fini @ "); ph((long)dh->fini); pf("\n");
+#endif
+ break;
+ case DT_INIT:
+ init = (void(*)(void))(dh->mem_base+_dynamic[i].d_un.d_val);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have init @ "); ph((long)init); pf("\n");
+#endif
+ break;
+
+ /* PLT RELOCATION */
+ case DT_PLTGOT:
+ dh->pltgot = (unsigned long*)(dh->mem_base+_dynamic[i].d_un.d_val);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have plt/got @ "); ph((long)dh->pltgot); pf("\n");
+#endif
+ break;
+ case DT_PLTREL:
+ if (_dynamic[i].d_un.d_val!=_DL_REL_T) {
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have incompatible relocation type\n");
+#endif
+ _dl_error_data=dh->name;
+ _dl_error=6;
+ return 0;
+ }
+ break;
+ case DT_JMPREL:
+ plt_rel = (_dl_rel_t*)(dh->mem_base+_dynamic[i].d_un.d_val);
+ dh->plt_rel = plt_rel;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have jmprel @ "); ph((long)plt_rel); pf("\n");
+#endif
+ break;
+ case DT_PLTRELSZ:
+ plt_relsz = _dynamic[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have pltrelsize @ "); ph((long)plt_relsz); pf("\n");
+#endif
+ break;
+
+ /* BASIC RELOCATION */
+ case DT_REL:
+ rel = (_dl_rel_t*)(dh->mem_base+_dynamic[i].d_un.d_val);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have rel @ "); ph((long)rel); pf("\n");
+#endif
+ break;
+ case DT_RELENT:
+ relent=_dynamic[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have relent @ "); ph((long)relent); pf("\n");
+#endif
+ break;
+ case DT_RELSZ:
+ relsize=_dynamic[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have relsize @ "); ph((long)relsize); pf("\n");
+#endif
+ break;
+
+
+ /* TEXT RELOCATIONS POSSIBLE -> NO SHARED OBJECT */
+ case DT_TEXTREL:
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": found possible textrelocation -> "); pf(dh->name); pf(" is not compiled as a shared library\n");
+#endif
+ _dl_error_data=dh->name;
+ _dl_error=3;
+ return 0;
+ break;
+
+ /* OTHERS */
+ default:
+#ifdef DEBUG
+#if 0
+ pf(__FUNCTION__); pf(": unknown "); ph(_dynamic[i].d_tag); pf(", "); ph(_dynamic[i].d_un.d_val); pf("\n");
+#endif
+#endif
+ break;
+ }
+ }
+
+ for(i=0;_dynamic[i].d_tag;i++) {
+ if (dh->name) { /* librabry can have a SONAME */
+ if (_dynamic[i].d_tag==DT_SONAME) {
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": pre soname: "); pf(dh->name); pf("\n");
+#endif
+ if (dh->flags&RTLD_USER) free(dh->name);
+ dh->flags&=~RTLD_NOSONAME;
+ dh->name = dh->dyn_str_tab+_dynamic[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have soname: "); pf(dh->name); pf("\n");
+#endif
+ }
+ }
+ else { /* programs can have a LD_RUN_PATH */
+ if (_dynamic[i].d_tag==DT_RPATH) {
+ register char *rpath=dh->dyn_str_tab+_dynamic[i].d_un.d_val;
+ _dl_search_rpath=rpath;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": have runpath: "); pf(rpath); pf("\n");
+#endif
+ }
+ }
+ }
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": post dynamic scan "); ph((unsigned long)dh); pf("\n");
+#endif
+
+ if (work_on_pltgot(dh)) {
+ _dl_error_data=dh->name;
+ _dl_error=3;
+ return 0;
+ }
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": pre load depending libraries "); ph((unsigned long)dh); pf("\n");
+#endif
+ /* load depending libs */
+ for(i=0;_dynamic[i].d_tag;++i) {
+ if (_dynamic[i].d_tag==DT_NEEDED) {
+ char *lib_name=dh->dyn_str_tab+_dynamic[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": needed for this lib: "); pf(lib_name); pf("\n");
+#endif
+ _dl_queue_lib(lib_name,dh->flags);
+ }
+ }
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": pre open depending libraries 2 "); ph((unsigned long)dh); pf("\n");
+#endif
+ if (_dl_open_dep()) {
+ return 0;
+ }
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": post load depending libraries, pre resolve "); ph((unsigned long)dh); pf("\n");
+#endif
+
+ /* relocation */
+ if (rel) {
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": try to relocate some values\n");
+#endif
+ if (_dl_relocate(dh,rel,relsize/relent)) return 0;
+ }
+
+ /* do PTL / GOT relocation */
+ if (plt_rel) {
+ _dl_rel_t *tmp,*max=((void*)plt_rel)+plt_relsz;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": rel plt/got\n");
+#endif
+ for(tmp=plt_rel;tmp<max;(char*)tmp=((char*)tmp)+sizeof(_dl_rel_t)) {
+ if ((dh->flags&RTLD_NOW)) {
+ unsigned long sym=(unsigned long)_dl_sym(dh,ELF_R_SYM(tmp->r_info));
+ if (sym) *((unsigned long*)(dh->mem_base+tmp->r_offset))=sym;
+ else {
+ _dl_error_data=dh->name;
+ _dl_error=4;
+ return 0;
+ }
+ }
+ else
+ _DL_REL_PLT(dh->mem_base,tmp);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": rel @ "); ph((long)dh->mem_base+tmp->r_offset); pf(" with type ");
+ ph(ELF_R_TYPE(tmp->r_info)); pf(" and sym "); ph(ELF_R_SYM(tmp->r_info));
+ pf(" -> "); ph(*((unsigned long*)(dh->mem_base+tmp->r_offset))); pf("\n");
+#endif
+ }
+ }
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": post resolve, pre init "); ph((unsigned long)dh); pf("\n");
+#endif
+ if (init) init();
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": post init "); ph((unsigned long)dh); pf("\n");
+#endif
+
+ return dh;
+}
+
+static void*_dl_load(const char*fn,const char*pathname,int fd,int flags) {
+ struct _dl_handle*ret=0;
+ if ((ret=_dl_map_lib(fn,pathname,fd,flags))) {
+ ret=_dl_dyn_scan(ret,ret->dynamic);
+ }
+ return ret;
+}
+
+
+/* ELF AUX parser */
+static void _dl_elfaux(register unsigned long*ui) {
+ register struct elf_aux {
+ unsigned long type;
+ unsigned long val;
+ } *ea;
+
+ while (*ui) ++ui;
+ /* now *ui points to the tailing NULL-pointer of the envirioment */
+
+ /* walk the elf_aux table */
+ for (ea=(struct elf_aux*)(ui+1); ea->type; ++ea) {
+ switch (ea->type) {
+ case AT_EXECFD: /* 2 */
+ /* DIE! DIE! DIE! */
+ pf("kernel gives us an unsupported binary load type...\n");
+ _dl_sys_exit(42);
+ break;
+
+ case AT_PHDR: /* 3 */
+ prog_ph=(Elf_Phdr*)ea->val;
+#ifdef DEBUG
+ pf("program header @ "); ph(ea->val); pf("\n");
+#endif
+ break;
+ case AT_PHENT: /* 4 */
+ prog_ph_size=ea->val;
+#ifdef DEBUG
+ pf("program header size "); ph(ea->val); pf("\n");
+#endif
+ break;
+ case AT_PHNUM: /* 5 */
+ prog_ph_num=ea->val;
+#ifdef DEBUG
+ pf("program header # "); ph(ea->val); pf("\n");
+#endif
+ break;
+
+ case AT_PAGESZ: /* 6 */
+ at_pagesize=ea->val;
+#ifdef DEBUG
+ pf("page size "); ph(ea->val); pf("\n");
+#endif
+ break;
+
+ case AT_BASE: /* 7 */
+ loadaddr=ea->val;
+#ifdef DEBUG
+ pf("interpreter base: "); ph(ea->val); pf("\n");
+#endif
+ break;
+
+#if 0
+ case AT_FLAGS: /* 8 */
+#ifdef DEBUG
+ pf("flags "); ph(ea->val); pf("\n");
+#endif
+ break;
+#endif
+
+ case AT_ENTRY: /* 9 */
+ prog_entry=ea->val;
+#ifdef DEBUG
+ pf("start program @ "); ph(ea->val); pf("\n");
+#endif
+ break;
+
+ case AT_NOTELF: /* 10 */
+ pf("this is an ELF-loader... and therefor can't handle anything else.\n");
+ _dl_sys_exit(42);
+ break;
+
+ case AT_UID: /* 11 */
+ at_uid=ea->val;
+#ifdef DEBUG
+ pf(" UID: "); ph(ea->val); pf("\n");
+#endif
+ break;
+ case AT_EUID: /* 12 */
+ at_euid=ea->val;
+#ifdef DEBUG
+ pf("EUID: "); ph(ea->val); pf("\n");
+#endif
+ break;
+ case AT_GID: /* 13 */
+ at_gid=ea->val;
+#ifdef DEBUG
+ pf(" GID: "); ph(ea->val); pf("\n");
+#endif
+ break;
+ case AT_EGID: /* 14 */
+ at_egid=ea->val;
+#ifdef DEBUG
+ pf("EGID: "); ph(ea->val); pf("\n");
+#endif
+ break;
+
+#if 0
+ case AT_PLATFORM: /* 15 */
+#ifdef DEBUG
+ pf("CPU: "); ph(ea->val); pf("\n");
+#endif
+ break;
+ case AT_HWCAP: /* 16 */
+#ifdef DEBUG
+ pf("CPU capabilities: "); ph(ea->val); pf("\n");
+#endif
+ break;
+ case AT_CLKTCK: /* 17 */
+#ifdef DEBUG
+ pf("CLK per sec "); ph( ea->val); pf("\n");
+#endif
+ break;
+ case AT_FPUCW: /* 18 */
+#ifdef DEBUG
+ pf("FPU control word "); ph( ea->val); pf("\n");
+#endif
+ break;
+#endif
+
+ default:
+ break;
+ }
+ }
+}
+
+
+/* start of libdl dynamic linker */
+static unsigned long _dl_main(int argc,char*argv[],char*envp[],unsigned long _dynamic) {
+ unsigned long*got;
+ struct _dl_handle*prog,*mydh;
+ struct _dl_handle my_dh;
+ Elf_Dyn*prog_dynamic=0;
+ unsigned int i;
+
+ if (0) _dl_main(argc,argv,envp,_dynamic); /* TRICK: no warning */
+
+ /* prepare to bootstarp the relocations */
+ got=get_got();
+ _dl_environ=envp;
+
+ /* run elf_aux (kernel provided misc data) */
+ _dl_elfaux((unsigned long*)envp);
+
+ if (loadaddr==0) {
+ pf("\ndiet libdl.so/dynamic-linker can't be started as a program !\n\n SORRY...\n\n");
+ return (unsigned long)_DIE_;
+ }
+
+ memset(&my_dh,0,sizeof(my_dh));
+ my_dh.mem_base=(char*)loadaddr;
+ my_dh.mem_size=0;
+ my_dh.lnk_count=1024;
+ my_dh.name="libdl.so";
+ my_dh.flags=LDSO_FLAGS;
+
+ got[1]=0; /* NOT YET (my_dh) */
+ got[2]=(unsigned long)_DIE_; /* NO lazy symbol resolver as long as we are not ready */
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": pre scan\n");
+#endif
+ /* bootstrap relocation */
+ if (_dl_dyn_scan(&my_dh,(Elf_Dyn*)_dynamic)==0) {
+ pf("error with dyn_scan myself\n");
+ return (unsigned long)_DIE_;
+ }
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": post scan\n");
+#endif
+
+ /* now we are save to use anything :) (hopefully) */
+
+ fini_entry=tt_fini;
+
+ prog=_dl_get_handle();
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": ugly, ugly, COPY pregenerated handle to real handle\n");
+#endif
+ mydh=_dl_get_handle();
+ {
+ register struct _dl_handle*tmp=mydh->prev;
+ memcpy(mydh,&my_dh,sizeof(struct _dl_handle));
+ mydh->prev=tmp;
+ }
+ got[1]=(unsigned long)mydh;
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": MORE ugly: prepare program...\n");
+#endif
+ for(i=0;(i<prog_ph_num);++i) {
+ if (prog_ph[i].p_type==PT_DYNAMIC) {
+ prog_dynamic=(Elf_Dyn*)prog_ph[i].p_vaddr;
+ break;
+ }
+ }
+ if (prog_dynamic==0) {
+ ph(0xe0000001);
+ pf(" error with program: no dynamic section ?\n");
+ return (unsigned long)_DIE_;
+ }
+ prog->name=0;
+ prog->lnk_count=1024;
+ prog->dynamic=prog_dynamic;
+ prog->flags=LDSO_FLAGS;
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": dyn_scan program...\n");
+#endif
+ if (_dl_dyn_scan(prog,(Elf_Dyn*)prog_dynamic)==0) {
+ _dl_error_location="error in dyn_scan the program";
+ pf(dlerror()); pf("\n");
+ return (unsigned long)_DIE_;
+ }
+
+ /* now start the program */
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": now jump to program entrypoint\n");
+#endif
+ return prog_entry;
+}
+
+#endif
diff --git a/mdk-stage1/dietlibc/libdl/_dl_open.c b/mdk-stage1/dietlibc/libdl/_dl_open.c
index 1f907db21..f7bd0af95 100644
--- a/mdk-stage1/dietlibc/libdl/_dl_open.c
+++ b/mdk-stage1/dietlibc/libdl/_dl_open.c
@@ -1,207 +1,35 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/mman.h>
+#include <fcntl.h>
#include <dlfcn.h>
-#include <linux/elf.h>
+#include <limits.h>
+#ifndef __DIET_LD_SO__
+#include <string.h>
+#endif
#include "_dl_int.h"
-struct _dl_handle dl_test;
-
-#define _ELF_DWN_ROUND(ps,n) ((n)&(~((ps)-1)))
-#define _ELF_UP_ROUND(ps,n) ((((n)&((ps)-1))?(ps):0)+ _ELF_DWN_ROUND((ps),(n)))
-#define _ELF_RST_ROUND(ps,n) ((n)&((ps)-1))
-
-void _dl_jump();
-
-/*
- * this file is a Q. & D. hack ... don't think this is bug free or meaningfull
- */
-
-static void *do_map_in(void *base, unsigned long length, int flags, int fd, unsigned long offset)
-{
- int perm = 0;
- if (flags & PF_X) perm|=PROT_EXEC;
- if (flags & PF_R) perm|=PROT_READ;
- if (flags & PF_W) perm|=PROT_WRITE;
- return mmap(base, length, perm, MAP_PRIVATE|((base)?MAP_FIXED:0), fd, offset);
-}
-
-unsigned long do_rel(struct _dl_handle * tmp_dl, unsigned long off)
-{
-// struct _dl_handle * tmp_dl = ((void*)*((&off)-1));
- Elf32_Rel *tmp = ((void*)tmp_dl->plt_rel)+off;
- int sym=ELF32_R_SYM(tmp->r_info);
- register unsigned long sym_val;
-
- printf("do_rel %08x %08x\n",tmp_dl,off);
-
- printf ("do_rel %08x+%x\n",tmp_dl->plt_rel,off);
- printf("do_rel @ %08x with type %d -> %d\n",tmp->r_offset,ELF32_R_TYPE(tmp->r_info),sym);
-
- printf("do_rel sym %08x\n",tmp_dl->dyn_sym_tab[sym].st_value);
-
- /* modify GOT for REAL symbol */
- sym_val=((unsigned long)(tmp_dl->mem_base+tmp_dl->dyn_sym_tab[sym].st_value));
- *((unsigned long*)(tmp_dl->mem_base+tmp->r_offset))=sym_val;
-
- printf("do_rel sym %08x\n",sym_val);
- /* HOWTO JUMP ?!? */
- return sym_val;
-}
-
-void *_dl_open(const char*pathname, int fd, int flag)
-{
- int ps=getpagesize();
- int i;
- unsigned char buf[1024];
- char *m=0,*d;
- struct _dl_handle *ret=0;
-
- unsigned long l;
-
- Elf32_Ehdr *eh;
- Elf32_Phdr *ph;
-
- int ld_nr=0;
- Elf32_Phdr *ld[4]={0,0,0,0};
- Elf32_Phdr *dyn=0;
-
- if (fd==-1) return 0;
-
- printf("_dl_open: %s\n",pathname);
-
- read(fd, buf, 1024);
- eh=(Elf32_Ehdr*)buf;
- ph=(Elf32_Phdr*)&buf[eh->e_phoff];
-
- for (i=0; i<eh->e_phnum; i++) {
- if (ph[i].p_type==PT_LOAD) {
- ld[ld_nr++]=ph+i;
- }
- if (ph[i].p_type==PT_DYNAMIC) {
- dyn=ph+i;
- }
+#ifdef __DIET_LD_SO__
+static
+#endif
+void*_dl_open(const char*filename,int flags) {
+ int fd;
+ char buf[PATH_MAX];
+ const char*p=0;
+
+ for (fd=0;filename[fd] && (p==0);++fd) if (filename[fd]=='/') p=filename;
+ if (p) {
+#ifdef __DIET_LD_SO__
+ if ((fd=_dl_sys_open(p,O_RDONLY,0))<0) fd=-1;
+#else
+ fd=open(p,O_RDONLY);
+#endif
+ } else {
+ p=buf;
+ fd=_dl_search(buf,sizeof(buf)-1,filename);
}
-
- if (ld_nr==1) {
- unsigned long offset = _ELF_DWN_ROUND(ps,ld[0]->p_offset);
- unsigned long off = _ELF_RST_ROUND(ps,ld[0]->p_offset);
- unsigned long length = _ELF_UP_ROUND(ps,ld[0]->p_memsz+off);
- m = (char*)do_map_in(0, length, ld[0]->p_flags, fd, offset);
-
- /* zero pad bss */
- l = ld[0]->p_offset+ld[0]->p_filesz;
- memset(m+l,0,length-l);
-
- dl_test.mem_base=m;
- dl_test.mem_size=length;
- dl_test.lnk_count=0;
-
- ret = &dl_test;
- }
- else if (ld_nr==2) { /* aem... yes Quick & Really Dirty / for the avarage 99% */
- //unsigned long text_addr = _ELF_DWN_ROUND(ps,ld[0]->p_vaddr);
- unsigned long text_offset = _ELF_DWN_ROUND(ps,ld[0]->p_offset);
- unsigned long text_off = _ELF_RST_ROUND(ps,ld[0]->p_offset);
- unsigned long text_size = _ELF_UP_ROUND(ps,ld[0]->p_memsz+text_off);
-
- unsigned long data_addr = _ELF_DWN_ROUND(ps,ld[1]->p_vaddr);
- unsigned long data_offset = _ELF_DWN_ROUND(ps,ld[1]->p_offset);
- unsigned long data_off = _ELF_RST_ROUND(ps,ld[1]->p_offset);
- unsigned long data_size = _ELF_UP_ROUND(ps,ld[1]->p_memsz+data_off);
- unsigned long data_fsize = _ELF_UP_ROUND(ps,ld[1]->p_filesz+data_off);
-
- /* mmap all mem_blocks for *.so */
- l = text_size+data_size;
-
- dl_test.mem_size=l;
-
- m = (char*) do_map_in(0,l,ld[0]->p_flags,fd,text_offset);
-
- /* release data,bss part */
- mprotect(m+data_addr, data_size, PROT_NONE);
-
- /* mmap data,bss part */
- d = (char*) do_map_in(m+data_addr,data_fsize,ld[1]->p_flags,fd,data_offset);
-
- /* zero pad bss */
- l = data_off+ld[1]->p_filesz;
- memset(d+l,0,data_size-l);
-
- /* more bss ? */
- if (data_size>data_fsize) {
- l = data_size-data_fsize;
- mmap(d+data_fsize, l, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
- }
-
- dl_test.mem_base=m;
- dl_test.lnk_count=0;
- ret = &dl_test;
- }
-
- printf("_dl_open pre resolv\n");
- if (ret) {
- Elf32_Dyn* dyn_tab = (void*)m+dyn->p_vaddr;
- void (*init)();
- unsigned long* got=0;
- void* jmprel=0;
- int pltreltype=0;
- int pltrelsize=0;
-
- printf("_dl_open IN resolv\n");
- for(i=0;dyn_tab[i].d_tag;i++) {
- if (dyn_tab[i].d_tag==DT_HASH) {
- ret->hash_tab = (unsigned long*)(m+dyn_tab[i].d_un.d_ptr);
- }
- if (dyn_tab[i].d_tag==DT_SYMTAB) {
- ret->dyn_sym_tab = (Elf32_Sym*)(m+dyn_tab[i].d_un.d_ptr);
- }
- if (dyn_tab[i].d_tag==DT_STRTAB) {
- ret->dyn_str_tab = (char*)(m+dyn_tab[i].d_un.d_ptr);
- }
- if (dyn_tab[i].d_tag==DT_FINI) {
- ret->fini = (void(*)(void))(m+dyn_tab[i].d_un.d_val);
- }
- if (dyn_tab[i].d_tag==DT_INIT) {
- init = (void(*)(void))(m+dyn_tab[i].d_un.d_val);
- printf("init @ %08x\n",init);
- }
- if (dyn_tab[i].d_tag==DT_PLTGOT) {
- got=(unsigned long*)(m+dyn_tab[i].d_un.d_val);
- }
- if (dyn_tab[i].d_tag==DT_PLTREL) {
- pltreltype=dyn_tab[i].d_un.d_val;
- }
- if (dyn_tab[i].d_tag==DT_PLTRELSZ) {
- pltrelsize=dyn_tab[i].d_un.d_val;
- }
- if (dyn_tab[i].d_tag==DT_JMPREL) {
- jmprel=(m+dyn_tab[i].d_un.d_val);
- dl_test.plt_rel=jmprel;
- }
- }
- /* GOT */
- got[0]+=(unsigned long)m;
- got[1]=(unsigned long)&dl_test;
-// got[2]=(unsigned long)do_rel;
- got[2]=(unsigned long)(_dl_jump);
- /* */
-
- if (pltreltype == DT_REL) {
- Elf32_Rel *tmp = jmprel;
- for (;(char*)tmp<(((char*)jmprel)+pltrelsize);(char*)tmp=((char*)tmp)+sizeof(Elf32_Rel)) {
- *((unsigned long*)(m+tmp->r_offset))+=(unsigned long)m;
-// *((unsigned long*)(m+tmp->r_offset))+=(unsigned long)do_rel;
- printf("rel @ %08x with type %d -> %d\n",tmp->r_offset,ELF32_R_TYPE(tmp->r_info),ELF32_R_SYM(tmp->r_info));
- }
- }
-
- printf("_dl_open post resolv, pre init\n");
- init();
+ if (fd==-1) {
+ _dl_error_data=filename;
+ _dl_error=1;
+ return 0;
}
- printf("_dl_open post resolv, init\n");
-
- close(fd);
- return ret;
+ return _dl_load(filename,p,fd,flags);
}
diff --git a/mdk-stage1/dietlibc/libdl/_dl_queue.c b/mdk-stage1/dietlibc/libdl/_dl_queue.c
new file mode 100644
index 000000000..5e08020d5
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/_dl_queue.c
@@ -0,0 +1,39 @@
+#include <dlfcn.h>
+#include "_dl_int.h"
+
+#define MAX_QUEUE 64
+
+static int _dl_queue_start=0;
+static int _dl_queue_stop=0;
+
+static struct {
+ const char*name;
+ int flags;
+} _dl_queue[MAX_QUEUE];
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+int _dl_queue_lib(const char*name,int flags) {
+ if (_dl_find_lib(name)==0) {
+ register int tmp;
+ if ((tmp=_dl_queue_stop+1)>=MAX_QUEUE) tmp=0;
+ if (tmp==_dl_queue_start) return -1;
+ _dl_queue[_dl_queue_stop].name=name;
+ _dl_queue[_dl_queue_stop].flags=flags;
+ _dl_queue_stop=tmp;
+ }
+ return 0;
+}
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+int _dl_open_dep() {
+ while (_dl_queue_start!=_dl_queue_stop) {
+ register int tmp=_dl_queue_start;
+ (++_dl_queue_start>=MAX_QUEUE)?_dl_queue_start=0:0;
+ if (!_dlopen(_dl_queue[tmp].name,_dl_queue[tmp].flags)) return 1;
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libdl/_dl_rel.c b/mdk-stage1/dietlibc/libdl/_dl_rel.c
new file mode 100644
index 000000000..bc8717dc2
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/_dl_rel.c
@@ -0,0 +1,42 @@
+#include <dlfcn.h>
+
+#include "_dl_int.h"
+
+static void exit_now(void) {
+#ifdef DEBUG
+ pf(__func__": symbol not found\n");
+#endif
+ _exit(213);
+}
+
+unsigned long do_rel(struct _dl_handle * tmp_dl, unsigned long off)
+{
+ Elf_Rel *tmp = ((void*)tmp_dl->plt_rel)+off;
+
+ int sym=ELF_R_SYM(tmp->r_info);
+
+ register unsigned long sym_val;
+
+#ifdef DEBUG
+ pf(__func__": "); ph((unsigned long)tmp_dl); pf(" "); ph(off); pf(" on ");
+ ph((long)tmp_dl->plt_rel); pf("\n");
+ pf(__func__": @ "); ph((long)tmp->r_offset); pf(" with type ");
+ ph(ELF_R_TYPE(tmp->r_info)); pf(" and sym "); ph(sym);
+ pf(" symval "); ph(tmp_dl->dyn_sym_tab[sym].st_value); pf("\n");
+#endif
+
+ /* modify GOT for REAL symbol */
+ //sym_val=((unsigned long)(tmp_dl->mem_base+tmp_dl->dyn_sym_tab[sym].st_value));
+ sym_val=(unsigned long)_dl_sym(tmp_dl,sym);
+ *((unsigned long*)(tmp_dl->mem_base+tmp->r_offset))=sym_val;
+
+#ifdef DEBUG
+ pf(__func__": sym "); ph(sym_val); pf("\n");
+#endif
+ /* JUMP (arg sysdep...) */
+ if (sym_val) return sym_val;
+ /* can't find symbol -> die now */
+ return (unsigned long)exit_now;
+}
+
+
diff --git a/mdk-stage1/dietlibc/libdl/_dl_rel.h b/mdk-stage1/dietlibc/libdl/_dl_rel.h
new file mode 100644
index 000000000..948aa5b79
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/_dl_rel.h
@@ -0,0 +1,25 @@
+#ifndef ___DL_REL_H__
+#define ___DL_REL_H__
+
+#if defined(__arm__) || defined(__i386__) || defined(__mips__)
+/* this are REL only archs: arm, i386, mips */
+
+#define _dl_rel_t Elf_Rel
+#define _DL_REL_T DT_REL
+
+#define _DL_REL_PLT(b,r) (*(unsigned long*)((b)+(r)->r_offset)+=(unsigned long)(b))
+
+#elif defined(__alpha__) || defined(__hppa__) || defined(__ppc__) || defined(__sparc__) || defined(__s390__)
+/* this are RELA only archs: alpha, chris, hppa, ia64, m68k, ppc, sparc, sparc64, sh, s390 */
+
+#define _dl_rel_t Elf_Rela
+#define _DL_REL_T DT_RELA
+
+#define _DL_REL_PLT(b,r) (*(unsigned long*)((b)+(r)->r_offset)=(unsigned long)((b)+(r)->r_addend))
+
+#else
+/* there are no known linux supported arch with mixed relocation types ... */
+#error "_dl_rel.h: NOT SUPPORTED"
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/libdl/_dl_relocate.c b/mdk-stage1/dietlibc/libdl/_dl_relocate.c
new file mode 100644
index 000000000..e91e48ccf
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/_dl_relocate.c
@@ -0,0 +1,96 @@
+#include "_dl_int.h"
+
+#include "_dl_rel.h"
+
+#if 0
+/*--- are other relocation types vital to shared objects ? ---*/
+
+ R_386_NONE 0 /* No reloc */
+ R_386_32 1 /* Direct 32 bit */
+ R_386_COPY 5 /* Copy symbol at runtime ?!? */
+ R_386_GLOB_DAT 6 /* Create GOT entry */
+ R_386_JMP_SLOT 7 /* Create PLT entry */
+ R_386_RELATIVE 8 /* Adjust by program base */
+
+ R_ARM_NONE 0 /* No reloc */
+ R_ARM_ABS32 2 /* Direct 32 bit */
+ R_ARM_COPY 20 /* Copy symbol at runtime */
+ R_ARM_GLOB_DAT 21 /* Create GOT entry */
+ R_ARM_JUMP_SLOT 22 /* Create PLT entry */
+ R_ARM_RELATIVE 23 /* Adjust by program base */
+
+#endif
+
+static int _dl_apply_relocate(struct _dl_handle*dh,_dl_rel_t*rel) {
+ int typ,ret=0;
+ Elf_Addr*loc;
+
+ loc=(Elf_Addr *)(dh->mem_base+rel->r_offset);
+
+#ifdef DEBUG
+#if 0
+ pf(__FUNCTION__); pf(": "); ph(ELF_R_TYPE(rel->r_info)); pf(" @ "); ph((unsigned long)loc);
+ pf(" preval "); ph(*(unsigned long*)loc); pf("\n");
+#endif
+#endif
+
+ typ=ELF_R_TYPE(rel->r_info);
+
+#ifdef __i386__
+ if (typ==R_386_32) { /* 1 */
+ *loc=(unsigned long)(dh->mem_base+dh->dyn_sym_tab[ELF_R_SYM(rel->r_info)].st_value);
+ } else if (typ==R_386_COPY) { /* 5 */
+ int len=dh->dyn_sym_tab[ELF_R_SYM(rel->r_info)].st_size;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": R_386_COPY !\n");
+#endif
+ memcpy(loc,(void*)(unsigned long)_dl_sym(dh,ELF_R_SYM(rel->r_info)),len);
+ } else if (typ==R_386_GLOB_DAT) { /* 6 */
+ *loc=(unsigned long)_dl_sym(dh,ELF_R_SYM(rel->r_info));
+ } else if (typ==R_386_JMP_SLOT) { /* 7 */
+ *loc+=(unsigned long)dh->mem_base;
+ } else if (typ==R_386_RELATIVE) { /* 8 */
+ *loc+=(unsigned long)dh->mem_base;
+ } else if (typ==R_386_NONE) { /* 0 */
+ } else
+ ret=1;
+#endif
+#ifdef __arm__
+ if (typ==R_ARM_ABS32) { /* 2 */
+ *loc=(unsigned long)(dh->mem_base+dh->dyn_sym_tab[ELF_R_SYM(rel->r_info)].st_value);
+ } else if (typ==R_ARM_COPY) { /* 20 */
+ int len=dh->dyn_sym_tab[ELF_R_SYM(rel->r_info)].st_size;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": R_ARM_COPY !\n");
+#endif
+ memcpy(loc,(void*)(unsigned long)_dl_sym(dh,ELF_R_SYM(rel->r_info)),len);
+ } else if (typ==R_ARM_GLOB_DAT) { /* 21 */
+ *loc=(unsigned long)_dl_sym(dh,ELF_R_SYM(rel->r_info));
+ } else if (typ==R_ARM_JUMP_SLOT) { /* 22 */
+ *loc+=(unsigned long)dh->mem_base;
+ } else if (typ==R_ARM_RELATIVE) { /* 23 */
+ *loc+=(unsigned long)dh->mem_base;
+ } else if (typ==R_ARM_NONE) { /* 0 */
+ } else
+ ret=1;
+#endif
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": @ "); ph((unsigned long)loc); pf(" val "); ph(*(unsigned long*)loc); pf("\n");
+#endif
+ return ret;
+}
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+int _dl_relocate(struct _dl_handle*dh,_dl_rel_t *rel,int num) {
+ int i;
+ for (i=0;i<num;i++) {
+ if (_dl_apply_relocate(dh,rel+i)) {
+ _dl_error=4;
+ return 1;
+ }
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libdl/_dl_search.c b/mdk-stage1/dietlibc/libdl/_dl_search.c
index 5e3217d46..ccf9c51c5 100644
--- a/mdk-stage1/dietlibc/libdl/_dl_search.c
+++ b/mdk-stage1/dietlibc/libdl/_dl_search.c
@@ -1,68 +1,95 @@
-#include <unistd.h>
#include <stdlib.h>
-#include <string.h>
#include <dlfcn.h>
#include <fcntl.h>
-#include <stdio.h>
+
+#include "_dl_int.h"
#define WANT_LD_SO_CONF_SEARCH
static const char *_dl_search_rpath=0;
+
+#ifndef __DIET_LD_SO__
+#include <unistd.h>
+#include <string.h>
void _dl_set_rpath(const char *path) { _dl_search_rpath=path; }
+const char* _dl_get_rpath() { return _dl_search_rpath; }
+#endif
/* search a colon (semicolon) seperated path for the libraray "filename" */
-static int _dl_search_path(char *buf, int len, const char*path, const int pathlen, const char *filename)
-{
- int fd,l=len,i=1;
- const char *c,*pe=path+pathlen;
+static int _dl_search_path(char*buf,int len,const char*path,const int pathlen,const char*filename) {
+ int fd,i=1,fl=strlen(filename),ml=len-fl;
+ const char*c,*pe=path+pathlen;
if (path) {
- for (c=path; c<pe; c+=i) {
+ for (c=path;c<pe;c+=i) {
+ int l=len-1;
if ((*c==':')||(*c==';')) ++c;
i=strcspn(c,":;");
if (i) {
- strncpy(buf, c, i); buf[i]=0;
- l-=i;
- strncat(buf, "/", l);
+ if (i>ml) continue; /* if len(path-entry)+len(filename)+2 is greater than the buffer ? SKIP */
+ memcpy(buf,c,i);
+ buf[i]='/';
+ l-=++i;
}
- else
- buf[0]=0;
- strncat(buf, filename, --l);
-// printf("_dl_search: %s\n",buf);
+ memcpy(buf+i,filename,fl);
+ buf[i+fl]=0;
+#ifdef DEBUG
+// pf(__func__": "); pf(buf); pf("\n");
+#endif
+#ifdef __DIET_LD_SO__
+ if ((fd=_dl_sys_open(buf,O_RDONLY,0))>-1) return fd;
+#else
if ((fd=open(buf,O_RDONLY))!=-1) return fd;
+#endif
}
}
return -1;
}
/* parse the SMALL file "conf" for lib directories (aem... hang me if you can :) ) */
-static int _dl_search_conf(char *buf, int len, const char *conf, const char *filename)
-{
+static int _dl_search_conf(char*buf,int len,const char*conf,const char*filename) {
char ld_so_conf[1024];
- int i,l,fd=open(conf,O_RDONLY);
- if (fd!=-1) {
+ int i,l,fd;
+#ifdef __DIET_LD_SO__
+ if ((fd=_dl_sys_open(conf,O_RDONLY,0))>-1) {
+ l=_dl_sys_read(fd,ld_so_conf,sizeof(ld_so_conf)-1);
+#else
+ if ((fd=open(conf,O_RDONLY))!=-1) {
l=read(fd,ld_so_conf,sizeof(ld_so_conf)-1);
+#endif
ld_so_conf[sizeof(ld_so_conf)-1]=0;
+#ifdef __DIET_LD_SO__
+ _dl_sys_close(fd);
+#else
close(fd);
- if (ld_so_conf[l-1]=='\n') ld_so_conf[--l]=0;
- for (i=0;i<l;i++) if (ld_so_conf[i]=='\n') ld_so_conf[i]=':';
- if ((fd=_dl_search_path(buf,len,ld_so_conf,l,filename))!=-1) return fd;
+#endif
+ if (l>0) {
+ if (ld_so_conf[l-1]=='\n') ld_so_conf[--l]=0;
+ for (i=0;i<l;i++) if (ld_so_conf[i]=='\n') ld_so_conf[i]=':';
+ if ((fd=_dl_search_path(buf,len,ld_so_conf,l,filename))!=-1) return fd;
+ }
}
return -1;
}
-int _dl_search(char *buf, int len, const char *filename)
-{
+#ifdef __DIET_LD_SO__
+static
+#endif
+int _dl_search(char*buf,int len,const char*filename) {
int fd;
- /* 1. search the LD_RUN_PATH (from the executable */
+ /* 1. search the LD_RUN_PATH (from the executable) */
if (_dl_search_rpath) {
if ((fd=_dl_search_path(buf,len,_dl_search_rpath,strlen(_dl_search_rpath),filename))!=-1) return fd;
}
/* 2. IF we have a "secure" enviroment THEN search LD_LIBRARY_PATH */
- if (getuid()==geteuid()) {
+#ifdef __DIET_LD_SO__
+ if ((at_uid==at_euid)&&(at_gid==at_egid)) {
+#else
+ if ((getuid()==geteuid())&&(getgid()==getegid())) {
+#endif
char *p=getenv("LD_LIBRARY_PATH");
if (p)
if ((fd=_dl_search_path(buf,len,p,strlen(p),filename))!=-1) return fd;
@@ -78,7 +105,7 @@ int _dl_search(char *buf, int len, const char *filename)
/* default path search */
{
- const char* def_path="/usr/lib:/lib";
+ const char def_path[]="/usr/lib:/lib";
return _dl_search_path(buf,len,def_path,strlen(def_path),filename);
}
}
diff --git a/mdk-stage1/dietlibc/libdl/dlclose.c b/mdk-stage1/dietlibc/libdl/dlclose.c
index 384550c47..6fafedcf5 100644
--- a/mdk-stage1/dietlibc/libdl/dlclose.c
+++ b/mdk-stage1/dietlibc/libdl/dlclose.c
@@ -1,14 +1,38 @@
+#include <sys/mman.h>
+
#include "_dl_int.h"
-int dlclose (void *handle)
-{
- if (handle) {
- struct _dl_handle *h = handle;
- if (h->lnk_count) {
- --h->lnk_count;
- return -1;
+static void dec_referenced_libs(struct _dl_handle*dh) {
+ Elf_Dyn* dyn_tab=dh->dynamic;
+ int i;
+ for(i=0;dyn_tab[i].d_tag;i++) {
+ if (dyn_tab[i].d_tag==DT_NEEDED) {
+ char *lib_name=dh->dyn_str_tab+dyn_tab[i].d_un.d_val;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": lib: "); pf(lib_name); pf("\n");
+#endif
+ dlclose(_dl_find_lib(lib_name));
}
- if (munmap(h->mem_base,h->mem_size)!=0) return -1;
+ }
+}
+
+int dlclose(void*handle) {
+ _dl_error_location="dlclose";
+ if (handle) {
+ struct _dl_handle*dh=handle;
+ if (--(dh->lnk_count)) return 0; /* not yet unreferenced */
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": "); pf(dh->name); pf("\n");
+#endif
+ if (dh->fini) dh->fini();
+ dec_referenced_libs(dh);
+#ifdef __DIET_LD_SO__
+ if (_dl_sys_munmap(dh->mem_base,dh->mem_size)<0) return -1;
+#else
+ if (munmap(dh->mem_base,dh->mem_size)==-1) return -1;
+#endif
+ _dl_free_handle(handle);
}
return 0;
}
diff --git a/mdk-stage1/dietlibc/libdl/dlerror.c b/mdk-stage1/dietlibc/libdl/dlerror.c
index 1e31bae54..3fea0b75c 100644
--- a/mdk-stage1/dietlibc/libdl/dlerror.c
+++ b/mdk-stage1/dietlibc/libdl/dlerror.c
@@ -1,4 +1,55 @@
-const char *dlerror(void)
-{
- return "HAE ?!?";
+
+#include "_dl_int.h"
+
+#ifdef __DIET_LD_SO__
+static unsigned int _dl_error;
+static const char*_dl_error_location;
+static const char*_dl_error_data;
+#else
+#include <string.h>
+unsigned int _dl_error;
+const char*_dl_error_location;
+const char*_dl_error_data;
+#endif
+
+static struct _dl_err_msg {
+ char*msg;
+ int len;
+} _dl_error_msg[]={
+#define MSG(n) { (n), sizeof((n))-1 }
+ MSG("can't open: "), /* 1 */
+ MSG("can't stat: "), /* 2 */
+ MSG("shared object is not position independent: "), /* 3 */
+ MSG("can't resolve all symbols in: "), /* 4 */
+ MSG("can't find symbol: "), /* 5 */
+ MSG("invalid relocation type in: "), /* 6 */
+ MSG("internal error: layout not yet supported: "), /* 7 */
+};
+
+const char *dlerror(void) {
+ static char buf[1024],*p=buf;
+ register int l,len=sizeof(buf)-1;
+ if (_dl_error==0) return 0;
+
+ buf[0]=0;
+ buf[len]=0;
+ --_dl_error;
+
+ if (_dl_error>=(sizeof(_dl_error_msg)/sizeof(struct _dl_err_msg)))
+ return "HAE ?!?";
+
+ if (_dl_error_location) {
+ l=strlen(_dl_error_location);
+ strncpy(p,_dl_error_location,len); len-=l; p+=l;
+ strncpy(p,": ",len); len-=2; p+=2;
+ }
+ l=_dl_error_msg[_dl_error].len;
+ strncpy(p,_dl_error_msg[_dl_error].msg,len); len-=l; p+=l;
+ strncpy(p,_dl_error_data,len);
+
+ _dl_error_location=0;
+ _dl_error_data="";
+ _dl_error=0;
+
+ return buf;
}
diff --git a/mdk-stage1/dietlibc/libdl/dlopen.c b/mdk-stage1/dietlibc/libdl/dlopen.c
index 1693d889f..79fa7903c 100644
--- a/mdk-stage1/dietlibc/libdl/dlopen.c
+++ b/mdk-stage1/dietlibc/libdl/dlopen.c
@@ -2,20 +2,25 @@
#include <dlfcn.h>
#include <limits.h>
-int _dl_search(char*buf, int bufsize, const char*filename);
-void *_dl_open(const char*pathname, int fd, int flag);
+#include "_dl_int.h"
-void *dlopen (const char *filename, int flag)
-{
- int fd;
- char buf[PATH_MAX];
- const char *p;
- if (*filename=='/')
- fd=open(p=filename,O_RDONLY);
- else {
- p=buf;
- fd=_dl_search(buf,sizeof(buf),filename);
+#ifdef __DIET_LD_SO__
+static
+#endif
+void*_dlopen(const char *filename, int flags) {
+ struct _dl_handle* ret;
+ if (filename) {
+ if ((ret=_dl_find_lib(filename))) {
+ ++(ret->lnk_count); /* add a reference */
+ return ret;
+ }
+ return _dl_open(filename,flags);
}
+ /* return 1 as an indicator for dlsym to search ALL global objects */
+ return RTLD_DEFAULT;
+}
- return _dl_open(p,fd,flag);
+void*dlopen(const char *filename, int flags) {
+ _dl_error_location="dlopen";
+ return _dlopen(filename,flags|RTLD_USER|RTLD_NOSONAME);
}
diff --git a/mdk-stage1/dietlibc/libdl/dlsym.c b/mdk-stage1/dietlibc/libdl/dlsym.c
index 2af940837..c58bb4d11 100644
--- a/mdk-stage1/dietlibc/libdl/dlsym.c
+++ b/mdk-stage1/dietlibc/libdl/dlsym.c
@@ -1,7 +1,92 @@
#include "_dl_int.h"
-void *dlsym(void *handle, char *symbol)
-{
- printf("dlsym(%08x,%s) -> %08x\n",handle,symbol,elf_hash(symbol)%17);
- return 0;
+#include "elf_hash.h"
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+void *_dlsym(void*handle,char*symbol) {
+ unsigned long*sym=0;
+ if (handle) {
+ struct _dl_handle*dh=(struct _dl_handle*)handle;
+ unsigned long hash =elf_hash(symbol);
+ unsigned long bhash=hash%HASH_BUCKET_LEN(dh->hash_tab);
+ unsigned long*chain=HASH_CHAIN(dh->hash_tab);
+ unsigned long ind;
+ char *name=dh->dyn_str_tab;
+
+#ifdef DEBUG
+// pf(__FUNCTION__); pf(": bucket("); ph(bhash); pf(",\""); pf(symbol); pf("\")\n");
+#endif
+
+ ind=HASH_BUCKET(dh->hash_tab)[bhash];
+#ifdef DEBUG
+// pf(__FUNCTION__); pf(": chain ("); ph(ind); pf(",\""); pf(symbol); pf("\")\n");
+#endif
+
+ while(ind) {
+ int ptr=dh->dyn_sym_tab[ind].st_name;
+#ifdef DEBUG
+// pf(__FUNCTION__); pf(": symbol(\""); pf(name+ptr); pf("\",\"); pf(symbol); pf("\")\n");
+#endif
+ if (strcmp(name+ptr,symbol)==0) {
+ if (ELF_ST_TYPE(dh->dyn_sym_tab[ind].st_shndx)!=0) {
+ sym=(long*)(dh->mem_base+dh->dyn_sym_tab[ind].st_value);
+ break; /* ok found ... */
+ }
+ }
+ ind=chain[ind];
+ }
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": symbol \""); pf(symbol); pf("\" @ "); ph((long)sym); pf("\n");
+#endif
+ }
+ return sym;
+}
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+void*_dl_sym_search_str(struct _dl_handle*dh,char*name) {
+ void *sym=0;
+ struct _dl_handle*tmp;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": search for: "); pf(name); pf("\n");
+#endif
+ for (tmp=_dl_root_handle;tmp && (!sym);tmp=tmp->next) {
+// if (!(tmp->flags&RTLD_GLOBAL)) continue;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": searching in "); pf(tmp->name); pf("\n");
+#endif
+ sym=_dlsym((void*)tmp,name);
+#ifdef DEBUG
+ if (sym) { pf(__FUNCTION__); pf(": found: "); pf(name); pf(" @ "); ph((long)sym); pf("\n"); }
+#endif
+ }
+ return sym;
+}
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+void*_dl_sym(struct _dl_handle*dh,int symbol) {
+ char *name=dh->dyn_str_tab+dh->dyn_sym_tab[symbol].st_name;
+ void*sym=_dl_sym_search_str(dh,name);
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": "); ph(symbol); pf(" -> "); ph((long)sym); pf("\n");
+#endif
+ return sym;
+}
+
+void*dlsym(void*handle,char*symbol) {
+ void*h;
+ if (handle==RTLD_DEFAULT || !handle /* RTLD_DEFAULT is NULL on glibc */ )
+ h=_dl_sym_search_str(0,symbol);
+ else h=_dlsym(handle,symbol);
+ if (h==0) {
+ _dl_error_location="dlsym";
+ _dl_error_data=symbol;
+ _dl_error=5;
+ }
+ return h;
}
diff --git a/mdk-stage1/dietlibc/libdl/elf_hash.c b/mdk-stage1/dietlibc/libdl/elf_hash.c
deleted file mode 100644
index 463dba0dd..000000000
--- a/mdk-stage1/dietlibc/libdl/elf_hash.c
+++ /dev/null
@@ -1,12 +0,0 @@
-unsigned long elf_hash(const unsigned char *name)
-{
- unsigned long h=0, g;
-
- while (*name)
- {
- h = (h<<4) + *(name++);
- if (g = h&0xf0000000) h ^= g>>24;
- h &= ~g;
- }
- return h;
-}
diff --git a/mdk-stage1/dietlibc/libdl/elf_hash.h b/mdk-stage1/dietlibc/libdl/elf_hash.h
new file mode 100644
index 000000000..be55982ea
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/elf_hash.h
@@ -0,0 +1,10 @@
+static unsigned long elf_hash(const unsigned char *name) {
+ unsigned long h=0, g;
+
+ while (*name) {
+ h = (h<<4) + *(name++);
+ if ((g = h&0xf0000000)) h ^= g>>24;
+ h &= ~g;
+ }
+ return h;
+}
diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c b/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c
index b0c3605b0..5a6361442 100644
--- a/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c
+++ b/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c
@@ -1,5 +1,6 @@
#include <ctype.h>
-int iscntrl(int c) {
+int iscntrl(int x) {
+ unsigned char c=x&0xff;
return (c<32) || (c>=127 && c<=160);
}
diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c b/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c
index c8d4a5df0..e79a19e52 100644
--- a/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c
+++ b/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c
@@ -1,4 +1,7 @@
-int isgraph(int c) {
+#include <ctype.h>
+
+int isgraph(int x) {
+ unsigned char c=x&0xff;
return (c>=33 && c<=126) || (c>=161 && c<=255);
}
diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-islower.c b/mdk-stage1/dietlibc/liblatin1/latin1-islower.c
index cab1a5171..c5ad18d1e 100644
--- a/mdk-stage1/dietlibc/liblatin1/latin1-islower.c
+++ b/mdk-stage1/dietlibc/liblatin1/latin1-islower.c
@@ -1,5 +1,6 @@
#include <ctype.h>
int islower(int c) {
- return (c>='a' && c<='z') || (c>=223 && c<=255 && c!=247);
+ unsigned char x=c&0xff;
+ return (x>='a' && x<='z') || (x>=223 && x<=255 && x!=247);
}
diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c b/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c
index f632483a0..9493892b1 100644
--- a/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c
+++ b/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c
@@ -1,4 +1,6 @@
+#include <ctype.h>
-int isprint(int c) {
+int isprint(int x) {
+ unsigned char c=x&0xff;
return (c>=32 && c<=126) || (c>=160 && c<=255);
}
diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c b/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c
index 1c1d59db8..a024548fd 100644
--- a/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c
+++ b/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c
@@ -1,5 +1,6 @@
#include <ctype.h>
int isupper(int c) {
- return (c>='A' && c<='Z') || (c>=192 && c<=222 && c!=215);
+ unsigned char x=c&0xff;
+ return (x>='A' && x<='Z') || (x>=192 && x<=222 && x!=215);
}
diff --git a/mdk-stage1/dietlibc/libm/acosh.c b/mdk-stage1/dietlibc/libm/acosh.c
new file mode 100644
index 000000000..a09a4c9f0
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/acosh.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+double acosh ( double x )
+{
+ return log ( x + sqrt (x*x - 1.) );
+}
diff --git a/mdk-stage1/dietlibc/libm/asinh.c b/mdk-stage1/dietlibc/libm/asinh.c
new file mode 100644
index 000000000..49c6b467f
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/asinh.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+double asinh ( double x )
+{
+ return log ( x + sqrt (x*x + 1.) );
+}
diff --git a/mdk-stage1/dietlibc/libm/atanh.c b/mdk-stage1/dietlibc/libm/atanh.c
new file mode 100644
index 000000000..bdb3367be
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/atanh.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+extern const float __half;
+
+double atanh ( double x )
+{
+ return __half * log ( (1.+x) / (1.-x) );
+}
diff --git a/mdk-stage1/dietlibc/libm/bessel.c b/mdk-stage1/dietlibc/libm/bessel.c
new file mode 100644
index 000000000..ba8a1afcb
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/bessel.c
@@ -0,0 +1,171 @@
+/*--------------------------------------------------------------------------*
+
+Name j0, j1, jn - Bessel functions
+ y0, y1, yn - Weber functions
+
+Usage double j0 (double x);
+ double j1 (double x);
+ double jn (int n, double x);
+ double y0 (double x);
+ double y1 (double x);
+ double yn (int n, double x);
+
+Prototype in math.h
+
+Description j0, j1 and jn calculate the Bessel function.
+ y0, y1 and yn calcualte the Weber function.
+
+Return value return their return values as doubles.
+
+*---------------------------------------------------------------------------*/
+
+#include <math.h>
+
+#define M_C 0.5772156649015328
+#if 0
+#define M_1_PI 0.318309886183790671538
+#define M_2_PI 0.636619772367581343076
+#define M_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148
+#endif
+
+
+#define EXPL(x) ((((short *)&x)[4] & 0x7FFF) >> 0)
+#define EXPD(x) ((((short *)&x)[3] & 0x7FF0) >> 4)
+#define EXPF(x) ((((short *)&x)[1] & 0x7F80) >> 7)
+
+#define SQUARE(x) (long) (My - (x) * (x) )
+
+
+static long double P ( int My, double* x )
+{
+ long double Sum = 0.;
+ long double Fact = 1.;
+ long double z182 = -0.015625 / (x[0] * x[0]);
+ register int i;
+
+ for ( i = 1; ; i += 2 ) {
+ Fact *= SQUARE(i+i-1) * SQUARE(i+i+1) * z182 / (i*(i+1));
+ if ( EXPL (Fact) < 0x3FFF-53 )
+ break;
+ Sum += Fact;
+ }
+ return 1. + Sum;
+}
+
+static long double Q ( int My, double* x )
+{
+ long double Fact = (My-1) / x[0] * 0.125;
+ long double Sum = Fact;
+ long double z182 = -0.015625 / (x[0]*x[0]);
+ register int i;
+
+ for ( i = 2; ; i += 2 ) {
+ Fact *= SQUARE(i+i-1) * SQUARE(i+i+1) * z182 / (i*(i+1));
+ if ( EXPL (Fact) < 0x3FFF-53 )
+ break;
+ Sum += Fact;
+ }
+ return Sum;
+}
+
+
+static long double ___jn ( int n, double* x )
+{
+ long double Sum;
+ long double Fact;
+ long double y;
+ register int i;
+ double xx;
+ long double Xi;
+ int My;
+
+ if ( n < 0 )
+ return n & 1 ? ___jn (-n, x) : -___jn (-n, x);
+
+ if ((x[0] >= 17.7+0.0144*(n*n))) {
+ Xi = x[0] - M_PI * (n*0.5 + 0.25);
+ My = n*n << 2;
+
+ return sqrt ( M_2_PI/x[0] ) * ( P(My,x) * cos(Xi) - Q(My,x) * sin(Xi) );
+ }
+ xx = x[0] * 0.5;
+ Sum = 0.;
+ Fact = 1.;
+ y = -xx * xx;
+
+ for ( i = 1; i <= n; i++ )
+ Fact *= xx/i;
+ for ( i = 1; ; i++ ) {
+ Sum += Fact;
+ Fact *= y / (i*(n+i));
+ if ( EXPL (Sum) - EXPL(Fact) > 53 || !EXPL(Fact) )
+ break;
+ }
+ return Sum;
+}
+
+
+static long double ___yn ( int n, double* x )
+{
+ long double Sum1;
+ long double Sum2;
+ long double Fact1;
+ long double Fact2;
+ long double F1;
+ long double F2;
+ long double y;
+ register int i;
+ double xx;
+ long double Xi;
+ unsigned int My;
+
+ if ( EXPD (x[0]) == 0 )
+ return -1./0.; /* ignore the gcc warning, this is intentional */
+
+ if ( (x[0] >= (n>=32 ? 25.8 : (n<8 ? 17.4+0.1*n : 16.2+0.3*n))) ) {
+ Xi = x[0] - M_PI * (n*0.5+0.25);
+ My = n*n << 2;
+
+ return sqrt ( M_2_PI / x[0] ) * ( P(My,x) * sin(Xi) + Q(My,x) * cos(Xi) );
+ }
+
+ Sum1 = Sum2 = F1 = F2 = 0;
+ Fact1 = 1. / (xx = x[0] * 0.5 );
+ Fact2 = 1.;
+ y = xx*xx;
+
+ for ( i = 1; i < n; i++ )
+ Fact1 *= (n-i) / xx;
+
+ for ( i = 1; i <= n; i++ ) {
+ Sum1 += Fact1;
+ if ( i == n )
+ break;
+ Fact1 *= y/(i*(n-i));
+ }
+
+ for (i=1; i<=n; i++) {
+ Fact2 *= xx / i;
+ F1 += 1. / i;
+ }
+
+ for ( i = 1; ; i++ ) {
+ Sum2 += Fact2 * (F1+F2);
+ Fact2 *= -y / (i*(n+i));
+ if ( EXPL (Sum2) - EXPL (Fact2) > 53 || !EXPL (Fact2) )
+ break;
+ F1 += 1. / (n+i);
+ F2 += 1. / i;
+ }
+
+ return M_1_PI * (2. * (M_C + log(xx)) * ___jn (n, x) - Sum1 - Sum2);
+}
+
+
+double j0 ( double x ) { return ___jn ( 0,&x ); }
+double j1 ( double x ) { return ___jn ( 1,&x ); }
+double jn ( int n, double x ) { return ___jn ( n,&x ); }
+double y0 ( double x ) { return ___yn ( 0,&x ); }
+double y1 ( double x ) { return ___yn ( 1,&x ); }
+double yn ( int n, double x ) { return ___yn ( n,&x ); }
+
diff --git a/mdk-stage1/dietlibc/libm/cosh.c b/mdk-stage1/dietlibc/libm/cosh.c
new file mode 100644
index 000000000..f64d59106
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/cosh.c
@@ -0,0 +1,9 @@
+#include <math.h>
+
+extern const float __half;
+
+double cosh ( double x )
+{
+ long double y = exp (x);
+ return (y + 1./y) * __half;
+}
diff --git a/mdk-stage1/dietlibc/libm/erf.c b/mdk-stage1/dietlibc/libm/erf.c
new file mode 100644
index 000000000..63f52d81f
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/erf.c
@@ -0,0 +1,95 @@
+#include "dietlibm.h"
+
+/*--------------------------------------------------------------------------*
+ z
+ 1 | -x²/2
+Name erf(z) = --------- | e dx
+ sqrt(2pi) |
+ 0
+
+ oo
+ 1 | -x²/2
+ erfc(z) = -------- | e dx
+ sqrt(2pi) |
+ z
+
+Usage double erf (double x);
+ double erfc(double x);
+
+Prototype in math.h
+
+Description erf(x) is the probability a normal distributed event occures
+ within the range [0,x]. erfc(x) is the probability a normal
+ distributed event occures within the range [x,oo].
+
+Return value return their respective function value.
+
+*---------------------------------------------------------------------------*/
+
+
+/* even function in (0): Coefficients for gamma(0) */
+
+static const double tab1 [9 + 1] = {
+ 0.398942280401432677926, -0.066490380066905446321, 9.97355701003581694794E-3, -1.18732821548045439878E-3, 1.15434687616155288764E-4, -9.44465625950361453450E-6, 6.65969351631665127484E-7, -4.12266741486268888409E-8, 2.27352982437280636972E-9, -1.13011716416192129505E-10
+};
+
+/* non even or odd function in (x), x>0: Coefficients for gamma(x), x>0 */
+
+static const double tab2 [] [31 + 1] = {
+ { -0.158655253931457051468, +0.241970724519143349823, -0.120985362259571674911, 0, +0.0201642270432619458197, -4.03284540865238916394E-3, -2.01642270432619458197E-3, +7.68161030219502697887E-4, +1.20025160971797296538E-4, -8.80184513793180174807E-5, -1.86705805956129127862E-6, +7.37124220917704609315E-6, -4.72826391707080259142E-7, -4.83395817951682973566E-7, +6.57036391970156141055E-8, +2.5544260402922190768E-8, -5.4292285616752144141E-9, -1.08932444506260820153E-9, +3.44399256708718202774E-10, +3.6021429664641554881E-11, -1.81147204852239925966E-11, -7.66935128389784976374E-13, +8.19047721646461768154E-13, -3.78144699611990981391E-15, -3.24856460059989147863E-14, +1.44438130842455313227E-15, +1.14391687912824634892E-15, -9.38053726039148625184E-17, -3.59908648108845288945E-17, +4.36020846676166022246E-18, +1.01298640134330880603E-18, -1.68640470512244526894E-19 },
+ { -0.0227501319481792072104, +0.0539909665131880519553, -0.0539909665131880519553, +0.0269954832565940259776, -4.49924720943233766301E-3, -2.24962360471616883129E-3, +1.34977416282970129877E-3, -1.17837426913704081544E-4, -1.15159303574756261652E-4, +3.70473728554448438507E-5, +2.82690796888936559912E-6, -3.54513195524355369855E-6, +3.76695631261094890352E-7, +1.92024079214184701051E-7, -5.22690859049557191018E-8, -4.91799344974114749666E-9, +3.66377919234006038965E-9, -1.5981997209104676352E-10, -1.73812379171063320997E-10, +2.62403075313043113473E-11, +5.60918720760414713346E-12, -1.72126983666416144614E-12, -8.63428809787622525331E-14, +7.89441765474563834480E-14, -3.13747960081562321348E-15, -2.77519506625391157547E-15, +3.29321944203493138076E-16, +7.44375150395529134369E-17, -1.66428523299294690222E-17, -1.32735612757620496568E-18, +6.24122437514304644794E-19, +1.12471123532438919306E-21 },
+ { -1.3498980316300945272E-3, +4.43184841193800717687E-3, -6.64777261790701076574E-3, +5.90913121591734290293E-3, -3.32388630895350538287E-3, +1.10796210298450179421E-3, -1.10796210298450179595E-4, -8.44161602273906129349E-5, +4.35270826172482847927E-5, -6.30190085030867423515E-6, -1.9785037553294674925E-6, +1.05520200284238266374E-6, -1.13913852579575399458E-7, -4.81174572974454799623E-8, +1.78216871733806513653E-8, -5.85637697215219690327E-10, -9.29791350219350980904E-10, +1.96377023046901260016E-10, +1.58870373467897094393E-11, -1.22699105512396660364E-11, +1.08794270836433192571E-12, +3.99646995170699427940E-13, -1.01594404465456044793E-13, -3.33469605506835759271E-15, +4.46588935876766499879E-15, -4.08076707607833277747E-16, -1.17808602368979218862E-16, +2.76224909899945482352E-17, +1.09206599392049874162E-18, -1.03145418746203977253E-18, +6.79984672177279963209E-20, +2.55831283729070534712E-20 },
+ { -3.16712418331199212695E-5, +1.33830225764885351832E-4, -2.67660451529770703664E-4, +3.34575564412213379613E-4, -2.89965489157251595673E-4, +1.8178605666396926958E-4, -8.25286392216793003064E-5, +2.55180251904870680833E-5, -3.91665839292075186649E-6, -7.40182052221464123606E-7, +6.44220233592652481453E-7, -1.73701553397390201613E-7, +9.09595464817154590424E-9, +9.44943118114780783705E-9, -3.29957075383376125942E-9, +2.94920746951281580686E-10, +1.18744773902482360274E-10, -4.42039585809856402486E-11, +3.61422484008923382324E-12, +1.43638335494248833511E-12, -4.58476794992724591068E-13, +2.23496663226445199624E-14, +1.57839046076890756440E-14, -3.67258220998453293248E-15, -1.69716269032291432153E-17, +1.43497778353923791279E-16, -2.14499365995613073838E-17, -1.93255135682867953692E-18, +1.01377499752128183701E-18, -7.55713215369572830154E-20, -2.25510650946079103289E-20, +5.26633993110171917109E-21 },
+ { -2.86651571879193912033E-7, +1.48671951473429770924E-6, -3.7167987868357442731E-6, +5.9468780589371908374E-6, -6.81413110919886450076E-6, +5.92209940035828587496E-6, -4.02653201907205629582E-6, +2.17108246596119665457E-6, -9.25512396325170449452E-7, +3.03096091545533908077E-7, -6.92802772105295808398E-8, +6.69226396924248971087E-9, +2.46006252876483997508E-9, -1.41806830376639605249E-9, +3.44251040657349801884E-10, -2.6965166176434937652E-11, -1.16546962748761528049E-11, +4.91490145086991326748E-12, -7.55854519365765424197E-13, -4.53988828124843593484E-14, +4.71533558309731405623E-14, -9.17323049919073092370E-15, +4.35542982587998484108E-17, +3.71238868922011013332E-16, -7.90772907386322623053E-17, +1.58463483904927528072E-18, +2.61503941976309571331E-18, -5.40699423853895351239E-19, +6.61825040533797444037E-21, +1.68378440730394776550E-20, -3.01930850797704474581E-21, -3.80658085177617928332E-23 },
+ { -9.8658764503769814198E-10, +6.07588284982328549581E-9, -1.82276485494698564874E-8, +3.54426499573024987263E-8, -5.01260335110421053478E-8, +5.48348427196551516061E-8, -4.81513715848495375522E-8, +3.47446467489597046263E-8, -2.08994095347716137282E-8, +1.0554987922587771203E-8, -4.4752674615729637229E-9, +1.57746505810079893253E-9, -4.49697115294871911476E-10, +9.63210042443717269402E-11, -1.16300711402336909847E-11, -1.31070037808191623761E-12, +1.16993345829435057496E-12, -3.40636420312606285351E-13, +5.23724821541706939045E-14, +3.93541148139975862961E-16, -2.59886413069218394637E-15, +7.24729556829529838503E-16, -8.51485747763574768020E-17, -7.86503719948806184368E-18, +5.35986191777031053618E-18, -9.84873767617830925356E-19, +2.93759678710573738811E-20, +2.85458592629073152182E-20, -7.12725445137377009753E-21, +5.25419393758902871947E-22, +1.24299023131490990316E-22, -4.04419210566489645405E-23 },
+ { -1.27981254388583500631E-12, +9.1347204083645933588E-12, -3.19715214292760767584E-11, +7.30777632669167468738E-11, -1.22557498812224960902E-10, +1.60618833847077433236E-10, -1.71047639646627010648E-10, +1.51926349902927316213E-10, -1.14609023345779936276E-10, +7.43697341394886835864E-11, -4.18713451557949730558E-11, +2.05606050331840905587E-11, -8.82161466664564577599E-12, +3.30031395277698236679E-12, -1.06851205331295409813E-12, +2.94333808755089195146E-13, -6.64411715537625335642E-14, +1.11264855981436243262E-14, -8.52918435682649455145E-16, -2.38837813662069487819E-16, +1.23994634366691956599E-16, -3.05269770279941723219E-17, +4.34539596489459676621E-18, -5.55819387468189608390E-20, -1.56974672263484202926E-19, +4.60835492190702561464E-20, -6.61112150617493330405E-21, +7.28424268476803924831E-23, +2.09156005934313228089E-22, -5.29080328670107625978E-23, +5.61375000671507211726E-24, +3.82199410465700894394E-25 },
+ { -6.22096057427178413283E-16, +5.05227108353689229741E-15, -2.02090843341475691883E-14, +5.30488463771373691202E-14, -1.02729512031916810045E-13, +1.56409892294496290711E-13, -1.94849254788406146283E-13, +2.04064637342166989709E-13, -1.83187931471980616892E-13, +1.42994099344605424348E-13, -9.8111907789286062426E-14, +5.96545975367403288587E-14, -3.23370114040930933005E-14, +1.56932853967230342257E-14, -6.83548101324218922896E-15, +2.67410077774155118457E-15, -9.38313996431647887562E-16, +2.94090734842381109313E-16, -8.16448235152204729921E-17, +1.9758222496699617607E-17, -4.03590262164308783690E-18, +6.43662361965717426956E-19, -5.93446415094778572090E-20, -6.07164564350191039536E-21, +4.38906686886388095825E-21, -1.17175498170220204828E-21, +1.98482140750318604418E-22, -1.70803571702439545981E-23, -1.94600332107885234554E-24, +1.10477141319981582738E-24, -2.31975718243847439962E-25, +2.54148402104633283670E-26 },
+ { -1.12858840595384064928E-19, +1.02797735716689148111E-18, -4.62589810725101166456E-18, +1.37063647622252197466E-17, -3.0068337697131575822E-17, +5.2067053140503053517E-17, -7.40914680178037035E-17, +8.9062000172830588611E-17, -9.22563786210983011008E-17, +8.35975730487397716492E-17, -6.70372487553237232779E-17, +4.80088566412770650047E-17, -3.09280630297969106245E-17, +1.8026496052333452774E-17, -9.54924880090907168481E-18, +4.61362333444861021959E-18, -2.03812361224098073479E-18, +8.24578860830779678155E-19, -3.0572087552697254564E-19, +1.03827313453936543577E-19, -3.22407758977306397999E-20, +9.12052549039695437376E-21, -2.33541947993595580264E-21, +5.35339963891271164659E-22, -1.07674173853083520575E-22, +1.82413373046113374293E-23, -2.33864726317468746329E-24, +1.29928813344150027051E-25, +3.86668349205203745336E-26, -1.63203452712600670685E-26, +3.65165372186699607411E-27, -5.51243539825332137371E-28 },
+ { -7.61985302416052609616E-24, +7.69459862670641937159E-23, -3.84729931335320968601E-22, +1.26960877340655919637E-21, -3.10990027829384449637E-21, +6.02935924057670511377E-21, -9.6342786971886625897E-21, +1.30454744197246721374E-20, -1.52745988785284834672E-20, +1.57034665186695273938E-20, -1.43457243961336621961E-20, +1.17567385540485497556E-20, -8.7104848256363928121E-21, +5.87137214731944288587E-21, -3.61951956727412561213E-21, +2.04954715001535632502E-21, -1.06982832733527370879E-21, +5.1628428354196120786E-22, -2.30885865897937993512E-22, +9.58556229281154921137E-23, -3.69911125531027884646E-23, +1.32784897023484841369E-23, -4.43433027366044567275E-24, +1.37688611947822111040E-24, -3.96971995397574368025E-25, +1.06008163579031271153E-25, -2.61149430849477426613E-26, +5.89698164189548613154E-27, -1.20793190886658723050E-27, +2.20446342551066852143E-28, -3.46061447029252398335E-29, +4.28913922246949096952E-30 }
+};
+
+static const double tab3 [8] = { +1, -1, +3, -15, +105, -945, +10395, -135135.0 };
+
+
+/*
+ Calculated: oo
+ 1 | -x²/2
+ gauss(z) = --------- | e dx
+ sqrt(2pi) |
+ z
+
+ gauss ( 0) = 0.5
+ gauss ( 1) ~ 0.1586
+ gauss ( 2) ~ 0.02275
+ gauss ( 4) ~ 3.17e-5
+ gauss (10) ~ 7.62e-24
+ gauss (oo) = 0
+
+ Note: only for z>0
+*/
+#include <stdio.h>
+#include <math.h>
+
+#define M_1_SQRT2PI 0.398942280401432686
+
+static long double gauss ( double x )
+{
+ unsigned int i = (unsigned int)(x + 0.5);
+ double y = x * x;
+
+ if ( i > 150 ) return 0.;
+ if ( i > 10 ) return M_1_SQRT2PI * exp (-0.5*y) / x * __poly (1./y, 7, tab3);
+ if ( i > 0 ) return -__poly ((x-i), 31, tab2 [i-1]);
+ return 0.5 - x * __poly (y, 9, tab1);
+ }
+
+double erf ( double x )
+{
+ return x < 0. ? -0.5 + gauss(-x) : 0.5 - gauss(x);
+}
+
+double erfc ( double x )
+{
+ return x < 0. ? 1.0 - gauss(-x) : gauss(x);
+}
+
diff --git a/mdk-stage1/dietlibc/libm/gamma.c b/mdk-stage1/dietlibc/libm/gamma.c
new file mode 100644
index 000000000..d5f3e4275
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/gamma.c
@@ -0,0 +1,98 @@
+#include "dietlibm.h"
+
+/*--------------------------------------------------------------------------*
+
+Name gamma, lgamma - gamma function
+
+Usage double gamma (double x);
+ double lgamma(double x);
+ extern int signgam;
+
+Prototype in math.h
+
+Description gamma returns the logarithm of the absolute value of the
+ gamma function. So it is possible â(x) for very large x.
+ The sign is stored in signgam, a extern variable
+ overwritten during every call to gamma(). lgamma() is
+ a synonym for gamma().
+ You can calculate â(x) by the following sequence:
+
+ double gammafunction(double x)
+ { double y=exp(gamma(x));
+
+ return signgam ? -y : +y;
+ }
+
+Return value gamma returns a value in range (-0.1208, +oo). For a input
+ value of zero, it returns +oo and errno is set to:
+
+ ERANGE Result out of range
+
+*---------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <math.h>
+
+#define B0 + 1.0l/ 6/ 1/ 2
+#define B1 - 1.0l/ 30/ 3/ 4
+#define B2 + 1.0l/ 42/ 5/ 6
+#define B3 - 1.0l/ 30/ 7/ 8
+#define B4 + 5.0l/ 66/ 9/10
+#define B5 - 691.0l/2730/11/12
+#define B6 + 7.0l/ 6/13/14
+#define B7 - 3617.0l/ 510/15/16
+#define B8 + 43867.0l/ 798/17/18
+#define B9 - 174611.0l/ 330/19/20
+#define B10 + 854513.0l/ 138/21/22
+#define B11 - 236364091.0l/2730/23/24
+#define B12 + 8553103.0l/ 6/25/26
+
+static const double coeff[] = { B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10 };
+int signgam;
+
+#define EXPL(x) (((short *)&x)[4] & 0x7FFF)
+
+static double logfact ( long double x )
+{
+ long double z = 2. * M_PI * x;
+ register int e = EXPL (x);
+
+ static unsigned char list [] = { 6, 4, 3, 3, 2, 2 };
+
+ return (log(x) - 1) * x + 0.5*log(z) + __poly (1./(x*x), e<0x4003 ? 10 : (e>0x4008 ? 1 : list [e-0x4003] ), coeff) / x;
+}
+
+
+double lgamma ( double x )
+{
+ register int k = floor (x);
+ long double w;
+ long double y;
+ long double z;
+
+ signgam = 0;
+
+ if ( k >= 7 )
+ return logfact (x-1);
+
+ if ( k == x )
+ switch (k) {
+ case 1 :
+ case 2 : return 0.000000000000000000000000000l;
+ case 3 : return 0.693147180559945309432805516l;
+ case 4 : return 1.791759469228055000858148560l;
+ case 5 : return 3.178053830347945619723759592l;
+ case 6 : return 4.787491742782045994244981560l;
+ default: return 1./0.; /* ignore the gcc warning, this is intentional */
+ }
+
+ z = logfact (y = x - k + 7.0 - 1);
+ w = 1;
+ for ( k = 7 - k; k--; )
+ w *= y, y -= 1.;
+
+ signgam = k >= 0 ? 0 : k & 1;
+ return z - log (w);
+}
+
+double gamma ( double val ) __attribute__ ((weak,alias("lgamma")));
diff --git a/mdk-stage1/dietlibc/libm/ipow.c b/mdk-stage1/dietlibc/libm/ipow.c
new file mode 100644
index 000000000..399986ea1
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/ipow.c
@@ -0,0 +1,29 @@
+#define _GNU_SOURCE
+#include <math.h>
+/*
+ * This is not standard, but often you only need such this function
+ * which is much shorter than the generic pow() function.
+ *
+ * double ipow ( double mant, int expo );
+ */
+
+double ipow ( double mant, int expo )
+{
+ double ret = 1.;
+ unsigned int e = expo; /* Some attention is necessary for expo = 2^31 */
+
+ if ( (int)e < 0 ) {
+ e = -e;
+ mant = 1./mant;
+ }
+
+ while (1) {
+ if ( e & 1 )
+ ret *= mant;
+ if ( (e >>= 1) == 0 )
+ break;
+ mant *= mant;
+ }
+
+ return ret;
+}
diff --git a/mdk-stage1/dietlibc/libm/poly.c b/mdk-stage1/dietlibc/libm/poly.c
new file mode 100644
index 000000000..cdcfb8c5c
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/poly.c
@@ -0,0 +1,41 @@
+/*--------------------------------------------------------------------------*
+
+Name __poly - generates a polynomial from arguments
+
+Usage double __poly ( double x, int n, const double* c );
+
+Prototype in math.h
+
+Description __poly generates a polynomial in x, of degree n, with
+ coefficients c[0], c[1], ..., c[n]. For example, if n=4,
+ the generated polynomial is
+
+ c[4]*x^4 + c[3]*x^3 + c[2]*x^2 + c[1]*x + c[0]
+
+ The polynomial is calculated using Horner's method:
+
+ polynom = (..((x*c[n] + c[n-1])*x + c[n-2])..)*x + c[0]
+
+Return value __poly returns the value of the polynomial as evaluated for
+ the given x.
+ A range error occurs if the result exceeds double range.
+
+*---------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include "dietlibm.h"
+
+double __poly ( double x, size_t n, const double* c)
+{
+ long double ret;
+ size_t i;
+
+ i = n;
+ c += n;
+ ret = 0;
+ do
+ ret = ret * x + *c--;
+ while ( i-- );
+
+ return ret;
+}
diff --git a/mdk-stage1/dietlibc/libm/pow.c b/mdk-stage1/dietlibc/libm/pow.c
new file mode 100644
index 000000000..e0e5a2983
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/pow.c
@@ -0,0 +1,42 @@
+
+#include <math.h>
+#include "dietlibm.h"
+
+double pow ( double mant, double expo )
+{
+ unsigned int e;
+ long double ret;
+
+ /* special cases 0^x */
+ if ( mant == 0. ) {
+ if ( expo > 0. )
+ return 0.;
+ else if ( expo == 0. )
+ return 1.;
+ else
+ return 1./mant;
+ }
+
+ /* special cases x^n with n is integer */
+ if ( expo == (int) (e = (int) expo) ) {
+
+ if ( (int)e < 0 ) {
+ e = -e;
+ mant = 1./mant;
+ }
+
+ ret = 1.;
+
+ while (1) {
+ if ( e & 1 )
+ ret *= mant;
+ if ( (e >>= 1) == 0 )
+ break;
+ mant *= mant;
+ }
+ return ret;
+ }
+
+ /* normal case */
+ return exp2 ( log2 (mant) * expo );
+}
diff --git a/mdk-stage1/dietlibc/libm/rint.c b/mdk-stage1/dietlibc/libm/rint.c
new file mode 100644
index 000000000..b6f0d8f85
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/rint.c
@@ -0,0 +1,5 @@
+#include <math.h>
+
+double rint(double x) {
+ return floor(x+0.5);
+}
diff --git a/mdk-stage1/dietlibc/libm/sinh.c b/mdk-stage1/dietlibc/libm/sinh.c
new file mode 100644
index 000000000..ae4542d25
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/sinh.c
@@ -0,0 +1,9 @@
+#include <math.h>
+
+extern const float __half;
+
+double sinh ( double x )
+{
+ long double y = exp (x);
+ return (y - 1./y) * __half;
+}
diff --git a/mdk-stage1/dietlibc/libm/tanh.c b/mdk-stage1/dietlibc/libm/tanh.c
new file mode 100644
index 000000000..21dc3d0c0
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/tanh.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double tanh ( double x )
+{
+ long double y = exp (x + x);
+ return (y - 1.) / (y + 1.);
+}
diff --git a/mdk-stage1/dietlibc/libpthread/CHANGES b/mdk-stage1/dietlibc/libpthread/CHANGES
index d39d990ba..63376623b 100644
--- a/mdk-stage1/dietlibc/libpthread/CHANGES
+++ b/mdk-stage1/dietlibc/libpthread/CHANGES
@@ -1,6 +1,12 @@
This is the pthread implementation of dietlibc.
Written from scratch by Olaf Dreesen.
+Mon Aug 6 15:46:39 MEST 2001
+
+ Ups... did the wrong error handling... the error is returned not put to
+ errno...
+ probably thread_key is not SMP save...
+
Thu Apr 12 16:47:12 MEST 2001
added conditional variables...
diff --git a/mdk-stage1/dietlibc/libpthread/Makefile b/mdk-stage1/dietlibc/libpthread/Makefile
index 06420f43a..f2ab8d8dc 100644
--- a/mdk-stage1/dietlibc/libpthread/Makefile
+++ b/mdk-stage1/dietlibc/libpthread/Makefile
@@ -12,14 +12,14 @@ VPATH=../$(ARCH)/
PTHREAD_OBJS = \
__testandset.o \
\
- thread_internal.o \
- thread_key.o \
+ pthread_internal.o \
+ pthread_key.o \
\
pthread_once.o pthread_spinlock.o \
\
pthread_create.o pthread_detach.o \
pthread_join.o pthread_self.o \
- pthread_exit.o \
+ pthread_exit.o pthread_equal.o \
\
pthread_cleanup_push.o \
pthread_cleanup_pop.o \
@@ -72,6 +72,7 @@ PTHREAD_OBJS = \
pthread_sys_create.o \
pthread_sys_fcntl.o \
pthread_sys_fsync.o \
+ pthread_sys_fdatasync.o \
pthread_sys_nanosleep.o \
pthread_sys_logging.o \
pthread_sys_open.o \
diff --git a/mdk-stage1/dietlibc/libpthread/README b/mdk-stage1/dietlibc/libpthread/README
index 3139c731d..ee85a572d 100644
--- a/mdk-stage1/dietlibc/libpthread/README
+++ b/mdk-stage1/dietlibc/libpthread/README
@@ -3,7 +3,7 @@ LIBPTHREAD
This is the pthread implementation of dietlibc.
Written from scratch by Olaf Dreesen.
-1. STATUS: incomplete but should work (or not... I had a lot of heisen-bugs...)
+1. STATUS: near complete and should work (or not... I had a lot of heisen-bugs...)
On non i386 archs the kernel header have major differences...
NO workaround yet for this problems...
@@ -15,13 +15,7 @@ Nested thread creation is now working fine...
2. HOW-TO make this lib:
- 1. generate the dietlibc in the parent directory.
- and make sure you have WANT_THREAD_SAVE active in the file:
- dietfeatures.h
-
- 2. change back here and type make
-
- and then you should have a libpthread.a
+ it is a standard dietlibc helper lib...
3. NOTES
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_atfork.c b/mdk-stage1/dietlibc/libpthread/pthread_atfork.c
index 2dc612dcc..70ca9f162 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_atfork.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_atfork.c
@@ -36,7 +36,7 @@ int pthread_atfork(void (*prepare)(void),
__pthread_unlock(&__atfork_struct_lock);
__NO_ASYNC_CANCEL_END;
- if (ret) (*(__errno_location()))=ENOMEM;
+ if (ret) ret=ENOMEM;
return ret;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c
index 726e88fe5..fbcefa3bd 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c
@@ -1,3 +1,4 @@
+#include <string.h>
#include <unistd.h>
#include <errno.h>
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c
index 690ad5f8e..f5eab5816 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c
@@ -13,6 +13,5 @@ int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
attr->__detachstate=detachstate;
return 0;
}
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c
index f38e6e35e..0b7a691e7 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c
@@ -13,6 +13,5 @@ int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit)
attr->__inheritsched=inherit;
return 0;
}
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c
index 833c0111b..a3e5a9b4a 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c
@@ -12,12 +12,11 @@ int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *p
attr->__schedparam.sched_priority=0;
return 0;
}
- if (((attr->__schedpolicy == SCHED_RR) || (attr->__schedpolicy == SCHED_RR))
+ if (((attr->__schedpolicy == SCHED_RR) || (attr->__schedpolicy == SCHED_FIFO))
&& ((param->sched_priority > 0) && (param->sched_priority < 100))) {
attr->__schedparam.sched_priority=param->sched_priority;
return 0;
}
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c
index e845bca32..227d3f7ad 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c
@@ -17,9 +17,8 @@ int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
attr->__schedpolicy=policy;
return 0;
}
- (*(__errno_location()))=ENOTSUP;
+ return ENOTSUP;
}
else
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c
index 39088c9b2..9be11ca2d 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c
@@ -11,8 +11,7 @@ int pthread_attr_setscope(pthread_attr_t *attr, int scope)
if (scope==PTHREAD_SCOPE_SYSTEM) return 0;
if (scope==PTHREAD_SCOPE_PROCESS)
- (*(__errno_location()))=ENOTSUP;
+ return ENOTSUP;
else
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c
index cfbab7747..1a0aae929 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c
@@ -12,6 +12,5 @@ int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
attr->__stacksize=stacksize;
return 0;
}
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cancel.c b/mdk-stage1/dietlibc/libpthread/pthread_cancel.c
index 4c87a3ed1..c0ae60349 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_cancel.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_cancel.c
@@ -14,14 +14,12 @@ int pthread_cancel(pthread_t th)
j=__find_thread_id(th);
if (j==-1) {
- (*(__errno_location()))=ESRCH;
- return -1;
+ return ESRCH;
}
thread = __get_thread_struct(j);
if (thread==0) {
- (*(__errno_location()))=ESRCH;
- return -1;
+ return ESRCH;
}
if (thread->cancelstate!=PTHREAD_CANCEL_DISABLE) {
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c
index d3c2274f3..776e0adfc 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c
@@ -10,14 +10,17 @@ int pthread_cond_broadcast(pthread_cond_t *cond)
__THREAD_INIT();
+ __NO_ASYNC_CANCEL_BEGIN;
__pthread_lock(&(cond->lock));
- while ((tmp=cond->wait_chain)) {
- cond->wait_chain=tmp->waitnext;
+
+ for (tmp=cond->wait_chain;tmp;tmp=tmp->waitnext) {
tmp->waitnext=0;
tmp->waiting=0;
}
- __pthread_unlock(&(cond->lock));
+ cond->wait_chain=0;
+ __pthread_unlock(&(cond->lock));
+ __NO_ASYNC_CANCEL_STOP;
return 0;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c
index 9a6cc4f0b..b553b41df 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c
@@ -1,3 +1,4 @@
+#include <string.h>
#include <unistd.h>
#include <errno.h>
@@ -9,8 +10,7 @@ int pthread_cond_destroy(pthread_cond_t *cond)
__THREAD_INIT();
if (cond->wait_chain) {
- (*__errno_location())=EBUSY;
- return 1;
+ return EBUSY;
}
memset(cond,0,sizeof(pthread_cond_t));
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c
index 20b38bef2..76dd5cb97 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c
@@ -1,3 +1,4 @@
+#include <string.h>
#include <unistd.h>
#include <errno.h>
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c
index 60bf2119c..02a3c028e 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c
@@ -10,9 +10,11 @@ int pthread_cond_signal(pthread_cond_t *cond)
__THREAD_INIT();
+ __NO_ASYNC_CANCEL_BEGIN;
__pthread_lock(&(cond->lock));
if ((tmp=cond->wait_chain)) cond->wait_chain=tmp->waitnext;
__pthread_unlock(&(cond->lock));
+ __NO_ASYNC_CANCEL_STOP;
if (tmp) {
tmp->waitnext=0;
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c
index 6613f2ca9..71d80bdb5 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c
@@ -9,13 +9,14 @@ int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
{
_pthread_descr tmp;
_pthread_descr this;
- int ret;
+ int ret=0;
__THREAD_INIT();
this=__thread_self();
/* put in wait-chain */
+ __NO_ASYNC_CANCEL_BEGIN;
__pthread_lock(&(cond->lock));
this->waiting=1;
if (cond->wait_chain) {
@@ -23,21 +24,51 @@ int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
tmp->waitnext=this;
} else cond->wait_chain=this;
__pthread_unlock(&(cond->lock));
+ __NO_ASYNC_CANCEL_STOP;
- /* Aeh yeah / wait till signal */
+ /* Aeh yeah / wait till cond-signal OR timeout */
pthread_mutex_unlock(mutex);
- ret=nanosleep(abstime,0);
+ while (this->waiting) {
+ struct timeval tv;
+ gettimeofday(&tv,0);
+ if ((abstime->tv_sec <= tv.tv_sec) && (abstime->tv_nsec <= (tv.tv_usec*1000))) {
+ ret = 1;
+ break;
+ }
+ __thread_wait_some_time();
+ if (this->canceled) break; /* a cancel */
+ }
pthread_mutex_lock(mutex);
- __TEST_CANCEL();
-
- if (ret) {
- if ((*__errno_location())!=EINTR) return -1;
- return 0;
+ __NO_ASYNC_CANCEL_BEGIN;
+ __pthread_lock(&(cond->lock));
+ if (this->waiting) { /* still waiting -> TIMEOUT or SIGNAL */
+ _pthread_descr prev;
+ /* remove from wait-chain */
+ prev=cond->wait_chain;
+ if ((prev=cond->wait_chain)==this) {
+ cond->wait_chain=this->waitnext;
+ } else {
+ for (tmp=prev->waitnext;tmp;prev=tmp,tmp=prev->waitnext) {
+ if (tmp==this) {
+ prev->waitnext=this->waitnext;
+ break;
+ }
+ }
+ }
+ this->waiting=0;
+ this->waitnext=0;
}
+ __pthread_unlock(&(cond->lock));
+ __NO_ASYNC_CANCEL_END;
+
+ if (ret) return ETIMEDOUT;
- (*__errno_location())=ETIMEDOUT;
- return -1;
+ {
+ register int err = (*__errno_location());
+ if (err==EINTR) return err;
+ }
+ return 0;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c
index 0c6c0ae13..8db49e840 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c
@@ -14,6 +14,7 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
this=__thread_self();
/* put in wait-chain */
+ __NO_ASYNC_CANCEL_BEGIN;
__pthread_lock(&(cond->lock));
this->waiting=1;
if (cond->wait_chain) {
@@ -21,16 +22,37 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
tmp->waitnext=this;
} else cond->wait_chain=this;
__pthread_unlock(&(cond->lock));
+ __NO_ASYNC_CANCEL_STOP;
/* Aeh yeah / wait till signal */
pthread_mutex_unlock(mutex);
while (this->waiting) {
__thread_wait_some_time();
- if (this->canceled) this->waiting=0; /* we got a cancel signal */
+ if (this->canceled) break; /* we got a cancel signal */
}
pthread_mutex_lock(mutex);
- __TEST_CANCEL();
+ __NO_ASYNC_CANCEL_BEGIN;
+ __pthread_lock(&(cond->lock));
+ if (this->waiting) { /* still waiting -> SIGNAL */
+ _pthread_descr prev;
+ /* remove from wait-chain */
+ prev=cond->wait_chain;
+ if ((prev=cond->wait_chain)==this) {
+ cond->wait_chain=this->waitnext;
+ } else {
+ for (tmp=prev->waitnext;tmp;prev=tmp,tmp=prev->waitnext) {
+ if (tmp==this) {
+ prev->waitnext=this->waitnext;
+ break;
+ }
+ }
+ }
+ this->waiting=0;
+ this->waitnext=0;
+ }
+ __pthread_unlock(&(cond->lock));
+ __NO_ASYNC_CANCEL_END;
return 0;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_create.c b/mdk-stage1/dietlibc/libpthread/pthread_create.c
index b4a499081..714c2bf4b 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_create.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_create.c
@@ -15,21 +15,20 @@ int pthread_create (pthread_t *thread, const pthread_attr_t *attr,
__THREAD_INIT();
if (start_routine==0) {
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
td = __thread_get_free();
if (td) {
+ td->go.__spinlock=PTHREAD_SPIN_LOCKED;
if (!(attr)) {
pthread_attr_init(&default_attr);
attr=&default_attr;
}
if ((td->policy!=SCHED_OTHER)&&(td->priority==0)) {
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
if (attr->__inheritsched==PTHREAD_INHERIT_SCHED) {
@@ -48,14 +47,17 @@ int pthread_create (pthread_t *thread, const pthread_attr_t *attr,
td->stack_size = attr->__stacksize;
- if (!(td->stack_addr)) {
+ if (!(attr->__stackaddr)) {
char *stack=(char*)malloc(td->stack_size);
if (!(stack)) {
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
td->stack_begin = stack;
+#ifdef __parisc__
+ td->stack_addr = stack;
+#else
td->stack_addr = stack+td->stack_size;
+#endif
} else {
td->stack_begin = 0;
td->stack_addr = attr->__stackaddr;
@@ -65,12 +67,15 @@ int pthread_create (pthread_t *thread, const pthread_attr_t *attr,
if (ret>1)
*thread=ret;
- else
+ else {
+ ++td->exited; /* mark as exited */
__thread_cleanup(td);
+ if (ret<0) return (*(__errno_location()));
+ return EAGAIN;
+ }
}
else
- (*(__errno_location()))=EAGAIN;
+ return EAGAIN;
- if (ret<2) return -1;
- return ret;
+ return 0;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_detach.c b/mdk-stage1/dietlibc/libpthread/pthread_detach.c
index c07280389..2f72b97a7 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_detach.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_detach.c
@@ -13,19 +13,12 @@ int pthread_detach(pthread_t th)
j=__find_thread_id(th);
if (j==-1) {
- (*(__errno_location()))=ESRCH;
- return -1;
+ return ESRCH;
}
thread = __get_thread_struct(j);
- if (thread==0) {
- (*(__errno_location()))=ESRCH;
- return -1;
- }
-
if (thread->detached) {
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
if (!thread->joined) {
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_equal.c b/mdk-stage1/dietlibc/libpthread/pthread_equal.c
new file mode 100644
index 000000000..d054d86ed
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_equal.c
@@ -0,0 +1,3 @@
+#include <pthread.h>
+
+int pthread_equal(pthread_t thread1, pthread_t thread2) { return (thread1==thread2); }
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_errno.c b/mdk-stage1/dietlibc/libpthread/pthread_errno.c
new file mode 100644
index 000000000..d035544ad
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_errno.c
@@ -0,0 +1,5 @@
+int errno;
+
+#include "dietwarning.h"
+
+link_warning("errno","\e[1;33;41m>>> your multithreaded code uses errno! <<<\e[0m");
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_fdglue2.c b/mdk-stage1/dietlibc/libpthread/pthread_fdglue2.c
new file mode 100644
index 000000000..d73c84220
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_fdglue2.c
@@ -0,0 +1,16 @@
+#include "dietstdio.h"
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <errno.h>
+
+extern int __stdio_atexit;
+extern FILE* __stdio_init_file_nothreads(int fd,int closeonerror);
+
+FILE* __stdio_init_file(int fd,int closeonerror) {
+ FILE *tmp=__stdio_init_file_nothreads(fd,closeonerror);
+ if (tmp) pthread_mutex_init(&tmp->m,0);
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_fgetc.c b/mdk-stage1/dietlibc/libpthread/pthread_fgetc.c
new file mode 100644
index 000000000..34e79e0fe
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_fgetc.c
@@ -0,0 +1,10 @@
+#include "dietstdio.h"
+#include <unistd.h>
+
+int fgetc(FILE *stream) {
+ int tmp;
+ pthread_mutex_lock(&stream->m);
+ tmp=fgetc_unlocked(stream);
+ pthread_mutex_unlock(&stream->m);
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_flockfile.c b/mdk-stage1/dietlibc/libpthread/pthread_flockfile.c
new file mode 100644
index 000000000..72131ffb1
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_flockfile.c
@@ -0,0 +1,5 @@
+#include "dietstdio.h"
+
+void flockfile(FILE* f) {
+ pthread_mutex_lock(&f->m);
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_fputc.c b/mdk-stage1/dietlibc/libpthread/pthread_fputc.c
new file mode 100644
index 000000000..82344b107
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_fputc.c
@@ -0,0 +1,9 @@
+#include <dietstdio.h>
+
+int fputc(int c, FILE *stream) {
+ int tmp;
+ pthread_mutex_lock(&stream->m);
+ tmp=fputc_unlocked(c,stream);
+ pthread_mutex_unlock(&stream->m);
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_funlockfile.c b/mdk-stage1/dietlibc/libpthread/pthread_funlockfile.c
new file mode 100644
index 000000000..beae058af
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_funlockfile.c
@@ -0,0 +1,5 @@
+#include "dietstdio.h"
+
+void funlockfile(FILE* f) {
+ pthread_mutex_unlock(&f->m);
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_getschedparam.c b/mdk-stage1/dietlibc/libpthread/pthread_getschedparam.c
new file mode 100644
index 000000000..aaaba4458
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_getschedparam.c
@@ -0,0 +1,22 @@
+#include <unistd.h>
+#include <errno.h>
+
+#include <pthread.h>
+#include "thread_internal.h"
+
+int pthread_getschedparam(pthread_t target_thread, int *policy, struct sched_param *param)
+{
+ int p;
+ __THREAD_INIT();
+
+ if (__find_thread_id(target_thread)<0) {
+ return ESRCH;
+ }
+
+ if (((p=sched_getscheduler(target_thread))==-1)||
+ (sched_getparam(target_thread,param) ==-1)) {
+ return (*(__errno_location()));
+ }
+ *policy=p;
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libpthread/thread_internal.c b/mdk-stage1/dietlibc/libpthread/pthread_internal.c
index a93806203..7bb4e16cb 100644
--- a/mdk-stage1/dietlibc/libpthread/thread_internal.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_internal.c
@@ -11,14 +11,14 @@
#include <stdio.h>
#include "thread_internal.h"
-static struct _pthread_fastlock __thread_struct_lock = {0};
+static struct _pthread_fastlock __thread_struct_lock = {PTHREAD_SPIN_UNLOCKED};
static struct _pthread_descr_struct threads[PTHREAD_THREADS_MAX];
static int _max_used_thread_id=1;
pthread_once_t __thread_inited;
-static struct _pthread_fastlock __manager_thread_signal_lock = {0};
-static struct _pthread_fastlock __manager_thread_data_lock = {1};
-static struct _pthread_fastlock __manager_thread_data_go_lock = {1};
+static struct _pthread_fastlock __manager_thread_signal_lock = {PTHREAD_SPIN_UNLOCKED};
+static struct _pthread_fastlock __manager_thread_data_lock = {PTHREAD_SPIN_LOCKED};
+static struct _pthread_fastlock __manager_thread_data_go_lock = {PTHREAD_SPIN_LOCKED};
//#define DEBUG
@@ -70,8 +70,10 @@ _pthread_descr __thread_get_free()
for (i=0; i<PTHREAD_THREADS_MAX; i++) {
if (threads[i].pid==0) {
- threads[i].pid=1; /* mark as taken */
ret = threads+i;
+ /* clear struct */
+ memset(ret,0,sizeof(struct _pthread_descr_struct));
+ ret->pid=1; /* mark as taken */
if (i>=_max_used_thread_id) _max_used_thread_id=i+1;
break;
}
@@ -91,22 +93,23 @@ void __thread_wait_some_time()
__libc_nanosleep(&reg,0);
}
-/* cleanup a thread struct */
-void __thread_cleanup(_pthread_descr th)
+/* cleanup/join a thread */
+int __thread_join(_pthread_descr th, void**return_value)
{
- /* lib provided stack should be freed */
+ /* mark thread th as joined */
+ if (__testandset(&(th->joined))) return EINVAL;
+ /* wait for thread to exit */
+ while(!th->exited) __thread_wait_some_time();
+ /* put return value to caller */
+ if (return_value) *return_value=th->retval;
+ /* cleanup thread */
if (th->stack_begin) free(th->stack_begin);
-
- /* an other thread has joined this on */
- if (th->joined) {
- th->joined->retval=th->retval;
- th->joined->join=0;
- th->joined=0;
- }
- th->pid=0; /* mark struct as free */
+ th->joined=0;
+ th->pid=0;
+ return 0;
}
-/* SIGHUP handler (thread cnacel) PTHREAD_CANCEL_ASYNCHRONOUS */
+/* SIGHUP handler (thread cancel) PTHREAD_CANCEL_ASYNCHRONOUS */
static void __thread_cancel_handler(int sig)
{
_pthread_descr this;
@@ -144,6 +147,7 @@ static void __kill_all_threads()
}
}
+__attribute__((weak)) volatile void __thread_start__key(int id);
__attribute__((weak)) volatile void __thread_start__key(int id) { return; }
__attribute__((weak,alias("__thread_start__key"))) volatile void __thread_exit__key(int id);
@@ -177,6 +181,14 @@ static void *__mthread_starter(void *arg)
#ifdef DEBUG
printf("in starter %d, parameter %8p\n", td->pid, td->func);
#endif
+ do {
+ __thread_wait_some_time();
+ if (td->canceled) return (void*)42;
+ } while (__pthread_trylock(&td->go));
+
+#ifdef DEBUG
+ printf("post starter %d, parameter %8p\n", td->pid, td->func);
+#endif
if (!td->canceled) {
if (!(setjmp(td->jmp_exit))) {
@@ -196,13 +208,6 @@ static void *__mthread_starter(void *arg)
printf("end starter %d, retval %8p\n", td->pid, td->retval);
#endif
- /* wake joined thread and put retval */
- if (td->joined) {
- td->joined->retval=td->retval;
- td->joined->join=0;
- td->joined=0;
- }
-
/* execute all functions on the cleanup-stack */
for (i=PTHREAD_MAX_CLEANUP;i;) {
if (td->cleanup_stack[--i].func) {
@@ -227,7 +232,11 @@ static void __manager_SIGCHLD(int sig)
for (i=0; i<_max_used_thread_id; i++) {
if (threads[i].pid==pid) {
- __thread_cleanup(threads+i);
+ ++threads[i].exited;
+ if (threads[i].detached) {
+ threads[i].joined=0;
+ __thread_cleanup(threads+i);
+ }
break;
}
}
@@ -255,7 +264,7 @@ static void* __manager_thread(void *arg)
while(1) {
do {
__thread_wait_some_time();
- if (getppid()<0) __manager_SIGTERM(0);
+ if (getppid()<2) __manager_SIGTERM(0);
} while (__pthread_trylock(&__manager_thread_data_lock));
__manager_thread_data->pid =
@@ -264,6 +273,8 @@ static void* __manager_thread(void *arg)
CLONE_VM | CLONE_FS | CLONE_FILES | SIGCHLD,
__manager_thread_data);
__thread_wait_some_time();
+ __thread_wait_some_time();
+ __pthread_unlock(&__manager_thread_data->go);
#ifdef DEBUG
printf("manager new thread %d\n",__manager_thread_data->pid);
#endif
@@ -329,7 +340,11 @@ void __thread_init()
++_max_used_thread_id;
threads[1].stack_size=sizeof(__manager_thread_stack);
+#ifdef __parisc__
+ threads[1].stack_addr=__manager_thread_stack;
+#else
threads[1].stack_addr=&__manager_thread_stack[sizeof(__manager_thread_stack)];
+#endif
threads[1].stack_begin=0;
threads[1].func=__manager_thread;
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_join.c b/mdk-stage1/dietlibc/libpthread/pthread_join.c
index 5b295bad1..39c076555 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_join.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_join.c
@@ -16,35 +16,24 @@ int pthread_join(pthread_t th, void **thread_return)
j=__find_thread_id(th);
if (j==-1) {
- (*(__errno_location()))=ESRCH;
- return -1;
+ return ESRCH;
}
thread = __get_thread_struct(j);
/* error handling */
if (thread==0) {
- (*(__errno_location()))=ESRCH;
- return -1;
+ return ESRCH;
}
if (this==thread) {
- (*(__errno_location()))=EDEADLK;
- return -1;
+ return EDEADLK;
}
if (thread->detached || thread->joined) {
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
- thread->joined=this;
- this->join=1;
-
- while(this->join) __thread_wait_some_time();
-
- if (thread_return) *thread_return=this->retval;
-
- return 0;
+ return __thread_join(thread,thread_return);
}
diff --git a/mdk-stage1/dietlibc/libpthread/thread_key.c b/mdk-stage1/dietlibc/libpthread/pthread_key.c
index b0f719fc9..8a77f281a 100644
--- a/mdk-stage1/dietlibc/libpthread/thread_key.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_key.c
@@ -7,10 +7,15 @@
struct _pthread_fastlock __thread_keys_lock;
struct _thread_key __thread_keys[PTHREAD_KEYS_MAX];
+void __thread_start__key(int id);
+void __thread_exit__key(int id);
+
void __thread_start__key(int id)
{
int i;
+ if (id<2) return;
+
__NO_ASYNC_CANCEL_BEGIN;
__pthread_lock(&__thread_keys_lock);
@@ -26,8 +31,10 @@ void __thread_exit__key(int id)
{
int i,try;
+ if (id<2) return;
+
__NO_ASYNC_CANCEL_BEGIN;
- __pthread_lock(&__thread_keys_lock);
+// __pthread_lock(&__thread_keys_lock);
for (i=0; i<PTHREAD_KEYS_MAX; i++) {
if ((__thread_keys[i].used) && (__thread_keys[i].destructor)) {
@@ -36,6 +43,6 @@ void __thread_exit__key(int id)
}
}
- __pthread_unlock(&__thread_keys_lock);
+// __pthread_unlock(&__thread_keys_lock);
__NO_ASYNC_CANCEL_STOP;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_key_create.c b/mdk-stage1/dietlibc/libpthread/pthread_key_create.c
index 44fccea6a..9718c695b 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_key_create.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_key_create.c
@@ -1,3 +1,4 @@
+#include <string.h>
#include <unistd.h>
#include <errno.h>
@@ -19,7 +20,7 @@ int pthread_key_create(pthread_key_t *key, void (*destructor)(const void*))
if (!__thread_keys[i].used) {
__thread_keys[i].used=1;
__thread_keys[i].destructor=destructor;
- memset(__thread_keys[i].tkd,0,PTHREAD_THREADS_MAX*sizeof(struct _thread_key));
+ memset(__thread_keys[i].tkd,0,PTHREAD_THREADS_MAX*sizeof(void*));
*key=i;
ret=0;
break;
@@ -29,7 +30,7 @@ int pthread_key_create(pthread_key_t *key, void (*destructor)(const void*))
__pthread_unlock(&__thread_keys_lock);
__NO_ASYNC_CANCEL_END;
- if (ret) (*__errno_location())=EAGAIN;
- return ret;
+ if (ret) return EAGAIN;
+ return 0;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_key_delete.c b/mdk-stage1/dietlibc/libpthread/pthread_key_delete.c
index b1bc366e2..8f7fb577f 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_key_delete.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_key_delete.c
@@ -10,8 +10,7 @@ int pthread_key_delete(pthread_key_t key)
__THREAD_INIT();
if (key>=PTHREAD_KEYS_MAX) {
- (*__errno_location())=EINVAL;
- return -1;
+ return EINVAL;
}
__thread_keys[key].used=0;
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c
index 33a16abd4..f5d66613c 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c
@@ -8,9 +8,8 @@ int pthread_mutex_destroy(pthread_mutex_t *mutex)
{
__THREAD_INIT();
- if ((mutex->owner)||(mutex->lock.__spinlock)) {
- (*(__errno_location()))=EBUSY;
- return -1;
+ if ((mutex->owner)||(mutex->lock.__spinlock==PTHREAD_SPIN_LOCKED)) {
+ return EBUSY;
}
return 0;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c
index b1797fb20..65161d0ec 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c
@@ -1,6 +1,6 @@
#include <unistd.h>
#include <errno.h>
-
+#include <string.h>
#include <pthread.h>
#include "thread_internal.h"
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c
index 0c3ade9e8..0df2bcd8d 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c
@@ -15,19 +15,18 @@ int pthread_mutex_lock(pthread_mutex_t *mutex)
this = __thread_self();
- if (this!=mutex->owner) {
- /* wait for mutex to free */
- __pthread_lock(&(mutex->lock));
-
- mutex->owner=this;
- }
- else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP)
- {
- (*(__errno_location()))=EDEADLK;
- return -1;
+ if (this==mutex->owner) {
+ if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP)
+ return EDEADLK;
+ if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) {
+ ++(mutex->count);
+ return 0;
+ }
}
- if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) ++(mutex->count);
+ /* wait for mutex to free */
+ __pthread_lock(&(mutex->lock));
+ mutex->owner=this;
return 0;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c
index fcf63f75e..620d26150 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c
@@ -18,16 +18,13 @@ int pthread_mutex_trylock(pthread_mutex_t *mutex)
if (this!=mutex->owner) {
/* wait for mutex to free */
if (__pthread_trylock(&(mutex->lock))) {
- (*(__errno_location()))=EBUSY;
- return -1;
+ return EBUSY;
}
mutex->owner=this;
}
- else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP)
- {
- (*(__errno_location()))=EDEADLK;
- return -1;
+ else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) {
+ return EDEADLK;
}
if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) ++(mutex->count);
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c
index 0b5a1d0f7..0c12282c1 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c
@@ -17,17 +17,14 @@ int pthread_mutex_unlock(pthread_mutex_t *mutex)
if (this==mutex->owner) {
if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) {
- if (--(mutex->count))
- return 0;
+ if (--(mutex->count)) return 0;
}
mutex->owner=0;
__pthread_unlock(&(mutex->lock));
}
- else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP)
- {
- (*(__errno_location()))=EPERM;
- return -1;
+ else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) {
+ return EPERM;
}
return 0;
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c b/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c
index ac600f8ed..8b110fe5a 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c
@@ -13,6 +13,5 @@ int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind)
attr->__mutexkind=kind;
return 0;
}
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c b/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c
index b906492fb..f832bef70 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c
@@ -20,6 +20,5 @@ int pthread_setcancelstate(int state, int *oldstate)
return 0;
}
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c b/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c
index 03d1f53de..f5669b70d 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c
@@ -20,6 +20,5 @@ int pthread_setcanceltype(int type, int *oldtype)
return 0;
}
- (*(__errno_location()))=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setschedparam.c b/mdk-stage1/dietlibc/libpthread/pthread_setschedparam.c
new file mode 100644
index 000000000..df007c408
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_setschedparam.c
@@ -0,0 +1,21 @@
+#include <unistd.h>
+#include <errno.h>
+
+#include <pthread.h>
+#include "thread_internal.h"
+
+int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param)
+{
+ __THREAD_INIT();
+
+ if (__find_thread_id(target_thread)<0) {
+ return ESRCH;
+ }
+
+ if (((policy == SCHED_OTHER) && (param->sched_priority==0)) ||
+ (((policy == SCHED_RR) || (policy == SCHED_FIFO)) &&
+ ((param->sched_priority > 0) && (param->sched_priority <100))))
+ return sched_setscheduler(target_thread, policy, param);
+
+ return EINVAL;
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c b/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c
index 78339c20b..b66ce31d0 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c
@@ -15,7 +15,6 @@ int pthread_setspecific(pthread_key_t key, const void *value)
__thread_keys[key].tkd[id]=value;
return 0;
}
- (*__errno_location())=EINVAL;
- return -1;
+ return EINVAL;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sigmask.c b/mdk-stage1/dietlibc/libpthread/pthread_sigmask.c
new file mode 100644
index 000000000..691e9e51a
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_sigmask.c
@@ -0,0 +1,8 @@
+#include <signal.h>
+#include <errno.h>
+
+#include <pthread.h>
+
+int pthread_sigmask(int how, const sigset_t*newset, sigset_t *oldset) {
+ return (sigprocmask(how,newset,oldset)==-1)?(*(__errno_location())):0;
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_spinlock.c b/mdk-stage1/dietlibc/libpthread/pthread_spinlock.c
index 449782adf..463c186bd 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_spinlock.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_spinlock.c
@@ -2,12 +2,12 @@
#include <pthread.h>
#include "thread_internal.h"
-static void __pthread_acquire(int * spinlock)
+void __pthread_lock(struct _pthread_fastlock * lock)
{
int cnt = 0;
struct timespec tm;
- while (__testandset(spinlock)) {
+ while (__testandset(&lock->__spinlock)) {
if (cnt < MAX_SPIN_COUNT) {
sched_yield();
cnt++;
@@ -20,11 +20,6 @@ static void __pthread_acquire(int * spinlock)
}
}
-void __pthread_lock(struct _pthread_fastlock * lock)
-{
- __pthread_acquire(&lock->__spinlock);
-}
-
int __pthread_trylock(struct _pthread_fastlock * lock)
{
return __testandset(&lock->__spinlock);
@@ -32,7 +27,8 @@ int __pthread_trylock(struct _pthread_fastlock * lock)
int __pthread_unlock(struct _pthread_fastlock * lock)
{
- return (lock->__spinlock = 0);
+ lock->__spinlock = PTHREAD_SPIN_UNLOCKED;
+ return 0;
}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c
index 9f7d23d79..9fd4bcd95 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c
@@ -3,10 +3,11 @@
#include <pthread.h>
#include "thread_internal.h"
+#include <stdlib.h>
+
static pthread_mutex_t mutex_alloc = PTHREAD_MUTEX_INITIALIZER;
-void free(void *ptr)
-{
+void free(void *ptr) {
__NO_ASYNC_CANCEL_BEGIN;
pthread_mutex_lock(&mutex_alloc);
__libc_free(ptr);
@@ -14,8 +15,7 @@ void free(void *ptr)
__NO_ASYNC_CANCEL_END;
}
-void *malloc(size_t size)
-{
+void *malloc(size_t size) {
register void *ret;
__NO_ASYNC_CANCEL_BEGIN;
pthread_mutex_lock(&mutex_alloc);
@@ -24,3 +24,13 @@ void *malloc(size_t size)
__NO_ASYNC_CANCEL_END;
return ret;
}
+
+void* realloc(void* ptr, size_t size) {
+ register void *ret;
+ __NO_ASYNC_CANCEL_BEGIN;
+ pthread_mutex_lock(&mutex_alloc);
+ ret=__libc_realloc(ptr, size);
+ pthread_mutex_unlock(&mutex_alloc);
+ __NO_ASYNC_CANCEL_END;
+ return ret;
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c
index 99210a488..c7c3fb884 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c
@@ -3,6 +3,7 @@
#include <pthread.h>
#include "thread_internal.h"
+int fcntl(int fd, int cmd, void *arg);
int fcntl(int fd, int cmd, void *arg)
{
__TEST_CANCEL();
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_fdatasync.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_fdatasync.c
new file mode 100644
index 000000000..69857c7b3
--- /dev/null
+++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_fdatasync.c
@@ -0,0 +1,10 @@
+#include <unistd.h>
+
+#include <pthread.h>
+#include "thread_internal.h"
+
+int fdatasync(int fd)
+{
+ __TEST_CANCEL();
+ return __libc_fdatasync(fd);
+}
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c
index 6070ad219..f9f93dce2 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c
@@ -4,6 +4,8 @@
#include <pthread.h>
#include "thread_internal.h"
+#include <syslog.h>
+
static pthread_mutex_t mutex_syslog = PTHREAD_MUTEX_INITIALIZER;
void closelog(void)
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c
index 513f6a323..8d9fb5523 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c
@@ -3,6 +3,7 @@
#include <pthread.h>
#include "thread_internal.h"
+int __pthread_open(const char *pathname, int flags, mode_t mode);
int __pthread_open(const char *pathname, int flags, mode_t mode)
{
__TEST_CANCEL();
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c
index 1ac33adfc..d5d94978b 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c
@@ -3,6 +3,8 @@
#include <pthread.h>
#include "thread_internal.h"
+#include <termios.h>
+
int tcdrain(int fd)
{
__TEST_CANCEL();
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c
index 76d5ddca7..e5020221a 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c
@@ -3,6 +3,8 @@
#include <pthread.h>
#include "thread_internal.h"
+#include <sys/wait.h>
+
pid_t waitpid(pid_t pid, int *status, int options)
{
__TEST_CANCEL();
diff --git a/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c b/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c
index 68f91e743..4151faca3 100644
--- a/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c
+++ b/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c
@@ -10,7 +10,7 @@ void pthread_testcancel()
thread=__thread_self();
- if (thread->canceled) {
+ if (thread && thread->canceled) {
pthread_exit(PTHREAD_CANCELED);
}
}
diff --git a/mdk-stage1/dietlibc/libpthread/thread_internal.h b/mdk-stage1/dietlibc/libpthread/thread_internal.h
index 5eb3bbd08..7843fb59d 100644
--- a/mdk-stage1/dietlibc/libpthread/thread_internal.h
+++ b/mdk-stage1/dietlibc/libpthread/thread_internal.h
@@ -9,6 +9,8 @@
#error "the diet libc is not compiled with thread safeness enabled!"
#endif
+#undef errno
+
/* cleanup */
#define PTHREAD_MAX_CLEANUP 8
struct thread_cleanup_t {
@@ -18,15 +20,13 @@ struct thread_cleanup_t {
/* the thread descriptor / internal */
struct _pthread_descr_struct {
- /* runtime handling */
- struct _pthread_descr_struct *joined; /* a joined thread or NULL */
-
/* conditional variables */
struct _pthread_descr_struct *waitnext; /* an other waiting thread or NULL */
int waiting; /* internal waiting "lock" */
/* thread/process data */
int pid; /* Process id */
+ int exited; /* Process is dead */
int policy; /* thread scheduling policy */
int priority; /* thread priority */
@@ -42,7 +42,7 @@ struct _pthread_descr_struct {
/* thread exit handling */
void *retval; /* thread return value */
- int join; /* thread waits for other to return */
+ int joined; /* flag other thread has joined */
jmp_buf jmp_exit; /* pthread_exit jump */
/* thread flags */
@@ -58,7 +58,7 @@ struct _pthread_descr_struct {
void* arg; /* thread argument */
/* create thread / manager thread lock */
- struct _pthread_fastlock *manager_lock;
+ struct _pthread_fastlock go;
/* cleanup stack */
struct thread_cleanup_t cleanup_stack[PTHREAD_MAX_CLEANUP];
@@ -84,12 +84,13 @@ int __clone(void* (*fn)(void*), void* stack, int flags, void *arg);
int __find_thread_id(int pid);
_pthread_descr __get_thread_struct(int id);
-_pthread_descr __thread_get_free();
-_pthread_descr __thread_self();
+_pthread_descr __thread_get_free(void);
+_pthread_descr __thread_self(void);
-void __thread_cleanup(_pthread_descr th);
+int __thread_join(_pthread_descr join, void **return_value);
+#define __thread_cleanup(th) (void)__thread_join((th),0)
-void __thread_wait_some_time();
+void __thread_wait_some_time(void);
#define __NO_ASYNC_CANCEL_BEGIN { int oldtype; pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
#define __NO_ASYNC_CANCEL_END pthread_setcanceltype(oldtype,0); pthread_testcancel(); }
@@ -100,7 +101,7 @@ int signal_manager_thread(_pthread_descr td);
/* init stuff */
extern pthread_once_t __thread_inited;
-void __thread_init();
+void __thread_init(void);
#define __THREAD_INIT() __pthread_once(&__thread_inited, __thread_init)
#define __TEST_CANCEL() pthread_testcancel()
@@ -108,6 +109,7 @@ void __thread_init();
void __libc_free(void *ptr);
void *__libc_malloc(size_t size);
+void *__libc_realloc(void* ptr, size_t size);
void __libc_closelog(void);
void __libc_openlog(const char *ident, int option, int facility);
@@ -119,6 +121,7 @@ int __libc_close(int fd);
int __libc_creat(const char *pathname, mode_t mode);
int __libc_fcntl(int fd, int cmd, void *arg);
int __libc_fsync(int fd);
+int __libc_fdatasync(int fd);
int __libc_nanosleep(const struct timespec *req, struct timespec *rem);
int __libc_open(const char *pathname, int flags, mode_t mode);
int __libc_pause(void);
diff --git a/mdk-stage1/dietlibc/libregex/rx.c b/mdk-stage1/dietlibc/libregex/rx.c
index b28358c2e..752d7f11b 100644
--- a/mdk-stage1/dietlibc/libregex/rx.c
+++ b/mdk-stage1/dietlibc/libregex/rx.c
@@ -1,8 +1,11 @@
+#define NDEBUG
#include <regex.h>
#include <stdlib.h>
+#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <string.h>
+#include <assert.h>
/* this is ugly.
* the idea is to build a parse tree, then do some poor man's OOP with a
@@ -40,7 +43,7 @@ struct regex {
struct atom {
matcher m;
void* next;
- enum { EMPTY, REGEX, BRACKET, ANY, LINESTART, LINEEND, WORDSTART, WORDEND, CHAR, } type;
+ enum { ILLEGAL, EMPTY, REGEX, BRACKET, ANY, LINESTART, LINEEND, WORDSTART, WORDEND, CHAR, } type;
int bnum;
union {
struct regex r;
@@ -64,7 +67,7 @@ struct branch {
};
static void clearcc(unsigned int* x) {
- memset(x,0,sizeof(*x));
+ memset(x,0,sizeof(struct bracketed));
}
static void setcc(unsigned int* x,unsigned int bit) {
@@ -84,9 +87,9 @@ static const char* parsebracketed(struct bracketed*__restrict__ b,const char*__r
if (*t=='^') { negflag=1; ++t; }
do {
if (*t==0) return s;
- setcc(b->cc,rx->cflags&REG_ICASE?*t:tolower(*t));
+ setcc(b->cc,rx->cflags&REG_ICASE?tolower(*t):*t);
if (t[1]=='-' && t[2]!=']') {
- for (i=*t+1; i<=t[2]; ++i) setcc(b->cc,rx->cflags&REG_ICASE?i:tolower(i));
+ for (i=*t+1; i<=t[2]; ++i) setcc(b->cc,rx->cflags&REG_ICASE?tolower(i):i);
t+=2;
}
++t;
@@ -97,55 +100,79 @@ static const char* parsebracketed(struct bracketed*__restrict__ b,const char*__r
static const char* parseregex(struct regex* r,const char* s,regex_t* rx);
-static int matchatom(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) {
+static int matchatom(void*__restrict__ x,const unsigned char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) {
register struct atom* a=(struct atom*)x;
int matchlen=0;
+ assert(a->type!=ILLEGAL);
switch (a->type) {
case EMPTY:
-// printf("matching EMPTY against \"%s\"\n",s);
- preg->l[a->bnum].rm_so=preg->l[a->bnum].rm_eo=ofs;
+#ifdef DEBUG
+ printf("matching atom EMPTY against \"%s\"\n",s);
+ printf("a->bnum is %d\n",a->bnum);
+#endif
+ if (a->bnum>=0) preg->l[a->bnum].rm_so=preg->l[a->bnum].rm_eo=ofs;
goto match;
case REGEX:
-// printf("matching REGEX against \"%s\"\n",s);
- if ((matchlen=a->u.r.m(a,s,ofs,preg,0,eflags))>=0) {
+#ifdef DEBUG
+ printf("matching atom REGEX against \"%s\"\n",s);
+ printf("a->bnum is %d\n",a->bnum);
+#endif
+ if ((matchlen=a->u.r.m(&a->u.r,s,ofs,preg,0,eflags))>=0) {
+ assert(a->bnum>=0);
preg->l[a->bnum].rm_so=ofs;
preg->l[a->bnum].rm_eo=ofs+matchlen;
goto match;
}
break;
case BRACKET:
-// printf("matching BRACKET against \"%s\"\n",s);
+#ifdef DEBUG
+ printf("matching atom BRACKET against \"%s\"\n",s);
+#endif
matchlen=1;
if (*s=='\n' && (preg->cflags&REG_NEWLINE)) break;
if (*s && issetcc(a->u.b.cc,(preg->cflags&REG_ICASE?tolower(*s):*s)))
goto match;
break;
case ANY:
-// printf("matching ANY against \"%s\"\n",s);
+#ifdef DEBUG
+ printf("matching atom ANY against \"%s\"\n",s);
+#endif
if (*s=='\n' && (preg->cflags&REG_NEWLINE)) break;
matchlen=1;
if (*s) goto match;
break;
case LINESTART:
-// printf("matching LINESTART against \"%s\"\n",s);
+#ifdef DEBUG
+ printf("matching atom LINESTART against \"%s\"\n",s);
+#endif
if (ofs==0 && (eflags&REG_NOTBOL)==0) {
goto match;
}
break;
case LINEEND:
-// printf("matching LINEEND against \"%s\"\n",s);
- if ((*s && *s!='\n') || (eflags&REG_NOTEOL)==0) break;
+#ifdef DEBUG
+ printf("matching atom LINEEND against \"%s\"\n",s);
+#endif
+ if ((*s && *s!='\n') || (eflags&REG_NOTEOL)) break;
goto match;
case WORDSTART:
- if ((ofs==0 || isspace(s[-1])) && !isspace(*s))
+#ifdef DEBUG
+ printf("matching atom WORDSTART against \"%s\"\n",s);
+#endif
+ if ((ofs==0 || !isalnum(s[-1])) && isalnum(*s))
goto match;
break;
case WORDEND:
- if (ofs>0 && !isspace(s[-1]) && isspace(*s))
+#ifdef DEBUG
+ printf("matching atom WORDEND against \"%s\"\n",s);
+#endif
+ if (ofs>0 && isalnum(s[-1]) && !isalnum(*s))
goto match;
break;
case CHAR:
-// printf("matching CHAR %c against \"%s\"\n",a->u.c,s);
+#ifdef DEBUG
+ printf("matching atom CHAR %c against \"%s\"\n",a->u.c,s);
+#endif
matchlen=1;
if (((preg->cflags&REG_ICASE)?tolower(*s):*s)==a->u.c) goto match;
break;
@@ -160,7 +187,7 @@ match:
static const char* parseatom(struct atom*__restrict__ a,const char*__restrict__ s,regex_t*__restrict__ rx) {
const char *tmp;
- a->m=matchatom;
+ a->m=(matcher)matchatom;
a->bnum=-1;
switch (*s) {
case '(':
@@ -203,7 +230,7 @@ static const char* parseatom(struct atom*__restrict__ a,const char*__restrict__
}
default:
a->type=CHAR;
- a->u.c=rx->cflags&REG_ICASE?*s:tolower(*s);
+ a->u.c=rx->cflags&REG_ICASE?tolower(*s):*s;
break;
}
return s+1;
@@ -213,9 +240,15 @@ static const char* parseatom(struct atom*__restrict__ a,const char*__restrict__
static int matchpiece(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) {
register struct piece* a=(struct piece*)x;
int matchlen=0;
- int tmp,num=0;
- unsigned int *offsets=alloca(sizeof(int)*a->max);
+ int tmp=0,num=0;
+ unsigned int *offsets;
+ assert(a->max>0 && a->max<1000);
+#ifdef DEBUG
+ printf("alloca(%d)\n",sizeof(int)*a->max);
+#endif
+ offsets=alloca(sizeof(int)*a->max);
offsets[0]=0;
+// printf("allocating %d offsets...\n",a->max);
// printf("matchpiece \"%s\"...\n",s);
/* first, try to match the atom as often as possible, up to a->max times */
if (a->max == 1 && a->min == 1)
@@ -227,6 +260,7 @@ static int matchpiece(void*__restrict__ x,const char*__restrict__ s,int ofs,stru
a->a.next=save;
++num;
matchlen+=tmp;
+// printf("setting offsets[%d] to %d\n",num,tmp);
offsets[num]=tmp;
} else {
a->a.next=save;
@@ -235,12 +269,13 @@ static int matchpiece(void*__restrict__ x,const char*__restrict__ s,int ofs,stru
}
if (num<a->min) return -1; /* already at minimum matches; signal mismatch */
/* then, while the rest does not match, back off */
- for (;;) {
+ for (;num>=0;) {
if (a->next)
tmp=((struct atom*)(a->next))->m(a->next,s+matchlen,ofs+matchlen,preg,plus+matchlen,eflags);
else
tmp=plus+matchlen;
if (tmp>=0) break; /* it did match; don't back off any further */
+// printf("using offsets[%d] (%d)\n",num,offsets[num]);
matchlen-=offsets[num];
--num;
}
@@ -279,6 +314,11 @@ static const char* parsepiece(struct piece*__restrict__ p,const char*__restrict_
static int matchbranch(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) {
register struct branch* a=(struct branch*)x;
int tmp;
+#ifdef DEBUG
+ printf("%08p matching branch against \"%s\"\n",a,s);
+ printf("%p %p\n",&a->p->m,a->p->m);
+#endif
+ assert(a->p->m==matchpiece);
tmp=a->p->m(a->p,s,ofs,preg,plus,eflags);
if (tmp>=0) {
if (a->next)
@@ -291,7 +331,7 @@ static int matchbranch(void*__restrict__ x,const char*__restrict__ s,int ofs,str
static const char* parsebranch(struct branch*__restrict__ b,const char*__restrict__ s,regex_t*__restrict__ rx,int*__restrict__ pieces) {
struct piece p;
- const char *tmp;
+ const char *tmp; /* the gcc warning here is bogus */
b->m=matchbranch;
b->num=0; b->p=0;
for (;;) {
@@ -305,9 +345,11 @@ static const char* parsebranch(struct branch*__restrict__ b,const char*__restric
tmp=parsepiece(&p,s,rx);
if (tmp==s) return s;
}
+// printf("b->p from %p to ",b->p);
if (!(b->p=realloc(b->p,++b->num*sizeof(p)))) return s;
+// printf("%p (size %d)\n",b->p,b->num*sizeof(p));
b->p[b->num-1]=p;
- if (*s=='|') { ++tmp; break; }
+ if (*tmp=='|') { break; }
s=tmp;
}
*pieces+=b->num;
@@ -318,7 +360,11 @@ static const char* parsebranch(struct branch*__restrict__ b,const char*__restric
static int matchregex(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) {
register struct regex* a=(struct regex*)x;
int i,tmp;
+#ifdef DEBUG
+ printf("%08p matching regex against \"%s\"\n",a,s);
+#endif
for (i=0; i<a->num; ++i) {
+ assert(a->b[i].m==matchbranch);
tmp=a->b[i].m(&a->b[i],s,ofs,preg,plus,eflags);
if (tmp>=0) {
if (a->next)
@@ -335,12 +381,15 @@ static const char* parseregex(struct regex*__restrict__ r,const char*__restrict_
const char *tmp;
r->m=matchregex;
r->num=0; r->b=0; r->pieces=0;
+ p->brackets=0;
for (;;) {
tmp=parsebranch(&b,s,p,&r->pieces);
if (tmp==s) return s;
+// printf("r->b from %p to ",r->b);
if (!(r->b=realloc(r->b,++r->num*sizeof(b)))) return s;
+// printf("%p (size %d)\n",r->b,r->num*sizeof(b));
r->b[r->num-1]=b;
- s=tmp;
+ s=tmp; if (*s=='|') ++s;
}
return tmp;
}
@@ -355,7 +404,7 @@ static void regex_putnext(struct regex* r,void* next);
static void atom_putnext(struct atom*__restrict__ a,void*__restrict__ next) {
a->next=next;
if (a->type==REGEX)
- regex_putnext(&a->u.r,next);
+ regex_putnext(&a->u.r,0);
}
static void piece_putnext(struct piece*__restrict__ p,void*__restrict__ next) {
@@ -365,8 +414,12 @@ static void piece_putnext(struct piece*__restrict__ p,void*__restrict__ next) {
static void branch_putnext(struct branch*__restrict__ b,void*__restrict__ next) {
int i;
- for (i=0; i<b->num-1; ++i)
- piece_putnext(&b->p[i],&b->p[i+1]);
+ for (i=0; i<b->num-1; ++i) {
+ if (b->p[i+1].min==1 && b->p[i+1].max==1)
+ piece_putnext(&b->p[i],&b->p[i+1].a);
+ else
+ piece_putnext(&b->p[i],&b->p[i+1]);
+ }
piece_putnext(&b->p[i],0);
b->next=next;
}
@@ -381,21 +434,29 @@ static void regex_putnext(struct regex*__restrict__ r,void*__restrict__ next) {
int regcomp(regex_t*__restrict__ preg, const char*__restrict__ regex, int cflags) {
- const char* t=parseregex(&preg->r,regex,preg);
+ const char* t;
+ preg->cflags=cflags;
+ t=parseregex(&preg->r,regex,preg);
if (t==regex) return -1;
regex_putnext(&preg->r,0);
- preg->cflags=cflags;
return 0;
}
int regexec(const regex_t*__restrict__ preg, const char*__restrict__ string, size_t nmatch, regmatch_t pmatch[], int eflags) {
int matched;
const char *orig=string;
- ((regex_t*)preg)->l=alloca(sizeof(regmatch_t)*(preg->brackets+1));
+ assert(preg->brackets+1>0 && preg->brackets<1000);
+#ifdef DEBUG
+ printf("alloca(%d)\n",sizeof(regmatch_t)*(preg->brackets+3));
+#endif
+ ((regex_t*)preg)->l=alloca(sizeof(regmatch_t)*(preg->brackets+3));
while (*string) {
matched=preg->r.m((void*)&preg->r,string,string-orig,(regex_t*)preg,0,eflags);
+// printf("ebp on stack = %x\n",stack[1]);
if (matched>=0) {
- if ((preg->cflags&REG_NOSUB)==0) memmove(pmatch,preg->l,nmatch*sizeof(regmatch_t));
+ preg->l[0].rm_so=string-orig;
+ preg->l[0].rm_eo=string-orig+matched;
+ if ((preg->cflags&REG_NOSUB)==0) memcpy(pmatch,preg->l,nmatch*sizeof(regmatch_t));
return 0;
}
++string; eflags|=REG_NOTBOL;
diff --git a/mdk-stage1/dietlibc/librpc/auth_none.c b/mdk-stage1/dietlibc/librpc/auth_none.c
index 7a4dffe87..59124bae4 100644
--- a/mdk-stage1/dietlibc/librpc/auth_none.c
+++ b/mdk-stage1/dietlibc/librpc/auth_none.c
@@ -46,14 +46,11 @@ static char sccsid[] =
#include <rpc/auth.h>
#define MAX_MARSHEL_SIZE 20
-/*
- * Authenticator operations routines
- */
static void authnone_verf();
-static void authnone_destroy();
-static bool_t authnone_marshal();
static bool_t authnone_validate();
static bool_t authnone_refresh();
+static void authnone_destroy();
+static bool_t authnone_marshal(AUTH *client, XDR *xdrs);
static struct auth_ops ops = {
authnone_verf,
@@ -66,7 +63,7 @@ static struct auth_ops ops = {
static struct authnone_private {
AUTH no_client;
char marshalled_client[MAX_MARSHEL_SIZE];
- u_int mcnt;
+ unsigned int mcnt;
} *authnone_private;
AUTH *authnone_create()
@@ -86,7 +83,7 @@ AUTH *authnone_create()
ap->no_client.ah_ops = &ops;
xdrs = &xdr_stream;
xdrmem_create(xdrs, ap->marshalled_client,
- (u_int) MAX_MARSHEL_SIZE, XDR_ENCODE);
+ (unsigned int) MAX_MARSHEL_SIZE, XDR_ENCODE);
(void) xdr_opaque_auth(xdrs, &ap->no_client.ah_cred);
(void) xdr_opaque_auth(xdrs, &ap->no_client.ah_verf);
ap->mcnt = XDR_GETPOS(xdrs);
@@ -126,3 +123,4 @@ static bool_t authnone_refresh()
static void authnone_destroy()
{
}
+
diff --git a/mdk-stage1/dietlibc/librpc/auth_unix.c b/mdk-stage1/dietlibc/librpc/auth_unix.c
index 5daeb5f4a..59eb6ff18 100644
--- a/mdk-stage1/dietlibc/librpc/auth_unix.c
+++ b/mdk-stage1/dietlibc/librpc/auth_unix.c
@@ -78,9 +78,9 @@ static struct auth_ops auth_unix_ops = {
struct audata {
struct opaque_auth au_origcred; /* original credentials */
struct opaque_auth au_shcred; /* short hand cred */
- u_long au_shfaults; /* short hand cache faults */
+ unsigned long au_shfaults; /* short hand cache faults */
char au_marshed[MAX_AUTH_BYTES];
- u_int au_mpos; /* xdr pos at end of marshed */
+ unsigned int au_mpos; /* xdr pos at end of marshed */
};
#define AUTH_PRIVATE(auth) ((struct audata *)auth->ah_private)
@@ -121,7 +121,7 @@ AUTH *authunix_create __P ((char *machname, uid_t uid,
}
#endif
auth->ah_ops = &auth_unix_ops;
- auth->ah_private = (caddr_t) au;
+ auth->ah_private = (char*) au;
auth->ah_verf = au->au_shcred = _null_auth;
au->au_shfaults = 0;
@@ -133,7 +133,7 @@ AUTH *authunix_create __P ((char *machname, uid_t uid,
aup.aup_machname = machname;
aup.aup_uid = uid;
aup.aup_gid = gid;
- aup.aup_len = (u_int) len;
+ aup.aup_len = (unsigned int) len;
aup.aup_gids = aup_gids;
/*
@@ -145,14 +145,14 @@ AUTH *authunix_create __P ((char *machname, uid_t uid,
au->au_origcred.oa_length = len = XDR_GETPOS(&xdrs);
au->au_origcred.oa_flavor = AUTH_UNIX;
#ifdef KERNEL
- au->au_origcred.oa_base = mem_alloc((u_int) len);
+ au->au_origcred.oa_base = mem_alloc((unsigned int) len);
#else
- if ((au->au_origcred.oa_base = mem_alloc((u_int) len)) == NULL) {
+ if ((au->au_origcred.oa_base = mem_alloc((unsigned int) len)) == NULL) {
(void) fprintf(stderr, "authunix_create: out of memory\n");
return (NULL);
}
#endif
- bcopy(mymem, au->au_origcred.oa_base, (u_int) len);
+ memmove(au->au_origcred.oa_base, mymem, (unsigned int) len);
/*
* set auth handle to reflect new cred.
@@ -288,7 +288,7 @@ register AUTH *auth;
if (auth->ah_verf.oa_base != NULL)
mem_free(auth->ah_verf.oa_base, auth->ah_verf.oa_length);
- mem_free((caddr_t) auth, sizeof(*auth));
+ mem_free((char*) auth, sizeof(*auth));
}
/*
@@ -311,3 +311,4 @@ register AUTH *auth;
}
XDR_DESTROY(xdrs);
}
+
diff --git a/mdk-stage1/dietlibc/librpc/authunix_prot.c b/mdk-stage1/dietlibc/librpc/authunix_prot.c
index ddcadb808..53897a364 100644
--- a/mdk-stage1/dietlibc/librpc/authunix_prot.c
+++ b/mdk-stage1/dietlibc/librpc/authunix_prot.c
@@ -59,7 +59,7 @@ register struct authunix_parms *p;
&& xdr_string(xdrs, &(p->aup_machname), MAX_MACHINE_NAME)
&& xdr_int(xdrs, &a)
&& xdr_int(xdrs, &b)
- && xdr_array(xdrs, (caddr_t *) & (p->aup_gids),
+ && xdr_array(xdrs, (char* *) & (p->aup_gids),
&(p->aup_len), NGRPS, sizeof(int), (xdrproc_t)xdr_int)) {
p->aup_uid=(uid_t)a;
p->aup_gid=(gid_t)b;
diff --git a/mdk-stage1/dietlibc/librpc/bindresvport.c b/mdk-stage1/dietlibc/librpc/bindresvport.c
index 8b65261dd..1131cc263 100644
--- a/mdk-stage1/dietlibc/librpc/bindresvport.c
+++ b/mdk-stage1/dietlibc/librpc/bindresvport.c
@@ -37,6 +37,7 @@
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include "dietfeatures.h"
/*
* Bind a socket to a privileged IP port
@@ -48,7 +49,6 @@ struct sockaddr_in *sin;
int res;
static short port;
struct sockaddr_in myaddr;
- extern int errno;
int i;
#define STARTPORT 600
@@ -57,7 +57,7 @@ struct sockaddr_in *sin;
if (sin == (struct sockaddr_in *) 0) {
sin = &myaddr;
- bzero(sin, sizeof(*sin));
+ memset(sin,0,sizeof(*sin));
sin->sin_family = AF_INET;
} else if (sin->sin_family != AF_INET) {
errno = EPFNOSUPPORT;
diff --git a/mdk-stage1/dietlibc/librpc/clnt_generic.c b/mdk-stage1/dietlibc/librpc/clnt_generic.c
index 9bb81cc80..5c0b96af9 100644
--- a/mdk-stage1/dietlibc/librpc/clnt_generic.c
+++ b/mdk-stage1/dietlibc/librpc/clnt_generic.c
@@ -44,8 +44,8 @@ static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI";
* returns client handle. Default options are set, which the user can
* change using the rpc equivalent of ioctl()'s.
*/
-CLIENT *clnt_create __P ((const char *hostname, const u_long prog,
- const u_long vers, const char *proto))
+CLIENT *clnt_create __P ((const char *hostname, const unsigned long prog,
+ const unsigned long vers, const char *proto))
{
struct hostent *h;
struct protoent *p;
@@ -68,14 +68,14 @@ CLIENT *clnt_create __P ((const char *hostname, const u_long prog,
return (NULL);
}
#ifdef __linux__
- bzero((char *) &sin, sizeof(sin));
+ memset((char*)&sin,0,sizeof(sin));
#endif
sin.sin_family = h->h_addrtype;
sin.sin_port = 0;
#ifndef __linux__
- bzero(sin.sin_zero, sizeof(sin.sin_zero));
+ memset(sin.sin_zero,0,sizeof(sin.sin_zero));
#endif
- bcopy(h->h_addr, (char *) &sin.sin_addr, h->h_length);
+ memmove((char *) &sin.sin_addr, h->h_addr, h->h_length);
p = getprotobyname(proto);
if (p == NULL) {
rpc_createerr.cf_stat = RPC_UNKNOWNPROTO;
diff --git a/mdk-stage1/dietlibc/librpc/clnt_raw.c b/mdk-stage1/dietlibc/librpc/clnt_raw.c
index 7479b55d6..52ab64421 100644
--- a/mdk-stage1/dietlibc/librpc/clnt_raw.c
+++ b/mdk-stage1/dietlibc/librpc/clnt_raw.c
@@ -54,7 +54,7 @@ static struct clntraw_private {
XDR xdr_stream;
char _raw_buf[UDPMSGSIZE];
char mashl_callmsg[MCALL_MSG_SIZE];
- u_int mcnt;
+ unsigned int mcnt;
} *clntraw_private;
static enum clnt_stat clntraw_call();
@@ -73,14 +73,12 @@ static struct clnt_ops client_ops = {
clntraw_control
};
-void svc_getreq();
-
/*
* Create a client handle for memory based rpc.
*/
CLIENT *clntraw_create(prog, vers)
-u_long prog;
-u_long vers;
+unsigned long prog;
+unsigned long vers;
{
register struct clntraw_private *clp = clntraw_private;
struct rpc_msg call_msg;
@@ -123,11 +121,11 @@ u_long vers;
static enum clnt_stat
clntraw_call(h, proc, xargs, argsp, xresults, resultsp, timeout)
CLIENT *h;
-u_long proc;
+unsigned long proc;
xdrproc_t xargs;
-caddr_t argsp;
+char* argsp;
xdrproc_t xresults;
-caddr_t resultsp;
+char* resultsp;
struct timeval timeout;
{
register struct clntraw_private *clp = clntraw_private;
@@ -202,7 +200,7 @@ static void clntraw_geterr()
static bool_t clntraw_freeres(cl, xdr_res, res_ptr)
CLIENT *cl;
xdrproc_t xdr_res;
-caddr_t res_ptr;
+char* res_ptr;
{
register struct clntraw_private *clp = clntraw_private;
register XDR *xdrs = &clp->xdr_stream;
@@ -228,3 +226,4 @@ static bool_t clntraw_control()
static void clntraw_destroy()
{
}
+
diff --git a/mdk-stage1/dietlibc/librpc/clnt_simple.c b/mdk-stage1/dietlibc/librpc/clnt_simple.c
index f309f86ff..e1f4c5f6c 100644
--- a/mdk-stage1/dietlibc/librpc/clnt_simple.c
+++ b/mdk-stage1/dietlibc/librpc/clnt_simple.c
@@ -54,8 +54,8 @@ static struct callrpc_private {
char *oldhost;
} *callrpc_private;
-int callrpc (const char *host, const u_long prognum,
- const u_long versnum, const u_long procnum,
+int callrpc (const char *host, const unsigned long prognum,
+ const unsigned long versnum, const unsigned long procnum,
const xdrproc_t inproc, const char *in,
const xdrproc_t outproc, char *out)
{
@@ -91,11 +91,11 @@ int callrpc (const char *host, const u_long prognum,
return ((int) RPC_UNKNOWNHOST);
timeout.tv_usec = 0;
timeout.tv_sec = 5;
- bcopy(hp->h_addr, (char *) &server_addr.sin_addr, hp->h_length);
+ memmove((char *) &server_addr.sin_addr, hp->h_addr, hp->h_length);
server_addr.sin_family = AF_INET;
server_addr.sin_port = 0;
- if ((crp->client = clntudp_create(&server_addr, (u_long) prognum,
- (u_long) versnum, timeout,
+ if ((crp->client = clntudp_create(&server_addr, (unsigned long) prognum,
+ (unsigned long) versnum, timeout,
&crp->socket)) == NULL)
return ((int) rpc_createerr.cf_stat);
crp->valid = 1;
diff --git a/mdk-stage1/dietlibc/librpc/clnt_tcp.c b/mdk-stage1/dietlibc/librpc/clnt_tcp.c
index 8c39e8933..56bf3315a 100644
--- a/mdk-stage1/dietlibc/librpc/clnt_tcp.c
+++ b/mdk-stage1/dietlibc/librpc/clnt_tcp.c
@@ -57,11 +57,10 @@ static char sccsid[] = "@(#)clnt_tcp.c 1.37 87/10/05 Copyr 1984 Sun Micro";
#include <errno.h>
#include <rpc/pmap_clnt.h>
#include <unistd.h>
+#include "dietfeatures.h"
#define MCALL_MSG_SIZE 24
-extern int errno;
-
static int readtcp();
static int writetcp();
@@ -89,7 +88,7 @@ struct ct_data {
struct sockaddr_in ct_addr;
struct rpc_err ct_error;
char ct_mcall[MCALL_MSG_SIZE]; /* marshalled callmsg */
- u_int ct_mpos; /* pos after marshal */
+ unsigned int ct_mpos; /* pos after marshal */
XDR ct_xdrs;
};
@@ -109,11 +108,11 @@ struct ct_data {
*/
CLIENT *clnttcp_create(raddr, prog, vers, sockp, sendsz, recvsz)
struct sockaddr_in *raddr;
-u_long prog;
-u_long vers;
+unsigned long prog;
+unsigned long vers;
register int *sockp;
-u_int sendsz;
-u_int recvsz;
+unsigned int sendsz;
+unsigned int recvsz;
{
CLIENT *h;
register struct ct_data *ct;
@@ -139,12 +138,12 @@ u_int recvsz;
* If no port number given ask the pmap for one
*/
if (raddr->sin_port == 0) {
- u_short port;
+ unsigned short port;
if ((port = pmap_getport(raddr, prog, vers, IPPROTO_TCP)) == 0) {
- mem_free((caddr_t) ct, sizeof(struct ct_data));
+ mem_free((char*) ct, sizeof(struct ct_data));
- mem_free((caddr_t) h, sizeof(CLIENT));
+ mem_free((char*) h, sizeof(CLIENT));
return ((CLIENT *) NULL);
}
raddr->sin_port = htons(port);
@@ -206,9 +205,9 @@ u_int recvsz;
* and authnone for authentication.
*/
xdrrec_create(&(ct->ct_xdrs), sendsz, recvsz,
- (caddr_t) ct, readtcp, writetcp);
+ (char*) ct, readtcp, writetcp);
h->cl_ops = &tcp_ops;
- h->cl_private = (caddr_t) ct;
+ h->cl_private = (char*) ct;
h->cl_auth = authnone_create();
return (h);
@@ -216,9 +215,9 @@ u_int recvsz;
/*
* Something goofed, free stuff and barf
*/
- mem_free((caddr_t) ct, sizeof(struct ct_data));
+ mem_free((char*) ct, sizeof(struct ct_data));
- mem_free((caddr_t) h, sizeof(CLIENT));
+ mem_free((char*) h, sizeof(CLIENT));
return ((CLIENT *) NULL);
}
@@ -226,18 +225,18 @@ static enum clnt_stat
clnttcp_call(h, proc, xdr_args, args_ptr, xdr_results, results_ptr,
timeout)
register CLIENT *h;
-u_long proc;
+unsigned long proc;
xdrproc_t xdr_args;
-caddr_t args_ptr;
+char* args_ptr;
xdrproc_t xdr_results;
-caddr_t results_ptr;
+char* results_ptr;
struct timeval timeout;
{
register struct ct_data *ct = (struct ct_data *) h->cl_private;
register XDR *xdrs = &(ct->ct_xdrs);
struct rpc_msg reply_msg;
- u_long x_id;
- u_long *msg_x_id = (u_long *) (ct->ct_mcall); /* yuk */
+ unsigned long x_id;
+ unsigned long *msg_x_id = (unsigned long *) (ct->ct_mcall); /* yuk */
register bool_t shipnow;
int refreshes = 2;
@@ -332,7 +331,7 @@ struct rpc_err *errp;
static bool_t clnttcp_freeres(cl, xdr_res, res_ptr)
CLIENT *cl;
xdrproc_t xdr_res;
-caddr_t res_ptr;
+char* res_ptr;
{
register struct ct_data *ct = (struct ct_data *) cl->cl_private;
register XDR *xdrs = &(ct->ct_xdrs);
@@ -379,9 +378,9 @@ CLIENT *h;
(void) close(ct->ct_sock);
}
XDR_DESTROY(&(ct->ct_xdrs));
- mem_free((caddr_t) ct, sizeof(struct ct_data));
+ mem_free((char*) ct, sizeof(struct ct_data));
- mem_free((caddr_t) h, sizeof(CLIENT));
+ mem_free((char*) h, sizeof(CLIENT));
}
/*
@@ -391,7 +390,7 @@ CLIENT *h;
*/
static int readtcp(ct, buf, len)
register struct ct_data *ct;
-caddr_t buf;
+char* buf;
register int len;
{
#ifdef FD_SETSIZE
@@ -447,7 +446,7 @@ register int len;
static int writetcp(ct, buf, len)
struct ct_data *ct;
-caddr_t buf;
+char* buf;
int len;
{
register int i, cnt;
@@ -461,3 +460,4 @@ int len;
}
return (len);
}
+
diff --git a/mdk-stage1/dietlibc/librpc/clnt_udp.c b/mdk-stage1/dietlibc/librpc/clnt_udp.c
index 7305d3ff1..874ef62db 100644
--- a/mdk-stage1/dietlibc/librpc/clnt_udp.c
+++ b/mdk-stage1/dietlibc/librpc/clnt_udp.c
@@ -45,8 +45,7 @@ static char sccsid[] = "@(#)clnt_udp.c 1.39 87/08/11 Copyr 1984 Sun Micro";
#include <errno.h>
#include <rpc/pmap_clnt.h>
#include <unistd.h>
-
-extern int errno;
+#include "dietfeatures.h"
/*
* UDP bases client side rpc operations
@@ -67,6 +66,7 @@ static struct clnt_ops udp_ops = {
clntudp_control
};
+
/*
* Private data kept per client handle
*/
@@ -79,10 +79,10 @@ struct cu_data {
struct timeval cu_total;
struct rpc_err cu_error;
XDR cu_outxdrs;
- u_int cu_xdrpos;
- u_int cu_sendsz;
+ unsigned int cu_xdrpos;
+ unsigned int cu_sendsz;
char *cu_outbuf;
- u_int cu_recvsz;
+ unsigned int cu_recvsz;
char cu_inbuf[1];
};
@@ -105,12 +105,12 @@ struct cu_data {
CLIENT *clntudp_bufcreate(raddr, program, version, wait, sockp, sendsz,
recvsz)
struct sockaddr_in *raddr;
-u_long program;
-u_long version;
+unsigned long program;
+unsigned long version;
struct timeval wait;
register int *sockp;
-u_int sendsz;
-u_int recvsz;
+unsigned int sendsz;
+unsigned int recvsz;
{
CLIENT *cl;
register struct cu_data *cu;
@@ -137,7 +137,7 @@ u_int recvsz;
(void) gettimeofday(&now, (struct timezone *) 0);
if (raddr->sin_port == 0) {
- u_short port;
+ unsigned short port;
if ((port =
pmap_getport(raddr, program, version, IPPROTO_UDP)) == 0) {
@@ -146,7 +146,7 @@ u_int recvsz;
raddr->sin_port = htons(port);
}
cl->cl_ops = &udp_ops;
- cl->cl_private = (caddr_t) cu;
+ cl->cl_private = (char*) cu;
cu->cu_raddr = *raddr;
cu->cu_rlen = sizeof(cu->cu_raddr);
cu->cu_wait = wait;
@@ -186,16 +186,16 @@ u_int recvsz;
return (cl);
fooy:
if (cu)
- mem_free((caddr_t) cu, sizeof(*cu) + sendsz + recvsz);
+ mem_free((char*) cu, sizeof(*cu) + sendsz + recvsz);
if (cl)
- mem_free((caddr_t) cl, sizeof(CLIENT));
+ mem_free((char*) cl, sizeof(CLIENT));
return ((CLIENT *) NULL);
}
CLIENT *clntudp_create(raddr, program, version, wait, sockp)
struct sockaddr_in *raddr;
-u_long program;
-u_long version;
+unsigned long program;
+unsigned long version;
struct timeval wait;
register int *sockp;
{
@@ -207,11 +207,11 @@ register int *sockp;
static enum clnt_stat
clntudp_call(cl, proc, xargs, argsp, xresults, resultsp, utimeout)
register CLIENT *cl; /* client handle */
-u_long proc; /* procedure number */
+unsigned long proc; /* procedure number */
xdrproc_t xargs; /* xdr routine for args */
-caddr_t argsp; /* pointer to args */
+char* argsp; /* pointer to args */
xdrproc_t xresults; /* xdr routine for results */
-caddr_t resultsp; /* pointer to results */
+char* resultsp; /* pointer to results */
struct timeval utimeout; /* seconds to wait before giving up */
{
register struct cu_data *cu = (struct cu_data *) cl->cl_private;
@@ -250,7 +250,7 @@ struct timeval utimeout; /* seconds to wait before giving up */
/*
* the transaction is the first thing in the out buffer
*/
- (*(u_short *) (cu->cu_outbuf))++;
+ (*(unsigned short *) (cu->cu_outbuf))++;
if ((!XDR_PUTLONG(xdrs, (long *) &proc)) ||
(!AUTH_MARSHALL(cl->cl_auth, xdrs)) || (!(*xargs) (xdrs, argsp)))
return (cu->cu_error.re_status = RPC_CANTENCODEARGS);
@@ -324,10 +324,10 @@ struct timeval utimeout; /* seconds to wait before giving up */
cu->cu_error.re_errno = errno;
return (cu->cu_error.re_status = RPC_CANTRECV);
}
- if (inlen < sizeof(u_long))
+ if (inlen < sizeof(unsigned long))
continue;
/* see if reply transaction id matches sent id */
- if (*((u_long *) (cu->cu_inbuf)) != *((u_long *) (cu->cu_outbuf)))
+ if (*((unsigned long *) (cu->cu_inbuf)) != *((unsigned long *) (cu->cu_outbuf)))
continue;
/* we now assume we have the proper reply */
break;
@@ -336,7 +336,7 @@ struct timeval utimeout; /* seconds to wait before giving up */
/*
* now decode and validate the response
*/
- xdrmem_create(&reply_xdrs, cu->cu_inbuf, (u_int) inlen, XDR_DECODE);
+ xdrmem_create(&reply_xdrs, cu->cu_inbuf, (unsigned int) inlen, XDR_DECODE);
ok = xdr_replymsg(&reply_xdrs, &reply_msg);
/* XDR_DESTROY(&reply_xdrs); save a few cycles on noop destroy */
if (ok) {
@@ -380,7 +380,7 @@ struct rpc_err *errp;
static bool_t clntudp_freeres(cl, xdr_res, res_ptr)
CLIENT *cl;
xdrproc_t xdr_res;
-caddr_t res_ptr;
+char* res_ptr;
{
register struct cu_data *cu = (struct cu_data *) cl->cl_private;
register XDR *xdrs = &(cu->cu_outxdrs);
@@ -432,6 +432,7 @@ CLIENT *cl;
(void) close(cu->cu_sock);
}
XDR_DESTROY(&(cu->cu_outxdrs));
- mem_free((caddr_t) cu, (sizeof(*cu) + cu->cu_sendsz + cu->cu_recvsz));
- mem_free((caddr_t) cl, sizeof(CLIENT));
+ mem_free((char*) cu, (sizeof(*cu) + cu->cu_sendsz + cu->cu_recvsz));
+ mem_free((char*) cl, sizeof(CLIENT));
}
+
diff --git a/mdk-stage1/dietlibc/librpc/get_myaddress.c b/mdk-stage1/dietlibc/librpc/get_myaddress.c
index cd63383d0..1ce2c2b32 100644
--- a/mdk-stage1/dietlibc/librpc/get_myaddress.c
+++ b/mdk-stage1/dietlibc/librpc/get_myaddress.c
@@ -64,6 +64,6 @@ void get_myaddress(struct sockaddr_in* addr)
exit(1);
}
addr->sin_family = AF_INET;
- bcopy((char *) hp->h_addr, (char *) &addr->sin_addr, hp->h_length);
+ memmove((char *) &addr->sin_addr, (char *) hp->h_addr, hp->h_length);
addr->sin_port = htons(PMAPPORT);
}
diff --git a/mdk-stage1/dietlibc/librpc/getrpcent.c b/mdk-stage1/dietlibc/librpc/getrpcent.c
index 5e7f694d2..71774a2eb 100644
--- a/mdk-stage1/dietlibc/librpc/getrpcent.c
+++ b/mdk-stage1/dietlibc/librpc/getrpcent.c
@@ -44,6 +44,7 @@ static char sccsid[] =
#include <netdb.h>
#include <sys/socket.h>
#include <string.h>
+#include <arpa/inet.h>
/*
* Internet version.
@@ -60,9 +61,7 @@ struct rpcdata {
char *domain;
} *rpcdata;
-static struct rpcent *interpret();
-struct hostent *gethostent();
-char *inet_ntoa();
+static struct rpcent *interpret(const char* val, size_t len);
#ifndef __linux__
static char *index();
@@ -195,7 +194,7 @@ char *s;
}
#endif
-static struct rpcent *interpret(const char* val, int len)
+static struct rpcent *interpret(const char* val, size_t len)
{
register struct rpcdata *d = _rpcdata();
char *p;
@@ -203,7 +202,7 @@ static struct rpcent *interpret(const char* val, int len)
if (d == 0)
return 0;
- strncpy(d->line, val, len);
+ strncpy(d->line, val, (size_t)len);
p = d->line;
d->line[len] = '\n';
if (*p == '#')
diff --git a/mdk-stage1/dietlibc/librpc/getrpcport.c b/mdk-stage1/dietlibc/librpc/getrpcport.c
index a7085cbe7..7b6e50a7d 100644
--- a/mdk-stage1/dietlibc/librpc/getrpcport.c
+++ b/mdk-stage1/dietlibc/librpc/getrpcport.c
@@ -42,15 +42,15 @@ static char sccsid[] = "@(#)getrpcport.c 1.3 87/08/11 SMI";
#include <string.h>
#include <rpc/pmap_clnt.h>
-extern int getrpcport (const char * host, u_long prognum,
- u_long versnum, u_int proto)
+extern int getrpcport (const char * host, unsigned long prognum,
+ unsigned long versnum, unsigned int proto)
{
struct sockaddr_in addr;
struct hostent *hp;
if ((hp = gethostbyname(host)) == NULL)
return (0);
- bcopy(hp->h_addr, (char *) &addr.sin_addr, hp->h_length);
+ memmove((char *) &addr.sin_addr, hp->h_addr, hp->h_length);
addr.sin_family = AF_INET;
addr.sin_port = 0;
return (pmap_getport(&addr, prognum, versnum, proto));
diff --git a/mdk-stage1/dietlibc/librpc/pmap_clnt.c b/mdk-stage1/dietlibc/librpc/pmap_clnt.c
index 428675656..9dbf3f624 100644
--- a/mdk-stage1/dietlibc/librpc/pmap_clnt.c
+++ b/mdk-stage1/dietlibc/librpc/pmap_clnt.c
@@ -48,18 +48,15 @@ static char sccsid[] =
static struct timeval timeout = { 5, 0 };
static struct timeval tottimeout = { 60, 0 };
-void clnt_perror();
-
-
/*
* Set a mapping between program,version and port.
* Calls the pmap service remotely to do the mapping.
*/
bool_t pmap_set(program, version, protocol, port)
-u_long program;
-u_long version;
+unsigned long program;
+unsigned long version;
int protocol;
-u_short port;
+unsigned short port;
{
struct sockaddr_in myaddress;
int socket = -1;
@@ -77,7 +74,7 @@ u_short port;
parms.pm_vers = version;
parms.pm_prot = protocol;
parms.pm_port = port;
- if (CLNT_CALL(client, PMAPPROC_SET, (xdrproc_t)xdr_pmap, (caddr_t)&parms, (xdrproc_t)xdr_bool, (caddr_t)&rslt,
+ if (CLNT_CALL(client, PMAPPROC_SET, (xdrproc_t)xdr_pmap, (char*)&parms, (xdrproc_t)xdr_bool, (void*)&rslt,
tottimeout) != RPC_SUCCESS) {
clnt_perror(client, "Cannot register service");
return (FALSE);
@@ -92,8 +89,8 @@ u_short port;
* Calls the pmap service remotely to do the un-mapping.
*/
bool_t pmap_unset(program, version)
-u_long program;
-u_long version;
+unsigned long program;
+unsigned long version;
{
struct sockaddr_in myaddress;
int socket = -1;
@@ -110,7 +107,7 @@ u_long version;
parms.pm_prog = program;
parms.pm_vers = version;
parms.pm_port = parms.pm_prot = 0;
- CLNT_CALL(client, PMAPPROC_UNSET, (xdrproc_t)xdr_pmap, (caddr_t)&parms, (xdrproc_t)xdr_bool, (caddr_t)&rslt,
+ CLNT_CALL(client, PMAPPROC_UNSET, (xdrproc_t)xdr_pmap, (char*)&parms, (xdrproc_t)xdr_bool, (void*)&rslt,
tottimeout);
CLNT_DESTROY(client);
(void) close(socket);
diff --git a/mdk-stage1/dietlibc/librpc/pmap_getmaps.c b/mdk-stage1/dietlibc/librpc/pmap_getmaps.c
index 6940783fb..de51a733a 100644
--- a/mdk-stage1/dietlibc/librpc/pmap_getmaps.c
+++ b/mdk-stage1/dietlibc/librpc/pmap_getmaps.c
@@ -48,14 +48,13 @@ static char sccsid[] =
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
+#include <netinet/in.h>
//#include <net/if.h>
#include <sys/ioctl.h>
#define NAMELEN 255
#define MAX_BROADCAST_SIZE 1400
#include <unistd.h>
-extern int errno;
-
/*
* Get a copy of the current port maps.
* Calls the pmap service remotely to do get the maps.
@@ -74,7 +73,7 @@ struct sockaddr_in *address;
client = clnttcp_create(address, PMAPPROG, PMAPVERS, &socket, 50, 500);
if (client != (CLIENT *) NULL) {
if (CLNT_CALL(client, PMAPPROC_DUMP, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_pmaplist,
- (caddr_t)&head, minutetimeout) != RPC_SUCCESS) {
+ (char*)&head, minutetimeout) != RPC_SUCCESS) {
clnt_perror(client, "pmap_getmaps rpc problem");
}
CLNT_DESTROY(client);
diff --git a/mdk-stage1/dietlibc/librpc/pmap_getport.c b/mdk-stage1/dietlibc/librpc/pmap_getport.c
index 174dca41a..edf199e69 100644
--- a/mdk-stage1/dietlibc/librpc/pmap_getport.c
+++ b/mdk-stage1/dietlibc/librpc/pmap_getport.c
@@ -55,18 +55,18 @@ static struct timeval tottimeout = { 60, 0 };
* Calls the pmap service remotely to do the lookup.
* Returns 0 if no map exists.
*/
-u_short pmap_getport(address, program, version, protocol)
+unsigned short pmap_getport(address, program, version, protocol)
struct sockaddr_in *address;
-u_long program;
-u_long version;
-u_int protocol;
+unsigned long program;
+unsigned long version;
+unsigned int protocol;
{
- u_short port = 0;
+ unsigned short port = 0;
int socket = -1;
register CLIENT *client;
struct pmap parms;
- address->sin_port = htons(PMAPPORT);
+ address->sin_port = htons((unsigned short)PMAPPORT);
client = clntudp_bufcreate(address, PMAPPROG,
PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE,
RPCSMALLMSGSIZE);
@@ -75,8 +75,8 @@ u_int protocol;
parms.pm_vers = version;
parms.pm_prot = protocol;
parms.pm_port = 0; /* not needed or used */
- if (CLNT_CALL(client, PMAPPROC_GETPORT, (xdrproc_t)xdr_pmap, (caddr_t)&parms,
- (xdrproc_t)xdr_u_short, (caddr_t)&port, tottimeout) != RPC_SUCCESS) {
+ if (CLNT_CALL(client, PMAPPROC_GETPORT, (xdrproc_t)xdr_pmap, (char*)&parms,
+ (xdrproc_t)xdr_u_short, (char*)&port, tottimeout) != RPC_SUCCESS) {
rpc_createerr.cf_stat = RPC_PMAPFAILURE;
clnt_geterr(client, &rpc_createerr.cf_error);
} else if (port == 0) {
diff --git a/mdk-stage1/dietlibc/librpc/pmap_prot2.c b/mdk-stage1/dietlibc/librpc/pmap_prot2.c
index 870c844ed..cd2deb036 100644
--- a/mdk-stage1/dietlibc/librpc/pmap_prot2.c
+++ b/mdk-stage1/dietlibc/librpc/pmap_prot2.c
@@ -107,8 +107,8 @@ bool_t xdr_pmaplist(XDR* xdrs, struct pmaplist** rp)
*/
if (freeing)
next = &((*rp)->pml_next);
- if (!xdr_reference(xdrs, (caddr_t *) rp,
- (u_int) sizeof(struct pmaplist), (xdrproc_t)xdr_pmap))
+ if (!xdr_reference(xdrs, (char* *) rp,
+ (unsigned int) sizeof(struct pmaplist), (xdrproc_t)xdr_pmap))
return (FALSE);
rp = (freeing) ? next : &((*rp)->pml_next);
diff --git a/mdk-stage1/dietlibc/librpc/pmap_rmt.c b/mdk-stage1/dietlibc/librpc/pmap_rmt.c
index 02efcf91c..390bd736e 100644
--- a/mdk-stage1/dietlibc/librpc/pmap_rmt.c
+++ b/mdk-stage1/dietlibc/librpc/pmap_rmt.c
@@ -49,11 +49,12 @@ static char sccsid[] = "@(#)pmap_rmt.c 1.21 87/08/27 Copyr 1984 Sun Micro";
//#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
+#include <netinet/in.h>
#define MAX_BROADCAST_SIZE 1400
#include <unistd.h>
#include <string.h>
+#include "dietfeatures.h"
-extern int errno;
static struct timeval timeout = { 3, 0 };
@@ -64,42 +65,40 @@ static struct timeval timeout = { 3, 0 };
* remotely call that routine with the given parameters. This allows
* programs to do a lookup and call in one step.
*/
-enum clnt_stat
-pmap_rmtcall(addr, prog, vers, proc, xdrargs, argsp, xdrres, resp, tout,
- port_ptr)
-struct sockaddr_in *addr;
-u_long prog, vers, proc;
-xdrproc_t xdrargs, xdrres;
-caddr_t argsp, resp;
-struct timeval tout;
-u_long *port_ptr;
-{
- int socket = -1;
- register CLIENT *client;
- struct rmtcallargs a;
- struct rmtcallres r;
- enum clnt_stat stat;
+enum clnt_stat pmap_rmtcall (struct sockaddr_in *addr,
+ const unsigned long prog,
+ const unsigned long vers,
+ const unsigned long proc,
+ xdrproc_t xdrargs,
+ char* argsp, xdrproc_t xdrres,
+ char* resp, struct timeval tout,
+ unsigned long *port_ptr) {
+ int socket = -1;
+ register CLIENT *client;
+ struct rmtcallargs a;
+ struct rmtcallres r;
+ enum clnt_stat stat;
- addr->sin_port = htons(PMAPPORT);
- client = clntudp_create(addr, PMAPPROG, PMAPVERS, timeout, &socket);
- if (client != (CLIENT *) NULL) {
- a.prog = prog;
- a.vers = vers;
- a.proc = proc;
- a.args_ptr = argsp;
- a.xdr_args = xdrargs;
- r.port_ptr = port_ptr;
- r.results_ptr = resp;
- r.xdr_results = xdrres;
- stat = CLNT_CALL(client, PMAPPROC_CALLIT, (xdrproc_t)xdr_rmtcall_args, (caddr_t)&a,
- (xdrproc_t)xdr_rmtcallres, (caddr_t)&r, tout);
- CLNT_DESTROY(client);
- } else {
- stat = RPC_FAILED;
- }
- (void) close(socket);
- addr->sin_port = 0;
- return (stat);
+ addr->sin_port = htons((short)PMAPPORT);
+ client = clntudp_create(addr, PMAPPROG, PMAPVERS, timeout, &socket);
+ if (client != (CLIENT *) NULL) {
+ a.prog = prog;
+ a.vers = vers;
+ a.proc = proc;
+ a.args_ptr = argsp;
+ a.xdr_args = xdrargs;
+ r.port_ptr = port_ptr;
+ r.results_ptr = resp;
+ r.xdr_results = xdrres;
+ stat = CLNT_CALL(client, PMAPPROC_CALLIT, (xdrproc_t)xdr_rmtcall_args, (char*)&a,
+ (xdrproc_t)xdr_rmtcallres, (char*)&r, tout);
+ CLNT_DESTROY(client);
+ } else {
+ stat = RPC_FAILED;
+ }
+ (void) close(socket);
+ addr->sin_port = 0;
+ return (stat);
}
@@ -109,7 +108,7 @@ u_long *port_ptr;
*/
bool_t xdr_rmtcall_args(XDR* xdrs, struct rmtcallargs* cap)
{
- u_int lenposition, argposition, position;
+ unsigned int lenposition, argposition, position;
if (xdr_u_long(xdrs, &(cap->prog)) &&
xdr_u_long(xdrs, &(cap->vers)) && xdr_u_long(xdrs, &(cap->proc))) {
@@ -120,7 +119,7 @@ bool_t xdr_rmtcall_args(XDR* xdrs, struct rmtcallargs* cap)
if (!(*(cap->xdr_args)) (xdrs, cap->args_ptr))
return (FALSE);
position = XDR_GETPOS(xdrs);
- cap->arglen = (u_long) position - (u_long) argposition;
+ cap->arglen = (unsigned long) position - (unsigned long) argposition;
XDR_SETPOS(xdrs, lenposition);
if (!xdr_u_long(xdrs, &(cap->arglen)))
return (FALSE);
@@ -136,12 +135,12 @@ bool_t xdr_rmtcall_args(XDR* xdrs, struct rmtcallargs* cap)
*/
bool_t xdr_rmtcallres(XDR* xdrs, struct rmtcallres* crp)
{
- caddr_t port_ptr;
+ char* port_ptr;
- port_ptr = (caddr_t) crp->port_ptr;
- if (xdr_reference(xdrs, &port_ptr, sizeof(u_long),
+ port_ptr = (char*) crp->port_ptr;
+ if (xdr_reference(xdrs, &port_ptr, sizeof(unsigned long),
(xdrproc_t)xdr_u_long) && xdr_u_long(xdrs, &crp->resultslen)) {
- crp->port_ptr = (u_long *) port_ptr;
+ crp->port_ptr = (unsigned long *) port_ptr;
return ((*(crp->xdr_results)) (xdrs, crp->results_ptr));
}
return (FALSE);
@@ -222,13 +221,13 @@ char *buf; /* why allocxate more when we can use existing... */
enum clnt_stat
clnt_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp,
eachresult)
-u_long prog; /* program number */
-u_long vers; /* version number */
-u_long proc; /* procedure number */
+unsigned long prog; /* program number */
+unsigned long vers; /* version number */
+unsigned long proc; /* procedure number */
xdrproc_t xargs; /* xdr routine for args */
-caddr_t argsp; /* pointer to args */
+char* argsp; /* pointer to args */
xdrproc_t xresults; /* xdr routine for results */
-caddr_t resultsp; /* pointer to results */
+char* resultsp; /* pointer to results */
resultproc_t eachresult; /* call with each result obtained */
{
enum clnt_stat stat;
@@ -248,8 +247,8 @@ resultproc_t eachresult; /* call with each result obtained */
#endif /* def FD_SETSIZE */
register int i;
bool_t done = FALSE;
- register u_long xid;
- u_long port;
+ register unsigned long xid;
+ unsigned long port;
struct in_addr addrs[20];
struct sockaddr_in baddr, raddr; /* broadcast and response addresses */
struct rmtcallargs a;
@@ -281,9 +280,9 @@ resultproc_t eachresult; /* call with each result obtained */
mask = (1 << sock);
#endif /* def FD_SETSIZE */
nets = getbroadcastnets(addrs, sock, inbuf);
- bzero((char *) &baddr, sizeof(baddr));
+ memset((char*)&baddr,0,sizeof(baddr));
baddr.sin_family = AF_INET;
- baddr.sin_port = htons(PMAPPORT);
+ baddr.sin_port = htons((short)PMAPPORT);
baddr.sin_addr.s_addr = htonl(INADDR_ANY);
/* baddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); */
(void) gettimeofday(&t, (struct timezone *) 0);
@@ -318,7 +317,7 @@ resultproc_t eachresult; /* call with each result obtained */
for (t.tv_sec = 4; t.tv_sec <= 14; t.tv_sec += 2) {
for (i = 0; i < nets; i++) {
baddr.sin_addr = addrs[i];
- if (sendto(sock, outbuf, outlen, 0,
+ if (sendto(sock, outbuf, (size_t)outlen, 0,
(struct sockaddr *) &baddr,
sizeof(struct sockaddr)) != outlen) {
perror("Cannot send broadcast packet");
@@ -332,7 +331,7 @@ resultproc_t eachresult; /* call with each result obtained */
}
recv_again:
msg.acpted_rply.ar_verf = _null_auth;
- msg.acpted_rply.ar_results.where = (caddr_t) & r;
+ msg.acpted_rply.ar_results.where = (char*) & r;
msg.acpted_rply.ar_results.proc = (xdrproc_t)xdr_rmtcallres;
readfds = mask;
switch (select(_rpc_dtablesize(), &readfds, 0, 0, &t)) {
@@ -361,18 +360,18 @@ resultproc_t eachresult; /* call with each result obtained */
stat = RPC_CANTRECV;
goto done_broad;
}
- if (inlen < sizeof(u_long))
+ if ((size_t)inlen < sizeof(unsigned long))
goto recv_again;
/*
* see if reply transaction id matches sent id.
* If so, decode the results.
*/
- xdrmem_create(xdrs, inbuf, (u_int) inlen, XDR_DECODE);
+ xdrmem_create(xdrs, inbuf, (unsigned int) inlen, XDR_DECODE);
if (xdr_replymsg(xdrs, &msg)) {
if ((msg.rm_xid == xid) &&
(msg.rm_reply.rp_stat == MSG_ACCEPTED) &&
(msg.acpted_rply.ar_stat == SUCCESS)) {
- raddr.sin_port = htons((u_short) port);
+ raddr.sin_port = htons((unsigned short) port);
done = (*eachresult) (resultsp, &raddr);
}
/* otherwise, we just ignore the errors ... */
diff --git a/mdk-stage1/dietlibc/librpc/rpc_callmsg.c b/mdk-stage1/dietlibc/librpc/rpc_callmsg.c
index 4b3a9880e..a3514f41c 100644
--- a/mdk-stage1/dietlibc/librpc/rpc_callmsg.c
+++ b/mdk-stage1/dietlibc/librpc/rpc_callmsg.c
@@ -83,14 +83,14 @@ register struct rpc_msg *cmsg;
IXDR_PUT_ENUM(buf, oa->oa_flavor);
IXDR_PUT_LONG(buf, oa->oa_length);
if (oa->oa_length) {
- bcopy(oa->oa_base, (caddr_t) buf, oa->oa_length);
+ memmove((char*) buf, oa->oa_base, oa->oa_length);
buf += RNDUP(oa->oa_length) / sizeof(long);
}
oa = &cmsg->rm_call.cb_verf;
IXDR_PUT_ENUM(buf, oa->oa_flavor);
IXDR_PUT_LONG(buf, oa->oa_length);
if (oa->oa_length) {
- bcopy(oa->oa_base, (caddr_t) buf, oa->oa_length);
+ memmove((char*) buf, oa->oa_base, oa->oa_length);
/* no real need....
buf += RNDUP(oa->oa_length) / sizeof (long);
*/
@@ -122,7 +122,7 @@ register struct rpc_msg *cmsg;
return (FALSE);
}
if (oa->oa_base == NULL) {
- oa->oa_base = (caddr_t)
+ oa->oa_base = (char*)
mem_alloc(oa->oa_length);
}
buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length));
@@ -132,7 +132,7 @@ register struct rpc_msg *cmsg;
return (FALSE);
}
} else {
- bcopy((caddr_t) buf, oa->oa_base, oa->oa_length);
+ memmove(oa->oa_base, (char*) buf, oa->oa_length);
/* no real need....
buf += RNDUP(oa->oa_length) /
sizeof (long);
@@ -155,7 +155,7 @@ register struct rpc_msg *cmsg;
return (FALSE);
}
if (oa->oa_base == NULL) {
- oa->oa_base = (caddr_t)
+ oa->oa_base = (char*)
mem_alloc(oa->oa_length);
}
buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length));
@@ -165,7 +165,7 @@ register struct rpc_msg *cmsg;
return (FALSE);
}
} else {
- bcopy((caddr_t) buf, oa->oa_base, oa->oa_length);
+ memmove(oa->oa_base, (char*) buf, oa->oa_length);
/* no real need...
buf += RNDUP(oa->oa_length) /
sizeof (long);
diff --git a/mdk-stage1/dietlibc/librpc/rpc_prot.c b/mdk-stage1/dietlibc/librpc/rpc_prot.c
index 19a4db27f..d5ca5ab77 100644
--- a/mdk-stage1/dietlibc/librpc/rpc_prot.c
+++ b/mdk-stage1/dietlibc/librpc/rpc_prot.c
@@ -74,7 +74,7 @@ bool_t xdr_des_block(xdrs, blkp)
register XDR *xdrs;
register des_block *blkp;
{
- return (xdr_opaque(xdrs, (caddr_t) blkp, sizeof(des_block)));
+ return (xdr_opaque(xdrs, (char*) blkp, sizeof(des_block)));
}
/* * * * * * * * * * * * * * XDR RPC MESSAGE * * * * * * * * * * * * * * * */
@@ -146,7 +146,7 @@ register struct rpc_msg *rmsg;
xdr_enum(xdrs, (enum_t *) & (rmsg->rm_direction)) &&
(rmsg->rm_direction == REPLY))
return (xdr_union(xdrs, (enum_t *) & (rmsg->rm_reply.rp_stat),
- (caddr_t) & (rmsg->rm_reply.ru), reply_dscrm,
+ (char*) & (rmsg->rm_reply.ru), reply_dscrm,
NULL_xdrproc_t));
return (FALSE);
}
diff --git a/mdk-stage1/dietlibc/librpc/svc.c b/mdk-stage1/dietlibc/librpc/svc.c
index 4fcdb5216..b430deb4a 100644
--- a/mdk-stage1/dietlibc/librpc/svc.c
+++ b/mdk-stage1/dietlibc/librpc/svc.c
@@ -44,12 +44,11 @@ static char sccsid[] = "@(#)svc.c 1.41 87/10/13 Copyr 1984 Sun Micro";
#include <errno.h>
#include <rpc/rpc.h>
#include <rpc/pmap_clnt.h>
+#include <string.h>
#ifdef __linux__
#include <sys/types.h>
#endif
-extern int errno;
-
#ifdef FD_SETSIZE
static SVCXPRT **xports;
#else
@@ -69,8 +68,8 @@ static SVCXPRT *xports[NOFILE];
*/
static struct svc_callout {
struct svc_callout *sc_next;
- u_long sc_prog;
- u_long sc_vers;
+ unsigned long sc_prog;
+ unsigned long sc_vers;
void (*sc_dispatch) ();
} *svc_head;
@@ -135,8 +134,8 @@ SVCXPRT *xprt;
*/
bool_t svc_register(xprt, prog, vers, dispatch, protocol)
SVCXPRT *xprt;
-u_long prog;
-u_long vers;
+unsigned long prog;
+unsigned long vers;
void (*dispatch) ();
rpcprot_t protocol;
{
@@ -170,8 +169,8 @@ rpcprot_t protocol;
* Remove a service program from the callout list.
*/
void svc_unregister(prog, vers)
-u_long prog;
-u_long vers;
+unsigned long prog;
+unsigned long vers;
{
struct svc_callout *prev;
register struct svc_callout *s;
@@ -184,7 +183,7 @@ u_long vers;
prev->sc_next = s->sc_next;
}
s->sc_next = NULL_SVC;
- mem_free((char *) s, (u_int) sizeof(struct svc_callout));
+ mem_free((char *) s, (unsigned int) sizeof(struct svc_callout));
/* now unregister the information with the local binder service */
(void) pmap_unset(prog, vers);
@@ -195,8 +194,8 @@ u_long vers;
* struct.
*/
static struct svc_callout *svc_find(prog, vers, prev)
-u_long prog;
-u_long vers;
+unsigned long prog;
+unsigned long vers;
struct svc_callout **prev;
{
register struct svc_callout *s, *p;
@@ -220,7 +219,7 @@ struct svc_callout **prev;
bool_t svc_sendreply(xprt, xdr_results, xdr_location)
register SVCXPRT *xprt;
xdrproc_t xdr_results;
-caddr_t xdr_location;
+char* xdr_location;
{
struct rpc_msg rply;
@@ -324,8 +323,8 @@ register SVCXPRT *xprt;
*/
void svcerr_progvers(xprt, low_vers, high_vers)
register SVCXPRT *xprt;
-u_long low_vers;
-u_long high_vers;
+unsigned long low_vers;
+unsigned long high_vers;
{
struct rpc_msg rply;
@@ -389,13 +388,13 @@ int *readfds;
enum xprt_stat stat;
struct rpc_msg msg;
int prog_found;
- u_long low_vers;
- u_long high_vers;
+ unsigned long low_vers;
+ unsigned long high_vers;
struct svc_req r;
register SVCXPRT *xprt;
- register u_long mask;
+ register unsigned long mask;
register int bit;
- register u_long *maskp;
+ register unsigned long *maskp;
register int setsize;
register int sock;
char cred_area[2 * MAX_AUTH_BYTES + RQCRED_SIZE];
@@ -409,9 +408,9 @@ int *readfds;
setsize = _rpc_dtablesize();
#ifdef __linux__
/*#define NFDBITS 32*/
- maskp = (u_long *) readfds;
+ maskp = (unsigned long *) readfds;
#else
- maskp = (u_long *) readfds->fds_bits;
+ maskp = (unsigned long *) readfds->fds_bits;
#endif
for (sock = 0; sock < setsize; sock += NFDBITS) {
for (mask = *maskp++; (bit = ffs(mask)); mask ^= (1 << (bit - 1))) {
diff --git a/mdk-stage1/dietlibc/librpc/svc_auth_unix.c b/mdk-stage1/dietlibc/librpc/svc_auth_unix.c
index 7e0305f0a..e81eba7d9 100644
--- a/mdk-stage1/dietlibc/librpc/svc_auth_unix.c
+++ b/mdk-stage1/dietlibc/librpc/svc_auth_unix.c
@@ -64,7 +64,7 @@ register struct rpc_msg *msg;
char area_machname[MAX_MACHINE_NAME + 1];
gid_t area_gids[NGRPS];
} *area;
- u_int auth_len;
+ unsigned int auth_len;
int str_len, gid_len;
register int i;
@@ -72,7 +72,7 @@ register struct rpc_msg *msg;
aup = &area->area_aup;
aup->aup_machname = area->area_machname;
aup->aup_gids = area->area_gids;
- auth_len = (u_int) msg->rm_call.cb_cred.oa_length;
+ auth_len = (unsigned int) msg->rm_call.cb_cred.oa_length;
xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len,
XDR_DECODE);
buf = XDR_INLINE(&xdrs, auth_len);
@@ -83,7 +83,7 @@ register struct rpc_msg *msg;
stat = AUTH_BADCRED;
goto done;
}
- bcopy((caddr_t) buf, aup->aup_machname, (u_int) str_len);
+ memmove(aup->aup_machname, (char*) buf, (unsigned int) str_len);
aup->aup_machname[str_len] = 0;
str_len = RNDUP(str_len);
buf += str_len / sizeof(long);
diff --git a/mdk-stage1/dietlibc/librpc/svc_raw.c b/mdk-stage1/dietlibc/librpc/svc_raw.c
index c13ea5e06..eebb433ee 100644
--- a/mdk-stage1/dietlibc/librpc/svc_raw.c
+++ b/mdk-stage1/dietlibc/librpc/svc_raw.c
@@ -69,6 +69,7 @@ static struct xp_ops server_ops = {
svcraw_destroy
};
+
SVCXPRT *svcraw_create()
{
register struct svcraw_private *srp = svcraw_private;
@@ -130,7 +131,7 @@ struct rpc_msg *msg;
static bool_t svcraw_getargs(xprt, xdr_args, args_ptr)
SVCXPRT *xprt;
xdrproc_t xdr_args;
-caddr_t args_ptr;
+char* args_ptr;
{
register struct svcraw_private *srp = svcraw_private;
@@ -142,7 +143,7 @@ caddr_t args_ptr;
static bool_t svcraw_freeargs(xprt, xdr_args, args_ptr)
SVCXPRT *xprt;
xdrproc_t xdr_args;
-caddr_t args_ptr;
+char* args_ptr;
{
register struct svcraw_private *srp = svcraw_private;
register XDR *xdrs;
@@ -157,3 +158,4 @@ caddr_t args_ptr;
static void svcraw_destroy()
{
}
+
diff --git a/mdk-stage1/dietlibc/librpc/svc_run.c b/mdk-stage1/dietlibc/librpc/svc_run.c
index c7150e357..506b37942 100644
--- a/mdk-stage1/dietlibc/librpc/svc_run.c
+++ b/mdk-stage1/dietlibc/librpc/svc_run.c
@@ -39,6 +39,7 @@ static char sccsid[] = "@(#)svc_run.c 1.1 87/10/13 Copyr 1984 Sun Micro";
#include <rpc/rpc.h>
#include <errno.h>
#include <unistd.h>
+#include "dietfeatures.h"
void svc_run()
{
@@ -47,7 +48,6 @@ void svc_run()
#else
int readfds;
#endif /* def FD_SETSIZE */
- extern int errno;
for (;;) {
#ifdef FD_SETSIZE
diff --git a/mdk-stage1/dietlibc/librpc/svc_simple.c b/mdk-stage1/dietlibc/librpc/svc_simple.c
index 0bb9a19eb..d2310de1e 100644
--- a/mdk-stage1/dietlibc/librpc/svc_simple.c
+++ b/mdk-stage1/dietlibc/librpc/svc_simple.c
@@ -73,8 +73,8 @@ int registerrpc(int prognum, int versnum, int procnum, char *(*progname)(), xdrp
return (-1);
}
}
- (void) pmap_unset((u_long) prognum, (u_long) versnum);
- if (!svc_register(transp, (u_long) prognum, (u_long) versnum,
+ (void) pmap_unset((unsigned long) prognum, (unsigned long) versnum);
+ if (!svc_register(transp, (unsigned long) prognum, (unsigned long) versnum,
universal, IPPROTO_UDP)) {
(void) fprintf(stderr, "couldn't register prog %d vers %d\n",
prognum, versnum);
@@ -120,7 +120,7 @@ SVCXPRT *transp;
for (pl = proglst; pl != NULL; pl = pl->p_nxt)
if (pl->p_prognum == prog && pl->p_procnum == proc) {
/* decode arguments into a CLEAN buffer */
- bzero(xdrbuf, sizeof(xdrbuf)); /* required ! */
+ memset(xdrbuf, 0, sizeof(xdrbuf)); /* required ! */
if (!svc_getargs(transp, pl->p_inproc, xdrbuf)) {
svcerr_decode(transp);
return;
diff --git a/mdk-stage1/dietlibc/librpc/svc_tcp.c b/mdk-stage1/dietlibc/librpc/svc_tcp.c
index 6edafa1b1..0444bc0d0 100644
--- a/mdk-stage1/dietlibc/librpc/svc_tcp.c
+++ b/mdk-stage1/dietlibc/librpc/svc_tcp.c
@@ -48,6 +48,7 @@ static char sccsid[] = "@(#)svc_tcp.c 1.21 87/08/11 Copyr 1984 Sun Micro";
#include <errno.h>
#include <string.h>
#include <unistd.h>
+#include "dietfeatures.h"
/*
* Ops vector for TCP/IP based rpc service handle
@@ -59,14 +60,7 @@ static bool_t svctcp_reply();
static bool_t svctcp_freeargs();
static void svctcp_destroy();
-static struct xp_ops svctcp_op = {
- svctcp_recv,
- svctcp_stat,
- svctcp_getargs,
- svctcp_reply,
- svctcp_freeargs,
- svctcp_destroy
-};
+static struct xp_ops svctcp_op;
/*
* Ops vector for TCP/IP rendezvous handler
@@ -87,13 +81,13 @@ static int readtcp(), writetcp();
static SVCXPRT *makefd_xprt();
struct tcp_rendezvous { /* kept in xprt->xp_p1 */
- u_int sendsize;
- u_int recvsize;
+ unsigned int sendsize;
+ unsigned int recvsize;
};
struct tcp_conn { /* kept in xprt->xp_p1 */
enum xprt_stat strm_stat;
- u_long x_id;
+ unsigned long x_id;
XDR xdrs;
char verf_body[MAX_AUTH_BYTES];
};
@@ -120,8 +114,8 @@ struct tcp_conn { /* kept in xprt->xp_p1 */
*/
SVCXPRT *svctcp_create(sock, sendsize, recvsize)
register int sock;
-u_int sendsize;
-u_int recvsize;
+unsigned int sendsize;
+unsigned int recvsize;
{
bool_t madesock = FALSE;
register SVCXPRT *xprt;
@@ -136,7 +130,7 @@ u_int recvsize;
}
madesock = TRUE;
}
- bzero((char *) &addr, sizeof(addr));
+ memset((char *) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
if (bindresvport(sock, &addr)) {
addr.sin_port = 0;
@@ -162,7 +156,7 @@ u_int recvsize;
return (NULL);
}
xprt->xp_p2 = NULL;
- xprt->xp_p1 = (caddr_t) r;
+ xprt->xp_p1 = (char*) r;
xprt->xp_verf = _null_auth;
xprt->xp_ops = &svctcp_rendezvous_op;
xprt->xp_port = ntohs(addr.sin_port);
@@ -177,8 +171,8 @@ u_int recvsize;
*/
SVCXPRT *svcfd_create(fd, sendsize, recvsize)
int fd;
-u_int sendsize;
-u_int recvsize;
+unsigned int sendsize;
+unsigned int recvsize;
{
return (makefd_xprt(fd, sendsize, recvsize));
@@ -186,8 +180,8 @@ u_int recvsize;
static SVCXPRT *makefd_xprt(fd, sendsize, recvsize)
int fd;
-u_int sendsize;
-u_int recvsize;
+unsigned int sendsize;
+unsigned int recvsize;
{
register SVCXPRT *xprt;
register struct tcp_conn *cd;
@@ -207,9 +201,9 @@ u_int recvsize;
}
cd->strm_stat = XPRT_IDLE;
xdrrec_create(&(cd->xdrs), sendsize, recvsize,
- (caddr_t) xprt, readtcp, writetcp);
+ (char*) xprt, readtcp, writetcp);
xprt->xp_p2 = NULL;
- xprt->xp_p1 = (caddr_t) cd;
+ xprt->xp_p1 = (char*) cd;
xprt->xp_verf.oa_base = cd->verf_body;
xprt->xp_addrlen = 0;
xprt->xp_ops = &svctcp_op; /* truely deals with calls */
@@ -267,9 +261,9 @@ register SVCXPRT *xprt;
/* an actual connection socket */
XDR_DESTROY(&(cd->xdrs));
}
- mem_free((caddr_t) cd, sizeof(struct tcp_conn));
+ mem_free((char*) cd, sizeof(struct tcp_conn));
- mem_free((caddr_t) xprt, sizeof(SVCXPRT));
+ mem_free((char*) xprt, sizeof(SVCXPRT));
}
/*
@@ -285,7 +279,7 @@ static struct timeval wait_per_try = { 35, 0 };
*/
static int readtcp(xprt, buf, len)
register SVCXPRT *xprt;
-caddr_t buf;
+char* buf;
register int len;
{
register int sock = xprt->xp_sock;
@@ -327,7 +321,7 @@ register int len;
*/
static int writetcp(xprt, buf, len)
register SVCXPRT *xprt;
-caddr_t buf;
+char* buf;
int len;
{
register int i, cnt;
@@ -372,7 +366,7 @@ register struct rpc_msg *msg;
static bool_t svctcp_getargs(xprt, xdr_args, args_ptr)
SVCXPRT *xprt;
xdrproc_t xdr_args;
-caddr_t args_ptr;
+char* args_ptr;
{
return ((*xdr_args)
@@ -382,7 +376,7 @@ caddr_t args_ptr;
static bool_t svctcp_freeargs(xprt, xdr_args, args_ptr)
SVCXPRT *xprt;
xdrproc_t xdr_args;
-caddr_t args_ptr;
+char* args_ptr;
{
register XDR *xdrs = &(((struct tcp_conn *) (xprt->xp_p1))->xdrs);
@@ -404,3 +398,13 @@ register struct rpc_msg *msg;
(void) xdrrec_endofrecord(xdrs, TRUE);
return (stat);
}
+
+static struct xp_ops svctcp_op = {
+ svctcp_recv,
+ svctcp_stat,
+ svctcp_getargs,
+ svctcp_reply,
+ svctcp_freeargs,
+ svctcp_destroy
+};
+
diff --git a/mdk-stage1/dietlibc/librpc/svc_udp.c b/mdk-stage1/dietlibc/librpc/svc_udp.c
index 1cdb5ce91..af22f289f 100644
--- a/mdk-stage1/dietlibc/librpc/svc_udp.c
+++ b/mdk-stage1/dietlibc/librpc/svc_udp.c
@@ -45,10 +45,9 @@ static char sccsid[] = "@(#)svc_udp.c 1.24 87/08/11 Copyr 1984 Sun Micro";
#include <errno.h>
#include <string.h>
#include <unistd.h>
-
+#include "dietfeatures.h"
#define rpc_buffer(xprt) ((xprt)->xp_p1)
-#define MAX(a, b) ((a > b) ? a : b)
static bool_t svcudp_recv();
static bool_t svcudp_reply();
@@ -57,23 +56,14 @@ static bool_t svcudp_getargs();
static bool_t svcudp_freeargs();
static void svcudp_destroy();
-static struct xp_ops svcudp_op = {
- svcudp_recv,
- svcudp_stat,
- svcudp_getargs,
- svcudp_reply,
- svcudp_freeargs,
- svcudp_destroy
-};
-
-extern int errno;
+static struct xp_ops svcudp_op;
/*
* kept in xprt->xp_p2
*/
struct svcudp_data {
- u_int su_iosz; /* byte size of send.recv buffer */
- u_long su_xid; /* transaction id */
+ unsigned int su_iosz; /* byte size of send.recv buffer */
+ unsigned long su_xid; /* transaction id */
XDR su_xdrs; /* XDR handle */
char su_verfbody[MAX_AUTH_BYTES]; /* verifier body */
char *su_cache; /* cached data, NULL if no cache */
@@ -81,8 +71,8 @@ struct svcudp_data {
#define su_data(xprt) ((struct svcudp_data *)(xprt->xp_p2))
-static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, u_long* replylenp);
-static void cache_set(SVCXPRT* xprt, u_long replylen);
+static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, unsigned long* replylenp);
+static void cache_set(SVCXPRT* xprt, unsigned long replylen);
/*
* Usage:
@@ -99,7 +89,7 @@ static void cache_set(SVCXPRT* xprt, u_long replylen);
*/
SVCXPRT *svcudp_bufcreate(sock, sendsz, recvsz)
register int sock;
-u_int sendsz, recvsz;
+unsigned int sendsz, recvsz;
{
bool_t madesock = FALSE;
register SVCXPRT *xprt;
@@ -114,7 +104,7 @@ u_int sendsz, recvsz;
}
madesock = TRUE;
}
- bzero((char *) &addr, sizeof(addr));
+ memset((char *) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
if (bindresvport(sock, &addr)) {
addr.sin_port = 0;
@@ -144,7 +134,7 @@ u_int sendsz, recvsz;
xdrmem_create(&(su->su_xdrs), rpc_buffer(xprt), su->su_iosz,
XDR_DECODE);
su->su_cache = NULL;
- xprt->xp_p2 = (caddr_t) su;
+ xprt->xp_p2 = (char*) su;
xprt->xp_verf.oa_base = su->su_verfbody;
xprt->xp_ops = &svcudp_op;
xprt->xp_port = ntohs(addr.sin_port);
@@ -175,7 +165,7 @@ struct rpc_msg *msg;
register XDR *xdrs = &(su->su_xdrs);
register int rlen;
char *reply;
- u_long replylen;
+ unsigned long replylen;
again:
xprt->xp_addrlen = sizeof(struct sockaddr_in);
@@ -185,7 +175,7 @@ struct rpc_msg *msg;
&(xprt->xp_addrlen));
if (rlen == -1 && errno == EINTR)
goto again;
- if (rlen < 4 * sizeof(u_long))
+ if (rlen < 4 * sizeof(unsigned long))
return (FALSE);
xdrs->x_op = XDR_DECODE;
XDR_SETPOS(xdrs, 0);
@@ -222,7 +212,7 @@ struct rpc_msg *msg;
== slen) {
stat = TRUE;
if (su->su_cache && slen >= 0) {
- cache_set(xprt, (u_long) slen);
+ cache_set(xprt, (unsigned long) slen);
}
}
}
@@ -232,7 +222,7 @@ struct rpc_msg *msg;
static bool_t svcudp_getargs(xprt, xdr_args, args_ptr)
SVCXPRT *xprt;
xdrproc_t xdr_args;
-caddr_t args_ptr;
+char* args_ptr;
{
return ((*xdr_args) (&(su_data(xprt)->su_xdrs), args_ptr));
@@ -241,7 +231,7 @@ caddr_t args_ptr;
static bool_t svcudp_freeargs(xprt, xdr_args, args_ptr)
SVCXPRT *xprt;
xdrproc_t xdr_args;
-caddr_t args_ptr;
+char* args_ptr;
{
register XDR *xdrs = &(su_data(xprt)->su_xdrs);
@@ -258,9 +248,9 @@ register SVCXPRT *xprt;
(void) close(xprt->xp_sock);
XDR_DESTROY(&(su->su_xdrs));
mem_free(rpc_buffer(xprt), su->su_iosz);
- mem_free((caddr_t) su, sizeof(struct svcudp_data));
+ mem_free((char*) su, sizeof(struct svcudp_data));
- mem_free((caddr_t) xprt, sizeof(SVCXPRT));
+ mem_free((char*) xprt, sizeof(SVCXPRT));
}
@@ -281,7 +271,7 @@ register SVCXPRT *xprt;
(type *) mem_alloc((unsigned) (sizeof(type) * (size)))
#define BZERO(addr, type, size) \
- bzero((char *) addr, sizeof(type) * (int) (size))
+ memset((char *) addr, 0, sizeof(type) * (int) (size))
/*
* An entry in the cache
@@ -291,16 +281,16 @@ struct cache_node {
/*
* Index into cache is xid, proc, vers, prog and address
*/
- u_long cache_xid;
- u_long cache_proc;
- u_long cache_vers;
- u_long cache_prog;
+ unsigned long cache_xid;
+ unsigned long cache_proc;
+ unsigned long cache_vers;
+ unsigned long cache_prog;
struct sockaddr_in cache_addr;
/*
* The cached reply and length
*/
char *cache_reply;
- u_long cache_replylen;
+ unsigned long cache_replylen;
/*
* Next node on the list, if there is a collision
*/
@@ -313,13 +303,13 @@ struct cache_node {
* The entire cache
*/
struct udp_cache {
- u_long uc_size; /* size of cache */
+ unsigned long uc_size; /* size of cache */
cache_ptr *uc_entries; /* hash table of entries in cache */
cache_ptr *uc_fifo; /* fifo list of entries in cache */
- u_long uc_nextvictim; /* points to next victim in fifo list */
- u_long uc_prog; /* saved program number */
- u_long uc_vers; /* saved version number */
- u_long uc_proc; /* saved procedure number */
+ unsigned long uc_nextvictim; /* points to next victim in fifo list */
+ unsigned long uc_prog; /* saved program number */
+ unsigned long uc_vers; /* saved version number */
+ unsigned long uc_proc; /* saved procedure number */
struct sockaddr_in uc_addr; /* saved caller's address */
};
@@ -335,7 +325,7 @@ struct udp_cache {
* Enable use of the cache.
* Note: there is no disable.
*/
-int svcudp_enablecache(SVCXPRT* transp, u_long size)
+int svcudp_enablecache(SVCXPRT* transp, unsigned long size)
{
struct svcudp_data *su = su_data(transp);
struct udp_cache *uc;
@@ -371,13 +361,13 @@ int svcudp_enablecache(SVCXPRT* transp, u_long size)
/*
* Set an entry in the cache
*/
-static void cache_set(SVCXPRT* xprt, u_long replylen)
+static void cache_set(SVCXPRT* xprt, unsigned long replylen)
{
register cache_ptr victim;
register cache_ptr *vicp;
register struct svcudp_data *su = su_data(xprt);
struct udp_cache *uc = (struct udp_cache *) su->su_cache;
- u_int loc;
+ unsigned int loc;
char *newbuf;
/*
@@ -434,14 +424,14 @@ static void cache_set(SVCXPRT* xprt, u_long replylen)
* Try to get an entry from the cache
* return 1 if found, 0 if not found
*/
-static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, u_long* replylenp)
+static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, unsigned long* replylenp)
{
- u_int loc;
+ unsigned int loc;
register cache_ptr ent;
register struct svcudp_data *su = su_data(xprt);
register struct udp_cache *uc = (struct udp_cache *) su->su_cache;
-# define EQADDR(a1, a2) (bcmp((char*)&a1, (char*)&a2, sizeof(a1)) == 0)
+# define EQADDR(a1, a2) (memcmp((char*)&a1, (char*)&a2, sizeof(a1)) == 0)
loc = CACHE_LOC(xprt, su->su_xid);
for (ent = uc->uc_entries[loc]; ent != NULL; ent = ent->cache_next) {
@@ -465,3 +455,13 @@ static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, u_long*
uc->uc_addr = xprt->xp_raddr;
return (0);
}
+
+static struct xp_ops svcudp_op = {
+ svcudp_recv,
+ svcudp_stat,
+ svcudp_getargs,
+ svcudp_reply,
+ svcudp_freeargs,
+ svcudp_destroy
+};
+
diff --git a/mdk-stage1/dietlibc/librpc/xdr.c b/mdk-stage1/dietlibc/librpc/xdr.c
index 864b47dea..836a5697a 100644
--- a/mdk-stage1/dietlibc/librpc/xdr.c
+++ b/mdk-stage1/dietlibc/librpc/xdr.c
@@ -52,7 +52,7 @@ static char sccsid[] = "@(#)xdr.c 1.35 87/08/12";
*/
#define XDR_FALSE ((long) 0)
#define XDR_TRUE ((long) 1)
-#define LASTUNSIGNED ((u_int) 0-1)
+#define LASTUNSIGNED ((unsigned int) 0-1)
/*
* for unit alignment
@@ -76,7 +76,7 @@ void xdr_free(xdrproc_t proc, char* objp)
*/
bool_t xdr_void( /* xdrs, addr */ )
/* XDR *xdrs; */
- /* caddr_t addr; */
+ /* char* addr; */
{
return (TRUE);
@@ -108,10 +108,10 @@ bool_t xdr_u_int(XDR* xdrs, unsigned int* up)
#ifdef lint
(void) (xdr_short(xdrs, (short *) up));
- return (xdr_u_long(xdrs, (u_long *) up));
+ return (xdr_u_long(xdrs, (unsigned long *) up));
#else
- if (sizeof(u_int) == sizeof(u_long)) {
- return (xdr_u_long(xdrs, (u_long *) up));
+ if (sizeof(unsigned int) == sizeof(unsigned long)) {
+ return (xdr_u_long(xdrs, (unsigned long *) up));
} else {
return (xdr_short(xdrs, (short *) up));
}
@@ -184,19 +184,19 @@ bool_t xdr_short(XDR* xdrs, short* sp)
*/
bool_t xdr_u_short(XDR* xdrs, unsigned short* usp)
{
- u_long l;
+ unsigned long l;
switch (xdrs->x_op) {
case XDR_ENCODE:
- l = (u_long) * usp;
+ l = (unsigned long) * usp;
return (XDR_PUTLONG(xdrs, &l));
case XDR_DECODE:
if (!XDR_GETLONG(xdrs, &l)) {
return (FALSE);
}
- *usp = (u_short) l;
+ *usp = (unsigned short) l;
return (TRUE);
case XDR_FREE:
@@ -226,7 +226,7 @@ bool_t xdr_char(XDR* xdrs, char* cp)
*/
bool_t xdr_u_char(XDR* xdrs, unsigned char* cp)
{
- u_int u;
+ unsigned int u;
u = (*cp);
if (!xdr_u_int(xdrs, &u)) {
@@ -297,10 +297,10 @@ enum_t *ep;
*/
bool_t xdr_opaque(xdrs, cp, cnt)
register XDR *xdrs;
-caddr_t cp;
-register u_int cnt;
+char* cp;
+register unsigned int cnt;
{
- register u_int rndup;
+ register unsigned int rndup;
static char crud[BYTES_PER_XDR_UNIT];
/*
@@ -349,11 +349,11 @@ register u_int cnt;
bool_t xdr_bytes(xdrs, cpp, sizep, maxsize)
register XDR *xdrs;
char **cpp;
-register u_int *sizep;
-u_int maxsize;
+register unsigned int *sizep;
+unsigned int maxsize;
{
register char *sp = *cpp; /* sp is the actual string pointer */
- register u_int nodesize;
+ register unsigned int nodesize;
/*
* first deal with the length since xdr bytes are counted
@@ -465,11 +465,11 @@ bool_t xdr_union(XDR* xdrs, enum_t* dscmp, char* unp, const struct xdr_discrim*
bool_t xdr_string(xdrs, cpp, maxsize)
register XDR *xdrs;
char **cpp;
-u_int maxsize;
+unsigned int maxsize;
{
register char *sp = *cpp; /* sp is the actual string pointer */
- u_int size;
- u_int nodesize;
+ unsigned int size;
+ unsigned int nodesize;
/*
* first deal with the length since xdr strings are counted-strings
diff --git a/mdk-stage1/dietlibc/librpc/xdr_array.c b/mdk-stage1/dietlibc/librpc/xdr_array.c
index f8ae12b19..f0c9bbbb3 100644
--- a/mdk-stage1/dietlibc/librpc/xdr_array.c
+++ b/mdk-stage1/dietlibc/librpc/xdr_array.c
@@ -48,7 +48,7 @@ static char sccsid[] =
#include <rpc/xdr.h>
#include <string.h>
-#define LASTUNSIGNED ((u_int)0-1)
+#define LASTUNSIGNED ((unsigned int)0-1)
/*
@@ -60,17 +60,17 @@ static char sccsid[] =
*/
bool_t xdr_array(xdrs, addrp, sizep, maxsize, elsize, elproc)
register XDR *xdrs;
-caddr_t *addrp; /* array pointer */
-u_int *sizep; /* number of elements */
-u_int maxsize; /* max numberof elements */
-u_int elsize; /* size in bytes of each element */
+char* *addrp; /* array pointer */
+unsigned int *sizep; /* number of elements */
+unsigned int maxsize; /* max numberof elements */
+unsigned int elsize; /* size in bytes of each element */
xdrproc_t elproc; /* xdr routine to handle each element */
{
- register u_int i;
- register caddr_t target = *addrp;
- register u_int c; /* the actual element count */
+ register unsigned int i;
+ register char* target = *addrp;
+ register unsigned int c; /* the actual element count */
register bool_t stat = TRUE;
- register u_int nodesize;
+ register unsigned int nodesize;
/* like strings, arrays are really counted arrays */
if (!xdr_u_int(xdrs, sizep)) {
@@ -80,7 +80,17 @@ xdrproc_t elproc; /* xdr routine to handle each element */
if ((c > maxsize) && (xdrs->x_op != XDR_FREE)) {
return (FALSE);
}
- nodesize = c * elsize;
+ /* duh, look for integer overflow (fefe) */
+ {
+ unsigned int i;
+ nodesize = 0;
+ for (i=c; i; --i) {
+ unsigned int tmp=nodesize+elsize;
+ if (tmp<nodesize) /* overflow */
+ return FALSE;
+ nodesize=tmp;
+ }
+ }
/*
* if we are deserializing, we may need to allocate an array.
@@ -96,7 +106,7 @@ xdrproc_t elproc; /* xdr routine to handle each element */
(void) fprintf(stderr, "xdr_array: out of memory\n");
return (FALSE);
}
- bzero(target, nodesize);
+ memset(target, 0, nodesize);
break;
case XDR_FREE:
@@ -134,11 +144,11 @@ xdrproc_t elproc; /* xdr routine to handle each element */
bool_t xdr_vector(xdrs, basep, nelem, elemsize, xdr_elem)
register XDR *xdrs;
register char *basep;
-register u_int nelem;
-register u_int elemsize;
+register unsigned int nelem;
+register unsigned int elemsize;
register xdrproc_t xdr_elem;
{
- register u_int i;
+ register unsigned int i;
register char *elptr;
elptr = basep;
diff --git a/mdk-stage1/dietlibc/librpc/xdr_mem.c b/mdk-stage1/dietlibc/librpc/xdr_mem.c
index 755f6abf1..5bc54cd4a 100644
--- a/mdk-stage1/dietlibc/librpc/xdr_mem.c
+++ b/mdk-stage1/dietlibc/librpc/xdr_mem.c
@@ -52,7 +52,7 @@ static bool_t xdrmem_getlong();
static bool_t xdrmem_putlong();
static bool_t xdrmem_getbytes();
static bool_t xdrmem_putbytes();
-static u_int xdrmem_getpos();
+static unsigned int xdrmem_getpos();
static bool_t xdrmem_setpos();
static int32_t *xdrmem_inline();
static void xdrmem_destroy();
@@ -68,20 +68,21 @@ static struct xdr_ops xdrmem_ops = {
xdrmem_destroy
};
+
/*
* The procedure xdrmem_create initializes a stream descriptor for a
* memory buffer.
*/
void xdrmem_create(xdrs, addr, size, op)
register XDR *xdrs;
-caddr_t addr;
-u_int size;
+const char* addr;
+unsigned int size;
enum xdr_op op;
{
xdrs->x_op = op;
xdrs->x_ops = &xdrmem_ops;
- xdrs->x_private = xdrs->x_base = addr;
+ xdrs->x_private = xdrs->x_base = (char*)addr;
xdrs->x_handy = size;
}
@@ -98,7 +99,7 @@ long *lp;
if ((xdrs->x_handy -= sizeof(long)) < 0)
return (FALSE);
- *lp = (long) ntohl((u_long) (*((long *) (xdrs->x_private))));
+ *lp = (long) ntohl((unsigned long) (*((long *) (xdrs->x_private))));
xdrs->x_private += sizeof(long);
return (TRUE);
@@ -112,7 +113,7 @@ long *lp;
if ((xdrs->x_handy -= sizeof(long)) < 0)
return (FALSE);
- *(long *) xdrs->x_private = (long) htonl((u_long) (*lp));
+ *(long *) xdrs->x_private = (long) htonl((unsigned long) (*lp));
xdrs->x_private += sizeof(long);
return (TRUE);
@@ -120,43 +121,43 @@ long *lp;
static bool_t xdrmem_getbytes(xdrs, addr, len)
register XDR *xdrs;
-caddr_t addr;
-register u_int len;
+char* addr;
+register unsigned int len;
{
if ((xdrs->x_handy -= len) < 0)
return (FALSE);
- bcopy(xdrs->x_private, addr, len);
+ memmove(addr, xdrs->x_private, len);
xdrs->x_private += len;
return (TRUE);
}
static bool_t xdrmem_putbytes(xdrs, addr, len)
register XDR *xdrs;
-caddr_t addr;
-register u_int len;
+char* addr;
+register unsigned int len;
{
if ((xdrs->x_handy -= len) < 0)
return (FALSE);
- bcopy(addr, xdrs->x_private, len);
+ memmove(xdrs->x_private, addr, len);
xdrs->x_private += len;
return (TRUE);
}
-static u_int xdrmem_getpos(xdrs)
+static unsigned int xdrmem_getpos(xdrs)
register XDR *xdrs;
{
- return ((u_int) xdrs->x_private - (u_int) xdrs->x_base);
+ return ((unsigned int) xdrs->x_private - (unsigned int) xdrs->x_base);
}
static bool_t xdrmem_setpos(xdrs, pos)
register XDR *xdrs;
-u_int pos;
+unsigned int pos;
{
- register caddr_t newaddr = xdrs->x_base + pos;
- register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
+ register char* newaddr = xdrs->x_base + pos;
+ register char* lastaddr = xdrs->x_private + xdrs->x_handy;
if ((long) newaddr > (long) lastaddr)
return (FALSE);
@@ -178,3 +179,4 @@ int len;
}
return (buf);
}
+
diff --git a/mdk-stage1/dietlibc/librpc/xdr_rec.c b/mdk-stage1/dietlibc/librpc/xdr_rec.c
index 83e800f5e..759a76108 100644
--- a/mdk-stage1/dietlibc/librpc/xdr_rec.c
+++ b/mdk-stage1/dietlibc/librpc/xdr_rec.c
@@ -42,7 +42,7 @@ static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro";
* and the tcp transport level. A record is composed on one or more
* record fragments. A record fragment is a thirty-two bit header followed
* by n bytes of data, where n is contained in the header. The header
- * is represented as a htonl(u_long). Thegh order bit encodes
+ * is represented as a htonl(unsigned long). Thegh order bit encodes
* whether or not the fragment is the last fragment of the record
* (1 => fragment is last, 0 => more fragments to follow.
* The other 31 bits encode the byte length of the fragment.
@@ -56,13 +56,13 @@ static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro";
extern long lseek();
-static u_int fix_buf_size();
+static unsigned int fix_buf_size();
static bool_t xdrrec_getlong();
static bool_t xdrrec_putlong();
static bool_t xdrrec_getbytes();
static bool_t xdrrec_putbytes();
-static u_int xdrrec_getpos();
+static unsigned int xdrrec_getpos();
static bool_t xdrrec_setpos();
static int32_t *xdrrec_inline();
static void xdrrec_destroy();
@@ -78,6 +78,7 @@ static struct xdr_ops xdrrec_ops = {
xdrrec_destroy
};
+
/*
* A record is composed of one or more record fragments.
* A record fragment is a two-byte header followed by zero to
@@ -91,32 +92,32 @@ static struct xdr_ops xdrrec_ops = {
* meet the needs of xdr and rpc based on tcp.
*/
-#define LAST_FRAG ((u_long)(1 << 31))
+#define LAST_FRAG ((unsigned long)(1 << 31))
typedef struct rec_strm {
- caddr_t tcp_handle;
- caddr_t the_buffer;
+ char* tcp_handle;
+ char* the_buffer;
/*
* out-goung bits
*/
int (*writeit) ();
- caddr_t out_base; /* output buffer (points to frag header) */
- caddr_t out_finger; /* next output position */
- caddr_t out_boundry; /* data cannot up to this address */
- u_long *frag_header; /* beginning of curren fragment */
+ char* out_base; /* output buffer (points to frag header) */
+ char* out_finger; /* next output position */
+ char* out_boundry; /* data cannot up to this address */
+ unsigned long *frag_header; /* beginning of curren fragment */
bool_t frag_sent; /* true if buffer sent in middle of record */
/*
* in-coming bits
*/
int (*readit) ();
- u_long in_size; /* fixed size of the input buffer */
- caddr_t in_base;
- caddr_t in_finger; /* location of next byte to be had */
- caddr_t in_boundry; /* can read up to this location */
+ unsigned long in_size; /* fixed size of the input buffer */
+ char* in_base;
+ char* in_finger; /* location of next byte to be had */
+ char* in_boundry; /* can read up to this location */
long fbtbc; /* fragment bytes to be consumed */
bool_t last_frag;
- u_int sendsize;
- u_int recvsize;
+ unsigned int sendsize;
+ unsigned int recvsize;
} RECSTREAM;
@@ -131,9 +132,9 @@ typedef struct rec_strm {
*/
void xdrrec_create(xdrs, sendsize, recvsize, tcp_handle, readit, writeit)
register XDR *xdrs;
-register u_int sendsize;
-register u_int recvsize;
-caddr_t tcp_handle;
+register unsigned int sendsize;
+register unsigned int recvsize;
+char* tcp_handle;
int (*readit) (); /* like read, but pass it a tcp_handle, not sock */
int (*writeit) (); /* like write, but pass it a tcp_handle, not sock */
{
@@ -159,20 +160,20 @@ int (*writeit) (); /* like write, but pass it a tcp_handle, not sock */
return;
}
for (rstrm->out_base = rstrm->the_buffer;
- (u_int) rstrm->out_base % BYTES_PER_XDR_UNIT != 0;
+ (unsigned long) rstrm->out_base % BYTES_PER_XDR_UNIT != 0;
rstrm->out_base++);
rstrm->in_base = rstrm->out_base + sendsize;
/*
* now the rest ...
*/
xdrs->x_ops = &xdrrec_ops;
- xdrs->x_private = (caddr_t) rstrm;
+ xdrs->x_private = (char*) rstrm;
rstrm->tcp_handle = tcp_handle;
rstrm->readit = readit;
rstrm->writeit = writeit;
rstrm->out_finger = rstrm->out_boundry = rstrm->out_base;
- rstrm->frag_header = (u_long *) rstrm->out_base;
- rstrm->out_finger += sizeof(u_long);
+ rstrm->frag_header = (unsigned long *) rstrm->out_base;
+ rstrm->out_finger += sizeof(unsigned long);
rstrm->out_boundry += sendsize;
rstrm->frag_sent = FALSE;
rstrm->in_size = recvsize;
@@ -198,15 +199,15 @@ long *lp;
/* first try the inline, fast case */
if ((rstrm->fbtbc >= sizeof(long)) &&
- (((int) rstrm->in_boundry - (int) buflp) >= sizeof(long))) {
- *lp = (long) ntohl((u_long) (*buflp));
+ (((long) rstrm->in_boundry - (long) buflp) >= sizeof(long))) {
+ *lp = (long) ntohl((unsigned long) (*buflp));
rstrm->fbtbc -= sizeof(long);
rstrm->in_finger += sizeof(long);
} else {
- if (!xdrrec_getbytes(xdrs, (caddr_t) & mylong, sizeof(long)))
+ if (!xdrrec_getbytes(xdrs, (char*) & mylong, sizeof(long)))
return (FALSE);
- *lp = (long) ntohl((u_long) mylong);
+ *lp = (long) ntohl((unsigned long) mylong);
}
return (TRUE);
}
@@ -216,17 +217,17 @@ long *lp;
*/
static bool_t flush_out(RECSTREAM* rstrm, bool_t eor)
{
- register u_long eormask = (eor == TRUE) ? LAST_FRAG : 0;
- register u_long len = (u_long) (rstrm->out_finger) -
- (u_long) (rstrm->frag_header) - sizeof(u_long);
+ register unsigned long eormask = (eor == TRUE) ? LAST_FRAG : 0;
+ register unsigned long len = (unsigned long) (rstrm->out_finger) -
+ (unsigned long) (rstrm->frag_header) - sizeof(unsigned long);
*(rstrm->frag_header) = htonl(len | eormask);
- len = (u_long) (rstrm->out_finger) - (u_long) (rstrm->out_base);
+ len = (unsigned long) (rstrm->out_finger) - (unsigned long) (rstrm->out_base);
if ((*(rstrm->writeit)) (rstrm->tcp_handle, rstrm->out_base, (int) len)
!= (int) len)
return (FALSE);
- rstrm->frag_header = (u_long *) rstrm->out_base;
- rstrm->out_finger = (caddr_t) rstrm->out_base + sizeof(u_long);
+ rstrm->frag_header = (unsigned long *) rstrm->out_base;
+ rstrm->out_finger = (char*) rstrm->out_base + sizeof(unsigned long);
return (TRUE);
}
@@ -235,12 +236,12 @@ static bool_t
fill_input_buf(rstrm)
register RECSTREAM *rstrm;
{
- register caddr_t where;
- u_int i;
+ register char* where;
+ unsigned int i;
register int len;
where = rstrm->in_base;
- i = (u_int) rstrm->in_boundry % BYTES_PER_XDR_UNIT;
+ i = (unsigned long) rstrm->in_boundry % BYTES_PER_XDR_UNIT;
where += i;
len = rstrm->in_size - i;
if ((len = (*(rstrm->readit)) (rstrm->tcp_handle, where, len)) == -1)
@@ -255,20 +256,20 @@ static bool_t
/* knows nothing about records! Only about input buffers */
get_input_bytes(rstrm, addr, len)
register RECSTREAM *rstrm;
-register caddr_t addr;
+register char* addr;
register int len;
{
register int current;
while (len > 0) {
- current = (int) rstrm->in_boundry - (int) rstrm->in_finger;
+ current = (long) rstrm->in_boundry - (long) rstrm->in_finger;
if (current == 0) {
if (!fill_input_buf(rstrm))
return (FALSE);
continue;
}
current = (len < current) ? len : current;
- bcopy(rstrm->in_finger, addr, current);
+ memmove(addr, rstrm->in_finger, current);
rstrm->in_finger += current;
addr += current;
len -= current;
@@ -281,9 +282,9 @@ static bool_t
set_input_fragment(rstrm)
register RECSTREAM *rstrm;
{
- u_long header;
+ unsigned long header;
- if (!get_input_bytes(rstrm, (caddr_t) & header, sizeof(header)))
+ if (!get_input_bytes(rstrm, (char*) & header, sizeof(header)))
return (FALSE);
header = (long) ntohl(header);
rstrm->last_frag = ((header & LAST_FRAG) == 0) ? FALSE : TRUE;
@@ -300,7 +301,7 @@ long cnt;
register int current;
while (cnt > 0) {
- current = (int) rstrm->in_boundry - (int) rstrm->in_finger;
+ current = (long) rstrm->in_boundry - (long) rstrm->in_finger;
if (current == 0) {
if (!fill_input_buf(rstrm))
return (FALSE);
@@ -313,8 +314,8 @@ long cnt;
return (TRUE);
}
-static u_int fix_buf_size(s)
-register u_int s;
+static unsigned int fix_buf_size(s)
+register unsigned int s;
{
if (s < 100)
@@ -341,7 +342,7 @@ long *lp;
dest_lp = ((long *) (rstrm->out_finger));
rstrm->out_finger += sizeof(long);
}
- *dest_lp = (long) htonl((u_long) (*lp));
+ *dest_lp = (long) htonl((unsigned long) (*lp));
return (TRUE);
}
@@ -349,8 +350,8 @@ static bool_t
/* must manage buffers, fragments, and records */
xdrrec_getbytes(xdrs, addr, len)
XDR *xdrs;
-register caddr_t addr;
-register u_int len;
+register char* addr;
+register unsigned int len;
{
register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private);
register int current;
@@ -376,16 +377,16 @@ register u_int len;
static bool_t xdrrec_putbytes(xdrs, addr, len)
XDR *xdrs;
-register caddr_t addr;
-register u_int len;
+register char* addr;
+register unsigned int len;
{
register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private);
register int current;
while (len > 0) {
- current = (u_int) rstrm->out_boundry - (u_int) rstrm->out_finger;
+ current = (unsigned long) rstrm->out_boundry - (unsigned long) rstrm->out_finger;
current = (len < current) ? len : current;
- bcopy(addr, rstrm->out_finger, current);
+ memmove(rstrm->out_finger, addr, current);
rstrm->out_finger += current;
addr += current;
len -= current;
@@ -398,13 +399,13 @@ register u_int len;
return (TRUE);
}
-static u_int xdrrec_getpos(xdrs)
+static unsigned int xdrrec_getpos(xdrs)
register XDR *xdrs;
{
register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
register long pos;
- pos = lseek((int) rstrm->tcp_handle, (long) 0, 1);
+ pos = lseek((int)((long) rstrm->tcp_handle), (long) 0, 1);
if (pos != -1)
switch (xdrs->x_op) {
@@ -417,27 +418,27 @@ register XDR *xdrs;
break;
default:
- pos = (u_int) - 1;
+ pos = (unsigned int) - 1;
break;
}
- return ((u_int) pos);
+ return ((unsigned int) pos);
}
static bool_t xdrrec_setpos(xdrs, pos)
register XDR *xdrs;
-u_int pos;
+unsigned int pos;
{
register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
- u_int currpos = xdrrec_getpos(xdrs);
+ unsigned int currpos = xdrrec_getpos(xdrs);
int delta = currpos - pos;
- caddr_t newpos;
+ char* newpos;
if ((int) currpos != -1)
switch (xdrs->x_op) {
case XDR_ENCODE:
newpos = rstrm->out_finger - delta;
- if ((newpos > (caddr_t) (rstrm->frag_header)) &&
+ if ((newpos > (char*) (rstrm->frag_header)) &&
(newpos < rstrm->out_boundry)) {
rstrm->out_finger = newpos;
return (TRUE);
@@ -493,7 +494,7 @@ register XDR *xdrs;
mem_free(rstrm->the_buffer,
rstrm->sendsize + rstrm->recvsize + BYTES_PER_XDR_UNIT);
- mem_free((caddr_t) rstrm, sizeof(RECSTREAM));
+ mem_free((char*) rstrm, sizeof(RECSTREAM));
}
@@ -554,20 +555,19 @@ XDR *xdrs;
bool_t sendnow;
{
register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private);
- register u_long len; /* fragment length */
+ register unsigned long len; /* fragment length */
if (sendnow || rstrm->frag_sent ||
- ((u_long) rstrm->out_finger + sizeof(u_long) >=
- (u_long) rstrm->out_boundry)) {
+ ((unsigned long) rstrm->out_finger + sizeof(unsigned long) >=
+ (unsigned long) rstrm->out_boundry)) {
rstrm->frag_sent = FALSE;
return (flush_out(rstrm, TRUE));
}
- len = (u_long) (rstrm->out_finger) - (u_long) (rstrm->frag_header) -
- sizeof(u_long);
- *(rstrm->frag_header) = htonl((u_long) len | LAST_FRAG);
- rstrm->frag_header = (u_long *) rstrm->out_finger;
- rstrm->out_finger += sizeof(u_long);
+ len = (unsigned long) (rstrm->out_finger) - (unsigned long) (rstrm->frag_header) -
+ sizeof(unsigned long);
+ *(rstrm->frag_header) = htonl((unsigned long) len | LAST_FRAG);
+ rstrm->frag_header = (unsigned long *) rstrm->out_finger;
+ rstrm->out_finger += sizeof(unsigned long);
return (TRUE);
}
-
diff --git a/mdk-stage1/dietlibc/librpc/xdr_reference.c b/mdk-stage1/dietlibc/librpc/xdr_reference.c
index 7715d821c..3e42d12f3 100644
--- a/mdk-stage1/dietlibc/librpc/xdr_reference.c
+++ b/mdk-stage1/dietlibc/librpc/xdr_reference.c
@@ -45,7 +45,7 @@ static char sccsid[] = "@(#)xdr_reference.c 1.11 87/08/11 SMI";
#include <rpc/xdr.h>
#include <string.h>
-#define LASTUNSIGNED ((u_int)0-1)
+#define LASTUNSIGNED ((unsigned int)0-1)
/*
* XDR an indirect pointer
@@ -58,11 +58,11 @@ static char sccsid[] = "@(#)xdr_reference.c 1.11 87/08/11 SMI";
*/
bool_t xdr_reference(xdrs, pp, size, proc)
register XDR *xdrs;
-caddr_t *pp; /* the pointer to work on */
-u_int size; /* size of the object pointed to */
+char* *pp; /* the pointer to work on */
+unsigned int size; /* size of the object pointed to */
xdrproc_t proc; /* xdr routine to handle the object */
{
- register caddr_t loc = *pp;
+ register char* loc = *pp;
register bool_t stat;
if (loc == NULL)
@@ -71,12 +71,12 @@ xdrproc_t proc; /* xdr routine to handle the object */
return (TRUE);
case XDR_DECODE:
- *pp = loc = (caddr_t) mem_alloc(size);
+ *pp = loc = (char*) mem_alloc(size);
if (loc == NULL) {
(void) fprintf(stderr, "xdr_reference: out of memory\n");
return (FALSE);
}
- bzero(loc, (int) size);
+ memset(loc, 0, (int) size);
break;
}
@@ -112,7 +112,7 @@ xdrproc_t proc; /* xdr routine to handle the object */
bool_t xdr_pointer(xdrs, objpp, obj_size, xdr_obj)
register XDR *xdrs;
char **objpp;
-u_int obj_size;
+unsigned int obj_size;
xdrproc_t xdr_obj;
{
diff --git a/mdk-stage1/dietlibc/librpc/xdr_stdio.c b/mdk-stage1/dietlibc/librpc/xdr_stdio.c
index e3190e0a9..1bc9ada16 100644
--- a/mdk-stage1/dietlibc/librpc/xdr_stdio.c
+++ b/mdk-stage1/dietlibc/librpc/xdr_stdio.c
@@ -51,7 +51,7 @@ static bool_t xdrstdio_getlong();
static bool_t xdrstdio_putlong();
static bool_t xdrstdio_getbytes();
static bool_t xdrstdio_putbytes();
-static u_int xdrstdio_getpos();
+static unsigned int xdrstdio_getpos();
static bool_t xdrstdio_setpos();
static int32_t *xdrstdio_inline();
static void xdrstdio_destroy();
@@ -70,6 +70,7 @@ static struct xdr_ops xdrstdio_ops = {
xdrstdio_destroy /* destroy stream */
};
+
/*
* Initialize a stdio xdr stream.
* Sets the xdr stream handle xdrs for use on the stream file.
@@ -83,7 +84,7 @@ enum xdr_op op;
xdrs->x_op = op;
xdrs->x_ops = &xdrstdio_ops;
- xdrs->x_private = (caddr_t) file;
+ xdrs->x_private = (char*) file;
xdrs->x_handy = 0;
xdrs->x_base = 0;
}
@@ -104,7 +105,7 @@ XDR *xdrs;
register long *lp;
{
- if (fread((caddr_t) lp, sizeof(long), 1, (FILE *) xdrs->x_private) !=
+ if (fread((char*) lp, sizeof(long), 1, (FILE *) xdrs->x_private) !=
1) return (FALSE);
#ifndef mc68000
@@ -123,7 +124,7 @@ long *lp;
lp = &mycopy;
#endif
- if (fwrite((caddr_t) lp, sizeof(long), 1, (FILE *) xdrs->x_private) !=
+ if (fwrite((char*) lp, sizeof(long), 1, (FILE *) xdrs->x_private) !=
1) return (FALSE);
return (TRUE);
@@ -131,8 +132,8 @@ long *lp;
static bool_t xdrstdio_getbytes(xdrs, addr, len)
XDR *xdrs;
-caddr_t addr;
-u_int len;
+char* addr;
+unsigned int len;
{
if ((len != 0)
@@ -143,8 +144,8 @@ u_int len;
static bool_t xdrstdio_putbytes(xdrs, addr, len)
XDR *xdrs;
-caddr_t addr;
-u_int len;
+char* addr;
+unsigned int len;
{
if ((len != 0)
@@ -153,16 +154,16 @@ u_int len;
return (TRUE);
}
-static u_int xdrstdio_getpos(xdrs)
+static unsigned int xdrstdio_getpos(xdrs)
XDR *xdrs;
{
- return ((u_int) ftell((FILE *) xdrs->x_private));
+ return ((unsigned int) ftell((FILE *) xdrs->x_private));
}
static bool_t xdrstdio_setpos(xdrs, pos)
XDR *xdrs;
-u_int pos;
+unsigned int pos;
{
return ((fseek((FILE *) xdrs->x_private, (long) pos, 0) < 0) ?
@@ -171,7 +172,7 @@ u_int pos;
static int32_t *xdrstdio_inline(xdrs, len)
XDR *xdrs;
-u_int len;
+unsigned int len;
{
/*
@@ -185,3 +186,4 @@ u_int len;
*/
return (NULL);
}
+
diff --git a/mdk-stage1/dietlibc/libshell/basename.c b/mdk-stage1/dietlibc/libshell/basename.c
new file mode 100644
index 000000000..fbf5b2478
--- /dev/null
+++ b/mdk-stage1/dietlibc/libshell/basename.c
@@ -0,0 +1,27 @@
+#include <string.h>
+#include <libgen.h>
+
+/*
+ path dirname basename
+ "/usr/lib" "/usr" "lib"
+ "/usr/" "/" "usr"
+ "usr" "." "usr"
+ "/" "/" "/"
+ "." "." "."
+ ".." "." ".."
+*/
+
+char *basename(char *path) {
+ char *c;
+again:
+ if (!(c=strrchr(path,'/'))) return path;
+ if (c[1]==0) {
+ if (c == path)
+ return c;
+ else {
+ *c=0;
+ goto again;
+ }
+ }
+ return c+1;
+}
diff --git a/mdk-stage1/dietlibc/libshell/dirname.c b/mdk-stage1/dietlibc/libshell/dirname.c
new file mode 100644
index 000000000..d35e6ea62
--- /dev/null
+++ b/mdk-stage1/dietlibc/libshell/dirname.c
@@ -0,0 +1,25 @@
+#include <string.h>
+#include <libgen.h>
+
+/*
+ path dirname basename
+ "/usr/lib" "/usr" "lib"
+ "/usr/" "/" "usr"
+ "usr" "." "usr"
+ "/" "/" "/"
+ "." "." "."
+ ".." "." ".."
+*/
+
+char *dirname(char *path) {
+ char *c;
+again:
+ if (!(c=strrchr(path,'/'))) return ".";
+ while (c[1]==0) { /* remove trailing slashes */
+ if (c==path) return c; /* unless path=='/' */
+ *c=0;
+ if (*--c!='/') break;
+ }
+ if (*c=='/') { if (c!=path) *c=0; return path; }
+ goto again;
+}
diff --git a/mdk-stage1/dietlibc/libshell/fnmatch.c b/mdk-stage1/dietlibc/libshell/fnmatch.c
index 4e7664510..ef43735f6 100644
--- a/mdk-stage1/dietlibc/libshell/fnmatch.c
+++ b/mdk-stage1/dietlibc/libshell/fnmatch.c
@@ -1,5 +1,6 @@
#include <ctype.h>
#include <fnmatch.h>
+#include <string.h>
#define NOTFIRST 128
@@ -11,6 +12,7 @@ static int match(char c,char d,int flags) {
}
int fnmatch(const char *pattern, const char *string, int flags) {
+ /*printf("fnmatch(\"%s\",\"%s\")\n",pattern,string);*/
if (*string==0) {
while (*pattern=='*') ++pattern;
return (!!*pattern);
@@ -18,31 +20,36 @@ int fnmatch(const char *pattern, const char *string, int flags) {
if (*string=='.' && *pattern!='.' && (flags&FNM_PERIOD)) {
/* don't match if FNM_PERIOD and this is the first char */
if ((flags&FNM_PERIOD) && (!(flags&NOTFIRST)))
- return 1;
+ return FNM_NOMATCH;
/* don't match if FNM_PERIOD and FNM_FILE_NAME and previous was '/' */
if ((flags&(FNM_FILE_NAME|FNM_PERIOD)) && string[-1]=='/')
- return 1;
+ return FNM_NOMATCH;
}
flags|=NOTFIRST;
switch (*pattern) {
case '[':
- ++pattern;
- while (*pattern && *pattern!=']') {
- if (flags&FNM_PATHNAME || *string!='/') {
+ {
+ int neg=0;
+ ++pattern;
+ if (*string=='/' && flags&FNM_PATHNAME) return FNM_NOMATCH;
+ if (*pattern=='^') { neg=1; ++pattern; }
+ while (*pattern && *pattern!=']') {
int res=0;
if (pattern[1]=='-') {
if (*string>=*pattern && *string<=pattern[2]) res=1;
if (flags&FNM_CASEFOLD) {
if (tolower(*string)>=tolower(*pattern) && tolower(*string)<=tolower(pattern[2])) res=1;
}
- } else
+ pattern+=3;
+ } else {
res=match(*pattern,*string,flags);
- if (res) {
+ ++pattern;
+ }
+ if (res ^ neg) {
while (*pattern && *pattern!=']') ++pattern;
return fnmatch(pattern+1,string+1,flags);
}
}
- ++pattern;
}
break;
case '\\':
@@ -55,12 +62,9 @@ int fnmatch(const char *pattern, const char *string, int flags) {
}
break;
case '*':
- if (!pattern[1] || fnmatch(pattern+1,string,flags)==0)
- return 0;
- else
- if (*string!='/')
- return fnmatch(pattern,string+1,flags);
- break;
+ if ((*string=='/' && flags&FNM_PATHNAME) || fnmatch(pattern,string+1,flags))
+ return fnmatch(pattern+1,string,flags);
+ return 0;
case 0:
if (*string==0 || (*string=='/' && (flags&FNM_LEADING_DIR)))
return 0;
@@ -70,5 +74,5 @@ int fnmatch(const char *pattern, const char *string, int flags) {
return fnmatch(pattern+1,string+1,flags);
break;
}
- return 1;
+ return FNM_NOMATCH;
}
diff --git a/mdk-stage1/dietlibc/libshell/glob.c b/mdk-stage1/dietlibc/libshell/glob.c
index 34d09d87a..deb61473c 100644
--- a/mdk-stage1/dietlibc/libshell/glob.c
+++ b/mdk-stage1/dietlibc/libshell/glob.c
@@ -24,6 +24,7 @@
#include <fnmatch.h>
#include <dirent.h>
#include <pwd.h>
+#include "dietfeatures.h"
#include <glob.h>
@@ -38,7 +39,7 @@ static int cmp_func(const void * a, const void * b)
return 1;
if (s2 == NULL)
return -1;
- return strcmp(s1, s2);
+ return strcoll(s1, s2);
}
@@ -47,6 +48,39 @@ static int cmp_func(const void * a, const void * b)
The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
The GLOB_APPEND flag is assumed to be set (always appends).
Prepends DIRECTORY in constructed PGLOB. */
+static void close_dir_keep_errno(DIR* dp) {
+ int save = errno;
+ if (dp)
+ closedir (dp);
+ errno=save;
+}
+
+static int add_entry(const char* name,glob_t *pglob,int* nfound) {
+ pglob->gl_pathv = (char **) realloc(pglob->gl_pathv,
+ (pglob->gl_pathc + pglob->gl_offs + 2)
+ * sizeof (char *));
+ if (pglob->gl_pathv == NULL)
+ return 1;
+ pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = strdup(name);
+ pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc + 1] = NULL;
+ pglob->gl_pathc++;
+ (*nfound)++;
+ return 0;
+}
+
+static void build_fullname(char * fullname, int fullnamesize, const char * directory, const char * filename) {
+ char *dest=fullname;
+ char *max=fullname+fullnamesize-1;
+ if (directory[0]=='/' && !directory[1]) {
+ *dest='/'; ++dest;
+ } else if (directory[0]!='.' || directory[1]) {
+ strncpy(dest,directory,max-dest);
+ dest+=strlen(dest);
+ *dest='/'; ++dest;
+ }
+ strncpy(dest,filename,max-dest);
+}
+
static int glob_in_dir(const char *pattern, const char *directory, int flags,
int errfunc(const char * epath, int eerrno),
glob_t *pglob)
@@ -57,33 +91,6 @@ static int glob_in_dir(const char *pattern, const char *directory, int flags,
int i;
char * ptr;
- void close_dir_keep_errno(void) {
- int save = errno;
- if (dp)
- closedir (dp);
- __set_errno(save);
- }
- int add_entry(const char * name) {
- pglob->gl_pathv = (char **) realloc(pglob->gl_pathv,
- (pglob->gl_pathc + pglob->gl_offs + 2)
- * sizeof (char *));
- if (pglob->gl_pathv == NULL)
- return 1;
- pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = strdup(name);
- pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc + 1] = NULL;
- pglob->gl_pathc++;
- nfound++;
- return 0;
- }
- void build_fullname(char * fullname, int fullnamesize, const char * directory, const char * filename) {
- if (!strcmp(directory, "/"))
- snprintf(fullname, fullnamesize, "/%s", filename);
- else if (!strcmp(directory, "."))
- snprintf(fullname, fullnamesize, "%s", filename);
- else
- snprintf(fullname, fullnamesize, "%s/%s", directory, filename);
- }
-
if (!dp) {
if (errno != ENOTDIR
&& ((errfunc != NULL && (*errfunc) (directory, errno))
@@ -103,12 +110,12 @@ static int glob_in_dir(const char *pattern, const char *directory, int flags,
continue;
}
if (fnmatch(pattern, ep->d_name, fnm_flags) == 0)
- if (add_entry(ptr))
+ if (add_entry(ptr,pglob,&nfound))
goto memory_error;
}
}
- close_dir_keep_errno();
+ close_dir_keep_errno(dp);
if (nfound != 0)
pglob->gl_flags = flags;
@@ -117,7 +124,7 @@ static int glob_in_dir(const char *pattern, const char *directory, int flags,
i = strlen(directory) + strlen(pattern) + 2;
ptr = (char *) alloca(i);
build_fullname(ptr, i, directory, pattern);
- if (add_entry(ptr))
+ if (add_entry(ptr,pglob,&nfound))
goto memory_error;
}
@@ -127,7 +134,7 @@ static int glob_in_dir(const char *pattern, const char *directory, int flags,
/* We're in trouble since we can't free the already allocated memory. [allocated from strdup(filame)]
* Well, after all, when malloc returns NULL we're already in a bad mood, and no doubt the
* program will manage to segfault by itself very soon :-). */
- close_dir_keep_errno();
+ close_dir_keep_errno(dp);
return GLOB_NOSPACE;
}
@@ -146,7 +153,7 @@ int glob(const char *pattern, int flags, int errfunc(const char * epath, int eer
char * ptr, * ptr2;
if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) {
- __set_errno (EINVAL);
+ errno=EINVAL;
return -1;
}
@@ -196,10 +203,10 @@ int glob(const char *pattern, int flags, int errfunc(const char * epath, int eer
if (filename == NULL) {
/* We have no '/' in the pattern */
filename = pattern_;
- dirname = ".";
+ dirname = (char*)".";
} else if (filename == pattern_) {
/* "/pattern". */
- dirname = "/";
+ dirname = (char*)"/";
filename++;
} else {
dirname = pattern_;
@@ -299,7 +306,7 @@ int glob(const char *pattern, int flags, int errfunc(const char * epath, int eer
globfree(pglob);
return GLOB_NOSPACE;
}
- snprintf(pglob->gl_pathv[j], k, "%s/%s", dirs.gl_pathv[i], filename);
+ build_fullname(pglob->gl_pathv[j], k, dirs.gl_pathv[i], filename);
pglob->gl_pathc++;
pglob->gl_pathv[j+1] = NULL;
}
diff --git a/mdk-stage1/dietlibc/libshell/realpath.c b/mdk-stage1/dietlibc/libshell/realpath.c
index 1377018e5..9aee2c585 100644
--- a/mdk-stage1/dietlibc/libshell/realpath.c
+++ b/mdk-stage1/dietlibc/libshell/realpath.c
@@ -5,21 +5,21 @@
#include <string.h>
#include "dietfeatures.h"
-char *realpath(const char *path, char *resolved_path) {
+char* realpath(const char *path, char *resolved_path) {
int fd=open(".",O_RDONLY);
- char *tmp="";
+ char* tmp=(char*)"";
+ if (fd<0) return 0;
if (chdir(path)) {
-#ifdef WANT_THREAD_SAFE
- if (*__errno_location()==ENOTDIR)
-#else
- if (errno==ENOTDIR)
-#endif
- {
- if ((tmp=strrchr(path,'/'))) {
+ if (errno==ENOTDIR) {
+ char* match;
+ if ((match=strrchr(path,'/'))) {
+ tmp=match;
memmove(resolved_path,path,tmp-path);
resolved_path[tmp-path]=0;
if (chdir(resolved_path)) { resolved_path=0; goto abort; }
}
+ } else {
+ resolved_path=0; goto abort;
}
}
if (!getcwd(resolved_path,PATH_MAX)) { resolved_path=0; goto abort; }
diff --git a/mdk-stage1/dietlibc/libstdio/fclose.c b/mdk-stage1/dietlibc/libstdio/fclose.c
index a955c6086..491ed2522 100644
--- a/mdk-stage1/dietlibc/libstdio/fclose.c
+++ b/mdk-stage1/dietlibc/libstdio/fclose.c
@@ -4,14 +4,9 @@
int fclose(FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
FILE *f,*fl;
-#endif
- if (!stream)
- return EOF;
fflush(stream);
res=close(stream->fd);
-#ifdef WANT_BUFFERED_STDIO
for (fl=0,f=__stdio_root; f; fl=f,f=f->next)
if (f==stream) {
if (fl)
@@ -20,7 +15,8 @@ int fclose(FILE *stream) {
__stdio_root=f->next;
break;
}
-#endif
+ if ((!(stream->flags&STATICBUF))&&(stream->buf))
+ free(stream->buf);
free(stream);
return res;
}
diff --git a/mdk-stage1/dietlibc/libstdio/fdglue.c b/mdk-stage1/dietlibc/libstdio/fdglue.c
index 1c3918f1f..9542711e2 100644
--- a/mdk-stage1/dietlibc/libstdio/fdglue.c
+++ b/mdk-stage1/dietlibc/libstdio/fdglue.c
@@ -1,13 +1,9 @@
-#include "dietstdio.h"
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
-
-#ifdef WANT_BUFFERED_STDIO
-extern int __stdio_atexit;
-extern void __stdio_flushall();
-#endif
+#include <pthread.h>
+#include "dietstdio.h"
int __stdio_parse_mode(const char *mode) {
int f=0;
@@ -24,29 +20,3 @@ int __stdio_parse_mode(const char *mode) {
}
}
-FILE* __stdio_init_file(int fd) {
- FILE *tmp=(FILE*)malloc(sizeof(FILE));
- if (!tmp) {
- close(fd);
- errno=ENOMEM;
- return 0;
- }
- tmp->fd=fd;
-#ifdef WANT_BUFFERED_STDIO
- tmp->bm=0;
- tmp->bs=0;
-#endif
-#ifdef WANT_UNGETC
- tmp->ungotten = 0;
-#endif
- tmp->flags=0;
-#ifdef WANT_BUFFERED_STDIO
- if (__stdio_atexit==0) {
- __stdio_atexit=1;
- atexit(__stdio_flushall);
- }
- tmp->next=__stdio_root;
- __stdio_root=tmp;
-#endif
- return tmp;
-}
diff --git a/mdk-stage1/dietlibc/libstdio/fdglue2.c b/mdk-stage1/dietlibc/libstdio/fdglue2.c
new file mode 100644
index 000000000..a76d4698d
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fdglue2.c
@@ -0,0 +1,37 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "dietstdio.h"
+#include <stdlib.h>
+#include <pthread.h>
+
+extern int __stdio_atexit;
+
+FILE* __stdio_init_file_nothreads(int fd,int closeonerror);
+FILE* __stdio_init_file_nothreads(int fd,int closeonerror) {
+ FILE *tmp=(FILE*)malloc(sizeof(FILE));
+ if (!tmp) goto err_out;
+ tmp->buf=(char*)malloc(BUFSIZE);
+ if (!tmp->buf) {
+ free(tmp);
+err_out:
+ if (closeonerror) close(fd);
+ errno=ENOMEM;
+ return 0;
+ }
+ tmp->fd=fd;
+ tmp->bm=0;
+ tmp->bs=0;
+ tmp->buflen=BUFSIZE;
+ tmp->flags=0;
+ if (__stdio_atexit==0) {
+ __stdio_atexit=1;
+ atexit(__stdio_flushall);
+ }
+ tmp->next=__stdio_root;
+ __stdio_root=tmp;
+ tmp->ungotten=0;
+ return tmp;
+}
+
+FILE* __stdio_init_file(int fd,int closeonerror) __attribute__((weak,alias("__stdio_init_file_nothreads")));
diff --git a/mdk-stage1/dietlibc/libstdio/fdopen.c b/mdk-stage1/dietlibc/libstdio/fdopen.c
index aee14fb0c..748b716eb 100644
--- a/mdk-stage1/dietlibc/libstdio/fdopen.c
+++ b/mdk-stage1/dietlibc/libstdio/fdopen.c
@@ -1,21 +1,13 @@
+#include <errno.h>
+#include "dietfeatures.h"
#include <sys/types.h>
#include <dietstdio.h>
#include <unistd.h>
-#define SEEK_END 2
-
-int __stdio_parse_mode(const char *mode);
-FILE* __stdio_init_file(int fd);
-
-FILE *fdopen (int filedes, const char *mode) {
+FILE *fdopen(int filedes, const char *mode) {
int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */
- int fd;
f=__stdio_parse_mode(mode);
- if ((fd=filedes)<0) return 0;
- {
- FILE * ret = __stdio_init_file(fd);
- ret->flags |= UNSEEKABLE;
- return ret;
- }
+ if (filedes<0) { errno=EBADF; return 0; }
+ return __stdio_init_file(filedes,0);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fdprintf.c b/mdk-stage1/dietlibc/libstdio/fdprintf.c
new file mode 100644
index 000000000..f9fc7a3b4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fdprintf.c
@@ -0,0 +1,13 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int fdprintf(int fd,const char *format,...) {
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr,format);
+ n=vfdprintf(fd,format,arg_ptr);
+ va_end(arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/feof.c b/mdk-stage1/dietlibc/libstdio/feof.c
index b7e86fe3b..bf2267fcf 100644
--- a/mdk-stage1/dietlibc/libstdio/feof.c
+++ b/mdk-stage1/dietlibc/libstdio/feof.c
@@ -1,9 +1,7 @@
#include <dietstdio.h>
int feof(FILE *stream) {
-#ifdef WANT_UNGETC
/* yuck!!! */
if (stream->ungotten) return 0;
-#endif
return (stream->flags&EOFINDICATOR);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fflush.c b/mdk-stage1/dietlibc/libstdio/fflush.c
index 7078e04f4..6f2003702 100644
--- a/mdk-stage1/dietlibc/libstdio/fflush.c
+++ b/mdk-stage1/dietlibc/libstdio/fflush.c
@@ -1,21 +1,16 @@
-#include "dietstdio.h"
#include <unistd.h>
#include <stdlib.h>
#include "dietwarning.h"
+#include "dietstdio.h"
FILE *__stdio_root;
-#ifdef WANT_BUFFERED_STDIO
int __stdio_atexit=0;
-void __stdio_flushall() {
+void __stdio_flushall(void) {
fflush(0);
}
-extern int __fflush_stdin();
-extern int __fflush_stdout();
-extern int __fflush_stderr();
-
int fflush(FILE *stream) {
if (stream==0) {
int res;
@@ -28,15 +23,20 @@ int fflush(FILE *stream) {
res=-1;
return res;
}
+// if (stream->flags&NOBUF) return 0;
if (stream->flags&BUFINPUT) {
register int tmp;
- if ((tmp=stream->bm-stream->bs)) lseek(stream->fd,tmp,SEEK_CUR);
- } else
- if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=stream->bm) {
+ if ((tmp=stream->bm-stream->bs)) {
+ lseek(stream->fd,tmp,SEEK_CUR);
+ }
+ stream->bs=stream->bm=0;
+ } else {
+ if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=(int)stream->bm) {
stream->flags|=ERRORINDICATOR;
return -1;
}
- stream->bm=0;
+ stream->bm=0;
+ }
return 0;
}
@@ -50,13 +50,15 @@ int __fflush4(FILE *stream,int next) {
stream->flags=(stream->flags&~BUFINPUT)|next;
return res;
}
+ if (stream->fd==0) __fflush_stdout();
return 0;
}
-#else
-int fflush(FILE *stream) {
- return 0;
+/* Internal function, has no prototype.
+ * This is defined here because of the weak symbol ELF semantics */
+int __stdio_outs(const char *s,size_t len);
+int __stdio_outs(const char *s,size_t len) {
+ return fwrite(s,1,(size_t)len,stdout);
}
-#endif
-link_warning("fflush","warning: your code uses stdio (several kilobytes of bloat).")
+link_warning("fflush","warning: your code uses stdio (7+k bloat).")
diff --git a/mdk-stage1/dietlibc/libstdio/fgetc.c b/mdk-stage1/dietlibc/libstdio/fgetc_unlocked.c
index 90d83961a..5136c8df1 100644
--- a/mdk-stage1/dietlibc/libstdio/fgetc.c
+++ b/mdk-stage1/dietlibc/libstdio/fgetc_unlocked.c
@@ -1,22 +1,17 @@
#include "dietstdio.h"
#include <unistd.h>
-extern int feof(FILE *stream);
-
-int fgetc(FILE *stream) {
+int fgetc_unlocked(FILE *stream) {
unsigned char c;
-#ifdef WANT_UNGETC
if (stream->ungotten) {
stream->ungotten=0;
return stream->ungetbuf;
}
-#endif
if (feof(stream))
return EOF;
-#ifdef WANT_BUFFERED_STDIO
if (__fflush4(stream,BUFINPUT)) return EOF;
if (stream->bm>=stream->bs) {
- int len=read(stream->fd,stream->buf,BUFSIZE);
+ int len=read(stream->fd,stream->buf,stream->buflen);
if (len==0) {
stream->flags|=EOFINDICATOR;
return EOF;
@@ -30,11 +25,6 @@ int fgetc(FILE *stream) {
c=stream->buf[stream->bm];
++stream->bm;
return c;
-#else
- if (read(stream->fd,&c,1)!=1) {
- stream->flags|=ERRORINDICATOR;
- return EOF;
- }
- return c;
-#endif
}
+
+int fgetc(FILE* stream) __attribute__((weak,alias("fgetc_unlocked")));
diff --git a/mdk-stage1/dietlibc/libstdio/fgetpos.c b/mdk-stage1/dietlibc/libstdio/fgetpos.c
new file mode 100644
index 000000000..d58b6fa5b
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fgetpos.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+int fgetpos(FILE *stream, fpos_t *pos) {
+ long l=ftell(stream);
+ if (l==-1) return -1;
+ *pos=l;
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/fgets.c b/mdk-stage1/dietlibc/libstdio/fgets.c
index c613d452d..d2ce4195d 100644
--- a/mdk-stage1/dietlibc/libstdio/fgets.c
+++ b/mdk-stage1/dietlibc/libstdio/fgets.c
@@ -1,11 +1,9 @@
#include "dietstdio.h"
-extern int ferror(FILE *stream);
-
char *fgets(char *s, int size, FILE *stream) {
char *orig=s;
int l;
- for (l=size; l>0;) {
+ for (l=size; l>1;) {
int c=fgetc(stream);
if (c==EOF) break;
*s=c;
diff --git a/mdk-stage1/dietlibc/libstdio/fopen.c b/mdk-stage1/dietlibc/libstdio/fopen.c
index aac17be42..3d9c28198 100644
--- a/mdk-stage1/dietlibc/libstdio/fopen.c
+++ b/mdk-stage1/dietlibc/libstdio/fopen.c
@@ -2,13 +2,7 @@
#include <dietstdio.h>
#include <unistd.h>
-#define SEEK_END 2
-
extern int __stdio_atexit;
-extern void __stdio_flushall();
-
-extern int __stdio_parse_mode(const char *mode);
-extern FILE* __stdio_init_file(int fd);
FILE *fopen (const char *path, const char *mode) {
int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */
@@ -17,5 +11,5 @@ FILE *fopen (const char *path, const char *mode) {
f=__stdio_parse_mode(mode);
if ((fd=open(path,f,0666))<0)
return 0;
- return __stdio_init_file(fd);
+ return __stdio_init_file(fd,1);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fprintf.c b/mdk-stage1/dietlibc/libstdio/fprintf.c
index 237fd1e51..6b3849a33 100644
--- a/mdk-stage1/dietlibc/libstdio/fprintf.c
+++ b/mdk-stage1/dietlibc/libstdio/fprintf.c
@@ -1,23 +1,13 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
-extern int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
int fprintf(FILE *f,const char *format,...) {
int n;
- char *printf_buf;
-/* char printf_buf[1024]; */
va_list arg_ptr;
- va_start(arg_ptr, format);
- n=vsnprintf(0,1000000,format,arg_ptr);
-/* write(1,printf_buf,strlen(printf_buf)); */
- va_end (arg_ptr);
- va_start (arg_ptr, format);
- printf_buf=alloca(n+2);
- n=vsnprintf(printf_buf,n+1,format,arg_ptr);
- va_end (arg_ptr);
- fwrite(printf_buf,n,1,f);
+ va_start(arg_ptr,format);
+ n=vfprintf(f,format,arg_ptr);
+ va_end(arg_ptr);
return n;
}
diff --git a/mdk-stage1/dietlibc/libstdio/fputc.c b/mdk-stage1/dietlibc/libstdio/fputc.c
deleted file mode 100644
index b816f7c4d..000000000
--- a/mdk-stage1/dietlibc/libstdio/fputc.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <dietstdio.h>
-#ifndef WANT_BUFFERED_STDIO
-#include <unistd.h>
-#endif
-
-int fputc(int c, FILE *stream) {
-#ifdef WANT_BUFFERED_STDIO
- if (__fflush4(stream,0)) return EOF;
- if (stream->bm>=BUFSIZE-1)
- if (fflush(stream)) return EOF;
- stream->buf[stream->bm]=c;
- ++stream->bm;
- if ((stream->flags&BUFLINEWISE) && c=='\n') /* puke */
- if (fflush(stream)) return EOF;
-#else
- write(stream->fd,&c,1);
-#endif
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/libstdio/fputc_unlocked.c b/mdk-stage1/dietlibc/libstdio/fputc_unlocked.c
new file mode 100644
index 000000000..6441c5741
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fputc_unlocked.c
@@ -0,0 +1,20 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+int fputc_unlocked(int c, FILE *stream) {
+ if (__fflush4(stream,0)) return EOF;
+ if (stream->bm>=stream->buflen-1)
+ if (fflush(stream)) return EOF;
+ if (stream->flags&NOBUF) {
+ if (write(stream->fd,&c,1) != 1) return EOF;
+ return 0;
+ }
+ stream->buf[stream->bm]=c;
+ ++stream->bm;
+ if (((stream->flags&BUFLINEWISE) && c=='\n') ||
+ ((stream->flags&NOBUF))) /* puke */
+ if (fflush(stream)) return EOF;
+ return 0;
+}
+
+int fputc(int c,FILE* stream) __attribute__((weak,alias("fputc_unlocked")));
diff --git a/mdk-stage1/dietlibc/libstdio/fread.c b/mdk-stage1/dietlibc/libstdio/fread.c
index 29afa1489..63ad4c2bc 100644
--- a/mdk-stage1/dietlibc/libstdio/fread.c
+++ b/mdk-stage1/dietlibc/libstdio/fread.c
@@ -4,48 +4,43 @@
size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
unsigned long i,j;
j=size*nmemb;
-#ifdef WANT_UNGETC
+ i=0;
+
+ if (!j || j/nmemb!=size) return 0;
if (stream->ungotten) {
+ stream->ungotten=0;
*(char*)ptr=stream->ungetbuf;
- ptr=((char*)ptr)+1;
- --j;
+ ++i;
}
if (!j) return 1;
+
+#ifdef WANT_FREAD_OPTIMIZATION
+ if (j>stream->buflen) {
+ size_t tmp=j-i;
+ int res;
+ fflush(stream);
+ while ((res=read(stream->fd,ptr+i,tmp))<(int)tmp) {
+ if (res==-1) {
+ stream->flags|=ERRORINDICATOR;
+ goto exit;
+ } else if (!res) {
+ stream->flags|=EOFINDICATOR;
+ goto exit;
+ }
+ i+=res; tmp-=res;
+ }
+ return nmemb;
+ }
#endif
- for (i=0; i<j; ++i) {
+ for (; i<j; ++i) {
res=fgetc(stream);
if (res==EOF)
+exit:
return i/size;
else
((unsigned char*)ptr)[i]=(unsigned char)res;
}
return nmemb;
-#else
-#ifdef WANT_UNGETC
- unsigned long j=size*nmemb;
-#endif
- fflush(stream);
-#ifdef WANT_UNGETC
- if (stream->ungotten) {
- *(char*)ptr=stream->ungetbuf;
- ptr=((char*)ptr)+1;
- --j;
- }
- if (!j) return 1;
- res=read(stream->fd,ptr,j);
-#else
- res=read(stream->fd,ptr,size*nmemb);
-#endif
- if (res<0) {
- stream->flags|=ERRORINDICATOR;
- return 0;
- } else if (res<size*nmemb)
- if (!(stream->flags & UNSEEKABLE)
- || ((stream->flags & UNSEEKABLE) && res == 0))
- stream->flags|=EOFINDICATOR;
- return res/size;
-#endif
}
diff --git a/mdk-stage1/dietlibc/libstdio/fscanf.c b/mdk-stage1/dietlibc/libstdio/fscanf.c
new file mode 100644
index 000000000..07f477462
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fscanf.c
@@ -0,0 +1,14 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+#include <unistd.h>
+
+int fscanf(FILE *stream, const char *format, ...) {
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr, format);
+ n=vfscanf(stream,format,arg_ptr);
+ va_end (arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/fseek.c b/mdk-stage1/dietlibc/libstdio/fseek.c
index 5bb96bc6e..a49230f0a 100644
--- a/mdk-stage1/dietlibc/libstdio/fseek.c
+++ b/mdk-stage1/dietlibc/libstdio/fseek.c
@@ -1,11 +1,10 @@
#include <dietstdio.h>
#include <unistd.h>
-long fseek(FILE *stream, long offset, int whence) {
+int fseek(FILE *stream, long offset, int whence) {
fflush(stream);
-#ifdef WANT_BUFFERED_STDIO
stream->bm=0; stream->bs=0;
-#endif
stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
- return (lseek(stream->fd,offset,whence));
+ stream->ungotten=0;
+ return lseek(stream->fd,offset,whence)!=-1?0:-1;
}
diff --git a/mdk-stage1/dietlibc/libstdio/fseeko.c b/mdk-stage1/dietlibc/libstdio/fseeko.c
new file mode 100644
index 000000000..6459a6ff4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fseeko.c
@@ -0,0 +1,10 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+int fseeko(FILE *stream, off_t offset, int whence) {
+ fflush(stream);
+ stream->bm=0; stream->bs=0;
+ stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
+ stream->ungotten=0;
+ return lseek(stream->fd,offset,whence)!=-1?0:-1;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/fseeko64.c b/mdk-stage1/dietlibc/libstdio/fseeko64.c
new file mode 100644
index 000000000..3b00596a1
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fseeko64.c
@@ -0,0 +1,12 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+#ifndef __NO_STAT64
+int fseeko64(FILE *stream, off64_t offset, int whence) {
+ fflush(stream);
+ stream->bm=0; stream->bs=0;
+ stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
+ stream->ungotten=0;
+ return lseek64(stream->fd,offset,whence)!=-1?0:-1;
+}
+#endif
diff --git a/mdk-stage1/dietlibc/libstdio/fsetpos.c b/mdk-stage1/dietlibc/libstdio/fsetpos.c
new file mode 100644
index 000000000..336135fff
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fsetpos.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+int fsetpos(FILE *stream, fpos_t *pos) {
+ if (fseek(stream,*pos,SEEK_SET)==-1)
+ return -1;
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/ftell.c b/mdk-stage1/dietlibc/libstdio/ftell.c
index 42d2c9f26..48f74858a 100644
--- a/mdk-stage1/dietlibc/libstdio/ftell.c
+++ b/mdk-stage1/dietlibc/libstdio/ftell.c
@@ -3,5 +3,5 @@
long ftell(FILE *stream) {
fflush(stream);
- return (lseek(stream->fd,0,SEEK_CUR));
+ return (lseek(stream->fd,0,SEEK_CUR)-stream->ungotten);
}
diff --git a/mdk-stage1/dietlibc/libstdio/ftello.c b/mdk-stage1/dietlibc/libstdio/ftello.c
new file mode 100644
index 000000000..9d36318e2
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/ftello.c
@@ -0,0 +1,7 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+off_t ftello(FILE *stream) {
+ fflush(stream);
+ return (lseek(stream->fd,0,SEEK_CUR));
+}
diff --git a/mdk-stage1/dietlibc/libstdio/ftello64.c b/mdk-stage1/dietlibc/libstdio/ftello64.c
new file mode 100644
index 000000000..bda7a7de4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/ftello64.c
@@ -0,0 +1,9 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+#ifndef __NO_STAT64
+off64_t ftello64(FILE *stream) {
+ fflush(stream);
+ return (lseek64(stream->fd,0ull,SEEK_CUR));
+}
+#endif
diff --git a/mdk-stage1/dietlibc/libstdio/fwrite.c b/mdk-stage1/dietlibc/libstdio/fwrite.c
index 5691661a5..e2536ccfb 100644
--- a/mdk-stage1/dietlibc/libstdio/fwrite.c
+++ b/mdk-stage1/dietlibc/libstdio/fwrite.c
@@ -1,30 +1,28 @@
#include <sys/types.h>
#include "dietstdio.h"
#include <unistd.h>
+#include <errno.h>
-size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream) {
+size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
- long len=size*nmemb;
+ unsigned long len=size*nmemb;
long i;
- if (len>BUFSIZE || (stream->flags&NOBUF)) {
- if (!(stream->flags&NOBUF)) fflush(stream);
- res=write(stream->fd,ptr,size*nmemb);
+ if (!nmemb || len/nmemb!=size) return 0; /* check for integer overflow */
+ if (len>stream->buflen || (stream->flags&NOBUF)) {
+ fflush(stream);
+ do {
+ res=write(stream->fd,ptr,size*nmemb);
+ } while (res==-1 && errno==EINTR);
} else {
register const unsigned char *c=ptr;
- for (i=size*nmemb; i>0; --i,++c)
- if (fputc(*c,stream)) {
- res=-1;
- break;
- }
- res=size*nmemb;
+ for (i=len; i>0; --i,++c)
+ if (fputc(*c,stream)) { res=len-i; goto abort; }
+ res=len;
}
-#else
- res=write(stream->fd,ptr,size*nmemb);
-#endif
if (res<0) {
stream->flags|=ERRORINDICATOR;
return 0;
}
+abort:
return size?res/size:0;
}
diff --git a/mdk-stage1/dietlibc/libstdio/printf.c b/mdk-stage1/dietlibc/libstdio/printf.c
index 571420dc3..5af172c58 100644
--- a/mdk-stage1/dietlibc/libstdio/printf.c
+++ b/mdk-stage1/dietlibc/libstdio/printf.c
@@ -1,29 +1,15 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include "dietstdio.h"
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
int printf(const char *format,...)
{
int n;
- char *printf_buf;
-/* char printf_buf[1024]; */
va_list arg_ptr;
va_start(arg_ptr, format);
- n=vsnprintf(0,1000000,format,arg_ptr);
-/* write(1,printf_buf,strlen(printf_buf)); */
- va_end (arg_ptr);
- va_start (arg_ptr, format);
- printf_buf=alloca(n+2);
- n=vsnprintf(printf_buf,n+1,format,arg_ptr);
-#ifdef WANT_BUFFERED_STDIO
- fwrite(printf_buf,n,1,stdout);
-#else
- write(1,printf_buf,n);
-#endif
- va_end (arg_ptr);
+ n=vprintf(format, arg_ptr);
+ va_end(arg_ptr);
return n;
}
diff --git a/mdk-stage1/dietlibc/libstdio/puts.c b/mdk-stage1/dietlibc/libstdio/puts.c
new file mode 100644
index 000000000..b1da01f9d
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/puts.c
@@ -0,0 +1,16 @@
+#include <unistd.h>
+#include <string.h>
+#include "dietstdio.h"
+#include "dietfeatures.h"
+
+int __cheap_outs(const char *s,size_t len);
+int __cheap_outs(const char *s,size_t len) {
+ return (size_t)write(1,s,len)==len?1:0;
+}
+
+int __stdio_outs(const char *s,size_t len) __attribute__((weak,alias("__cheap_outs")));
+
+int puts(const char *s) {
+ return (__stdio_outs(s,strlen(s)) && __stdio_outs("\n",1))?0:-1;
+}
+
diff --git a/mdk-stage1/dietlibc/libstdio/scanf.c b/mdk-stage1/dietlibc/libstdio/scanf.c
new file mode 100644
index 000000000..589c19f41
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/scanf.c
@@ -0,0 +1,14 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+#include <unistd.h>
+
+int scanf(const char *format, ...) {
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr, format);
+ n=vfscanf(stdin,format,arg_ptr);
+ va_end (arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/setvbuf.c b/mdk-stage1/dietlibc/libstdio/setvbuf.c
index d0b1b7640..b8b50addf 100644
--- a/mdk-stage1/dietlibc/libstdio/setvbuf.c
+++ b/mdk-stage1/dietlibc/libstdio/setvbuf.c
@@ -1,18 +1,34 @@
#include <sys/types.h>
#include "dietstdio.h"
#include <unistd.h>
+#include <stdlib.h>
#include "dietwarning.h"
-int setvbuf(FILE *stream, char *buf, int flags , size_t size) {
-#ifdef WANT_BUFFERED_STDIO
+static int set_flags (FILE *stream, int flags) {
switch (flags) {
- case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break;
- case _IOLBF: stream->flags = (stream->flags & ~(BUFLINEWISE|NOBUF)) | BUFLINEWISE; break;
- case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break;
- default: return -1;
+ case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break;
+ case _IOLBF: stream->flags = (stream->flags & ~(NOBUF)) | BUFLINEWISE; break;
+ case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break;
+ default: return -1;
}
-#endif
return 0;
}
-link_warning("setvbuf","setvbuf does not implement changing the buffer in diet libc.")
+int setvbuf(FILE *stream, char *buf, int flags, size_t size) {
+ if (buf) {
+ if (!(stream->flags&STATICBUF)) free(stream->buf);
+ stream->buf=buf;
+ }
+ else {
+ char *tmp;
+ if (!size) {
+ return set_flags(stream,flags);
+ }
+ if (!(tmp=malloc(size))) return -1;
+ if (!(stream->flags&STATICBUF)) free(stream->buf);
+ stream->buf=tmp;
+ }
+ stream->buflen=size;
+ stream->bm=stream->bs=0;
+ return set_flags(stream,flags);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stderr.c b/mdk-stage1/dietlibc/libstdio/stderr.c
index a82b1b727..a9a34fd7e 100644
--- a/mdk-stage1/dietlibc/libstdio/stderr.c
+++ b/mdk-stage1/dietlibc/libstdio/stderr.c
@@ -1,13 +1,22 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stderr = { 2, NOBUF, 0, 0 };
-
-int __fflush_stderr() {
- return fflush(stderr);
-}
-#else
-static FILE __stderr = { 2, 0 };
+static FILE __stderr = {
+ .fd=2,
+ .flags=NOBUF,
+ .bs=0, .bm=0,
+ .buflen=0,
+ .buf=0,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stderr=&__stderr;
+
+int __fflush_stderr(void) {
+ return fflush(stderr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stdin.c b/mdk-stage1/dietlibc/libstdio/stdin.c
index 2db82f9ab..217f3f609 100644
--- a/mdk-stage1/dietlibc/libstdio/stdin.c
+++ b/mdk-stage1/dietlibc/libstdio/stdin.c
@@ -1,13 +1,23 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stdin = { 0, BUFINPUT, 0, 0 };
-
-int __fflush_stdin() {
- return fflush(stdin);
-}
-#else
-static FILE __stdin = { 0, 0 };
+static char __stdin_buf[BUFSIZE];
+static FILE __stdin = {
+ .fd=0,
+ .flags=BUFINPUT|STATICBUF,
+ .bs=0, .bm=0,
+ .buflen=BUFSIZE,
+ .buf=__stdin_buf,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stdin=&__stdin;
+
+int __fflush_stdin(void) {
+ return fflush(stdin);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stdout.c b/mdk-stage1/dietlibc/libstdio/stdout.c
index 481fb1014..08054d0d4 100644
--- a/mdk-stage1/dietlibc/libstdio/stdout.c
+++ b/mdk-stage1/dietlibc/libstdio/stdout.c
@@ -1,14 +1,23 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stdout = { 1, BUFLINEWISE, 0, 0 };
-
-int __fflush_stdout() {
- return fflush(stdout);
-}
-#else
-static FILE __stdout = { 1, 0 };
+static char __stdout_buf[BUFSIZE];
+static FILE __stdout = {
+ .fd=1,
+ .flags=BUFLINEWISE|STATICBUF,
+ .bs=0, .bm=0,
+ .buflen=BUFSIZE,
+ .buf=__stdout_buf,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stdout=&__stdout;
+int __fflush_stdout(void) {
+ return fflush(stdout);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/tmpfile.c b/mdk-stage1/dietlibc/libstdio/tmpfile.c
new file mode 100644
index 000000000..b20d8410d
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/tmpfile.c
@@ -0,0 +1,12 @@
+#include "dietstdio.h"
+#include <stdlib.h>
+#include <unistd.h>
+
+FILE *tmpfile (void) {
+ int fd;
+ char template[20] = "/tmp/tmpfile-XXXXXX";
+ if ((fd=mkstemp(template))<0)
+ return 0;
+ unlink(template);
+ return __stdio_init_file(fd,1);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/ungetc.c b/mdk-stage1/dietlibc/libstdio/ungetc.c
index ae03e9381..133e92820 100644
--- a/mdk-stage1/dietlibc/libstdio/ungetc.c
+++ b/mdk-stage1/dietlibc/libstdio/ungetc.c
@@ -1,11 +1,10 @@
#include "dietstdio.h"
-#ifdef WANT_UNGETC
int ungetc(int c, FILE *stream) {
- if (stream->ungotten)
+ if (stream->ungotten || c<0 || c>255)
return EOF;
stream->ungotten=1;
- stream->ungetbuf=(char)(unsigned char)c;
+ stream->ungetbuf=(unsigned char)c;
+ stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
return c;
}
-#endif
diff --git a/mdk-stage1/dietlibc/libstdio/vfdprintf.c b/mdk-stage1/dietlibc/libstdio/vfdprintf.c
new file mode 100644
index 000000000..fdfeb09e1
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vfdprintf.c
@@ -0,0 +1,15 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+
+static int __fwrite(void*ptr, size_t nmemb, int fd) {
+ return write(fd,ptr,nmemb);
+}
+
+int vfdprintf(int fd, const char *format, va_list arg_ptr)
+{
+ struct arg_printf ap = { (void*)(long)fd, (int(*)(void*,size_t,void*)) __fwrite };
+ return __v_printf(&ap,format,arg_ptr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/vfprintf.c b/mdk-stage1/dietlibc/libstdio/vfprintf.c
new file mode 100644
index 000000000..5e64cf099
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vfprintf.c
@@ -0,0 +1,15 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+
+static int __fwrite(void*ptr, size_t nmemb, FILE* f) {
+ return fwrite(ptr,1,nmemb,f);
+}
+
+int vfprintf(FILE *stream, const char *format, va_list arg_ptr)
+{
+ struct arg_printf ap = { stream, (int(*)(void*,size_t,void*)) __fwrite };
+ return __v_printf(&ap,format,arg_ptr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/vfscanf.c b/mdk-stage1/dietlibc/libstdio/vfscanf.c
new file mode 100644
index 000000000..6d75a45ac
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vfscanf.c
@@ -0,0 +1,11 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+#include <unistd.h>
+
+int vfscanf(FILE *stream, const char *format, va_list arg_ptr)
+{
+ struct arg_scanf farg = { (void*)stream, (int(*)(void*))fgetc, (int(*)(int,void*))ungetc };
+ return __v_scanf(&farg,format,arg_ptr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/vprintf.c b/mdk-stage1/dietlibc/libstdio/vprintf.c
new file mode 100644
index 000000000..7fe579e0a
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vprintf.c
@@ -0,0 +1,15 @@
+#include <stdarg.h>
+#include <unistd.h>
+#include "dietstdio.h"
+
+int __stdio_outs(const char *s,size_t len) __attribute__((weak));
+int __stdio_outs(const char *s,size_t len) {
+ return (write(1,s,len)==(int)len)?1:0;
+}
+
+int vprintf(const char *format, va_list ap)
+{
+ struct arg_printf _ap = { 0, (int(*)(void*,size_t,void*)) __stdio_outs };
+ return __v_printf(&_ap,format,ap);
+}
+
diff --git a/mdk-stage1/dietlibc/libstdio/vscanf.c b/mdk-stage1/dietlibc/libstdio/vscanf.c
new file mode 100644
index 000000000..ba9358fc4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vscanf.c
@@ -0,0 +1,10 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+#include <unistd.h>
+
+int vscanf(const char *format, va_list arg_ptr)
+{
+ return vfscanf(stdin,format,arg_ptr);
+}
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]=':';