summaryrefslogtreecommitdiffstats
path: root/mdk-stage1
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1')
-rw-r--r--mdk-stage1/.cvsignore7
-rw-r--r--mdk-stage1/.gitignore13
-rw-r--r--mdk-stage1/Makefile204
-rw-r--r--mdk-stage1/Makefile.common37
-rw-r--r--mdk-stage1/NEWS572
-rw-r--r--mdk-stage1/adsl.c183
-rw-r--r--mdk-stage1/adsl.h34
-rw-r--r--mdk-stage1/automatic.c45
-rw-r--r--mdk-stage1/automatic.h5
-rw-r--r--mdk-stage1/bzlib/Makefile47
-rw-r--r--mdk-stage1/bzlib/blocksort.c1138
-rw-r--r--mdk-stage1/bzlib/bzlib.c1567
-rw-r--r--mdk-stage1/bzlib/bzlib_private.h530
-rw-r--r--mdk-stage1/bzlib/compress.c720
-rw-r--r--mdk-stage1/bzlib/crctable.c148
-rw-r--r--mdk-stage1/bzlib/decompress.c664
-rw-r--r--mdk-stage1/bzlib/huffman.c232
-rw-r--r--mdk-stage1/bzlib/randtable.c128
-rw-r--r--mdk-stage1/cdrom.c163
-rw-r--r--mdk-stage1/cdrom.h4
-rw-r--r--mdk-stage1/config-stage1.h55
-rw-r--r--mdk-stage1/dhcp.c160
-rw-r--r--mdk-stage1/dhcp.h9
-rw-r--r--mdk-stage1/dietlibc/AUTHOR1
-rw-r--r--mdk-stage1/dietlibc/Makefile79
-rw-r--r--mdk-stage1/dietlibc/README11
-rw-r--r--mdk-stage1/dietlibc/alpha/Makefile.add5
-rw-r--r--mdk-stage1/dietlibc/alpha/__longjmp.S38
-rw-r--r--mdk-stage1/dietlibc/alpha/accept.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/bind.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/clone.S42
-rw-r--r--mdk-stage1/dietlibc/alpha/connect.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/divq.S102
-rw-r--r--mdk-stage1/dietlibc/alpha/getegid.S11
-rw-r--r--mdk-stage1/dietlibc/alpha/geteuid.S11
-rw-r--r--mdk-stage1/dietlibc/alpha/getgid.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getpeername.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getpid.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getppid.S11
-rw-r--r--mdk-stage1/dietlibc/alpha/getsockname.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getsockopt.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getuid.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/listen.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/mmap.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/pipe.S17
-rw-r--r--mdk-stage1/dietlibc/alpha/recv.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/recvfrom.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/send.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/sendto.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/setjmp.S46
-rw-r--r--mdk-stage1/dietlibc/alpha/setsockopt.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/signal.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/sigprocmask.S7
-rw-r--r--mdk-stage1/dietlibc/alpha/socket.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/socketcall.S5
-rw-r--r--mdk-stage1/dietlibc/alpha/start.S35
-rw-r--r--mdk-stage1/dietlibc/alpha/strlen.c32
-rw-r--r--mdk-stage1/dietlibc/alpha/time.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/unified.S29
-rw-r--r--mdk-stage1/dietlibc/alpha/utime.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/waitpid.S9
-rw-r--r--mdk-stage1/dietlibc/dietdirent.h6
-rw-r--r--mdk-stage1/dietlibc/dietfeatures.h16
-rw-r--r--mdk-stage1/dietlibc/dietstdio.h64
-rw-r--r--mdk-stage1/dietlibc/dirstream.h78
-rw-r--r--mdk-stage1/dietlibc/i386/Makefile.add3
-rw-r--r--mdk-stage1/dietlibc/i386/__longjmp.S20
-rw-r--r--mdk-stage1/dietlibc/i386/mmap.c16
-rw-r--r--mdk-stage1/dietlibc/i386/select.S6
-rw-r--r--mdk-stage1/dietlibc/i386/setjmp.S64
-rw-r--r--mdk-stage1/dietlibc/i386/start.S28
-rw-r--r--mdk-stage1/dietlibc/i386/strchr.S47
-rw-r--r--mdk-stage1/dietlibc/i386/unified.S33
-rw-r--r--mdk-stage1/dietlibc/include/arpa/inet.h15
-rw-r--r--mdk-stage1/dietlibc/include/assert.h23
-rw-r--r--mdk-stage1/dietlibc/include/ctype.h13
-rw-r--r--mdk-stage1/dietlibc/include/dirent.h61
-rw-r--r--mdk-stage1/dietlibc/include/elf.h1989
-rw-r--r--mdk-stage1/dietlibc/include/endian.h43
-rw-r--r--mdk-stage1/dietlibc/include/errno.h10
-rw-r--r--mdk-stage1/dietlibc/include/fcntl.h24
-rw-r--r--mdk-stage1/dietlibc/include/features.h1
-rw-r--r--mdk-stage1/dietlibc/include/ftw.h51
-rw-r--r--mdk-stage1/dietlibc/include/grp.h18
-rw-r--r--mdk-stage1/dietlibc/include/limits.h10
-rw-r--r--mdk-stage1/dietlibc/include/malloc.h1
-rw-r--r--mdk-stage1/dietlibc/include/net/if.h9
-rw-r--r--mdk-stage1/dietlibc/include/netdb.h48
-rw-r--r--mdk-stage1/dietlibc/include/netinet/in.h6
-rw-r--r--mdk-stage1/dietlibc/include/netinet/in_systm.h0
-rw-r--r--mdk-stage1/dietlibc/include/netinet/ip.h6
-rw-r--r--mdk-stage1/dietlibc/include/paths.h7
-rw-r--r--mdk-stage1/dietlibc/include/pwd.h20
-rw-r--r--mdk-stage1/dietlibc/include/setjmp.h121
-rw-r--r--mdk-stage1/dietlibc/include/signal.h15
-rw-r--r--mdk-stage1/dietlibc/include/stdint.h6
-rw-r--r--mdk-stage1/dietlibc/include/stdio.h69
-rw-r--r--mdk-stage1/dietlibc/include/stdlib.h44
-rw-r--r--mdk-stage1/dietlibc/include/string.h42
-rw-r--r--mdk-stage1/dietlibc/include/sys/cdefs.h24
-rw-r--r--mdk-stage1/dietlibc/include/sys/ioctl.h10
-rw-r--r--mdk-stage1/dietlibc/include/sys/mman.h25
-rw-r--r--mdk-stage1/dietlibc/include/sys/mount.h81
-rw-r--r--mdk-stage1/dietlibc/include/sys/resource.h7
-rw-r--r--mdk-stage1/dietlibc/include/sys/select.h6
-rw-r--r--mdk-stage1/dietlibc/include/sys/socket.h21
-rw-r--r--mdk-stage1/dietlibc/include/sys/stat.h48
-rw-r--r--mdk-stage1/dietlibc/include/sys/time.h24
-rw-r--r--mdk-stage1/dietlibc/include/sys/types.h33
-rw-r--r--mdk-stage1/dietlibc/include/sys/utsname.h35
-rw-r--r--mdk-stage1/dietlibc/include/sys/vfs.h11
-rw-r--r--mdk-stage1/dietlibc/include/sys/wait.h14
-rw-r--r--mdk-stage1/dietlibc/include/termios.h178
-rw-r--r--mdk-stage1/dietlibc/include/time.h31
-rw-r--r--mdk-stage1/dietlibc/include/unistd.h83
-rw-r--r--mdk-stage1/dietlibc/include/utime.h16
-rw-r--r--mdk-stage1/dietlibc/include/utmp.h72
-rw-r--r--mdk-stage1/dietlibc/lib/__dtostr.c82
-rw-r--r--mdk-stage1/dietlibc/lib/__lltostr.c34
-rw-r--r--mdk-stage1/dietlibc/lib/__ltostr.c34
-rw-r--r--mdk-stage1/dietlibc/lib/__xmknod.c6
-rw-r--r--mdk-stage1/dietlibc/lib/_brk.c14
-rw-r--r--mdk-stage1/dietlibc/lib/abort.c14
-rw-r--r--mdk-stage1/dietlibc/lib/accept.c14
-rw-r--r--mdk-stage1/dietlibc/lib/alarm.c47
-rw-r--r--mdk-stage1/dietlibc/lib/alloc.c225
-rw-r--r--mdk-stage1/dietlibc/lib/assert_fail.c27
-rw-r--r--mdk-stage1/dietlibc/lib/atexit.c23
-rw-r--r--mdk-stage1/dietlibc/lib/atof.c5
-rw-r--r--mdk-stage1/dietlibc/lib/atoi.c8
-rw-r--r--mdk-stage1/dietlibc/lib/atol.c8
-rw-r--r--mdk-stage1/dietlibc/lib/bind.c12
-rw-r--r--mdk-stage1/dietlibc/lib/cfgetospeed.c6
-rw-r--r--mdk-stage1/dietlibc/lib/closedir.c28
-rw-r--r--mdk-stage1/dietlibc/lib/connect.c14
-rw-r--r--mdk-stage1/dietlibc/lib/creat64.c5
-rw-r--r--mdk-stage1/dietlibc/lib/errlist.c132
-rw-r--r--mdk-stage1/dietlibc/lib/errno_location.c5
-rw-r--r--mdk-stage1/dietlibc/lib/execl.c24
-rw-r--r--mdk-stage1/dietlibc/lib/execvp.c55
-rw-r--r--mdk-stage1/dietlibc/lib/ftw.c52
-rw-r--r--mdk-stage1/dietlibc/lib/getdomainname.c17
-rw-r--r--mdk-stage1/dietlibc/lib/getenv.c17
-rw-r--r--mdk-stage1/dietlibc/lib/gethostname.c18
-rw-r--r--mdk-stage1/dietlibc/lib/getpeername.c13
-rw-r--r--mdk-stage1/dietlibc/lib/getservent.c141
-rw-r--r--mdk-stage1/dietlibc/lib/getsockname.c13
-rw-r--r--mdk-stage1/dietlibc/lib/getsockopt.c13
-rw-r--r--mdk-stage1/dietlibc/lib/htons.c12
-rw-r--r--mdk-stage1/dietlibc/lib/if_indextoname.c29
-rw-r--r--mdk-stage1/dietlibc/lib/if_nametoindex.c27
-rw-r--r--mdk-stage1/dietlibc/lib/isalnum.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isalpha.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isascii.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isatty.c20
-rw-r--r--mdk-stage1/dietlibc/lib/isblank.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isdigit.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isspace.c6
-rw-r--r--mdk-stage1/dietlibc/lib/listen.c13
-rw-r--r--mdk-stage1/dietlibc/lib/lockf.c37
-rw-r--r--mdk-stage1/dietlibc/lib/longjmp.c51
-rw-r--r--mdk-stage1/dietlibc/lib/memccmp.c17
-rw-r--r--mdk-stage1/dietlibc/lib/memccpy.c19
-rw-r--r--mdk-stage1/dietlibc/lib/memchr.c9
-rw-r--r--mdk-stage1/dietlibc/lib/memcmp.c14
-rw-r--r--mdk-stage1/dietlibc/lib/memcpy.c12
-rw-r--r--mdk-stage1/dietlibc/lib/memmove.c23
-rw-r--r--mdk-stage1/dietlibc/lib/memset.c9
-rw-r--r--mdk-stage1/dietlibc/lib/mkfifo.c6
-rw-r--r--mdk-stage1/dietlibc/lib/nop.c7
-rw-r--r--mdk-stage1/dietlibc/lib/open64.c11
-rw-r--r--mdk-stage1/dietlibc/lib/opendir.c63
-rw-r--r--mdk-stage1/dietlibc/lib/perror.c16
-rw-r--r--mdk-stage1/dietlibc/lib/pread.c10
-rw-r--r--mdk-stage1/dietlibc/lib/pread64.c13
-rw-r--r--mdk-stage1/dietlibc/lib/putenv.c37
-rw-r--r--mdk-stage1/dietlibc/lib/puts.c6
-rw-r--r--mdk-stage1/dietlibc/lib/raise.c8
-rw-r--r--mdk-stage1/dietlibc/lib/readdir.c83
-rw-r--r--mdk-stage1/dietlibc/lib/recv.c13
-rw-r--r--mdk-stage1/dietlibc/lib/recvfrom.c12
-rw-r--r--mdk-stage1/dietlibc/lib/rewind.c6
-rw-r--r--mdk-stage1/dietlibc/lib/rewinddir.c17
-rw-r--r--mdk-stage1/dietlibc/lib/sbrk.c20
-rw-r--r--mdk-stage1/dietlibc/lib/seekdir.c15
-rw-r--r--mdk-stage1/dietlibc/lib/send.c13
-rw-r--r--mdk-stage1/dietlibc/lib/sendto.c13
-rw-r--r--mdk-stage1/dietlibc/lib/set_errno.c9
-rw-r--r--mdk-stage1/dietlibc/lib/setsockopt.c13
-rw-r--r--mdk-stage1/dietlibc/lib/sigaddset.c21
-rw-r--r--mdk-stage1/dietlibc/lib/sigemptyset.c14
-rw-r--r--mdk-stage1/dietlibc/lib/sigjmp.c36
-rw-r--r--mdk-stage1/dietlibc/lib/sleep.c11
-rw-r--r--mdk-stage1/dietlibc/lib/snprintf.c14
-rw-r--r--mdk-stage1/dietlibc/lib/socket.c12
-rw-r--r--mdk-stage1/dietlibc/lib/sprintf.c15
-rw-r--r--mdk-stage1/dietlibc/lib/sscanf.c13
-rw-r--r--mdk-stage1/dietlibc/lib/strcat.c18
-rw-r--r--mdk-stage1/dietlibc/lib/strchr.c16
-rw-r--r--mdk-stage1/dietlibc/lib/strcmp.c16
-rw-r--r--mdk-stage1/dietlibc/lib/strcpy.c15
-rw-r--r--mdk-stage1/dietlibc/lib/strcspn.c17
-rw-r--r--mdk-stage1/dietlibc/lib/strdup.c9
-rw-r--r--mdk-stage1/dietlibc/lib/strerror.c10
-rw-r--r--mdk-stage1/dietlibc/lib/strlcat.c72
-rw-r--r--mdk-stage1/dietlibc/lib/strlcpy.c68
-rw-r--r--mdk-stage1/dietlibc/lib/strlen.c47
-rw-r--r--mdk-stage1/dietlibc/lib/strncat.c19
-rw-r--r--mdk-stage1/dietlibc/lib/strncmp.c6
-rw-r--r--mdk-stage1/dietlibc/lib/strncpy.c10
-rw-r--r--mdk-stage1/dietlibc/lib/strpbrk.c11
-rw-r--r--mdk-stage1/dietlibc/lib/strrchr.c18
-rw-r--r--mdk-stage1/dietlibc/lib/strspn.c17
-rw-r--r--mdk-stage1/dietlibc/lib/strstr.c15
-rw-r--r--mdk-stage1/dietlibc/lib/strtod.c52
-rw-r--r--mdk-stage1/dietlibc/lib/strtok.c6
-rw-r--r--mdk-stage1/dietlibc/lib/strtok_r.c21
-rw-r--r--mdk-stage1/dietlibc/lib/strtol.c15
-rw-r--r--mdk-stage1/dietlibc/lib/strtoll.c15
-rw-r--r--mdk-stage1/dietlibc/lib/strtoul.c39
-rw-r--r--mdk-stage1/dietlibc/lib/strtoull.c39
-rw-r--r--mdk-stage1/dietlibc/lib/sys_siglist.c37
-rw-r--r--mdk-stage1/dietlibc/lib/tcgetattr.c7
-rw-r--r--mdk-stage1/dietlibc/lib/tcsetattr.c23
-rw-r--r--mdk-stage1/dietlibc/lib/telldir.c38
-rw-r--r--mdk-stage1/dietlibc/lib/ttyname.c60
-rw-r--r--mdk-stage1/dietlibc/lib/vfork.c6
-rw-r--r--mdk-stage1/dietlibc/lib/vfprintf.c11
-rw-r--r--mdk-stage1/dietlibc/lib/vprintf.c14
-rw-r--r--mdk-stage1/dietlibc/lib/vsnprintf.c239
-rw-r--r--mdk-stage1/dietlibc/lib/vsprintf.c11
-rw-r--r--mdk-stage1/dietlibc/lib/vsscanf.c243
-rw-r--r--mdk-stage1/dietlibc/lib/wait.c6
-rw-r--r--mdk-stage1/dietlibc/lib/wait3.c5
-rw-r--r--mdk-stage1/dietlibc/ppc/Makefile.add3
-rw-r--r--mdk-stage1/dietlibc/ppc/__longjmp.S61
-rw-r--r--mdk-stage1/dietlibc/ppc/mmap.c37
-rw-r--r--mdk-stage1/dietlibc/ppc/setjmp.S56
-rw-r--r--mdk-stage1/dietlibc/ppc/start.S44
-rw-r--r--mdk-stage1/dietlibc/ppc/unified.S21
-rw-r--r--mdk-stage1/dietlibc/sparc/Makefile.add3
-rw-r--r--mdk-stage1/dietlibc/sparc/__longjmp.S66
-rw-r--r--mdk-stage1/dietlibc/sparc/fork.S19
-rw-r--r--mdk-stage1/dietlibc/sparc/mmap.c43
-rw-r--r--mdk-stage1/dietlibc/sparc/pipe.S20
-rw-r--r--mdk-stage1/dietlibc/sparc/setjmp.S35
-rw-r--r--mdk-stage1/dietlibc/sparc/start.S46
-rw-r--r--mdk-stage1/dietlibc/sparc/udiv.S363
-rw-r--r--mdk-stage1/dietlibc/sparc/umul.S170
-rw-r--r--mdk-stage1/dietlibc/sparc/unified.S28
-rw-r--r--mdk-stage1/dietlibc/sparc/urem.S362
-rw-r--r--mdk-stage1/dietlibc/start.h10
-rw-r--r--mdk-stage1/dietlibc/syscalls.h82
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/__pread.S4
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/_llseek.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/access.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/brk.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/chdir.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/chmod.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/chown.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/chroot.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/close.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/dup.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/dup2.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/execve.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/exit.S6
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fchdir.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fchmod.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fchown.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fcntl.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/flock.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fork.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fstatfs.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fsync.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/ftruncate.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getcwd.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getdents.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getdents64.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getegid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/geteuid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getgid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getgroups.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getpgid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getpid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getppid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getresgid.S7
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getresuid.S7
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getrlimit.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getrusage.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getsid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/gettimeofday.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getuid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/ioctl.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/kill.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/lchown.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/link.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/lseek.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mkdir.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mknod.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mount.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mprotect.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mremap.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/munmap.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/nanosleep.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/open.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/pipe.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/poll.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/pwrite.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/read.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/readlink.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/rename.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/rmdir.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/select.S4
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sendfile.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setdomainname.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setgid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setgroups.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sethostname.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setitimer.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setpgid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setregid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setresgid.S7
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setresuid.S7
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setreuid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setrlimit.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setsid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setuid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sigaction.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/signal.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sigpending.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sigprocmask.S6
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sigsuspend.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/socketcall.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/statfs.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/swapoff.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/swapon.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/symlink.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sync.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/syslog.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/time.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/truncate.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/umask.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/umount.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/uname.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/unlink.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/utime.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/vhangup.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/wait4.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/waitpid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/write.S5
-rw-r--r--mdk-stage1/directory.c169
-rw-r--r--mdk-stage1/directory.h29
-rw-r--r--mdk-stage1/disk.c283
-rw-r--r--mdk-stage1/disk.h4
-rw-r--r--mdk-stage1/dns.c172
-rw-r--r--mdk-stage1/dns.h4
-rw-r--r--mdk-stage1/doc/HACKING31
-rw-r--r--mdk-stage1/doc/README185
-rw-r--r--mdk-stage1/doc/TECH-INFOS106
-rw-r--r--mdk-stage1/doc/UPDATEMODULES96
-rw-r--r--mdk-stage1/doc/documented..frontend.h69
-rw-r--r--mdk-stage1/frontend-common.c64
-rw-r--r--mdk-stage1/frontend.h45
-rw-r--r--mdk-stage1/init-data/emptyboot.img.bz2bin6342 -> 0 bytes
-rw-r--r--mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2bin30301 -> 0 bytes
-rw-r--r--mdk-stage1/init-data/msgboot-graphicallogo.img.bz2bin29067 -> 0 bytes
-rw-r--r--mdk-stage1/init-data/msgboot.img.bz2bin30378 -> 0 bytes
-rw-r--r--mdk-stage1/init-libc-headers.h44
-rw-r--r--mdk-stage1/init.c410
-rw-r--r--mdk-stage1/insmod-busybox/.cvsignore1
-rw-r--r--mdk-stage1/insmod-busybox/Config.h132
-rw-r--r--mdk-stage1/insmod-busybox/Makefile54
-rw-r--r--mdk-stage1/insmod-busybox/README8
-rw-r--r--mdk-stage1/insmod-busybox/busybox.h467
-rw-r--r--mdk-stage1/insmod-busybox/insmod.c2951
-rw-r--r--mdk-stage1/insmod-busybox/loop.h5
-rw-r--r--mdk-stage1/insmod-busybox/messages.c90
-rw-r--r--mdk-stage1/insmod-busybox/utility.c1756
-rw-r--r--mdk-stage1/insmod-modutils/Makefile61
-rw-r--r--mdk-stage1/insmod-modutils/include/config.h105
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_alpha.h10
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_arm.h10
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_hppa.h9
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_hppa64.h9
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_i386.h10
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_ia64.h9
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_m68k.h10
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_mips.h24
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_ppc.h10
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_s390.h10
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_sparc.h10
-rw-r--r--mdk-stage1/insmod-modutils/include/elf_sparc64.h27
-rw-r--r--mdk-stage1/insmod-modutils/include/kallsyms.h131
-rw-r--r--mdk-stage1/insmod-modutils/include/kerneld.h46
-rw-r--r--mdk-stage1/insmod-modutils/include/modstat.h55
-rw-r--r--mdk-stage1/insmod-modutils/include/module.h210
-rw-r--r--mdk-stage1/insmod-modutils/include/obj.h275
-rw-r--r--mdk-stage1/insmod-modutils/include/util.h101
-rw-r--r--mdk-stage1/insmod-modutils/include/version.h1
-rw-r--r--mdk-stage1/insmod-modutils/insmod.c1964
-rw-r--r--mdk-stage1/insmod-modutils/obj/Makefile31
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_alpha.c305
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_arm.c318
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_common.c399
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_hppa.c668
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_hppa64.c686
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_i386.c245
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_ia64.c1065
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_kallsyms.c292
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_load.c354
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_m68k.c147
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_mips.c238
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_ppc.c255
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_reloc.c435
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_s390.c245
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_sparc.c226
-rw-r--r--mdk-stage1/insmod-modutils/obj/obj_sparc64.c352
-rw-r--r--mdk-stage1/insmod-modutils/util/Makefile39
-rw-r--r--mdk-stage1/insmod-modutils/util/alias.h244
-rw-r--r--mdk-stage1/insmod-modutils/util/arch64.c35
-rw-r--r--mdk-stage1/insmod-modutils/util/config.c1591
-rw-r--r--mdk-stage1/insmod-modutils/util/gzfiles.c74
-rw-r--r--mdk-stage1/insmod-modutils/util/logger.c163
-rw-r--r--mdk-stage1/insmod-modutils/util/meta_expand.c339
-rw-r--r--mdk-stage1/insmod-modutils/util/modstat.c419
-rw-r--r--mdk-stage1/insmod-modutils/util/snap_shot.c154
-rw-r--r--mdk-stage1/insmod-modutils/util/sys_cm.c88
-rw-r--r--mdk-stage1/insmod-modutils/util/sys_dm.c37
-rw-r--r--mdk-stage1/insmod-modutils/util/sys_gks.c37
-rw-r--r--mdk-stage1/insmod-modutils/util/sys_nim.c53
-rw-r--r--mdk-stage1/insmod-modutils/util/sys_oim.c40
-rw-r--r--mdk-stage1/insmod-modutils/util/sys_qm.c56
-rw-r--r--mdk-stage1/insmod-modutils/util/xftw.c422
-rw-r--r--mdk-stage1/insmod-modutils/util/xmalloc.c39
-rw-r--r--mdk-stage1/insmod-modutils/util/xrealloc.c39
-rw-r--r--mdk-stage1/insmod-modutils/util/xstrcat.c40
-rw-r--r--mdk-stage1/insmod-modutils/util/xstrdup.c41
-rw-r--r--mdk-stage1/insmod-modutils/util/xsystem.c51
-rw-r--r--mdk-stage1/ka.c198
-rw-r--r--mdk-stage1/ka.h (renamed from mdk-stage1/insmod.h)12
-rw-r--r--mdk-stage1/linux-2.2/nfs.h226
-rw-r--r--mdk-stage1/linux-2.2/nfs_mount.h53
-rw-r--r--mdk-stage1/log.c41
-rw-r--r--mdk-stage1/log.h8
-rw-r--r--mdk-stage1/lomount.c84
-rw-r--r--mdk-stage1/lomount.h8
-rw-r--r--mdk-stage1/mar/.cvsignore1
-rw-r--r--mdk-stage1/mar/Makefile55
-rw-r--r--mdk-stage1/mar/mar-extract-only.c206
-rw-r--r--mdk-stage1/mar/mar-extract-only.h32
-rw-r--r--mdk-stage1/mar/mar-frontend.c199
-rw-r--r--mdk-stage1/mar/mar.h70
-rw-r--r--mdk-stage1/minilibc.c251
-rw-r--r--mdk-stage1/minilibc.h144
-rw-r--r--mdk-stage1/modules.c441
-rw-r--r--mdk-stage1/modules.h19
-rw-r--r--mdk-stage1/mount.c110
-rw-r--r--mdk-stage1/mount.h11
-rw-r--r--mdk-stage1/mount_rpcgen.h208
-rw-r--r--mdk-stage1/network.c751
-rw-r--r--mdk-stage1/network.h21
-rw-r--r--mdk-stage1/newt-frontend.c156
-rw-r--r--mdk-stage1/nfsmount.c297
-rw-r--r--mdk-stage1/nfsmount.h328
-rw-r--r--mdk-stage1/params.c175
-rw-r--r--mdk-stage1/params.h31
-rw-r--r--mdk-stage1/partition.c170
-rw-r--r--mdk-stage1/partition.h (renamed from mdk-stage1/insmod-busybox/insmod-frontend.c)22
-rw-r--r--mdk-stage1/pci-resource/.cvsignore1
-rw-r--r--mdk-stage1/pci-resource/Makefile25
-rwxr-xr-xmdk-stage1/pci-resource/update-pci-ids.pl64
-rw-r--r--mdk-stage1/pcmcia/Makefile34
-rw-r--r--mdk-stage1/pcmcia/bulkmem.h6
-rw-r--r--mdk-stage1/pcmcia/cardmgr.c805
-rw-r--r--mdk-stage1/pcmcia/cardmgr.h107
-rw-r--r--mdk-stage1/pcmcia/cirrus.h31
-rw-r--r--mdk-stage1/pcmcia/cistpl.h6
-rw-r--r--mdk-stage1/pcmcia/config.h59
-rw-r--r--mdk-stage1/pcmcia/cs.h45
-rw-r--r--mdk-stage1/pcmcia/cs_types.h13
-rw-r--r--mdk-stage1/pcmcia/driver_ops.h15
-rw-r--r--mdk-stage1/pcmcia/ds.h25
-rw-r--r--mdk-stage1/pcmcia/i82365.h27
-rw-r--r--mdk-stage1/pcmcia/lex_config.c2008
-rw-r--r--mdk-stage1/pcmcia/lex_config.l224
-rwxr-xr-xmdk-stage1/pcmcia/merge_from_pcitable37
-rw-r--r--mdk-stage1/pcmcia/pcmcia.h6
-rw-r--r--mdk-stage1/pcmcia/pcmcia_probe.c396
-rw-r--r--mdk-stage1/pcmcia/probe.c426
-rw-r--r--mdk-stage1/pcmcia/startup.c271
-rw-r--r--mdk-stage1/pcmcia/startup.h54
-rw-r--r--mdk-stage1/pcmcia/tcic.h6
-rw-r--r--mdk-stage1/pcmcia/version.h6
-rw-r--r--mdk-stage1/pcmcia/vg468.h12
-rw-r--r--mdk-stage1/pcmcia/yacc_config.c1017
-rw-r--r--mdk-stage1/pcmcia/yacc_config.h37
-rw-r--r--mdk-stage1/pcmcia/yacc_config.y133
-rw-r--r--mdk-stage1/probe-modules.c69
-rw-r--r--mdk-stage1/probing.c952
-rw-r--r--mdk-stage1/probing.h39
-rw-r--r--mdk-stage1/rescue-gui.c301
-rw-r--r--mdk-stage1/stage1-data/stage1-with-sash.tar.bz2bin345030 -> 0 bytes
-rw-r--r--mdk-stage1/stage1-data/stage1.tar.bz2bin1957 -> 0 bytes
-rw-r--r--mdk-stage1/stage1.c338
-rw-r--r--mdk-stage1/stage1.h34
-rw-r--r--mdk-stage1/stdio-frontend.c242
-rw-r--r--mdk-stage1/thirdparty.c460
-rw-r--r--mdk-stage1/thirdparty.h35
-rw-r--r--mdk-stage1/tools.c495
-rw-r--r--mdk-stage1/tools.h42
-rwxr-xr-xmdk-stage1/update-pci-ids.pl27
-rwxr-xr-xmdk-stage1/update-pcmcia-ids.pl42
-rwxr-xr-xmdk-stage1/update-usb-ids.pl24
-rw-r--r--mdk-stage1/url.c176
-rw-r--r--mdk-stage1/url.h8
-rw-r--r--mdk-stage1/utils.c191
-rw-r--r--mdk-stage1/utils.h36
-rw-r--r--mdk-stage1/wireless.c160
-rw-r--r--mdk-stage1/wireless.h (renamed from mdk-stage1/insmod-modutils/insmod-frontend.c)19
-rw-r--r--mdk-stage1/zlibsupport.c292
-rw-r--r--mdk-stage1/zlibsupport.h11
521 files changed, 8386 insertions, 42369 deletions
diff --git a/mdk-stage1/.cvsignore b/mdk-stage1/.cvsignore
deleted file mode 100644
index 55cc430b7..000000000
--- a/mdk-stage1/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-init
-stage1-full
-stage1-cdrom
-stage1-disk
-stage1-network
-debug.log
-.depend
diff --git a/mdk-stage1/.gitignore b/mdk-stage1/.gitignore
new file mode 100644
index 000000000..fe2469cea
--- /dev/null
+++ b/mdk-stage1/.gitignore
@@ -0,0 +1,13 @@
+*.o
+dhcp-client
+init
+probe-modules
+rescue-gui
+stage1
+pci-resource/pci-ids.h
+usb-resource/usb-ids.h
+pcmcia-resource/pcmcia-ids.h
+pcmcia/lex_config.c
+pcmcia/libpcmcia.a
+pcmcia/yacc_config.c
+pcmcia/yacc_config.h
diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile
index d6135bc8b..1d66d22fe 100644
--- a/mdk-stage1/Makefile
+++ b/mdk-stage1/Makefile
@@ -2,11 +2,9 @@
#
# mdk-stage1 - the program that will load second-stage install
#
- # $Id$
+ # Pixel (pixel) (mostly done by Guillaume Cottenceau)
#
- # Guillaume Cottenceau (gc@mandrakesoft.com)
- #
- # Copyright 2000 MandrakeSoft
+ # Copyright 2000-2004 Mandriva
#
# This software may be freely redistributed under the terms of the GNU
# public license.
@@ -14,182 +12,166 @@
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+VERSION=2.62
+PRODUCT=drakx-installer-binaries
+
#
# Portions from Erik Troan (ewt@redhat.com) Copyright 1996 Red Hat Software
#
- #*****************************************************************************
-VERSION = 8.0beta
top_dir = .
include $(top_dir)/Makefile.common
+include $(top_dir)/../Makefile.config
+ARCHDIR=$(ARCH)
+ifeq (i386, $(ARCH))
+ARCHDIR=i686
+endif
+DEFS = -DDISTRIB_NAME=\"$(DISTRIB_NAME)\" -DDISTRIB_VERSION=\"$(DISTRIB_VERSION)\" -DDISTRIB_TYPE=\"$(DISTRIB_TYPE)\" -DDISTRIB_DESCR=\"$(DISTRIB_DESCR)\" $(ADDITIONAL_DEFS) -D_FILE_OFFSET_BITS=64 -DARCH=\"$(ARCHDIR)\" -DCONFIG_USE_ZLIB
-CFLAGS = -Os -pipe -Wall -Werror -fomit-frame-pointer
-
-DEFS = -DVERSION=\"$(VERSION)\"
-
-COMPILE = $(CC) $(DEFS) $(CFLAGS)
-
+COMPILE = $(CC) $(DEFS) $(CFLAGS) -Wno-error=format-truncation
- #- stage1 "loader"
-ifeq (i386, $(ARCH))
-INITSRC = minilibc.c init.c
-INIT_DEFS = -DINIT_HEADERS=\"minilibc.h\"
-else
INITSRC = init.c
-INIT_DEFS = -DINIT_HEADERS=\"init-libc-headers.h\" $(DIETLIBC_INCLUDES)
-endif
-INITOBJS = $(subst .c,.o,$(INITSRC))
+STAGE1_DEFS=-DDISABLE_KA
+
+INITOBJS = $(INITSRC:.c=.o)
#- frontends
NEWT_FRONTEND_SRC = newt-frontend.c
-NEWT_FRONTEND_LIBS = /usr/lib/libnewt.a /usr/lib/libslang.a
+NEWT_FRONTEND_LIBS = -lnewt -lslang
STDIO_FRONTEND_SRC = stdio-frontend.c
STDIO_FRONTEND_LIBS =
-WSLIB_FRONTEND_SRC = wslib-frontend.c
-WSLIB_FRONTEND_LIBS = /usr/lib/libwslib.a
-
-
-FRONTEND_OBJS = $(subst .c,.o,$($(F)_FRONTEND_SRC))
-FRONTEND_LIBS = $($(F)_FRONTEND_LIBS)
+FRONTEND_OBJS = $($(F)_FRONTEND_SRC:.c=.o)
-FRONTEND_LINK = $(FRONTEND_OBJS) $(FRONTEND_LIBS)
-MEDIAS_FRONTEND_LINK = $(FRONTEND_LINK)
-
-ifeq (DIETLIBC, $(L))
-ifeq (NEWT, $(F))
-MEDIAS_FRONTEND_LINK = $(subst .c,.o,$(STDIO_FRONTEND_SRC)) $(STDIO_FRONTEND_LIBS)
-else
-MEDIAS_FRONTEND_LINK = $(FRONTEND_LINK)
-endif
-endif
-
-ifeq (i386, $(ARCH))
-INSMOD = insmod-busybox
-else
-INSMOD = insmod-modutils
-endif
-
-GLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod.a mar/libmar.a bzlib/libbzlib.a
-DIETLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod-DIET.a mar/libmar-DIET.a bzlib/libbzlib-DIET.a
-STAGE1_OWN_LIBS = $($(L)_STAGE1_OWN_LIBS)
+FRONTEND_LINK = $(FRONTEND_OBJS) $($(F)_FRONTEND_LIBS)
+STAGE1_OWN_LIBS = -lz -lldetect -lkmod -lpci -llzma -lsysfs
-STAGE1_NETWORK_LIBS = /usr/lib/libresolv.a
#- stage1 itself
-STAGE1SRC = stage1.c log.c tools.c modules.c probing.c mount.c automatic.c
+STAGE1SRC = stage1.c log.c utils.c params.c tools.c modules.c probing.c mount.c automatic.c frontend-common.c lomount.c thirdparty.c zlibsupport.c
CDROMSRC = cdrom.c
-DISKSRC = disk.c lomount.c
-NETWORKSRC = network.c dns.c nfsmount.c dhcp.c url.c
+DISKSRC = disk.c directory.c partition.c
+NETWORKSRC = network.c dhcp.c url.c dns.c adsl.c directory.c wireless.c
+#KASRC = ka.c
-ALLSRC = $(INITSRC) $(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC)
+# use sort to remove duplicates
+STAGE1_ALLSRC = $(sort $(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC) $(KASRC))
+ALLSRC = $(INITSRC) $(STAGE1_ALLSRC)
-STAGE1OBJS = $(subst .c,.o,$(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC))
-
-STAGE1OBJS-CDROM = $(subst .c,-CDROM.o,$(STAGE1SRC) $(CDROMSRC))
-
-CDROM_DEFS = -DDISABLE_DISK -DDISABLE_NETWORK
-
-
-STAGE1OBJS-DISK = $(subst .c,-DISK.o,$(STAGE1SRC) $(DISKSRC))
-
-DISK_DEFS = -DDISABLE_CDROM -DDISABLE_NETWORK
+CDROM_DEFS = -DSPAWN_SHELL -DDISABLE_DISK -DDISABLE_NETWORK
STAGE1OBJS-NETWORK = $(subst .c,-NETWORK.o,$(STAGE1SRC) $(NETWORKSRC))
-NETWORK_DEFS = -DDISABLE_CDROM -DDISABLE_DISK
+NETWORK_DEFS = -DSPAWN_SHELL -DDISABLE_CDROM -DDISABLE_DISK -DDISABLE_KA
-ifeq (i386, $(ARCH))
-LDFLAGS_INIT = -static -nostdlib /usr/lib/crt1.o
-else
-LDFLAGS_INIT = $(DIETLIBC_LDFLAGS_STAGE1)
-INIT_LIBC = $(DIETLIBC_LIBC)
-endif
+STAGE1OBJS-NETWORK-STANDALONE = $(subst .c,-NETWORK-STANDALONE.o,$(STAGE1SRC) $(NETWORKSRC))
+NETWORK_STANDALONE_DEFS = -DDISABLE_CDROM -DDISABLE_DISK -DENABLE_NETWORK_STANDALONE -DDISABLE_KA
-BINS = init stage1-full
-ifeq (i386, $(ARCH))
-BINS += stage1-cdrom stage1-disk stage1-network
-endif
+STAGE1OBJS-FULL = $(STAGE1_ALLSRC:.c=-FULL.o)
+BINS = init stage1 dhcp-client rescue-gui probe-modules
-DIRS = dietlibc mar pci-resource bzlib $(INSMOD)
-ifeq (i386,$(ARCH))
-DIRS += pcmcia
-endif
-
-
-ifeq (i386,$(ARCH))
+OTHERS = pci-ids.h usb-ids.h
+ifneq (,$(filter $(ARCH),i386 x86_64))
+OTHERS += pcmcia-ids.h pcmcia
PCMCIA_LIB = pcmcia/libpcmcia.a
PCMCIA_DEFS = -DENABLE_PCMCIA
endif
+USB_DEFS_GEN = -DENABLE_USB
+USB_DEFS = -DENABLE_USB -DDISABLE_PCIADAPTERS
-all: dirs $(BINS)
+all: $(OTHERS) $(BINS)
-dirs:
- @for n in . $(DIRS); do \
- [ "$$n" = "." ] || make -C $$n ;\
- done
+pci-ids.h: /usr/share/ldetect-lst/pcitable.gz update-pci-ids.pl
+ perl update-pci-ids.pl > $@ || { rm -f $@; exit 1; }
-init: $(INITOBJS) $(INIT_LIBC)
- $(CC) $(LDFLAGS_INIT) -o $@ $^
- $(STRIPCMD) $@
+usb-ids.h: /usr/share/ldetect-lst/usbtable.gz update-usb-ids.pl
+ perl update-usb-ids.pl > $@ || rm -f $@
-stage1-cdrom: $(STAGE1OBJS-CDROM) $(STAGE1_OWN_LIBS) $(STAGE1_OWN_LIBS) $(MEDIAS_FRONTEND_LINK) $(STAGE1_LIBC)
- $(CC) $(LDFLAGS_STAGE1) -o $@ $^
- $(STRIPCMD) $@
+pcmcia-ids.h: update-pcmcia-ids.pl
+ perl update-pcmcia-ids.pl > $@ || { rm -f $@; exit 1; }
+
+pcmcia/libpcmcia.a:
+ make -j -C pcmcia
-stage1-disk: $(STAGE1OBJS-DISK) $(STAGE1_OWN_LIBS) $(MEDIAS_FRONTEND_LINK) $(STAGE1_LIBC)
- $(CC) $(LDFLAGS_STAGE1) -o $@ $^
+probing.c: pci-ids.h
+
+init: $(INITOBJS)
+ $(CC) $(LDFLAGS) -o $@ $^
$(STRIPCMD) $@
-stage1-network: $(STAGE1OBJS-NETWORK) $(GLIBC_STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK)
- $(CC) $(GLIBC_LDFLAGS_STAGE1) -o $@ $^
+stage1: $(STAGE1OBJS-FULL) $(STAGE1_OWN_LIBS) $(FRONTEND_LINK) $(PCMCIA_LIB)
+ $(CC) $(LDFLAGS) -o $@ $^
$(STRIPCMD) $@
-stage1-full: $(STAGE1OBJS) $(GLIBC_STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(PCMCIA_LIB)
- $(CC) $(GLIBC_LDFLAGS_STAGE1) -o $@ $^
+dhcp-client: $(STAGE1OBJS-NETWORK-STANDALONE) $(STAGE1_OWN_LIBS) $(FRONTEND_LINK)
+ $(CC) $(LDFLAGS) -o $@ $^
$(STRIPCMD) $@
-$(STAGE1OBJS-CDROM): %-CDROM.o: %.c .depend
- $(COMPILE) $(INCLUDES) $(CDROM_DEFS) -c $< -o $@
+$(INITOBJS): %.o: %.c
+ $(COMPILE) -c $<
-$(STAGE1OBJS-DISK): %-DISK.o: %.c .depend
- $(COMPILE) $(INCLUDES) $(DISK_DEFS) -c $< -o $@
+$(STAGE1OBJS-NETWORK): %-NETWORK.o: %.c
+ $(COMPILE) $(INCLUDES) $(NETWORK_DEFS) $(PCMCIA_DEFS) $(USB_DEFS_GEN) -DENABLE_ADDITIONAL_MODULES -c $< -o $@
-$(STAGE1OBJS-NETWORK): %-NETWORK.o: %.c .depend
- $(COMPILE) $(GLIBC_INCLUDES) $(NETWORK_DEFS) -c $< -o $@
+$(STAGE1OBJS-NETWORK-STANDALONE): %-NETWORK-STANDALONE.o: %.c
+ $(COMPILE) $(INCLUDES) $(NETWORK_STANDALONE_DEFS) $(USB_DEFS_GEN) -c $< -o $@
-$(INITOBJS): %.o: %.c
- $(COMPILE) $(INIT_DEFS) -c $<
+$(STAGE1OBJS-FULL): %-FULL.o: %.c
+ $(COMPILE) $(INCLUDES) -DSPAWN_SHELL $(USB_DEFS_GEN) $(PCMCIA_DEFS) $(STAGE1_DEFS) -c $< -o $@
-.c.o: .depend
- $(COMPILE) $(GLIBC_INCLUDES) $(PCMCIA_DEFS) -c $<
+.c.o:
+ $(COMPILE) $(INCLUDES) -c $<
-clean:
+clean: localclean
@for n in $(DIRS); do \
(cd $$n; make clean) \
done
- rm -f *.o .depend *.rdz *.img $(BINS)
+
+localclean:
+ rm -f *.o .depend *.rdz *.img pci-ids.h pcmcia-ids.h usb-ids.h $(BINS)
+
+
+rescue-gui: rescue-gui.o frontend-common.o params.o utils.o log.o automatic.o $(FRONTEND_LINK)
+ $(CC) $(LDFLAGS) -o $@ $^
+ $(STRIPCMD) $@
+
+probe-modules: probe-modules.o probing-FULL.o modules-FULL.o params-FULL.o utils-FULL.o log-FULL.o automatic-FULL.o frontend-common-FULL.o stdio-frontend.o zlibsupport-FULL.o $(STAGE1_OWN_LIBS) $(PCMCIA_LIB)
+ $(CC) $(LDFLAGS) -o $@ $^
+ $(STRIPCMD) $@
+
+dist: tar
+tar:
+ rm -rf $(PRODUCT)*.tar* $(PRODUCT)-$(VERSION)
+ @cd ..; git archive --prefix=$(PRODUCT)-$(VERSION)/ HEAD mdk-stage1 kernel Makefile.config | xz >mdk-stage1/$(PRODUCT)-$(VERSION).tar.xz;
+ $(info $(PRODUCT)-$(VERSION).tar.xz is ready)
.depend:
- $(CPP) $(CFLAGS) -DHAVE_CONFIG_H -M $(ALLSRC) > .depend
+ $(CPP) $(CFLAGS) -M $(ALLSRC) > .depend
ifeq (.depend,$(wildcard .depend))
include .depend
-endif
+endif
+
+
+*-NETWORK.o: %-NETWORK.o: %.o
+
+*-FULL.o: %-FULL.o: %.o
+
diff --git a/mdk-stage1/Makefile.common b/mdk-stage1/Makefile.common
index ec8441978..f2c70273a 100644
--- a/mdk-stage1/Makefile.common
+++ b/mdk-stage1/Makefile.common
@@ -1,9 +1,9 @@
# -*- makefile -*-
#******************************************************************************
#
- # Guillaume Cottenceau (gc@mandrakesoft.com)
+ # Guillaume Cottenceau (gc)
#
- # Copyright 2000 MandrakeSoft
+ # Copyright 2000 Mandriva
#
# This software may be freely redistributed under the terms of the GNU
# public license.
@@ -15,28 +15,33 @@
#*****************************************************************************
ARCH := $(patsubst i%86,i386,$(shell uname -m))
-ARCH := $(patsubst sparc%,sparc,$(ARCH))
+ARCH := $(ARCH:arm%=arm)
- #- default lib is dietlibc (honoured by main Makefile whenever possible)
-L = DIETLIBC
-# L = GLIBC
+# DEBUG = 1
#- default frontend is newt (honoured by main Makefile whenever possible)
+ifdef DEBUG
+F = STDIO
+else
F = NEWT
-# F = STDIO
+endif
+ifdef DEBUG
+OPTFLAGS = -g -DDEBUG
+else
+OPTFLAGS = -Os
+endif
-DIETLIBC_INCLUDES = -I$(top_dir)/dietlibc/include -I.
-GLIBC_INCLUDES = -I.
-INCLUDES = $($(L)_INCLUDES)
+#- flags used by all stuff
+CFLAGS = $(OPTFLAGS) -pipe -Wall -fomit-frame-pointer -fno-strict-aliasing -Werror
-GLIBC_LDFLAGS_STAGE1 = -static
-DIETLIBC_LDFLAGS_STAGE1 = -nostdlib $(top_dir)/dietlibc/start.o
-LDFLAGS_STAGE1 = $($(L)_LDFLAGS_STAGE1)
+INCLUDES = -I.
-GLIBC_LIBC =
-DIETLIBC_LIBC = $(top_dir)/dietlibc/dietlibc.a
-STAGE1_LIBC = $($(L)_LIBC)
+LDFLAGS =
+ifdef DEBUG
+STRIPCMD = echo not stripping
+else
STRIPCMD = strip -R .note -R .comment
+endif
diff --git a/mdk-stage1/NEWS b/mdk-stage1/NEWS
new file mode 100644
index 000000000..714ea3129
--- /dev/null
+++ b/mdk-stage1/NEWS
@@ -0,0 +1,572 @@
+- Replace i586 with i686 in files
+
+2.62
+
+- Sync list_modules with kernel 6.4
+
+2.61
+
+- Sync with kernel 6.0
+- Increase MEM_LIMIT_* to match current stage2 size
+- Fix the detection of available memory
+- Fix a build failure with -Werror=address
+
+2.60
+
+- Sync with kernel 5.17
+- Sync with kernel 5.18
+- Sync with kernel 5.19
+- Sync with kernel 6.0
+- Sync with kernel 6.1
+
+2.59
+
+- use 'nolock' option for NFS
+
+2.58
+
+- fix 'disk' method after kernel-5.15 breakage
+
+2.57
+
+- http server: allow to specify a port different than default "80" (mga#28367)
+
+2.56
+
+- load exfat module to mount exfat (mga#28371)
+
+2.55
+
+- recognize rtw89_pci HID driver
+
+2.53
+
+- recognize amd_sfh HID driver
+
+2.52
+
+- recognize more rtw88_*
+- sync with kernel 5.10
+
+2.51
+
+- configure wpa_supplicant to try both nl80211 and wext interfaces
+ o some old wireless driver modules may only support wext
+- improve help for entering wireless keys/passphrases
+ o note that ASCII strings can now be used for WEP keys (mga#21042)
+
+2.50
+
+- add support for WPA/WPA2 (mga#9541)
+
+2.49
+
+- sync with kernel 5.9
+
+2.48
+
+- sync with kernel 5.8
+
+2.47
+
+- sync with kernel 5.6/5.7
+
+2.46
+
+- make NVME code really generic and reuse if for most other disks
+
+2.45
+
+- fix NVME code to work for disks with no vendor
+
+2.44
+
+- add support for NVME disks
+
+2.43
+
+- sync with kernel 5.5
+
+2.42
+
+- sync with kernel 5.4
+
+2.41
+
+- sync with kernel 5.3
+
+2.40
+
+- recognize 8821ce (mga#24605)
+
+2.39
+
+- add AMD PCIe MP2 I2C detection
+
+2.38
+
+- sync with kernel 5.1
+
+2.37
+
+- sync with kernel 5.0
+
+2.36
+
+- suppress mount error messages when probing for media (mga#24142)
+- better gcc8 workarounds
+
+2.35
+
+- fix compiling with gcc8
+- compile with -Wno-error=format-truncation for now
+
+2.34
+
+- mounting:
+ o let libblk guess the right fs type rather than manually trying a long list
+ of potential fses
+ o use regular mount tool rather than manual system calls
+ o use regular mount tool for NFS too (support NFSv4, ...)
+
+2.33
+
+- advertize "ext4" rather than "ext2"
+- check for builtin modules in /sys/fs too (eg: ext4)
+- support auto-install with "method:disk,disk:xxx,part:xxxY,dir:zzz"
+
+2.32
+
+- list_modules: don't include vboxvideo (mga#23467)
+
+2.31
+
+- sync with kernel 4.1[89]
+
+2.30
+
+- add missing smartpqi driver (mga#23305)
+
+2.29
+- add missing Mellanox drivers (mga#23263)
+
+2.28
+- sync with kernel 4.1[5-7]
+
+2.27
+- further sync with kernel 4.14
+
+2.26
+- sync with kernel 4.14
+
+2.25
+- fix build with gcc7
+
+2.24
+- recognize 8812au (mga#21043)
+
+2.23
+- recognize new kernel-4.8 drivers
+
+2.22
+- recognize new kernel-4.9 drivers
+
+2.21
+- recognize new kernel-4.7 drivers
+
+2.20
+- fix description of network interfaces (mga#15638)
+
+2.19
+- recognize some missing wireless drivers (mga#16768)
+
+2.18
+- recognize new kernel-4.6 drivers
+
+2.17
+- recognize new kernel-4.4 drivers
+
+2.16
+- recognize new kernel-4.3 drivers
+
+2.15
+- recognize new kernel-4.1 drivers
+
+2.14
+- network.c: fix -Werror=logical-not-parentheses
+
+2.13
+- mount again debugfs for ldetect (mga#14435)
+ (regression in 1.83)
+
+2.12
+- recognize new kernel-3.19 drivers
+
+2.11
+- recognize new kernel-3.18 drivers (mga#14799)
+
+2.10
+- include new 3.18 USB host drivers (mga#14799)
+
+2.9
+- glibc 2.20 wants _DEFAULT_SOURCE instead of _BSD_SOURCE
+
+2.8
+- recognize new kernel-3.17 drivers
+
+2.7
+- recognize hyper-v network card
+
+2.6
+- recognize new kernel-3.16 drivers
+
+2.5
+- stop creating /dev entries now that we use udev
+
+2.4
+- fix building with "make -j24"
+
+2.3
+- recognize new kernel-3.15 drivers
+
+2.2
+- drop support for supermount (dead since 2007)
+- recognize new kernel-3.14 drivers
+
+2.1
+- drop support for SPARC
+- support dynamic linking only
+- use getaddrinfo() with glibc too now that use the dynamic library
+
+2.0
+- kernel modules and firmware is needed during stage2, so move and symlink
+ (symlinks are only for if you umount state2 /usr and want a still working initrd)
+ mga#11600 mga#11601
+
+1.83
+- do initrd symlinking in 'init' rather than 'stage1' (stage1 is now run earlier)
+- build init and stage1 as a shared library (due to bugs in directory handling
+ in dietlibc as exposed in libkmod but also because glibc is already include in
+ dracut)
+
+1.82
+- detect new kernel-3.12 modules
+
+1.81
+- sync with kernel-3.11 (might fix mga#11377)
+
+1.80
+- include latest list_modules.pl
+ (might fix mga#11377)
+
+1.79
+- fix compiling with gcc-4.8
+
+1.78
+- probe virtual drivers too (mga#9546)
+ (install from Xen hd not supported yet)
+
+1.77
+- use kmod for module loading (mga#9242, based on Pok works @mdv)
+
+1.76
+- revert patch introduced in r7542
+
+1.75
+- fix loading modules with "-" in their names (mga#9242)
+
+1.74.1
+- update list_modules for xen dom0 and virtio support (#9242)
+
+1.74
+- fix unitialized memory screwing up dialog input (pok, mdv, mga#8729)
+- kill bootsplash support (we drop bootsplash in kernel in 2008)
+- kill firmware loader now that firmware are loaded by the kernel
+
+1.73
+- add firmware loader written in C (based on hotplug2) (mga#6323)
+
+1.72
+- fix URL passed to stage2 when user didn't provide the arch in the
+ install path (mga#6823)
+- retry with FTP instead of HTTP when there's no proxy and user didn't
+ provided the architecture in the URL
+
+1.71
+- silent hid_generic loading
+
+1.70
+- mount /dev as devtmpfs (pok, mdv)
+- rely on /sys being created in images
+
+1.69
+- do not try to mount /proc/bus/usb
+- load hid-generic
+
+1.68
+- mount /sys/kernel/debug (needed for new ldetect)
+
+1.67
+- make sure nurses get initialized in UTF-8 (mga#4894)
+- revert to "linux" terminfo
+
+1.66
+- do not advice long dead pcmcia.img & network.img images (mga#5466)
+- first attempt at supporting XenBlk discs
+- hide "KA server" option (mga#5944)
+- switch from gethostbyname() to getaddrinfo() (mga#4056)
+- switch from gethostbyaddr() to getnameinfo()
+- use system libraries for newtw, slang & sysfs (mdv)
+
+1.65
+- load btrfs module to mount btrfs
+- try mounting as btrfs
+
+1.64
+- default to "screen" instead of "linux" terminfo (mga#4894)
+
+1.63
+- do not try to load obsolete sqlzma & squashfs_lzma kernel modules
+- recognize c67x00, imx21-hcd, fhci, isp1362-hcd, oxu210hp-hcd & renesas-usbhs
+ USB host drivers (mga#4905)
+
+1.62
+- fix segfaulting when ISO directory is not valid (mga#4592)
+
+1.61
+- fix building with newer dietlibc/zlib
+
+1.60
+- add support for virtio discs
+
+1.59
+- try to use arch-prefixed location for FTP & HTTP installs (mga#2578)
+
+1.58
+- add support for kernel compressed as XZ
+
+1.57
+- fix linking with new kmod
+
+1.56
+- kill 10 years old snapshot of pppd & pppoe
+ (now using upstream pppd & pppoe)
+- link with libkmod instead of libmodprobe
+
+1.55:
+- pcmcia: kill obsolete test for 2.2 kernel
+- sync with kernel-3.2.0-0.rc7.1.mga2 for updated list_modules.pm
+
+1.54:
+- fix retrieving mirrorlist, broken in 1.53
+- fix build with Werror
+
+1.53:
+- display distro name in mirror list too (#191)
+
+1.52:
+- fix build with gcc-4.6.2
+ * fixes -Werror=unused-but-set-variable
+
+1.51:
+- sync with kernel-3.1.0-1.mga2
+ * add hid devices:
+ hid-keytouch, hid-uclogic
+ * add sas/raid driver:
+ isci
+ * add sound devices:
+ snd-lola, snd-firewire-speakers snd-isight, snd-usb-6fire
+ * add usb/storage:
+ ums-eneub6250, ums-realtek
+ * add wireless drivers:
+ brcmsmac, rtl8187se, rtusb, rtl8192se, rtl8192cu, rtl8192de
+
+1.50:
+- do not attempt to perform ISA probe for PCMCIA controller on x86_64
+ as it fails with kvm_amd (#1156)
+- add ums-* (USB mass storage) modules in disk/usb category
+
+1.49:
+- use new libldetect API for finding out unknown devices
+- handle more PCMCIA controllers
+- "i82365" driver was renamed "pd6729"
+
+1.48:
+- arm/mips support
+- try to handle built-in modules
+- fix build with Werror
+- use mirrors.mageia.org/api for mirror list
+
+1.47:
+- 2011.0 build
+
+1.46:
+- create device listed in /proc/partitions with correct major/minor (#57032)
+
+1.45:
+- do not list /dev/fd0 when no floppy is found (#58390)
+
+1.44:
+- rebuild with latest list_modules.pm (might fix #57833)
+
+1.43:
+- bump version (#57466)
+
+1.42:
+- list asix module in network/usb group
+- virtio: fix device probing: use PCI subdevices
+- fix format string bug from 1.41
+
+1.41:
+- load needed modules for known virtio devices, fixes #51804
+
+1.39:
+- set uevent helper which will load firmware and do not set firmware
+ timeout to 1 second (it will fail if firmware is not there)
+
+1.38:
+- handle hybrid ISOs (ISO images dumped to USB keys)
+
+1.37:
+- enumerate hid bus and load hid quirk modules, fixes #47167
+
+1.36:
+- load appropriate modules before trying to mount ext4/reiser4
+
+1.35:
+- allow installing from ext3/ext4/reiser4
+
+1.34:
+- adapt to new modules.dep format (prefix modules with directory path)
+- try to use arch-prefixed location for automatic disk installs
+
+1.33:
+- build fix for glibc 2.8
+- sort modules in the interface
+- try to load squashfs_lzma too
+
+1.32:
+- automatically find compressed stage2 with automatic=method:disk
+
+1.31:
+- usbkbd is dead, using usbhid instead
+
+1.30:
+- add back "ide-generic" support (incorrectly removed in 1.17), the
+ module that we want to avoid is "ide-pci-generic" (previously "generic"),
+ and this is handled by ldetect-lst preferred modules list
+- handle ide-cd being renamed as ide-cd_mod
+
+1.29:
+- allow to pass module options to probe-modules
+- build fixes for gcc 4.3
+
+1.28:
+- fix segfault with empty device description (can happen for USB devices)
+
+1.27.1:
+- fix build
+
+1.27:
+- do not set firmware timeout to 1 second in probe-modules helper for
+ Mandriva One (#39216)
+
+1.26:
+- load bus/firewire controllers (#31356)
+- really ask dhcp domain if not guessed
+
+1.25:
+- do not allow to choose outdated cooker mirror list (#37278)
+
+1.24:
+- load disk/ide before disk/scsi (#38451, to prevent sata deps from
+ overriding non-libata pata modules, like in stage2)
+- fix asking modules when no controller is detected
+
+1.23:
+- probe usb-storage/sbp2 only when probing USB/SCSI buses
+ (to make automatic boot faster on IDE)
+- make dhcp the first choice (instead of static) in the network type menu
+- clear tty2 after shell is killed
+- log "killed shell" message on tty3
+- add a space in front of top line (like help message)
+- space-pad top line with spaces to the right (like help message)
+
+1.22:
+- fix automatic IDE media detection (was broken with multiple CD drives, #36161)
+- fix bootsplash in automatic CD-Rom mode (as a result of IDE media detection fix)
+- wait only 1 second for firmware upload (not to hang boot with iwl3945, #37279)
+
+1.21:
+- load nls_cp437 and nls_iso8859_1 when loading vfat
+ (used to be in custom modules.dep)
+
+1.20:
+- probe-modules:
+ o handle the "--usb" option instead of "usb"
+ o load module passed as argument (if any), instead of probing bus
+- switch to modules from /lib/modules/`uname -r`, modules.dep containing full filename
+
+1.19:
+- rebuild with list_modules to handle atl2 ethernet driver
+
+1.18:
+- add probe-modules helper
+
+1.17:
+- use modules from disk/ide category (#33043)
+- do not explicitely try to load ide-generic, ldetect will fallback to
+ ide-generic when appropriate (#33043)
+
+1.16:
+- if you give nfs directory xxx, try to use xxx/ARCH
+- handle cdroms with and without ARCH at the root
+
+1.15:
+- ask loading modules from /modules if needed
+- read modules description from /modules/modules.description
+
+1.14:
+- fix segfault in USB detection code (when no module match, #32624)
+
+1.13:
+- use module names instead of filenames
+- convert module name to filename before loading it
+ (using modules.dep to get filename)
+- keep module in dependencies list even if it has no dependencies
+ (to keep track of its filename)
+- use '_' in module names when explicitely loading modules (cosmetics)
+
+1.12:
+- adapt to new list_modules
+
+1.11:
+- use ldetect/libmodprobe/libpci instead of custom pci/usb probe
+- rename rescue "GUI" as rescue "menu"
+
+1.10.1:
+- link init with dietlibc instead of minilibc on ix86/x86-64
+- add missing includes for wireless
+- fix build of pppoe by using dietlibc termios header
+
+1.10:
+- add ide-disk module
+- load ide-disk when detecting disks (ide is now modularized...)
+
+1.9:
+- ide is now modularized
+
+1.8:
+- build pcmcia header only on i386/x86_64 (#30668)
+- use api.mandriva.com to retrieve mirror list (#29346)
+
+1.7:
+- don't kill our init/klogd when running stage2
+ (bug introduced when switching to initramfs)
+
+1.6:
+- write DNS settings in temporary ifcfg file
+ (fixes resolv.conf post install)
+
+1.5:
+- fix infinite loop in wired interface mode
diff --git a/mdk-stage1/adsl.c b/mdk-stage1/adsl.c
new file mode 100644
index 000000000..70968f50b
--- /dev/null
+++ b/mdk-stage1/adsl.c
@@ -0,0 +1,183 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <resolv.h>
+#include <signal.h>
+
+#include "stage1.h"
+#include "log.h"
+#include "network.h"
+#include "modules.h"
+#include "utils.h"
+#include "frontend.h"
+#include "automatic.h"
+
+#include "adsl.h"
+
+
+static enum return_type adsl_connect(struct interface_info * intf, char * username, char * password, char * acname)
+{
+ char pppoe_call[500];
+ char * pppd_launch[] = { "/sbin/pppd", "pty", pppoe_call, "noipdefault", "noauth", "default-asyncmap", "defaultroute",
+ "hide-password", "nodetach", "usepeerdns", "local", "mtu", "1492", "mru", "1492", "noaccomp",
+ "noccp", "nobsdcomp", "nodeflate", "nopcomp", "novj", "novjccomp", "user", username,
+ "password", password, "lcp-echo-interval", "20", "lcp-echo-failure", "3", "lock", "persist", NULL };
+ int fd;
+ int retries = 10;
+ char * tty_adsl = "/dev/tty6";
+ enum return_type status = RETURN_ERROR;
+ pid_t ppp_pid;
+
+ snprintf(pppoe_call, sizeof(pppoe_call), "/sbin/pppoe -p /var/run/pppoe.conf-adsl.pid.pppoe -I %s -T 80 -U -m 1412", intf->device);
+
+ if (!streq(acname, "")) {
+ strcat(pppoe_call, "-C ");
+ strcat(pppoe_call, acname);
+ }
+
+ fd = open(tty_adsl, O_RDWR);
+ if (fd == -1) {
+ log_message("cannot open tty -- no pppd");
+ return RETURN_ERROR;
+ }
+ else if (access(pppd_launch[0], X_OK)) {
+ log_message("cannot open pppd - %s doesn't exist", pppd_launch[0]);
+ return RETURN_ERROR;
+ }
+
+ if (!(ppp_pid = fork())) {
+ dup2(fd, 0);
+ dup2(fd, 1);
+ dup2(fd, 2);
+
+ close(fd);
+ setsid();
+ if (ioctl(0, TIOCSCTTY, NULL))
+ log_perror("could not set new controlling tty");
+
+ printf("\t(exec of pppd)\n");
+ execv(pppd_launch[0], pppd_launch);
+ log_message("execve of %s failed: %s", pppd_launch[0], strerror(errno));
+ exit(-1);
+ }
+ close(fd);
+ while (retries > 0 && kill(ppp_pid, 0) == 0) {
+ FILE * f;
+ if ((f = fopen("/var/run/pppd.tdb", "rb"))) {
+ while (1) {
+ char buf[500];
+ char *p;
+ if (!fgets(buf, sizeof(buf), f))
+ break;
+ p = strstr(buf, "IPLOCAL=");
+ if (p) {
+ struct sockaddr_in addr;
+ if (inet_aton(p + 8, &addr.sin_addr))
+ intf->ip = addr.sin_addr;
+ status = RETURN_OK;
+ }
+ }
+ fclose(f);
+ if (status == RETURN_OK) {
+ log_message("PPP: connected!");
+ break;
+ }
+ }
+ retries--;
+ log_message("PPP: <sleep>");
+ sleep(2);
+ }
+
+ if (status != RETURN_OK) {
+ log_message("PPP: could not connect");
+ kill(ppp_pid, SIGTERM);
+ sleep(1);
+ kill(ppp_pid, SIGKILL);
+ sleep(1);
+ }
+ return status;
+}
+
+
+enum return_type perform_adsl(struct interface_info * intf)
+{
+ struct in_addr addr;
+ char * questions[] = { "Username", "Password", "AC Name", NULL };
+ char * questions_auto[] = { "adsluser", "adslpass", "adslacname", NULL };
+ static char ** answers = NULL;
+ enum return_type results;
+
+ inet_aton("10.0.0.10", &addr);
+ memcpy(&intf->ip, &addr, sizeof(addr));
+
+ inet_aton("255.255.255.0", &addr);
+ memcpy(&intf->netmask, &addr, sizeof(addr));
+
+ *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) &
+ *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask));
+
+ intf->is_ptp = 0;
+
+ if (configure_net_device(intf)) {
+ stg1_error_message("Could not configure..");
+ return RETURN_ERROR;
+ }
+
+ results = ask_from_entries_auto("Please enter the username and password for your ADSL account.\n"
+ "Leave blank the AC Name field if you don't know what it means.\n"
+ "(Warning! only PPPoE protocol is supported)",
+ questions, &answers, 40, questions_auto, NULL);
+ if (results != RETURN_OK)
+ return results;
+
+ intf->boot_proto = BOOTPROTO_ADSL_PPPOE;
+
+ wait_message("Waiting for ADSL connection to show up...");
+ my_modprobe("ppp_generic", ANY_DRIVER_TYPE, NULL);
+ my_modprobe("ppp_async", ANY_DRIVER_TYPE, NULL);
+ results = adsl_connect(intf, answers[0], answers[1], answers[2]);
+ remove_wait_message();
+
+ if (results != RETURN_OK) {
+ wait_message("Retrying the ADSL connection...");
+ results = adsl_connect(intf, answers[0], answers[1], answers[2]);
+ remove_wait_message();
+ } else {
+ intf->user = strdup(answers[0]);
+ intf->pass = strdup(answers[1]);
+ intf->acname = strdup(answers[2]);
+ }
+
+ if (results != RETURN_OK) {
+ stg1_error_message("I could not connect to the ADSL network.");
+ return perform_adsl(intf);
+ }
+
+ sleep(1);
+ res_init(); /* reinit the resolver, pppd modified /etc/resolv.conf */
+
+ return RETURN_OK;
+}
diff --git a/mdk-stage1/adsl.h b/mdk-stage1/adsl.h
new file mode 100644
index 000000000..aa4461108
--- /dev/null
+++ b/mdk-stage1/adsl.h
@@ -0,0 +1,34 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * View the homepage: http://us.mandriva.com/~gc/html/stage1.html
+ *
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * Portions from GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2000 Free Software Foundation, Inc.
+ *
+ * Itself based on etherboot-4.6.4 by Martin Renters.
+ *
+ */
+
+#ifndef _ADSL_H_
+#define _ADSL_H_
+
+#include "stage1.h"
+#include "network.h"
+
+enum return_type perform_adsl(struct interface_info * intf);
+
+#endif
diff --git a/mdk-stage1/automatic.c b/mdk-stage1/automatic.c
index 486a829de..5e9ed56a2 100644
--- a/mdk-stage1/automatic.c
+++ b/mdk-stage1/automatic.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <string.h>
#include "tools.h"
+#include "utils.h"
#include "stage1.h"
#include "frontend.h"
#include "log.h"
@@ -45,14 +46,14 @@ void grab_automatic_params(char * line)
int j = i;
while (line[i] != ':' && line[i] != '\0')
i++;
- name = memdup(&line[j], i-j + 1);
+ name = _memdup(&line[j], i-j + 1);
name[i-j] = 0;
k = i+1;
i++;
while (line[i] != ',' && line[i] != '\0')
i++;
- value = memdup(&line[k], i-k + 1);
+ value = _memdup(&line[k], i-k + 1);
value[i-k] = 0;
tmp_params[p].name = name;
@@ -64,7 +65,7 @@ void grab_automatic_params(char * line)
}
tmp_params[p++].name = NULL;
- automatic_params = memdup(tmp_params, sizeof(struct param_elem) * p);
+ automatic_params = _memdup(tmp_params, sizeof(struct param_elem) * p);
log_message("AUTOMATIC MODE: got %d params", p-1);
}
@@ -74,8 +75,22 @@ char * get_auto_value(char * auto_param)
{
struct param_elem * ptr = automatic_params;
+ struct param_elem short_aliases[] =
+ { { "method", "met" }, { "network", "netw" }, { "interface", "int" }, { "gateway", "gat" },
+ { "netmask", "netm" }, { "adsluser", "adslu" }, { "adslpass", "adslp" }, { "hostname", "hos" },
+ { "domain", "dom" }, { "server", "ser" }, { "directory", "dir" }, { "user", "use" },
+ { "pass", "pas" }, { "disk", "dis" }, { "partition", "par" }, { "proxy_host", "proxh" },
+ { "proxy_port", "proxp" }, { NULL, NULL } };
+ struct param_elem * ptr_alias = short_aliases;
+ while (ptr_alias->name) {
+ if (streq(auto_param, ptr_alias->name))
+ break;
+ ptr_alias++;
+ }
+
while (ptr->name) {
- if (!strcmp(ptr->name, auto_param))
+ if (streq(ptr->name, auto_param)
+ || (ptr_alias->name && streq(ptr_alias->value, ptr->name)))
return ptr->value;
ptr++;
}
@@ -86,9 +101,9 @@ char * get_auto_value(char * auto_param)
enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto)
{
- if (!IS_AUTOMATIC)
+ if (!IS_AUTOMATIC) {
return ask_from_list(msg, elems, choice);
- else {
+ } else {
char ** sav_elems = elems;
char * tmp = get_auto_value(auto_param);
while (elems && *elems) {
@@ -100,16 +115,16 @@ enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, ch
elems++;
elems_auto++;
}
- unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */
+ unset_automatic(); /* we are in a fallback mode */
return ask_from_list(msg, sav_elems, choice);
}
}
enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** elems_comments, char ** choice, char * auto_param, char ** elems_auto)
{
- if (!IS_AUTOMATIC)
+ if (!IS_AUTOMATIC) {
return ask_from_list_comments(msg, elems, elems_comments, choice);
- else {
+ } else {
char ** sav_elems = elems;
char * tmp = get_auto_value(auto_param);
while (elems && *elems) {
@@ -121,7 +136,7 @@ enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** e
elems++;
elems_auto++;
}
- unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */
+ unset_automatic(); /* we are in a fallback mode */
return ask_from_list_comments(msg, sav_elems, elems_comments, choice);
}
}
@@ -129,9 +144,9 @@ enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** e
enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** answers, int entry_size, char ** questions_auto, void (*callback_func)(char ** strings))
{
- if (!IS_AUTOMATIC)
+ if (!IS_AUTOMATIC) {
return ask_from_entries(msg, questions, answers, entry_size, callback_func);
- else {
+ } else {
char * tmp_answers[50];
int i = 0;
while (questions && *questions) {
@@ -142,7 +157,7 @@ enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** an
questions_auto++;
}
- *answers = memdup(tmp_answers, sizeof(char *) * i);
+ *answers = _memdup(tmp_answers, sizeof(char *) * i);
return RETURN_OK;
}
}
diff --git a/mdk-stage1/automatic.h b/mdk-stage1/automatic.h
index c2ac0a73d..5fb890d61 100644
--- a/mdk-stage1/automatic.h
+++ b/mdk-stage1/automatic.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -24,6 +24,7 @@
#include "stage1.h"
void grab_automatic_params(char * line);
+char * get_auto_value(char * auto_param);
enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto);
enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** elems_comments, char ** choice, char * auto_param, char ** elems_auto);
diff --git a/mdk-stage1/bzlib/Makefile b/mdk-stage1/bzlib/Makefile
deleted file mode 100644
index 3015ccc2d..000000000
--- a/mdk-stage1/bzlib/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
- #******************************************************************************
- #
- # Guillaume Cottenceau (gc@mandrakesoft.com)
- #
- # Copyright 2000 MandrakeSoft
- #
- # This software may be freely redistributed under the terms of the GNU
- # public license.
- #
- # 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- #
- #*****************************************************************************
-
-top_dir = ..
-
-include $(top_dir)/Makefile.common
-
-
-all: libbzlib.a libbzlib-DIET.a
-
-clean:
- rm -f *.o *.a
-
-FLAGS = -Wall -Werror -Os -fomit-frame-pointer -c
-
-
-OBJS = blocksort.o bzlib.o compress.o crctable.o decompress.o huffman.o randtable.o
-OBJS-DIET = $(subst .o,-DIET.o,$(OBJS))
-
-
-libbzlib.a: $(OBJS)
- ar -cru $@ $^
- ranlib $@
-
-libbzlib-DIET.a: $(OBJS-DIET)
- ar -cru $@ $^
- ranlib $@
-
-
-$(OBJS): %.o: %.c
- gcc $(FLAGS) $(GLIBC_INCLUDES) -c $< -o $@
-
-$(OBJS-DIET): %-DIET.o: %.c
- gcc $(FLAGS) $(DIETLIBC_INCLUDES) -c $< -o $@
-
diff --git a/mdk-stage1/bzlib/blocksort.c b/mdk-stage1/bzlib/blocksort.c
deleted file mode 100644
index c1b78c483..000000000
--- a/mdk-stage1/bzlib/blocksort.c
+++ /dev/null
@@ -1,1138 +0,0 @@
-
-/*-------------------------------------------------------------*/
-/*--- Block sorting machinery ---*/
-/*--- blocksort.c ---*/
-/*-------------------------------------------------------------*/
-
-/*--
- This file is a part of bzip2 and/or libbzip2, a program and
- library for lossless, block-sorting data compression.
-
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
-
- 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. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
- 3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
- 4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-
- Julian Seward, Cambridge, UK.
- jseward@acm.org
- bzip2/libbzip2 version 1.0 of 21 March 2000
-
- This program is based on (at least) the work of:
- Mike Burrows
- David Wheeler
- Peter Fenwick
- Alistair Moffat
- Radford Neal
- Ian H. Witten
- Robert Sedgewick
- Jon L. Bentley
-
- For more information on these sources, see the manual.
-
- To get some idea how the block sorting algorithms in this file
- work, read my paper
- On the Performance of BWT Sorting Algorithms
- in Proceedings of the IEEE Data Compression Conference 2000,
- Snowbird, Utah, USA, 27-30 March 2000. The main sort in this
- file implements the algorithm called cache in the paper.
---*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "bzlib_private.h"
-
-/*---------------------------------------------*/
-/*--- Fallback O(N log(N)^2) sorting ---*/
-/*--- algorithm, for repetitive blocks ---*/
-/*---------------------------------------------*/
-
-/*---------------------------------------------*/
-static
-__inline__
-void fallbackSimpleSort ( UInt32* fmap,
- UInt32* eclass,
- Int32 lo,
- Int32 hi )
-{
- Int32 i, j, tmp;
- UInt32 ec_tmp;
-
- if (lo == hi) return;
-
- if (hi - lo > 3) {
- for ( i = hi-4; i >= lo; i-- ) {
- tmp = fmap[i];
- ec_tmp = eclass[tmp];
- for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 )
- fmap[j-4] = fmap[j];
- fmap[j-4] = tmp;
- }
- }
-
- for ( i = hi-1; i >= lo; i-- ) {
- tmp = fmap[i];
- ec_tmp = eclass[tmp];
- for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ )
- fmap[j-1] = fmap[j];
- fmap[j-1] = tmp;
- }
-}
-
-
-/*---------------------------------------------*/
-#define fswap(zz1, zz2) \
- { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
-
-#define fvswap(zzp1, zzp2, zzn) \
-{ \
- Int32 yyp1 = (zzp1); \
- Int32 yyp2 = (zzp2); \
- Int32 yyn = (zzn); \
- while (yyn > 0) { \
- fswap(fmap[yyp1], fmap[yyp2]); \
- yyp1++; yyp2++; yyn--; \
- } \
-}
-
-
-#define fmin(a,b) ((a) < (b)) ? (a) : (b)
-
-#define fpush(lz,hz) { stackLo[sp] = lz; \
- stackHi[sp] = hz; \
- sp++; }
-
-#define fpop(lz,hz) { sp--; \
- lz = stackLo[sp]; \
- hz = stackHi[sp]; }
-
-#define FALLBACK_QSORT_SMALL_THRESH 10
-#define FALLBACK_QSORT_STACK_SIZE 100
-
-
-static
-void fallbackQSort3 ( UInt32* fmap,
- UInt32* eclass,
- Int32 loSt,
- Int32 hiSt )
-{
- Int32 unLo, unHi, ltLo, gtHi, n, m;
- Int32 sp, lo, hi;
- UInt32 med, r, r3;
- Int32 stackLo[FALLBACK_QSORT_STACK_SIZE];
- Int32 stackHi[FALLBACK_QSORT_STACK_SIZE];
-
- r = 0;
-
- sp = 0;
- fpush ( loSt, hiSt );
-
- while (sp > 0) {
-
- AssertH ( sp < FALLBACK_QSORT_STACK_SIZE, 1004 );
-
- fpop ( lo, hi );
- if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) {
- fallbackSimpleSort ( fmap, eclass, lo, hi );
- continue;
- }
-
- /* Random partitioning. Median of 3 sometimes fails to
- avoid bad cases. Median of 9 seems to help but
- looks rather expensive. This too seems to work but
- is cheaper. Guidance for the magic constants
- 7621 and 32768 is taken from Sedgewick's algorithms
- book, chapter 35.
- */
- r = ((r * 7621) + 1) % 32768;
- r3 = r % 3;
- if (r3 == 0) med = eclass[fmap[lo]]; else
- if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else
- med = eclass[fmap[hi]];
-
- unLo = ltLo = lo;
- unHi = gtHi = hi;
-
- while (1) {
- while (1) {
- if (unLo > unHi) break;
- n = (Int32)eclass[fmap[unLo]] - (Int32)med;
- if (n == 0) {
- fswap(fmap[unLo], fmap[ltLo]);
- ltLo++; unLo++;
- continue;
- };
- if (n > 0) break;
- unLo++;
- }
- while (1) {
- if (unLo > unHi) break;
- n = (Int32)eclass[fmap[unHi]] - (Int32)med;
- if (n == 0) {
- fswap(fmap[unHi], fmap[gtHi]);
- gtHi--; unHi--;
- continue;
- };
- if (n < 0) break;
- unHi--;
- }
- if (unLo > unHi) break;
- fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--;
- }
-
- AssertD ( unHi == unLo-1, "fallbackQSort3(2)" );
-
- if (gtHi < ltLo) continue;
-
- n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n);
- m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m);
-
- n = lo + unLo - ltLo - 1;
- m = hi - (gtHi - unHi) + 1;
-
- if (n - lo > hi - m) {
- fpush ( lo, n );
- fpush ( m, hi );
- } else {
- fpush ( m, hi );
- fpush ( lo, n );
- }
- }
-}
-
-#undef fmin
-#undef fpush
-#undef fpop
-#undef fswap
-#undef fvswap
-#undef FALLBACK_QSORT_SMALL_THRESH
-#undef FALLBACK_QSORT_STACK_SIZE
-
-
-/*---------------------------------------------*/
-/* Pre:
- nblock > 0
- eclass exists for [0 .. nblock-1]
- ((UChar*)eclass) [0 .. nblock-1] holds block
- ptr exists for [0 .. nblock-1]
-
- Post:
- ((UChar*)eclass) [0 .. nblock-1] holds block
- All other areas of eclass destroyed
- fmap [0 .. nblock-1] holds sorted order
- bhtab [ 0 .. 2+(nblock/32) ] destroyed
-*/
-
-#define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31))
-#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31))
-#define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31)))
-#define WORD_BH(zz) bhtab[(zz) >> 5]
-#define UNALIGNED_BH(zz) ((zz) & 0x01f)
-
-static
-void fallbackSort ( UInt32* fmap,
- UInt32* eclass,
- UInt32* bhtab,
- Int32 nblock,
- Int32 verb )
-{
- Int32 ftab[257];
- Int32 ftabCopy[256];
- Int32 H, i, j, k, l, r, cc, cc1;
- Int32 nNotDone;
- Int32 nBhtab;
- UChar* eclass8 = (UChar*)eclass;
-
- /*--
- Initial 1-char radix sort to generate
- initial fmap and initial BH bits.
- --*/
- if (verb >= 4)
- VPrintf0 ( " bucket sorting ...\n" );
- for (i = 0; i < 257; i++) ftab[i] = 0;
- for (i = 0; i < nblock; i++) ftab[eclass8[i]]++;
- for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i];
- for (i = 1; i < 257; i++) ftab[i] += ftab[i-1];
-
- for (i = 0; i < nblock; i++) {
- j = eclass8[i];
- k = ftab[j] - 1;
- ftab[j] = k;
- fmap[k] = i;
- }
-
- nBhtab = 2 + (nblock / 32);
- for (i = 0; i < nBhtab; i++) bhtab[i] = 0;
- for (i = 0; i < 256; i++) SET_BH(ftab[i]);
-
- /*--
- Inductively refine the buckets. Kind-of an
- "exponential radix sort" (!), inspired by the
- Manber-Myers suffix array construction algorithm.
- --*/
-
- /*-- set sentinel bits for block-end detection --*/
- for (i = 0; i < 32; i++) {
- SET_BH(nblock + 2*i);
- CLEAR_BH(nblock + 2*i + 1);
- }
-
- /*-- the log(N) loop --*/
- H = 1;
- while (1) {
-
- if (verb >= 4)
- VPrintf1 ( " depth %6d has ", H );
-
- j = 0;
- for (i = 0; i < nblock; i++) {
- if (ISSET_BH(i)) j = i;
- k = fmap[i] - H; if (k < 0) k += nblock;
- eclass[k] = j;
- }
-
- nNotDone = 0;
- r = -1;
- while (1) {
-
- /*-- find the next non-singleton bucket --*/
- k = r + 1;
- while (ISSET_BH(k) && UNALIGNED_BH(k)) k++;
- if (ISSET_BH(k)) {
- while (WORD_BH(k) == 0xffffffff) k += 32;
- while (ISSET_BH(k)) k++;
- }
- l = k - 1;
- if (l >= nblock) break;
- while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++;
- if (!ISSET_BH(k)) {
- while (WORD_BH(k) == 0x00000000) k += 32;
- while (!ISSET_BH(k)) k++;
- }
- r = k - 1;
- if (r >= nblock) break;
-
- /*-- now [l, r] bracket current bucket --*/
- if (r > l) {
- nNotDone += (r - l + 1);
- fallbackQSort3 ( fmap, eclass, l, r );
-
- /*-- scan bucket and generate header bits-- */
- cc = -1;
- for (i = l; i <= r; i++) {
- cc1 = eclass[fmap[i]];
- if (cc != cc1) { SET_BH(i); cc = cc1; };
- }
- }
- }
-
- if (verb >= 4)
- VPrintf1 ( "%6d unresolved strings\n", nNotDone );
-
- H *= 2;
- if (H > nblock || nNotDone == 0) break;
- }
-
- /*--
- Reconstruct the original block in
- eclass8 [0 .. nblock-1], since the
- previous phase destroyed it.
- --*/
- if (verb >= 4)
- VPrintf0 ( " reconstructing block ...\n" );
- j = 0;
- for (i = 0; i < nblock; i++) {
- while (ftabCopy[j] == 0) j++;
- ftabCopy[j]--;
- eclass8[fmap[i]] = (UChar)j;
- }
- AssertH ( j < 256, 1005 );
-}
-
-#undef SET_BH
-#undef CLEAR_BH
-#undef ISSET_BH
-#undef WORD_BH
-#undef UNALIGNED_BH
-
-
-/*---------------------------------------------*/
-/*--- The main, O(N^2 log(N)) sorting ---*/
-/*--- algorithm. Faster for "normal" ---*/
-/*--- non-repetitive blocks. ---*/
-/*---------------------------------------------*/
-
-/*---------------------------------------------*/
-static
-__inline__
-Bool mainGtU ( UInt32 i1,
- UInt32 i2,
- UChar* block,
- UInt16* quadrant,
- UInt32 nblock,
- Int32* budget )
-{
- Int32 k;
- UChar c1, c2;
- UInt16 s1, s2;
-
- AssertD ( i1 != i2, "mainGtU" );
- /* 1 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 2 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 3 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 4 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 5 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 6 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 7 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 8 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 9 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 10 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 11 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
- /* 12 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- i1++; i2++;
-
- k = nblock + 8;
-
- do {
- /* 1 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- s1 = quadrant[i1]; s2 = quadrant[i2];
- if (s1 != s2) return (s1 > s2);
- i1++; i2++;
- /* 2 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- s1 = quadrant[i1]; s2 = quadrant[i2];
- if (s1 != s2) return (s1 > s2);
- i1++; i2++;
- /* 3 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- s1 = quadrant[i1]; s2 = quadrant[i2];
- if (s1 != s2) return (s1 > s2);
- i1++; i2++;
- /* 4 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- s1 = quadrant[i1]; s2 = quadrant[i2];
- if (s1 != s2) return (s1 > s2);
- i1++; i2++;
- /* 5 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- s1 = quadrant[i1]; s2 = quadrant[i2];
- if (s1 != s2) return (s1 > s2);
- i1++; i2++;
- /* 6 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- s1 = quadrant[i1]; s2 = quadrant[i2];
- if (s1 != s2) return (s1 > s2);
- i1++; i2++;
- /* 7 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- s1 = quadrant[i1]; s2 = quadrant[i2];
- if (s1 != s2) return (s1 > s2);
- i1++; i2++;
- /* 8 */
- c1 = block[i1]; c2 = block[i2];
- if (c1 != c2) return (c1 > c2);
- s1 = quadrant[i1]; s2 = quadrant[i2];
- if (s1 != s2) return (s1 > s2);
- i1++; i2++;
-
- if (i1 >= nblock) i1 -= nblock;
- if (i2 >= nblock) i2 -= nblock;
-
- k -= 8;
- (*budget)--;
- }
- while (k >= 0);
-
- return False;
-}
-
-
-/*---------------------------------------------*/
-/*--
- Knuth's increments seem to work better
- than Incerpi-Sedgewick here. Possibly
- because the number of elems to sort is
- usually small, typically <= 20.
---*/
-static
-Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280,
- 9841, 29524, 88573, 265720,
- 797161, 2391484 };
-
-static
-void mainSimpleSort ( UInt32* ptr,
- UChar* block,
- UInt16* quadrant,
- Int32 nblock,
- Int32 lo,
- Int32 hi,
- Int32 d,
- Int32* budget )
-{
- Int32 i, j, h, bigN, hp;
- UInt32 v;
-
- bigN = hi - lo + 1;
- if (bigN < 2) return;
-
- hp = 0;
- while (incs[hp] < bigN) hp++;
- hp--;
-
- for (; hp >= 0; hp--) {
- h = incs[hp];
-
- i = lo + h;
- while (True) {
-
- /*-- copy 1 --*/
- if (i > hi) break;
- v = ptr[i];
- j = i;
- while ( mainGtU (
- ptr[j-h]+d, v+d, block, quadrant, nblock, budget
- ) ) {
- ptr[j] = ptr[j-h];
- j = j - h;
- if (j <= (lo + h - 1)) break;
- }
- ptr[j] = v;
- i++;
-
- /*-- copy 2 --*/
- if (i > hi) break;
- v = ptr[i];
- j = i;
- while ( mainGtU (
- ptr[j-h]+d, v+d, block, quadrant, nblock, budget
- ) ) {
- ptr[j] = ptr[j-h];
- j = j - h;
- if (j <= (lo + h - 1)) break;
- }
- ptr[j] = v;
- i++;
-
- /*-- copy 3 --*/
- if (i > hi) break;
- v = ptr[i];
- j = i;
- while ( mainGtU (
- ptr[j-h]+d, v+d, block, quadrant, nblock, budget
- ) ) {
- ptr[j] = ptr[j-h];
- j = j - h;
- if (j <= (lo + h - 1)) break;
- }
- ptr[j] = v;
- i++;
-
- if (*budget < 0) return;
- }
- }
-}
-
-
-/*---------------------------------------------*/
-/*--
- The following is an implementation of
- an elegant 3-way quicksort for strings,
- described in a paper "Fast Algorithms for
- Sorting and Searching Strings", by Robert
- Sedgewick and Jon L. Bentley.
---*/
-
-#define mswap(zz1, zz2) \
- { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
-
-#define mvswap(zzp1, zzp2, zzn) \
-{ \
- Int32 yyp1 = (zzp1); \
- Int32 yyp2 = (zzp2); \
- Int32 yyn = (zzn); \
- while (yyn > 0) { \
- mswap(ptr[yyp1], ptr[yyp2]); \
- yyp1++; yyp2++; yyn--; \
- } \
-}
-
-static
-__inline__
-UChar mmed3 ( UChar a, UChar b, UChar c )
-{
- UChar t;
- if (a > b) { t = a; a = b; b = t; };
- if (b > c) {
- b = c;
- if (a > b) b = a;
- }
- return b;
-}
-
-#define mmin(a,b) ((a) < (b)) ? (a) : (b)
-
-#define mpush(lz,hz,dz) { stackLo[sp] = lz; \
- stackHi[sp] = hz; \
- stackD [sp] = dz; \
- sp++; }
-
-#define mpop(lz,hz,dz) { sp--; \
- lz = stackLo[sp]; \
- hz = stackHi[sp]; \
- dz = stackD [sp]; }
-
-
-#define mnextsize(az) (nextHi[az]-nextLo[az])
-
-#define mnextswap(az,bz) \
- { Int32 tz; \
- tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \
- tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \
- tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; }
-
-
-#define MAIN_QSORT_SMALL_THRESH 20
-#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT)
-#define MAIN_QSORT_STACK_SIZE 100
-
-static
-void mainQSort3 ( UInt32* ptr,
- UChar* block,
- UInt16* quadrant,
- Int32 nblock,
- Int32 loSt,
- Int32 hiSt,
- Int32 dSt,
- Int32* budget )
-{
- Int32 unLo, unHi, ltLo, gtHi, n, m, med;
- Int32 sp, lo, hi, d;
-
- Int32 stackLo[MAIN_QSORT_STACK_SIZE];
- Int32 stackHi[MAIN_QSORT_STACK_SIZE];
- Int32 stackD [MAIN_QSORT_STACK_SIZE];
-
- Int32 nextLo[3];
- Int32 nextHi[3];
- Int32 nextD [3];
-
- sp = 0;
- mpush ( loSt, hiSt, dSt );
-
- while (sp > 0) {
-
- AssertH ( sp < MAIN_QSORT_STACK_SIZE, 1001 );
-
- mpop ( lo, hi, d );
- if (hi - lo < MAIN_QSORT_SMALL_THRESH ||
- d > MAIN_QSORT_DEPTH_THRESH) {
- mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget );
- if (*budget < 0) return;
- continue;
- }
-
- med = (Int32)
- mmed3 ( block[ptr[ lo ]+d],
- block[ptr[ hi ]+d],
- block[ptr[ (lo+hi)>>1 ]+d] );
-
- unLo = ltLo = lo;
- unHi = gtHi = hi;
-
- while (True) {
- while (True) {
- if (unLo > unHi) break;
- n = ((Int32)block[ptr[unLo]+d]) - med;
- if (n == 0) {
- mswap(ptr[unLo], ptr[ltLo]);
- ltLo++; unLo++; continue;
- };
- if (n > 0) break;
- unLo++;
- }
- while (True) {
- if (unLo > unHi) break;
- n = ((Int32)block[ptr[unHi]+d]) - med;
- if (n == 0) {
- mswap(ptr[unHi], ptr[gtHi]);
- gtHi--; unHi--; continue;
- };
- if (n < 0) break;
- unHi--;
- }
- if (unLo > unHi) break;
- mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--;
- }
-
- AssertD ( unHi == unLo-1, "mainQSort3(2)" );
-
- if (gtHi < ltLo) {
- mpush(lo, hi, d+1 );
- continue;
- }
-
- n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n);
- m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m);
-
- n = lo + unLo - ltLo - 1;
- m = hi - (gtHi - unHi) + 1;
-
- nextLo[0] = lo; nextHi[0] = n; nextD[0] = d;
- nextLo[1] = m; nextHi[1] = hi; nextD[1] = d;
- nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1;
-
- if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
- if (mnextsize(1) < mnextsize(2)) mnextswap(1,2);
- if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
-
- AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" );
- AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" );
-
- mpush (nextLo[0], nextHi[0], nextD[0]);
- mpush (nextLo[1], nextHi[1], nextD[1]);
- mpush (nextLo[2], nextHi[2], nextD[2]);
- }
-}
-
-#undef mswap
-#undef mvswap
-#undef mpush
-#undef mpop
-#undef mmin
-#undef mnextsize
-#undef mnextswap
-#undef MAIN_QSORT_SMALL_THRESH
-#undef MAIN_QSORT_DEPTH_THRESH
-#undef MAIN_QSORT_STACK_SIZE
-
-
-/*---------------------------------------------*/
-/* Pre:
- nblock > N_OVERSHOOT
- block32 exists for [0 .. nblock-1 +N_OVERSHOOT]
- ((UChar*)block32) [0 .. nblock-1] holds block
- ptr exists for [0 .. nblock-1]
-
- Post:
- ((UChar*)block32) [0 .. nblock-1] holds block
- All other areas of block32 destroyed
- ftab [0 .. 65536 ] destroyed
- ptr [0 .. nblock-1] holds sorted order
- if (*budget < 0), sorting was abandoned
-*/
-
-#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8])
-#define SETMASK (1 << 21)
-#define CLEARMASK (~(SETMASK))
-
-static
-void mainSort ( UInt32* ptr,
- UChar* block,
- UInt16* quadrant,
- UInt32* ftab,
- Int32 nblock,
- Int32 verb,
- Int32* budget )
-{
- Int32 i, j, k, ss, sb;
- Int32 runningOrder[256];
- Bool bigDone[256];
- Int32 copyStart[256];
- Int32 copyEnd [256];
- UChar c1;
- Int32 numQSorted;
- UInt16 s;
- if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" );
-
- /*-- set up the 2-byte frequency table --*/
- for (i = 65536; i >= 0; i--) ftab[i] = 0;
-
- j = block[0] << 8;
- i = nblock-1;
- for (; i >= 3; i -= 4) {
- quadrant[i] = 0;
- j = (j >> 8) | ( ((UInt16)block[i]) << 8);
- ftab[j]++;
- quadrant[i-1] = 0;
- j = (j >> 8) | ( ((UInt16)block[i-1]) << 8);
- ftab[j]++;
- quadrant[i-2] = 0;
- j = (j >> 8) | ( ((UInt16)block[i-2]) << 8);
- ftab[j]++;
- quadrant[i-3] = 0;
- j = (j >> 8) | ( ((UInt16)block[i-3]) << 8);
- ftab[j]++;
- }
- for (; i >= 0; i--) {
- quadrant[i] = 0;
- j = (j >> 8) | ( ((UInt16)block[i]) << 8);
- ftab[j]++;
- }
-
- /*-- (emphasises close relationship of block & quadrant) --*/
- for (i = 0; i < BZ_N_OVERSHOOT; i++) {
- block [nblock+i] = block[i];
- quadrant[nblock+i] = 0;
- }
-
- if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" );
-
- /*-- Complete the initial radix sort --*/
- for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1];
-
- s = block[0] << 8;
- i = nblock-1;
- for (; i >= 3; i -= 4) {
- s = (s >> 8) | (block[i] << 8);
- j = ftab[s] -1;
- ftab[s] = j;
- ptr[j] = i;
- s = (s >> 8) | (block[i-1] << 8);
- j = ftab[s] -1;
- ftab[s] = j;
- ptr[j] = i-1;
- s = (s >> 8) | (block[i-2] << 8);
- j = ftab[s] -1;
- ftab[s] = j;
- ptr[j] = i-2;
- s = (s >> 8) | (block[i-3] << 8);
- j = ftab[s] -1;
- ftab[s] = j;
- ptr[j] = i-3;
- }
- for (; i >= 0; i--) {
- s = (s >> 8) | (block[i] << 8);
- j = ftab[s] -1;
- ftab[s] = j;
- ptr[j] = i;
- }
-
- /*--
- Now ftab contains the first loc of every small bucket.
- Calculate the running order, from smallest to largest
- big bucket.
- --*/
- for (i = 0; i <= 255; i++) {
- bigDone [i] = False;
- runningOrder[i] = i;
- }
-
- {
- Int32 vv;
- Int32 h = 1;
- do h = 3 * h + 1; while (h <= 256);
- do {
- h = h / 3;
- for (i = h; i <= 255; i++) {
- vv = runningOrder[i];
- j = i;
- while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) {
- runningOrder[j] = runningOrder[j-h];
- j = j - h;
- if (j <= (h - 1)) goto zero;
- }
- zero:
- runningOrder[j] = vv;
- }
- } while (h != 1);
- }
-
- /*--
- The main sorting loop.
- --*/
-
- numQSorted = 0;
-
- for (i = 0; i <= 255; i++) {
-
- /*--
- Process big buckets, starting with the least full.
- Basically this is a 3-step process in which we call
- mainQSort3 to sort the small buckets [ss, j], but
- also make a big effort to avoid the calls if we can.
- --*/
- ss = runningOrder[i];
-
- /*--
- Step 1:
- Complete the big bucket [ss] by quicksorting
- any unsorted small buckets [ss, j], for j != ss.
- Hopefully previous pointer-scanning phases have already
- completed many of the small buckets [ss, j], so
- we don't have to sort them at all.
- --*/
- for (j = 0; j <= 255; j++) {
- if (j != ss) {
- sb = (ss << 8) + j;
- if ( ! (ftab[sb] & SETMASK) ) {
- Int32 lo = ftab[sb] & CLEARMASK;
- Int32 hi = (ftab[sb+1] & CLEARMASK) - 1;
- if (hi > lo) {
- if (verb >= 4)
- VPrintf4 ( " qsort [0x%x, 0x%x] "
- "done %d this %d\n",
- ss, j, numQSorted, hi - lo + 1 );
- mainQSort3 (
- ptr, block, quadrant, nblock,
- lo, hi, BZ_N_RADIX, budget
- );
- numQSorted += (hi - lo + 1);
- if (*budget < 0) return;
- }
- }
- ftab[sb] |= SETMASK;
- }
- }
-
- AssertH ( !bigDone[ss], 1006 );
-
- /*--
- Step 2:
- Now scan this big bucket [ss] so as to synthesise the
- sorted order for small buckets [t, ss] for all t,
- including, magically, the bucket [ss,ss] too.
- This will avoid doing Real Work in subsequent Step 1's.
- --*/
- {
- for (j = 0; j <= 255; j++) {
- copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK;
- copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1;
- }
- for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) {
- k = ptr[j]-1; if (k < 0) k += nblock;
- c1 = block[k];
- if (!bigDone[c1])
- ptr[ copyStart[c1]++ ] = k;
- }
- for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) {
- k = ptr[j]-1; if (k < 0) k += nblock;
- c1 = block[k];
- if (!bigDone[c1])
- ptr[ copyEnd[c1]-- ] = k;
- }
- }
-
- AssertH ( copyStart[ss]-1 == copyEnd[ss], 1007 );
-
- for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK;
-
- /*--
- Step 3:
- The [ss] big bucket is now done. Record this fact,
- and update the quadrant descriptors. Remember to
- update quadrants in the overshoot area too, if
- necessary. The "if (i < 255)" test merely skips
- this updating for the last bucket processed, since
- updating for the last bucket is pointless.
-
- The quadrant array provides a way to incrementally
- cache sort orderings, as they appear, so as to
- make subsequent comparisons in fullGtU() complete
- faster. For repetitive blocks this makes a big
- difference (but not big enough to be able to avoid
- the fallback sorting mechanism, exponential radix sort).
-
- The precise meaning is: at all times:
-
- for 0 <= i < nblock and 0 <= j <= nblock
-
- if block[i] != block[j],
-
- then the relative values of quadrant[i] and
- quadrant[j] are meaningless.
-
- else {
- if quadrant[i] < quadrant[j]
- then the string starting at i lexicographically
- precedes the string starting at j
-
- else if quadrant[i] > quadrant[j]
- then the string starting at j lexicographically
- precedes the string starting at i
-
- else
- the relative ordering of the strings starting
- at i and j has not yet been determined.
- }
- --*/
- bigDone[ss] = True;
-
- if (i < 255) {
- Int32 bbStart = ftab[ss << 8] & CLEARMASK;
- Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart;
- Int32 shifts = 0;
-
- while ((bbSize >> shifts) > 65534) shifts++;
-
- for (j = bbSize-1; j >= 0; j--) {
- Int32 a2update = ptr[bbStart + j];
- UInt16 qVal = (UInt16)(j >> shifts);
- quadrant[a2update] = qVal;
- if (a2update < BZ_N_OVERSHOOT)
- quadrant[a2update + nblock] = qVal;
- }
- AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 );
- }
-
- }
-
- if (verb >= 4)
- VPrintf3 ( " %d pointers, %d sorted, %d scanned\n",
- nblock, numQSorted, nblock - numQSorted );
-}
-
-#undef BIGFREQ
-#undef SETMASK
-#undef CLEARMASK
-
-
-/*---------------------------------------------*/
-/* Pre:
- nblock > 0
- arr2 exists for [0 .. nblock-1 +N_OVERSHOOT]
- ((UChar*)arr2) [0 .. nblock-1] holds block
- arr1 exists for [0 .. nblock-1]
-
- Post:
- ((UChar*)arr2) [0 .. nblock-1] holds block
- All other areas of block destroyed
- ftab [ 0 .. 65536 ] destroyed
- arr1 [0 .. nblock-1] holds sorted order
-*/
-void BZ2_blockSort ( EState* s )
-{
- UInt32* ptr = s->ptr;
- UChar* block = s->block;
- UInt32* ftab = s->ftab;
- Int32 nblock = s->nblock;
- Int32 verb = s->verbosity;
- Int32 wfact = s->workFactor;
- UInt16* quadrant;
- Int32 budget;
- Int32 budgetInit;
- Int32 i;
-
- if (nblock < 10000) {
- fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
- } else {
- /* Calculate the location for quadrant, remembering to get
- the alignment right. Assumes that &(block[0]) is at least
- 2-byte aligned -- this should be ok since block is really
- the first section of arr2.
- */
- i = nblock+BZ_N_OVERSHOOT;
- if (i & 1) i++;
- quadrant = (UInt16*)(&(block[i]));
-
- /* (wfact-1) / 3 puts the default-factor-30
- transition point at very roughly the same place as
- with v0.1 and v0.9.0.
- Not that it particularly matters any more, since the
- resulting compressed stream is now the same regardless
- of whether or not we use the main sort or fallback sort.
- */
- if (wfact < 1 ) wfact = 1;
- if (wfact > 100) wfact = 100;
- budgetInit = nblock * ((wfact-1) / 3);
- budget = budgetInit;
-
- mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget );
- if (verb >= 3)
- VPrintf3 ( " %d work, %d block, ratio %5.2f\n",
- budgetInit - budget,
- nblock,
- (float)(budgetInit - budget) /
- (float)(nblock==0 ? 1 : nblock) );
- if (budget < 0) {
- if (verb >= 2)
- VPrintf0 ( " too repetitive; using fallback"
- " sorting algorithm\n" );
- fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
- }
- }
-
- s->origPtr = -1;
- for (i = 0; i < s->nblock; i++)
- if (ptr[i] == 0)
- { s->origPtr = i; break; };
-
- AssertH( s->origPtr != -1, 1003 );
-}
-
-
-/*-------------------------------------------------------------*/
-/*--- end blocksort.c ---*/
-/*-------------------------------------------------------------*/
diff --git a/mdk-stage1/bzlib/bzlib.c b/mdk-stage1/bzlib/bzlib.c
deleted file mode 100644
index ebf6e269b..000000000
--- a/mdk-stage1/bzlib/bzlib.c
+++ /dev/null
@@ -1,1567 +0,0 @@
-
-/*-------------------------------------------------------------*/
-/*--- Library top-level functions. ---*/
-/*--- bzlib.c ---*/
-/*-------------------------------------------------------------*/
-
-/*--
- This file is a part of bzip2 and/or libbzip2, a program and
- library for lossless, block-sorting data compression.
-
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
-
- 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. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
- 3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
- 4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-
- Julian Seward, Cambridge, UK.
- jseward@acm.org
- bzip2/libbzip2 version 1.0 of 21 March 2000
-
- This program is based on (at least) the work of:
- Mike Burrows
- David Wheeler
- Peter Fenwick
- Alistair Moffat
- Radford Neal
- Ian H. Witten
- Robert Sedgewick
- Jon L. Bentley
-
- For more information on these sources, see the manual.
---*/
-
-/*--
- CHANGES
- ~~~~~~~
- 0.9.0 -- original version.
-
- 0.9.0a/b -- no changes in this file.
-
- 0.9.0c
- * made zero-length BZ_FLUSH work correctly in bzCompress().
- * fixed bzWrite/bzRead to ignore zero-length requests.
- * fixed bzread to correctly handle read requests after EOF.
- * wrong parameter order in call to bzDecompressInit in
- bzBuffToBuffDecompress. Fixed.
---*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-
-#include "bzlib_private.h"
-
-
-/*---------------------------------------------------*/
-/*--- Compression stuff ---*/
-/*---------------------------------------------------*/
-
-
-/*---------------------------------------------------*/
-#ifndef BZ_NO_STDIO
-void BZ2_bz__AssertH__fail ( int errcode )
-{
- fprintf(stderr,
- "\n\nbzip2/libbzip2: internal error number %d.\n"
- "This is a bug in bzip2/libbzip2, %s.\n"
- "Please report it to me at: jseward@acm.org. If this happened\n"
- "when you were using some program which uses libbzip2 as a\n"
- "component, you should also report this bug to the author(s)\n"
- "of that program. Please make an effort to report this bug;\n"
- "timely and accurate bug reports eventually lead to higher\n"
- "quality software. Thanks. Julian Seward, 21 March 2000.\n\n",
- errcode,
- BZ2_bzlibVersion()
- );
- exit(3);
-}
-#endif
-
-
-/*---------------------------------------------------*/
-static
-int bz_config_ok ( void )
-{
- if (sizeof(int) != 4) return 0;
- if (sizeof(short) != 2) return 0;
- if (sizeof(char) != 1) return 0;
- return 1;
-}
-
-
-/*---------------------------------------------------*/
-static
-void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
-{
- void* v = malloc ( items * size );
- return v;
-}
-
-static
-void default_bzfree ( void* opaque, void* addr )
-{
- if (addr != NULL) free ( addr );
-}
-
-
-/*---------------------------------------------------*/
-static
-void prepare_new_block ( EState* s )
-{
- Int32 i;
- s->nblock = 0;
- s->numZ = 0;
- s->state_out_pos = 0;
- BZ_INITIALISE_CRC ( s->blockCRC );
- for (i = 0; i < 256; i++) s->inUse[i] = False;
- s->blockNo++;
-}
-
-
-/*---------------------------------------------------*/
-static
-void init_RL ( EState* s )
-{
- s->state_in_ch = 256;
- s->state_in_len = 0;
-}
-
-
-static
-Bool isempty_RL ( EState* s )
-{
- if (s->state_in_ch < 256 && s->state_in_len > 0)
- return False; else
- return True;
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzCompressInit)
- ( bz_stream* strm,
- int blockSize100k,
- int verbosity,
- int workFactor )
-{
- Int32 n;
- EState* s;
-
- if (!bz_config_ok()) return BZ_CONFIG_ERROR;
-
- if (strm == NULL ||
- blockSize100k < 1 || blockSize100k > 9 ||
- workFactor < 0 || workFactor > 250)
- return BZ_PARAM_ERROR;
-
- if (workFactor == 0) workFactor = 30;
- if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
- if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
-
- s = BZALLOC( sizeof(EState) );
- if (s == NULL) return BZ_MEM_ERROR;
- s->strm = strm;
-
- s->arr1 = NULL;
- s->arr2 = NULL;
- s->ftab = NULL;
-
- n = 100000 * blockSize100k;
- s->arr1 = BZALLOC( n * sizeof(UInt32) );
- s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
- s->ftab = BZALLOC( 65537 * sizeof(UInt32) );
-
- if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) {
- if (s->arr1 != NULL) BZFREE(s->arr1);
- if (s->arr2 != NULL) BZFREE(s->arr2);
- if (s->ftab != NULL) BZFREE(s->ftab);
- if (s != NULL) BZFREE(s);
- return BZ_MEM_ERROR;
- }
-
- s->blockNo = 0;
- s->state = BZ_S_INPUT;
- s->mode = BZ_M_RUNNING;
- s->combinedCRC = 0;
- s->blockSize100k = blockSize100k;
- s->nblockMAX = 100000 * blockSize100k - 19;
- s->verbosity = verbosity;
- s->workFactor = workFactor;
-
- s->block = (UChar*)s->arr2;
- s->mtfv = (UInt16*)s->arr1;
- s->zbits = NULL;
- s->ptr = (UInt32*)s->arr1;
-
- strm->state = s;
- strm->total_in_lo32 = 0;
- strm->total_in_hi32 = 0;
- strm->total_out_lo32 = 0;
- strm->total_out_hi32 = 0;
- init_RL ( s );
- prepare_new_block ( s );
- return BZ_OK;
-}
-
-
-/*---------------------------------------------------*/
-static
-void add_pair_to_block ( EState* s )
-{
- Int32 i;
- UChar ch = (UChar)(s->state_in_ch);
- for (i = 0; i < s->state_in_len; i++) {
- BZ_UPDATE_CRC( s->blockCRC, ch );
- }
- s->inUse[s->state_in_ch] = True;
- switch (s->state_in_len) {
- case 1:
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- break;
- case 2:
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- break;
- case 3:
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- break;
- default:
- s->inUse[s->state_in_len-4] = True;
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- s->block[s->nblock] = (UChar)ch; s->nblock++;
- s->block[s->nblock] = ((UChar)(s->state_in_len-4));
- s->nblock++;
- break;
- }
-}
-
-
-/*---------------------------------------------------*/
-static
-void flush_RL ( EState* s )
-{
- if (s->state_in_ch < 256) add_pair_to_block ( s );
- init_RL ( s );
-}
-
-
-/*---------------------------------------------------*/
-#define ADD_CHAR_TO_BLOCK(zs,zchh0) \
-{ \
- UInt32 zchh = (UInt32)(zchh0); \
- /*-- fast track the common case --*/ \
- if (zchh != zs->state_in_ch && \
- zs->state_in_len == 1) { \
- UChar ch = (UChar)(zs->state_in_ch); \
- BZ_UPDATE_CRC( zs->blockCRC, ch ); \
- zs->inUse[zs->state_in_ch] = True; \
- zs->block[zs->nblock] = (UChar)ch; \
- zs->nblock++; \
- zs->state_in_ch = zchh; \
- } \
- else \
- /*-- general, uncommon cases --*/ \
- if (zchh != zs->state_in_ch || \
- zs->state_in_len == 255) { \
- if (zs->state_in_ch < 256) \
- add_pair_to_block ( zs ); \
- zs->state_in_ch = zchh; \
- zs->state_in_len = 1; \
- } else { \
- zs->state_in_len++; \
- } \
-}
-
-
-/*---------------------------------------------------*/
-static
-Bool copy_input_until_stop ( EState* s )
-{
- Bool progress_in = False;
-
- if (s->mode == BZ_M_RUNNING) {
-
- /*-- fast track the common case --*/
- while (True) {
- /*-- block full? --*/
- if (s->nblock >= s->nblockMAX) break;
- /*-- no input? --*/
- if (s->strm->avail_in == 0) break;
- progress_in = True;
- ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) );
- s->strm->next_in++;
- s->strm->avail_in--;
- s->strm->total_in_lo32++;
- if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
- }
-
- } else {
-
- /*-- general, uncommon case --*/
- while (True) {
- /*-- block full? --*/
- if (s->nblock >= s->nblockMAX) break;
- /*-- no input? --*/
- if (s->strm->avail_in == 0) break;
- /*-- flush/finish end? --*/
- if (s->avail_in_expect == 0) break;
- progress_in = True;
- ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) );
- s->strm->next_in++;
- s->strm->avail_in--;
- s->strm->total_in_lo32++;
- if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
- s->avail_in_expect--;
- }
- }
- return progress_in;
-}
-
-
-/*---------------------------------------------------*/
-static
-Bool copy_output_until_stop ( EState* s )
-{
- Bool progress_out = False;
-
- while (True) {
-
- /*-- no output space? --*/
- if (s->strm->avail_out == 0) break;
-
- /*-- block done? --*/
- if (s->state_out_pos >= s->numZ) break;
-
- progress_out = True;
- *(s->strm->next_out) = s->zbits[s->state_out_pos];
- s->state_out_pos++;
- s->strm->avail_out--;
- s->strm->next_out++;
- s->strm->total_out_lo32++;
- if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
- }
-
- return progress_out;
-}
-
-
-/*---------------------------------------------------*/
-static
-Bool handle_compress ( bz_stream* strm )
-{
- Bool progress_in = False;
- Bool progress_out = False;
- EState* s = strm->state;
-
- while (True) {
-
- if (s->state == BZ_S_OUTPUT) {
- progress_out |= copy_output_until_stop ( s );
- if (s->state_out_pos < s->numZ) break;
- if (s->mode == BZ_M_FINISHING &&
- s->avail_in_expect == 0 &&
- isempty_RL(s)) break;
- prepare_new_block ( s );
- s->state = BZ_S_INPUT;
- if (s->mode == BZ_M_FLUSHING &&
- s->avail_in_expect == 0 &&
- isempty_RL(s)) break;
- }
-
- if (s->state == BZ_S_INPUT) {
- progress_in |= copy_input_until_stop ( s );
- if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) {
- flush_RL ( s );
- BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) );
- s->state = BZ_S_OUTPUT;
- }
- else
- if (s->nblock >= s->nblockMAX) {
- BZ2_compressBlock ( s, False );
- s->state = BZ_S_OUTPUT;
- }
- else
- if (s->strm->avail_in == 0) {
- break;
- }
- }
-
- }
-
- return progress_in || progress_out;
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
-{
- Bool progress;
- EState* s;
- if (strm == NULL) return BZ_PARAM_ERROR;
- s = strm->state;
- if (s == NULL) return BZ_PARAM_ERROR;
- if (s->strm != strm) return BZ_PARAM_ERROR;
-
- preswitch:
- switch (s->mode) {
-
- case BZ_M_IDLE:
- return BZ_SEQUENCE_ERROR;
-
- case BZ_M_RUNNING:
- if (action == BZ_RUN) {
- progress = handle_compress ( strm );
- return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;
- }
- else
- if (action == BZ_FLUSH) {
- s->avail_in_expect = strm->avail_in;
- s->mode = BZ_M_FLUSHING;
- goto preswitch;
- }
- else
- if (action == BZ_FINISH) {
- s->avail_in_expect = strm->avail_in;
- s->mode = BZ_M_FINISHING;
- goto preswitch;
- }
- else
- return BZ_PARAM_ERROR;
-
- case BZ_M_FLUSHING:
- if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR;
- if (s->avail_in_expect != s->strm->avail_in)
- return BZ_SEQUENCE_ERROR;
- progress = handle_compress ( strm );
- if (s->avail_in_expect > 0 || !isempty_RL(s) ||
- s->state_out_pos < s->numZ) return BZ_FLUSH_OK;
- s->mode = BZ_M_RUNNING;
- return BZ_RUN_OK;
-
- case BZ_M_FINISHING:
- if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR;
- if (s->avail_in_expect != s->strm->avail_in)
- return BZ_SEQUENCE_ERROR;
- progress = handle_compress ( strm );
- if (!progress) return BZ_SEQUENCE_ERROR;
- if (s->avail_in_expect > 0 || !isempty_RL(s) ||
- s->state_out_pos < s->numZ) return BZ_FINISH_OK;
- s->mode = BZ_M_IDLE;
- return BZ_STREAM_END;
- }
- return BZ_OK; /*--not reached--*/
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm )
-{
- EState* s;
- if (strm == NULL) return BZ_PARAM_ERROR;
- s = strm->state;
- if (s == NULL) return BZ_PARAM_ERROR;
- if (s->strm != strm) return BZ_PARAM_ERROR;
-
- if (s->arr1 != NULL) BZFREE(s->arr1);
- if (s->arr2 != NULL) BZFREE(s->arr2);
- if (s->ftab != NULL) BZFREE(s->ftab);
- BZFREE(strm->state);
-
- strm->state = NULL;
-
- return BZ_OK;
-}
-
-
-/*---------------------------------------------------*/
-/*--- Decompression stuff ---*/
-/*---------------------------------------------------*/
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzDecompressInit)
- ( bz_stream* strm,
- int verbosity,
- int small )
-{
- DState* s;
-
- if (!bz_config_ok()) return BZ_CONFIG_ERROR;
-
- if (strm == NULL) return BZ_PARAM_ERROR;
- if (small != 0 && small != 1) return BZ_PARAM_ERROR;
- if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR;
-
- if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
- if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
-
- s = BZALLOC( sizeof(DState) );
- if (s == NULL) return BZ_MEM_ERROR;
- s->strm = strm;
- strm->state = s;
- s->state = BZ_X_MAGIC_1;
- s->bsLive = 0;
- s->bsBuff = 0;
- s->calculatedCombinedCRC = 0;
- strm->total_in_lo32 = 0;
- strm->total_in_hi32 = 0;
- strm->total_out_lo32 = 0;
- strm->total_out_hi32 = 0;
- s->smallDecompress = (Bool)small;
- s->ll4 = NULL;
- s->ll16 = NULL;
- s->tt = NULL;
- s->currBlockNo = 0;
- s->verbosity = verbosity;
-
- return BZ_OK;
-}
-
-
-/*---------------------------------------------------*/
-static
-void unRLE_obuf_to_output_FAST ( DState* s )
-{
- UChar k1;
-
- if (s->blockRandomised) {
-
- while (True) {
- /* try to finish existing run */
- while (True) {
- if (s->strm->avail_out == 0) return;
- if (s->state_out_len == 0) break;
- *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
- BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
- s->state_out_len--;
- s->strm->next_out++;
- s->strm->avail_out--;
- s->strm->total_out_lo32++;
- if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
- }
-
- /* can a new run be started? */
- if (s->nblock_used == s->save_nblock+1) return;
-
-
- s->state_out_len = 1;
- s->state_out_ch = s->k0;
- BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
- k1 ^= BZ_RAND_MASK; s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- s->state_out_len = 2;
- BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
- k1 ^= BZ_RAND_MASK; s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- s->state_out_len = 3;
- BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
- k1 ^= BZ_RAND_MASK; s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
- k1 ^= BZ_RAND_MASK; s->nblock_used++;
- s->state_out_len = ((Int32)k1) + 4;
- BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK;
- s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
- }
-
- } else {
-
- /* restore */
- UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC;
- UChar c_state_out_ch = s->state_out_ch;
- Int32 c_state_out_len = s->state_out_len;
- Int32 c_nblock_used = s->nblock_used;
- Int32 c_k0 = s->k0;
- UInt32* c_tt = s->tt;
- UInt32 c_tPos = s->tPos;
- char* cs_next_out = s->strm->next_out;
- unsigned int cs_avail_out = s->strm->avail_out;
- /* end restore */
-
- UInt32 avail_out_INIT = cs_avail_out;
- Int32 s_save_nblockPP = s->save_nblock+1;
- unsigned int total_out_lo32_old;
-
- while (True) {
-
- /* try to finish existing run */
- if (c_state_out_len > 0) {
- while (True) {
- if (cs_avail_out == 0) goto return_notr;
- if (c_state_out_len == 1) break;
- *( (UChar*)(cs_next_out) ) = c_state_out_ch;
- BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
- c_state_out_len--;
- cs_next_out++;
- cs_avail_out--;
- }
- s_state_out_len_eq_one:
- {
- if (cs_avail_out == 0) {
- c_state_out_len = 1; goto return_notr;
- };
- *( (UChar*)(cs_next_out) ) = c_state_out_ch;
- BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
- cs_next_out++;
- cs_avail_out--;
- }
- }
- /* can a new run be started? */
- if (c_nblock_used == s_save_nblockPP) {
- c_state_out_len = 0; goto return_notr;
- };
- c_state_out_ch = c_k0;
- BZ_GET_FAST_C(k1); c_nblock_used++;
- if (k1 != c_k0) {
- c_k0 = k1; goto s_state_out_len_eq_one;
- };
- if (c_nblock_used == s_save_nblockPP)
- goto s_state_out_len_eq_one;
-
- c_state_out_len = 2;
- BZ_GET_FAST_C(k1); c_nblock_used++;
- if (c_nblock_used == s_save_nblockPP) continue;
- if (k1 != c_k0) { c_k0 = k1; continue; };
-
- c_state_out_len = 3;
- BZ_GET_FAST_C(k1); c_nblock_used++;
- if (c_nblock_used == s_save_nblockPP) continue;
- if (k1 != c_k0) { c_k0 = k1; continue; };
-
- BZ_GET_FAST_C(k1); c_nblock_used++;
- c_state_out_len = ((Int32)k1) + 4;
- BZ_GET_FAST_C(c_k0); c_nblock_used++;
- }
-
- return_notr:
- total_out_lo32_old = s->strm->total_out_lo32;
- s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out);
- if (s->strm->total_out_lo32 < total_out_lo32_old)
- s->strm->total_out_hi32++;
-
- /* save */
- s->calculatedBlockCRC = c_calculatedBlockCRC;
- s->state_out_ch = c_state_out_ch;
- s->state_out_len = c_state_out_len;
- s->nblock_used = c_nblock_used;
- s->k0 = c_k0;
- s->tt = c_tt;
- s->tPos = c_tPos;
- s->strm->next_out = cs_next_out;
- s->strm->avail_out = cs_avail_out;
- /* end save */
- }
-}
-
-
-
-/*---------------------------------------------------*/
-__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
-{
- Int32 nb, na, mid;
- nb = 0;
- na = 256;
- do {
- mid = (nb + na) >> 1;
- if (indx >= cftab[mid]) nb = mid; else na = mid;
- }
- while (na - nb != 1);
- return nb;
-}
-
-
-/*---------------------------------------------------*/
-static
-void unRLE_obuf_to_output_SMALL ( DState* s )
-{
- UChar k1;
-
- if (s->blockRandomised) {
-
- while (True) {
- /* try to finish existing run */
- while (True) {
- if (s->strm->avail_out == 0) return;
- if (s->state_out_len == 0) break;
- *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
- BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
- s->state_out_len--;
- s->strm->next_out++;
- s->strm->avail_out--;
- s->strm->total_out_lo32++;
- if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
- }
-
- /* can a new run be started? */
- if (s->nblock_used == s->save_nblock+1) return;
-
-
- s->state_out_len = 1;
- s->state_out_ch = s->k0;
- BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
- k1 ^= BZ_RAND_MASK; s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- s->state_out_len = 2;
- BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
- k1 ^= BZ_RAND_MASK; s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- s->state_out_len = 3;
- BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
- k1 ^= BZ_RAND_MASK; s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
- k1 ^= BZ_RAND_MASK; s->nblock_used++;
- s->state_out_len = ((Int32)k1) + 4;
- BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK;
- s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
- }
-
- } else {
-
- while (True) {
- /* try to finish existing run */
- while (True) {
- if (s->strm->avail_out == 0) return;
- if (s->state_out_len == 0) break;
- *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
- BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
- s->state_out_len--;
- s->strm->next_out++;
- s->strm->avail_out--;
- s->strm->total_out_lo32++;
- if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
- }
-
- /* can a new run be started? */
- if (s->nblock_used == s->save_nblock+1) return;
-
- s->state_out_len = 1;
- s->state_out_ch = s->k0;
- BZ_GET_SMALL(k1); s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- s->state_out_len = 2;
- BZ_GET_SMALL(k1); s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- s->state_out_len = 3;
- BZ_GET_SMALL(k1); s->nblock_used++;
- if (s->nblock_used == s->save_nblock+1) continue;
- if (k1 != s->k0) { s->k0 = k1; continue; };
-
- BZ_GET_SMALL(k1); s->nblock_used++;
- s->state_out_len = ((Int32)k1) + 4;
- BZ_GET_SMALL(s->k0); s->nblock_used++;
- }
-
- }
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzDecompress) ( bz_stream *strm )
-{
- DState* s;
- if (strm == NULL) return BZ_PARAM_ERROR;
- s = strm->state;
- if (s == NULL) return BZ_PARAM_ERROR;
- if (s->strm != strm) return BZ_PARAM_ERROR;
-
- while (True) {
- if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR;
- if (s->state == BZ_X_OUTPUT) {
- if (s->smallDecompress)
- unRLE_obuf_to_output_SMALL ( s ); else
- unRLE_obuf_to_output_FAST ( s );
- if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {
- BZ_FINALISE_CRC ( s->calculatedBlockCRC );
- if (s->verbosity >= 3)
- VPrintf2 ( " {0x%x, 0x%x}", s->storedBlockCRC,
- s->calculatedBlockCRC );
- if (s->verbosity >= 2) VPrintf0 ( "]" );
- if (s->calculatedBlockCRC != s->storedBlockCRC)
- return BZ_DATA_ERROR;
- s->calculatedCombinedCRC
- = (s->calculatedCombinedCRC << 1) |
- (s->calculatedCombinedCRC >> 31);
- s->calculatedCombinedCRC ^= s->calculatedBlockCRC;
- s->state = BZ_X_BLKHDR_1;
- } else {
- return BZ_OK;
- }
- }
- if (s->state >= BZ_X_MAGIC_1) {
- Int32 r = BZ2_decompress ( s );
- if (r == BZ_STREAM_END) {
- if (s->verbosity >= 3)
- VPrintf2 ( "\n combined CRCs: stored = 0x%x, computed = 0x%x",
- s->storedCombinedCRC, s->calculatedCombinedCRC );
- if (s->calculatedCombinedCRC != s->storedCombinedCRC)
- return BZ_DATA_ERROR;
- return r;
- }
- if (s->state != BZ_X_OUTPUT) return r;
- }
- }
-
- AssertH ( 0, 6001 );
-
- return 0; /*NOTREACHED*/
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm )
-{
- DState* s;
- if (strm == NULL) return BZ_PARAM_ERROR;
- s = strm->state;
- if (s == NULL) return BZ_PARAM_ERROR;
- if (s->strm != strm) return BZ_PARAM_ERROR;
-
- if (s->tt != NULL) BZFREE(s->tt);
- if (s->ll16 != NULL) BZFREE(s->ll16);
- if (s->ll4 != NULL) BZFREE(s->ll4);
-
- BZFREE(strm->state);
- strm->state = NULL;
-
- return BZ_OK;
-}
-
-
-#ifndef BZ_NO_STDIO
-/*---------------------------------------------------*/
-/*--- File I/O stuff ---*/
-/*---------------------------------------------------*/
-
-#define BZ_SETERR(eee) \
-{ \
- if (bzerror != NULL) *bzerror = eee; \
- if (bzf != NULL) bzf->lastErr = eee; \
-}
-
-typedef
- struct {
- FILE* handle;
- Char buf[BZ_MAX_UNUSED];
- Int32 bufN;
- Bool writing;
- bz_stream strm;
- Int32 lastErr;
- Bool initialisedOk;
- }
- bzFile;
-
-
-/*---------------------------------------------*/
-static Bool myfeof ( FILE* f )
-{
- return feof(f) ? True : False;
-}
-
-
-/*---------------------------------------------------*/
-BZFILE* BZ_API(BZ2_bzWriteOpen)
- ( int* bzerror,
- FILE* f,
- int blockSize100k,
- int verbosity,
- int workFactor )
-{
- Int32 ret;
- bzFile* bzf = NULL;
-
- BZ_SETERR(BZ_OK);
-
- if (f == NULL ||
- (blockSize100k < 1 || blockSize100k > 9) ||
- (workFactor < 0 || workFactor > 250) ||
- (verbosity < 0 || verbosity > 4))
- { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
-
- if (ferror(f))
- { BZ_SETERR(BZ_IO_ERROR); return NULL; };
-
- bzf = malloc ( sizeof(bzFile) );
- if (bzf == NULL)
- { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
-
- BZ_SETERR(BZ_OK);
- bzf->initialisedOk = False;
- bzf->bufN = 0;
- bzf->handle = f;
- bzf->writing = True;
- bzf->strm.bzalloc = NULL;
- bzf->strm.bzfree = NULL;
- bzf->strm.opaque = NULL;
-
- if (workFactor == 0) workFactor = 30;
- ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k,
- verbosity, workFactor );
- if (ret != BZ_OK)
- { BZ_SETERR(ret); free(bzf); return NULL; };
-
- bzf->strm.avail_in = 0;
- bzf->initialisedOk = True;
- return bzf;
-}
-
-
-
-/*---------------------------------------------------*/
-void BZ_API(BZ2_bzWrite)
- ( int* bzerror,
- BZFILE* b,
- void* buf,
- int len )
-{
- Int32 n, n2, ret;
- bzFile* bzf = (bzFile*)b;
-
- BZ_SETERR(BZ_OK);
- if (bzf == NULL || buf == NULL || len < 0)
- { BZ_SETERR(BZ_PARAM_ERROR); return; };
- if (!(bzf->writing))
- { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
- if (ferror(bzf->handle))
- { BZ_SETERR(BZ_IO_ERROR); return; };
-
- if (len == 0)
- { BZ_SETERR(BZ_OK); return; };
-
- bzf->strm.avail_in = len;
- bzf->strm.next_in = buf;
-
- while (True) {
- bzf->strm.avail_out = BZ_MAX_UNUSED;
- bzf->strm.next_out = bzf->buf;
- ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN );
- if (ret != BZ_RUN_OK)
- { BZ_SETERR(ret); return; };
-
- if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
- n = BZ_MAX_UNUSED - bzf->strm.avail_out;
- n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar),
- n, bzf->handle );
- if (n != n2 || ferror(bzf->handle))
- { BZ_SETERR(BZ_IO_ERROR); return; };
- }
-
- if (bzf->strm.avail_in == 0)
- { BZ_SETERR(BZ_OK); return; };
- }
-}
-
-
-/*---------------------------------------------------*/
-void BZ_API(BZ2_bzWriteClose)
- ( int* bzerror,
- BZFILE* b,
- int abandon,
- unsigned int* nbytes_in,
- unsigned int* nbytes_out )
-{
- BZ2_bzWriteClose64 ( bzerror, b, abandon,
- nbytes_in, NULL, nbytes_out, NULL );
-}
-
-
-void BZ_API(BZ2_bzWriteClose64)
- ( int* bzerror,
- BZFILE* b,
- int abandon,
- unsigned int* nbytes_in_lo32,
- unsigned int* nbytes_in_hi32,
- unsigned int* nbytes_out_lo32,
- unsigned int* nbytes_out_hi32 )
-{
- Int32 n, n2, ret;
- bzFile* bzf = (bzFile*)b;
-
- if (bzf == NULL)
- { BZ_SETERR(BZ_OK); return; };
- if (!(bzf->writing))
- { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
- if (ferror(bzf->handle))
- { BZ_SETERR(BZ_IO_ERROR); return; };
-
- if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0;
- if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0;
- if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0;
- if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0;
-
- if ((!abandon) && bzf->lastErr == BZ_OK) {
- while (True) {
- bzf->strm.avail_out = BZ_MAX_UNUSED;
- bzf->strm.next_out = bzf->buf;
- ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH );
- if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END)
- { BZ_SETERR(ret); return; };
-
- if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
- n = BZ_MAX_UNUSED - bzf->strm.avail_out;
- n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar),
- n, bzf->handle );
- if (n != n2 || ferror(bzf->handle))
- { BZ_SETERR(BZ_IO_ERROR); return; };
- }
-
- if (ret == BZ_STREAM_END) break;
- }
- }
-
- if ( !abandon && !ferror ( bzf->handle ) ) {
- fflush ( bzf->handle );
- if (ferror(bzf->handle))
- { BZ_SETERR(BZ_IO_ERROR); return; };
- }
-
- if (nbytes_in_lo32 != NULL)
- *nbytes_in_lo32 = bzf->strm.total_in_lo32;
- if (nbytes_in_hi32 != NULL)
- *nbytes_in_hi32 = bzf->strm.total_in_hi32;
- if (nbytes_out_lo32 != NULL)
- *nbytes_out_lo32 = bzf->strm.total_out_lo32;
- if (nbytes_out_hi32 != NULL)
- *nbytes_out_hi32 = bzf->strm.total_out_hi32;
-
- BZ_SETERR(BZ_OK);
- BZ2_bzCompressEnd ( &(bzf->strm) );
- free ( bzf );
-}
-
-
-/*---------------------------------------------------*/
-BZFILE* BZ_API(BZ2_bzReadOpen)
- ( int* bzerror,
- FILE* f,
- int verbosity,
- int small,
- void* unused,
- int nUnused )
-{
- bzFile* bzf = NULL;
- int ret;
-
- BZ_SETERR(BZ_OK);
-
- if (f == NULL ||
- (small != 0 && small != 1) ||
- (verbosity < 0 || verbosity > 4) ||
- (unused == NULL && nUnused != 0) ||
- (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED)))
- { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
-
- if (ferror(f))
- { BZ_SETERR(BZ_IO_ERROR); return NULL; };
-
- bzf = malloc ( sizeof(bzFile) );
- if (bzf == NULL)
- { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
-
- BZ_SETERR(BZ_OK);
-
- bzf->initialisedOk = False;
- bzf->handle = f;
- bzf->bufN = 0;
- bzf->writing = False;
- bzf->strm.bzalloc = NULL;
- bzf->strm.bzfree = NULL;
- bzf->strm.opaque = NULL;
-
- while (nUnused > 0) {
- bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++;
- unused = ((void*)( 1 + ((UChar*)(unused)) ));
- nUnused--;
- }
-
- ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small );
- if (ret != BZ_OK)
- { BZ_SETERR(ret); free(bzf); return NULL; };
-
- bzf->strm.avail_in = bzf->bufN;
- bzf->strm.next_in = bzf->buf;
-
- bzf->initialisedOk = True;
- return bzf;
-}
-
-
-/*---------------------------------------------------*/
-void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b )
-{
- bzFile* bzf = (bzFile*)b;
-
- BZ_SETERR(BZ_OK);
- if (bzf == NULL)
- { BZ_SETERR(BZ_OK); return; };
-
- if (bzf->writing)
- { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
-
- if (bzf->initialisedOk)
- (void)BZ2_bzDecompressEnd ( &(bzf->strm) );
- free ( bzf );
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzRead)
- ( int* bzerror,
- BZFILE* b,
- void* buf,
- int len )
-{
- Int32 n, ret;
- bzFile* bzf = (bzFile*)b;
-
- BZ_SETERR(BZ_OK);
-
- if (bzf == NULL || buf == NULL || len < 0)
- { BZ_SETERR(BZ_PARAM_ERROR); return 0; };
-
- if (bzf->writing)
- { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; };
-
- if (len == 0)
- { BZ_SETERR(BZ_OK); return 0; };
-
- bzf->strm.avail_out = len;
- bzf->strm.next_out = buf;
-
- while (True) {
-
- if (ferror(bzf->handle))
- { BZ_SETERR(BZ_IO_ERROR); return 0; };
-
- if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) {
- n = fread ( bzf->buf, sizeof(UChar),
- BZ_MAX_UNUSED, bzf->handle );
- if (ferror(bzf->handle))
- { BZ_SETERR(BZ_IO_ERROR); return 0; };
- bzf->bufN = n;
- bzf->strm.avail_in = bzf->bufN;
- bzf->strm.next_in = bzf->buf;
- }
-
- ret = BZ2_bzDecompress ( &(bzf->strm) );
-
- if (ret != BZ_OK && ret != BZ_STREAM_END)
- { BZ_SETERR(ret); return 0; };
-
- if (ret == BZ_OK && myfeof(bzf->handle) &&
- bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0)
- { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; };
-
- if (ret == BZ_STREAM_END)
- { BZ_SETERR(BZ_STREAM_END);
- return len - bzf->strm.avail_out; };
- if (bzf->strm.avail_out == 0)
- { BZ_SETERR(BZ_OK); return len; };
-
- }
-
- return 0; /*not reached*/
-}
-
-
-/*---------------------------------------------------*/
-void BZ_API(BZ2_bzReadGetUnused)
- ( int* bzerror,
- BZFILE* b,
- void** unused,
- int* nUnused )
-{
- bzFile* bzf = (bzFile*)b;
- if (bzf == NULL)
- { BZ_SETERR(BZ_PARAM_ERROR); return; };
- if (bzf->lastErr != BZ_STREAM_END)
- { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
- if (unused == NULL || nUnused == NULL)
- { BZ_SETERR(BZ_PARAM_ERROR); return; };
-
- BZ_SETERR(BZ_OK);
- *nUnused = bzf->strm.avail_in;
- *unused = bzf->strm.next_in;
-}
-#endif
-
-
-/*---------------------------------------------------*/
-/*--- Misc convenience stuff ---*/
-/*---------------------------------------------------*/
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzBuffToBuffCompress)
- ( char* dest,
- unsigned int* destLen,
- char* source,
- unsigned int sourceLen,
- int blockSize100k,
- int verbosity,
- int workFactor )
-{
- bz_stream strm;
- int ret;
-
- if (dest == NULL || destLen == NULL ||
- source == NULL ||
- blockSize100k < 1 || blockSize100k > 9 ||
- verbosity < 0 || verbosity > 4 ||
- workFactor < 0 || workFactor > 250)
- return BZ_PARAM_ERROR;
-
- if (workFactor == 0) workFactor = 30;
- strm.bzalloc = NULL;
- strm.bzfree = NULL;
- strm.opaque = NULL;
- ret = BZ2_bzCompressInit ( &strm, blockSize100k,
- verbosity, workFactor );
- if (ret != BZ_OK) return ret;
-
- strm.next_in = source;
- strm.next_out = dest;
- strm.avail_in = sourceLen;
- strm.avail_out = *destLen;
-
- ret = BZ2_bzCompress ( &strm, BZ_FINISH );
- if (ret == BZ_FINISH_OK) goto output_overflow;
- if (ret != BZ_STREAM_END) goto errhandler;
-
- /* normal termination */
- *destLen -= strm.avail_out;
- BZ2_bzCompressEnd ( &strm );
- return BZ_OK;
-
- output_overflow:
- BZ2_bzCompressEnd ( &strm );
- return BZ_OUTBUFF_FULL;
-
- errhandler:
- BZ2_bzCompressEnd ( &strm );
- return ret;
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzBuffToBuffDecompress)
- ( char* dest,
- unsigned int* destLen,
- char* source,
- unsigned int sourceLen,
- int small,
- int verbosity )
-{
- bz_stream strm;
- int ret;
-
- if (dest == NULL || destLen == NULL ||
- source == NULL ||
- (small != 0 && small != 1) ||
- verbosity < 0 || verbosity > 4)
- return BZ_PARAM_ERROR;
-
- strm.bzalloc = NULL;
- strm.bzfree = NULL;
- strm.opaque = NULL;
- ret = BZ2_bzDecompressInit ( &strm, verbosity, small );
- if (ret != BZ_OK) return ret;
-
- strm.next_in = source;
- strm.next_out = dest;
- strm.avail_in = sourceLen;
- strm.avail_out = *destLen;
-
- ret = BZ2_bzDecompress ( &strm );
- if (ret == BZ_OK) goto output_overflow_or_eof;
- if (ret != BZ_STREAM_END) goto errhandler;
-
- /* normal termination */
- *destLen -= strm.avail_out;
- BZ2_bzDecompressEnd ( &strm );
- return BZ_OK;
-
- output_overflow_or_eof:
- if (strm.avail_out > 0) {
- BZ2_bzDecompressEnd ( &strm );
- return BZ_UNEXPECTED_EOF;
- } else {
- BZ2_bzDecompressEnd ( &strm );
- return BZ_OUTBUFF_FULL;
- };
-
- errhandler:
- BZ2_bzDecompressEnd ( &strm );
- return ret;
-}
-
-
-/*---------------------------------------------------*/
-/*--
- Code contributed by Yoshioka Tsuneo
- (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp),
- to support better zlib compatibility.
- This code is not _officially_ part of libbzip2 (yet);
- I haven't tested it, documented it, or considered the
- threading-safeness of it.
- If this code breaks, please contact both Yoshioka and me.
---*/
-/*---------------------------------------------------*/
-
-/*---------------------------------------------------*/
-/*--
- return version like "0.9.0c".
---*/
-const char * BZ_API(BZ2_bzlibVersion)(void)
-{
- return BZ_VERSION;
-}
-
-
-#ifndef BZ_NO_STDIO
-/*---------------------------------------------------*/
-
-#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
-# include <fcntl.h>
-# include <io.h>
-# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY)
-#else
-# define SET_BINARY_MODE(file)
-#endif
-static
-BZFILE * bzopen_or_bzdopen
- ( const char *path, /* no use when bzdopen */
- int fd, /* no use when bzdopen */
- const char *mode,
- int open_mode) /* bzopen: 0, bzdopen:1 */
-{
- int bzerr;
- char unused[BZ_MAX_UNUSED];
- int blockSize100k = 9;
- int writing = 0;
- char mode2[10] = "";
- FILE *fp = NULL;
- BZFILE *bzfp = NULL;
- int verbosity = 0;
- int workFactor = 30;
- int smallMode = 0;
- int nUnused = 0;
-
- if (mode == NULL) return NULL;
- while (*mode) {
- switch (*mode) {
- case 'r':
- writing = 0; break;
- case 'w':
- writing = 1; break;
- case 's':
- smallMode = 1; break;
- default:
- if (isdigit((int)(*mode))) {
- blockSize100k = *mode-'0';
- }
- }
- mode++;
- }
- strcat(mode2, writing ? "w" : "r" );
- strcat(mode2,"b"); /* binary mode */
-
- if (open_mode==0) {
- if (path==NULL || strcmp(path,"")==0) {
- fp = (writing ? stdout : stdin);
- SET_BINARY_MODE(fp);
- } else {
- fp = fopen(path,mode2);
- }
- } else {
-#ifdef BZ_STRICT_ANSI
- fp = NULL;
-#else
- fp = fdopen(fd,mode2);
-#endif
- }
- if (fp == NULL) return NULL;
-
- if (writing) {
- /* Guard against total chaos and anarchy -- JRS */
- if (blockSize100k < 1) blockSize100k = 1;
- if (blockSize100k > 9) blockSize100k = 9;
- bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k,
- verbosity,workFactor);
- } else {
- bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode,
- unused,nUnused);
- }
- if (bzfp == NULL) {
- if (fp != stdin && fp != stdout) fclose(fp);
- return NULL;
- }
- return bzfp;
-}
-
-
-/*---------------------------------------------------*/
-/*--
- open file for read or write.
- ex) bzopen("file","w9")
- case path="" or NULL => use stdin or stdout.
---*/
-BZFILE * BZ_API(BZ2_bzopen)
- ( const char *path,
- const char *mode )
-{
- return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0);
-}
-
-
-/*---------------------------------------------------*/
-BZFILE * BZ_API(BZ2_bzdopen)
- ( int fd,
- const char *mode )
-{
- return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1);
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len )
-{
- int bzerr, nread;
- if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0;
- nread = BZ2_bzRead(&bzerr,b,buf,len);
- if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) {
- return nread;
- } else {
- return -1;
- }
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
-{
- int bzerr;
-
- BZ2_bzWrite(&bzerr,b,buf,len);
- if(bzerr == BZ_OK){
- return len;
- }else{
- return -1;
- }
-}
-
-
-/*---------------------------------------------------*/
-int BZ_API(BZ2_bzflush) (BZFILE *b)
-{
- /* do nothing now... */
- return 0;
-}
-
-
-/*---------------------------------------------------*/
-void BZ_API(BZ2_bzclose) (BZFILE* b)
-{
- int bzerr;
- FILE *fp = ((bzFile *)b)->handle;
-
- if (b==NULL) {return;}
- if(((bzFile*)b)->writing){
- BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL);
- if(bzerr != BZ_OK){
- BZ2_bzWriteClose(NULL,b,1,NULL,NULL);
- }
- }else{
- BZ2_bzReadClose(&bzerr,b);
- }
- if(fp!=stdin && fp!=stdout){
- fclose(fp);
- }
-}
-
-
-/*---------------------------------------------------*/
-/*--
- return last error code
---*/
-static char *bzerrorstrings[] = {
- "OK"
- ,"SEQUENCE_ERROR"
- ,"PARAM_ERROR"
- ,"MEM_ERROR"
- ,"DATA_ERROR"
- ,"DATA_ERROR_MAGIC"
- ,"IO_ERROR"
- ,"UNEXPECTED_EOF"
- ,"OUTBUFF_FULL"
- ,"CONFIG_ERROR"
- ,"???" /* for future */
- ,"???" /* for future */
- ,"???" /* for future */
- ,"???" /* for future */
- ,"???" /* for future */
- ,"???" /* for future */
-};
-
-
-const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum)
-{
- int err = ((bzFile *)b)->lastErr;
-
- if(err>0) err = 0;
- *errnum = err;
- return bzerrorstrings[err*-1];
-}
-#endif
-
-
-/*-------------------------------------------------------------*/
-/*--- end bzlib.c ---*/
-/*-------------------------------------------------------------*/
diff --git a/mdk-stage1/bzlib/bzlib_private.h b/mdk-stage1/bzlib/bzlib_private.h
deleted file mode 100644
index fb51c7a1d..000000000
--- a/mdk-stage1/bzlib/bzlib_private.h
+++ /dev/null
@@ -1,530 +0,0 @@
-
-/*-------------------------------------------------------------*/
-/*--- Private header file for the library. ---*/
-/*--- bzlib_private.h ---*/
-/*-------------------------------------------------------------*/
-
-/*--
- This file is a part of bzip2 and/or libbzip2, a program and
- library for lossless, block-sorting data compression.
-
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
-
- 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. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
- 3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
- 4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-
- Julian Seward, Cambridge, UK.
- jseward@acm.org
- bzip2/libbzip2 version 1.0 of 21 March 2000
-
- This program is based on (at least) the work of:
- Mike Burrows
- David Wheeler
- Peter Fenwick
- Alistair Moffat
- Radford Neal
- Ian H. Witten
- Robert Sedgewick
- Jon L. Bentley
-
- For more information on these sources, see the manual.
---*/
-
-
-#ifndef _BZLIB_PRIVATE_H
-#define _BZLIB_PRIVATE_H
-
-#include <stdlib.h>
-
-#ifndef BZ_NO_STDIO
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#endif
-
-#include "bzlib.h"
-
-
-
-/*-- General stuff. --*/
-
-#define BZ_VERSION "1.0.1, 23-June-2000"
-
-typedef char Char;
-typedef unsigned char Bool;
-typedef unsigned char UChar;
-typedef int Int32;
-typedef unsigned int UInt32;
-typedef short Int16;
-typedef unsigned short UInt16;
-
-#define True ((Bool)1)
-#define False ((Bool)0)
-
-#ifndef __GNUC__
-#define __inline__ /* */
-#endif
-
-#ifndef BZ_NO_STDIO
-extern void BZ2_bz__AssertH__fail ( int errcode );
-#define AssertH(cond,errcode) \
- { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
-#if BZ_DEBUG
-#define AssertD(cond,msg) \
- { if (!(cond)) { \
- fprintf ( stderr, \
- "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\
- exit(1); \
- }}
-#else
-#define AssertD(cond,msg) /* */
-#endif
-#define VPrintf0(zf) \
- fprintf(stderr,zf)
-#define VPrintf1(zf,za1) \
- fprintf(stderr,zf,za1)
-#define VPrintf2(zf,za1,za2) \
- fprintf(stderr,zf,za1,za2)
-#define VPrintf3(zf,za1,za2,za3) \
- fprintf(stderr,zf,za1,za2,za3)
-#define VPrintf4(zf,za1,za2,za3,za4) \
- fprintf(stderr,zf,za1,za2,za3,za4)
-#define VPrintf5(zf,za1,za2,za3,za4,za5) \
- fprintf(stderr,zf,za1,za2,za3,za4,za5)
-#else
-extern void bz_internal_error ( int errcode );
-#define AssertH(cond,errcode) \
- { if (!(cond)) bz_internal_error ( errcode ); }
-#define AssertD(cond,msg) /* */
-#define VPrintf0(zf) /* */
-#define VPrintf1(zf,za1) /* */
-#define VPrintf2(zf,za1,za2) /* */
-#define VPrintf3(zf,za1,za2,za3) /* */
-#define VPrintf4(zf,za1,za2,za3,za4) /* */
-#define VPrintf5(zf,za1,za2,za3,za4,za5) /* */
-#endif
-
-
-#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
-#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp))
-
-
-/*-- Constants for the back end. --*/
-
-#define BZ_MAX_ALPHA_SIZE 258
-#define BZ_MAX_CODE_LEN 23
-
-#define BZ_RUNA 0
-#define BZ_RUNB 1
-
-#define BZ_N_GROUPS 6
-#define BZ_G_SIZE 50
-#define BZ_N_ITERS 4
-
-#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
-
-
-
-/*-- Stuff for randomising repetitive blocks. --*/
-
-extern Int32 BZ2_rNums[512];
-
-#define BZ_RAND_DECLS \
- Int32 rNToGo; \
- Int32 rTPos \
-
-#define BZ_RAND_INIT_MASK \
- s->rNToGo = 0; \
- s->rTPos = 0 \
-
-#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
-
-#define BZ_RAND_UPD_MASK \
- if (s->rNToGo == 0) { \
- s->rNToGo = BZ2_rNums[s->rTPos]; \
- s->rTPos++; \
- if (s->rTPos == 512) s->rTPos = 0; \
- } \
- s->rNToGo--;
-
-
-
-/*-- Stuff for doing CRCs. --*/
-
-extern UInt32 BZ2_crc32Table[256];
-
-#define BZ_INITIALISE_CRC(crcVar) \
-{ \
- crcVar = 0xffffffffL; \
-}
-
-#define BZ_FINALISE_CRC(crcVar) \
-{ \
- crcVar = ~(crcVar); \
-}
-
-#define BZ_UPDATE_CRC(crcVar,cha) \
-{ \
- crcVar = (crcVar << 8) ^ \
- BZ2_crc32Table[(crcVar >> 24) ^ \
- ((UChar)cha)]; \
-}
-
-
-
-/*-- States and modes for compression. --*/
-
-#define BZ_M_IDLE 1
-#define BZ_M_RUNNING 2
-#define BZ_M_FLUSHING 3
-#define BZ_M_FINISHING 4
-
-#define BZ_S_OUTPUT 1
-#define BZ_S_INPUT 2
-
-#define BZ_N_RADIX 2
-#define BZ_N_QSORT 12
-#define BZ_N_SHELL 18
-#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
-
-
-
-
-/*-- Structure holding all the compression-side stuff. --*/
-
-typedef
- struct {
- /* pointer back to the struct bz_stream */
- bz_stream* strm;
-
- /* mode this stream is in, and whether inputting */
- /* or outputting data */
- Int32 mode;
- Int32 state;
-
- /* remembers avail_in when flush/finish requested */
- UInt32 avail_in_expect;
-
- /* for doing the block sorting */
- UInt32* arr1;
- UInt32* arr2;
- UInt32* ftab;
- Int32 origPtr;
-
- /* aliases for arr1 and arr2 */
- UInt32* ptr;
- UChar* block;
- UInt16* mtfv;
- UChar* zbits;
-
- /* for deciding when to use the fallback sorting algorithm */
- Int32 workFactor;
-
- /* run-length-encoding of the input */
- UInt32 state_in_ch;
- Int32 state_in_len;
- BZ_RAND_DECLS;
-
- /* input and output limits and current posns */
- Int32 nblock;
- Int32 nblockMAX;
- Int32 numZ;
- Int32 state_out_pos;
-
- /* map of bytes used in block */
- Int32 nInUse;
- Bool inUse[256];
- UChar unseqToSeq[256];
-
- /* the buffer for bit stream creation */
- UInt32 bsBuff;
- Int32 bsLive;
-
- /* block and combined CRCs */
- UInt32 blockCRC;
- UInt32 combinedCRC;
-
- /* misc administratium */
- Int32 verbosity;
- Int32 blockNo;
- Int32 blockSize100k;
-
- /* stuff for coding the MTF values */
- Int32 nMTF;
- Int32 mtfFreq [BZ_MAX_ALPHA_SIZE];
- UChar selector [BZ_MAX_SELECTORS];
- UChar selectorMtf[BZ_MAX_SELECTORS];
-
- UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- /* second dimension: only 3 needed; 4 makes index calculations faster */
- UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4];
-
- }
- EState;
-
-
-
-/*-- externs for compression. --*/
-
-extern void
-BZ2_blockSort ( EState* );
-
-extern void
-BZ2_compressBlock ( EState*, Bool );
-
-extern void
-BZ2_bsInitWrite ( EState* );
-
-extern void
-BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
-
-extern void
-BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
-
-
-
-/*-- states for decompression. --*/
-
-#define BZ_X_IDLE 1
-#define BZ_X_OUTPUT 2
-
-#define BZ_X_MAGIC_1 10
-#define BZ_X_MAGIC_2 11
-#define BZ_X_MAGIC_3 12
-#define BZ_X_MAGIC_4 13
-#define BZ_X_BLKHDR_1 14
-#define BZ_X_BLKHDR_2 15
-#define BZ_X_BLKHDR_3 16
-#define BZ_X_BLKHDR_4 17
-#define BZ_X_BLKHDR_5 18
-#define BZ_X_BLKHDR_6 19
-#define BZ_X_BCRC_1 20
-#define BZ_X_BCRC_2 21
-#define BZ_X_BCRC_3 22
-#define BZ_X_BCRC_4 23
-#define BZ_X_RANDBIT 24
-#define BZ_X_ORIGPTR_1 25
-#define BZ_X_ORIGPTR_2 26
-#define BZ_X_ORIGPTR_3 27
-#define BZ_X_MAPPING_1 28
-#define BZ_X_MAPPING_2 29
-#define BZ_X_SELECTOR_1 30
-#define BZ_X_SELECTOR_2 31
-#define BZ_X_SELECTOR_3 32
-#define BZ_X_CODING_1 33
-#define BZ_X_CODING_2 34
-#define BZ_X_CODING_3 35
-#define BZ_X_MTF_1 36
-#define BZ_X_MTF_2 37
-#define BZ_X_MTF_3 38
-#define BZ_X_MTF_4 39
-#define BZ_X_MTF_5 40
-#define BZ_X_MTF_6 41
-#define BZ_X_ENDHDR_2 42
-#define BZ_X_ENDHDR_3 43
-#define BZ_X_ENDHDR_4 44
-#define BZ_X_ENDHDR_5 45
-#define BZ_X_ENDHDR_6 46
-#define BZ_X_CCRC_1 47
-#define BZ_X_CCRC_2 48
-#define BZ_X_CCRC_3 49
-#define BZ_X_CCRC_4 50
-
-
-
-/*-- Constants for the fast MTF decoder. --*/
-
-#define MTFA_SIZE 4096
-#define MTFL_SIZE 16
-
-
-
-/*-- Structure holding all the decompression-side stuff. --*/
-
-typedef
- struct {
- /* pointer back to the struct bz_stream */
- bz_stream* strm;
-
- /* state indicator for this stream */
- Int32 state;
-
- /* for doing the final run-length decoding */
- UChar state_out_ch;
- Int32 state_out_len;
- Bool blockRandomised;
- BZ_RAND_DECLS;
-
- /* the buffer for bit stream reading */
- UInt32 bsBuff;
- Int32 bsLive;
-
- /* misc administratium */
- Int32 blockSize100k;
- Bool smallDecompress;
- Int32 currBlockNo;
- Int32 verbosity;
-
- /* for undoing the Burrows-Wheeler transform */
- Int32 origPtr;
- UInt32 tPos;
- Int32 k0;
- Int32 unzftab[256];
- Int32 nblock_used;
- Int32 cftab[257];
- Int32 cftabCopy[257];
-
- /* for undoing the Burrows-Wheeler transform (FAST) */
- UInt32 *tt;
-
- /* for undoing the Burrows-Wheeler transform (SMALL) */
- UInt16 *ll16;
- UChar *ll4;
-
- /* stored and calculated CRCs */
- UInt32 storedBlockCRC;
- UInt32 storedCombinedCRC;
- UInt32 calculatedBlockCRC;
- UInt32 calculatedCombinedCRC;
-
- /* map of bytes used in block */
- Int32 nInUse;
- Bool inUse[256];
- Bool inUse16[16];
- UChar seqToUnseq[256];
-
- /* for decoding the MTF values */
- UChar mtfa [MTFA_SIZE];
- Int32 mtfbase[256 / MTFL_SIZE];
- UChar selector [BZ_MAX_SELECTORS];
- UChar selectorMtf[BZ_MAX_SELECTORS];
- UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
-
- Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- Int32 minLens[BZ_N_GROUPS];
-
- /* save area for scalars in the main decompress code */
- Int32 save_i;
- Int32 save_j;
- Int32 save_t;
- Int32 save_alphaSize;
- Int32 save_nGroups;
- Int32 save_nSelectors;
- Int32 save_EOB;
- Int32 save_groupNo;
- Int32 save_groupPos;
- Int32 save_nextSym;
- Int32 save_nblockMAX;
- Int32 save_nblock;
- Int32 save_es;
- Int32 save_N;
- Int32 save_curr;
- Int32 save_zt;
- Int32 save_zn;
- Int32 save_zvec;
- Int32 save_zj;
- Int32 save_gSel;
- Int32 save_gMinlen;
- Int32* save_gLimit;
- Int32* save_gBase;
- Int32* save_gPerm;
-
- }
- DState;
-
-
-
-/*-- Macros for decompression. --*/
-
-#define BZ_GET_FAST(cccc) \
- s->tPos = s->tt[s->tPos]; \
- cccc = (UChar)(s->tPos & 0xff); \
- s->tPos >>= 8;
-
-#define BZ_GET_FAST_C(cccc) \
- c_tPos = c_tt[c_tPos]; \
- cccc = (UChar)(c_tPos & 0xff); \
- c_tPos >>= 8;
-
-#define SET_LL4(i,n) \
- { if (((i) & 0x1) == 0) \
- s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \
- s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \
- }
-
-#define GET_LL4(i) \
- ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
-
-#define SET_LL(i,n) \
- { s->ll16[i] = (UInt16)(n & 0x0000ffff); \
- SET_LL4(i, n >> 16); \
- }
-
-#define GET_LL(i) \
- (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
-
-#define BZ_GET_SMALL(cccc) \
- cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \
- s->tPos = GET_LL(s->tPos);
-
-
-/*-- externs for decompression. --*/
-
-extern Int32
-BZ2_indexIntoF ( Int32, Int32* );
-
-extern Int32
-BZ2_decompress ( DState* );
-
-extern void
-BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
- Int32, Int32, Int32 );
-
-
-#endif
-
-
-/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/
-
-#ifdef BZ_NO_STDIO
-#ifndef NULL
-#define NULL 0
-#endif
-#endif
-
-
-/*-------------------------------------------------------------*/
-/*--- end bzlib_private.h ---*/
-/*-------------------------------------------------------------*/
diff --git a/mdk-stage1/bzlib/compress.c b/mdk-stage1/bzlib/compress.c
deleted file mode 100644
index 58d5abe7c..000000000
--- a/mdk-stage1/bzlib/compress.c
+++ /dev/null
@@ -1,720 +0,0 @@
-
-/*-------------------------------------------------------------*/
-/*--- Compression machinery (not incl block sorting) ---*/
-/*--- compress.c ---*/
-/*-------------------------------------------------------------*/
-
-/*--
- This file is a part of bzip2 and/or libbzip2, a program and
- library for lossless, block-sorting data compression.
-
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
-
- 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. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
- 3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
- 4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-
- Julian Seward, Cambridge, UK.
- jseward@acm.org
- bzip2/libbzip2 version 1.0 of 21 March 2000
-
- This program is based on (at least) the work of:
- Mike Burrows
- David Wheeler
- Peter Fenwick
- Alistair Moffat
- Radford Neal
- Ian H. Witten
- Robert Sedgewick
- Jon L. Bentley
-
- For more information on these sources, see the manual.
---*/
-
-/*--
- CHANGES
- ~~~~~~~
- 0.9.0 -- original version.
-
- 0.9.0a/b -- no changes in this file.
-
- 0.9.0c
- * changed setting of nGroups in sendMTFValues() so as to
- do a bit better on small files
---*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-
-#include "bzlib_private.h"
-
-
-/*---------------------------------------------------*/
-/*--- Bit stream I/O ---*/
-/*---------------------------------------------------*/
-
-/*---------------------------------------------------*/
-void BZ2_bsInitWrite ( EState* s )
-{
- s->bsLive = 0;
- s->bsBuff = 0;
-}
-
-
-/*---------------------------------------------------*/
-static
-void bsFinishWrite ( EState* s )
-{
- while (s->bsLive > 0) {
- s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
- s->numZ++;
- s->bsBuff <<= 8;
- s->bsLive -= 8;
- }
-}
-
-
-/*---------------------------------------------------*/
-#define bsNEEDW(nz) \
-{ \
- while (s->bsLive >= 8) { \
- s->zbits[s->numZ] \
- = (UChar)(s->bsBuff >> 24); \
- s->numZ++; \
- s->bsBuff <<= 8; \
- s->bsLive -= 8; \
- } \
-}
-
-
-/*---------------------------------------------------*/
-static
-__inline__
-void bsW ( EState* s, Int32 n, UInt32 v )
-{
- bsNEEDW ( n );
- s->bsBuff |= (v << (32 - s->bsLive - n));
- s->bsLive += n;
-}
-
-
-/*---------------------------------------------------*/
-static
-void bsPutUInt32 ( EState* s, UInt32 u )
-{
- bsW ( s, 8, (u >> 24) & 0xffL );
- bsW ( s, 8, (u >> 16) & 0xffL );
- bsW ( s, 8, (u >> 8) & 0xffL );
- bsW ( s, 8, u & 0xffL );
-}
-
-
-/*---------------------------------------------------*/
-static
-void bsPutUChar ( EState* s, UChar c )
-{
- bsW( s, 8, (UInt32)c );
-}
-
-
-/*---------------------------------------------------*/
-/*--- The back end proper ---*/
-/*---------------------------------------------------*/
-
-/*---------------------------------------------------*/
-static
-void makeMaps_e ( EState* s )
-{
- Int32 i;
- s->nInUse = 0;
- for (i = 0; i < 256; i++)
- if (s->inUse[i]) {
- s->unseqToSeq[i] = s->nInUse;
- s->nInUse++;
- }
-}
-
-
-/*---------------------------------------------------*/
-static
-void generateMTFValues ( EState* s )
-{
- UChar yy[256];
- Int32 i, j;
- Int32 zPend;
- Int32 wr;
- Int32 EOB;
-
- /*
- After sorting (eg, here),
- s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
- and
- ((UChar*)s->arr2) [ 0 .. s->nblock-1 ]
- holds the original block data.
-
- The first thing to do is generate the MTF values,
- and put them in
- ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
- Because there are strictly fewer or equal MTF values
- than block values, ptr values in this area are overwritten
- with MTF values only when they are no longer needed.
-
- The final compressed bitstream is generated into the
- area starting at
- (UChar*) (&((UChar*)s->arr2)[s->nblock])
-
- These storage aliases are set up in bzCompressInit(),
- except for the last one, which is arranged in
- compressBlock().
- */
- UInt32* ptr = s->ptr;
- UChar* block = s->block;
- UInt16* mtfv = s->mtfv;
-
- makeMaps_e ( s );
- EOB = s->nInUse+1;
-
- for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
-
- wr = 0;
- zPend = 0;
- for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
-
- for (i = 0; i < s->nblock; i++) {
- UChar ll_i;
- AssertD ( wr <= i, "generateMTFValues(1)" );
- j = ptr[i]-1; if (j < 0) j += s->nblock;
- ll_i = s->unseqToSeq[block[j]];
- AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
-
- if (yy[0] == ll_i) {
- zPend++;
- } else {
-
- if (zPend > 0) {
- zPend--;
- while (True) {
- if (zPend & 1) {
- mtfv[wr] = BZ_RUNB; wr++;
- s->mtfFreq[BZ_RUNB]++;
- } else {
- mtfv[wr] = BZ_RUNA; wr++;
- s->mtfFreq[BZ_RUNA]++;
- }
- if (zPend < 2) break;
- zPend = (zPend - 2) / 2;
- };
- zPend = 0;
- }
- {
- register UChar rtmp;
- register UChar* ryy_j;
- register UChar rll_i;
- rtmp = yy[1];
- yy[1] = yy[0];
- ryy_j = &(yy[1]);
- rll_i = ll_i;
- while ( rll_i != rtmp ) {
- register UChar rtmp2;
- ryy_j++;
- rtmp2 = rtmp;
- rtmp = *ryy_j;
- *ryy_j = rtmp2;
- };
- yy[0] = rtmp;
- j = ryy_j - &(yy[0]);
- mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
- }
-
- }
- }
-
- if (zPend > 0) {
- zPend--;
- while (True) {
- if (zPend & 1) {
- mtfv[wr] = BZ_RUNB; wr++;
- s->mtfFreq[BZ_RUNB]++;
- } else {
- mtfv[wr] = BZ_RUNA; wr++;
- s->mtfFreq[BZ_RUNA]++;
- }
- if (zPend < 2) break;
- zPend = (zPend - 2) / 2;
- };
- zPend = 0;
- }
-
- mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
-
- s->nMTF = wr;
-}
-
-
-/*---------------------------------------------------*/
-#define BZ_LESSER_ICOST 0
-#define BZ_GREATER_ICOST 15
-
-static
-void sendMTFValues ( EState* s )
-{
- Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
- Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
- Int32 nGroups, nBytes;
-
- /*--
- UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- is a global since the decoder also needs it.
-
- Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
- are also globals only used in this proc.
- Made global to keep stack frame size small.
- --*/
-
-
- UInt16 cost[BZ_N_GROUPS];
- Int32 fave[BZ_N_GROUPS];
-
- UInt16* mtfv = s->mtfv;
-
- if (s->verbosity >= 3)
- VPrintf3( " %d in block, %d after MTF & 1-2 coding, "
- "%d+2 syms in use\n",
- s->nblock, s->nMTF, s->nInUse );
-
- alphaSize = s->nInUse+2;
- for (t = 0; t < BZ_N_GROUPS; t++)
- for (v = 0; v < alphaSize; v++)
- s->len[t][v] = BZ_GREATER_ICOST;
-
- /*--- Decide how many coding tables to use ---*/
- AssertH ( s->nMTF > 0, 3001 );
- if (s->nMTF < 200) nGroups = 2; else
- if (s->nMTF < 600) nGroups = 3; else
- if (s->nMTF < 1200) nGroups = 4; else
- if (s->nMTF < 2400) nGroups = 5; else
- nGroups = 6;
-
- /*--- Generate an initial set of coding tables ---*/
- {
- Int32 nPart, remF, tFreq, aFreq;
-
- nPart = nGroups;
- remF = s->nMTF;
- gs = 0;
- while (nPart > 0) {
- tFreq = remF / nPart;
- ge = gs-1;
- aFreq = 0;
- while (aFreq < tFreq && ge < alphaSize-1) {
- ge++;
- aFreq += s->mtfFreq[ge];
- }
-
- if (ge > gs
- && nPart != nGroups && nPart != 1
- && ((nGroups-nPart) % 2 == 1)) {
- aFreq -= s->mtfFreq[ge];
- ge--;
- }
-
- if (s->verbosity >= 3)
- VPrintf5( " initial group %d, [%d .. %d], "
- "has %d syms (%4.1f%%)\n",
- nPart, gs, ge, aFreq,
- (100.0 * (float)aFreq) / (float)(s->nMTF) );
-
- for (v = 0; v < alphaSize; v++)
- if (v >= gs && v <= ge)
- s->len[nPart-1][v] = BZ_LESSER_ICOST; else
- s->len[nPart-1][v] = BZ_GREATER_ICOST;
-
- nPart--;
- gs = ge+1;
- remF -= aFreq;
- }
- }
-
- /*---
- Iterate up to BZ_N_ITERS times to improve the tables.
- ---*/
- for (iter = 0; iter < BZ_N_ITERS; iter++) {
-
- for (t = 0; t < nGroups; t++) fave[t] = 0;
-
- for (t = 0; t < nGroups; t++)
- for (v = 0; v < alphaSize; v++)
- s->rfreq[t][v] = 0;
-
- /*---
- Set up an auxiliary length table which is used to fast-track
- the common case (nGroups == 6).
- ---*/
- if (nGroups == 6) {
- for (v = 0; v < alphaSize; v++) {
- s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
- s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
- s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
- }
- }
-
- nSelectors = 0;
- totc = 0;
- gs = 0;
- while (True) {
-
- /*--- Set group start & end marks. --*/
- if (gs >= s->nMTF) break;
- ge = gs + BZ_G_SIZE - 1;
- if (ge >= s->nMTF) ge = s->nMTF-1;
-
- /*--
- Calculate the cost of this group as coded
- by each of the coding tables.
- --*/
- for (t = 0; t < nGroups; t++) cost[t] = 0;
-
- if (nGroups == 6 && 50 == ge-gs+1) {
- /*--- fast track the common case ---*/
- register UInt32 cost01, cost23, cost45;
- register UInt16 icv;
- cost01 = cost23 = cost45 = 0;
-
-# define BZ_ITER(nn) \
- icv = mtfv[gs+(nn)]; \
- cost01 += s->len_pack[icv][0]; \
- cost23 += s->len_pack[icv][1]; \
- cost45 += s->len_pack[icv][2]; \
-
- BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4);
- BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9);
- BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
- BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
- BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
- BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
- BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
- BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
- BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
- BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
-
-# undef BZ_ITER
-
- cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
- cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
- cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
-
- } else {
- /*--- slow version which correctly handles all situations ---*/
- for (i = gs; i <= ge; i++) {
- UInt16 icv = mtfv[i];
- for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
- }
- }
-
- /*--
- Find the coding table which is best for this group,
- and record its identity in the selector table.
- --*/
- bc = 999999999; bt = -1;
- for (t = 0; t < nGroups; t++)
- if (cost[t] < bc) { bc = cost[t]; bt = t; };
- totc += bc;
- fave[bt]++;
- s->selector[nSelectors] = bt;
- nSelectors++;
-
- /*--
- Increment the symbol frequencies for the selected table.
- --*/
- if (nGroups == 6 && 50 == ge-gs+1) {
- /*--- fast track the common case ---*/
-
-# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
-
- BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4);
- BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9);
- BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
- BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
- BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
- BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
- BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
- BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
- BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
- BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
-
-# undef BZ_ITUR
-
- } else {
- /*--- slow version which correctly handles all situations ---*/
- for (i = gs; i <= ge; i++)
- s->rfreq[bt][ mtfv[i] ]++;
- }
-
- gs = ge+1;
- }
- if (s->verbosity >= 3) {
- VPrintf2 ( " pass %d: size is %d, grp uses are ",
- iter+1, totc/8 );
- for (t = 0; t < nGroups; t++)
- VPrintf1 ( "%d ", fave[t] );
- VPrintf0 ( "\n" );
- }
-
- /*--
- Recompute the tables based on the accumulated frequencies.
- --*/
- for (t = 0; t < nGroups; t++)
- BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]),
- alphaSize, 20 );
- }
-
-
- AssertH( nGroups < 8, 3002 );
- AssertH( nSelectors < 32768 &&
- nSelectors <= (2 + (900000 / BZ_G_SIZE)),
- 3003 );
-
-
- /*--- Compute MTF values for the selectors. ---*/
- {
- UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
- for (i = 0; i < nGroups; i++) pos[i] = i;
- for (i = 0; i < nSelectors; i++) {
- ll_i = s->selector[i];
- j = 0;
- tmp = pos[j];
- while ( ll_i != tmp ) {
- j++;
- tmp2 = tmp;
- tmp = pos[j];
- pos[j] = tmp2;
- };
- pos[0] = tmp;
- s->selectorMtf[i] = j;
- }
- };
-
- /*--- Assign actual codes for the tables. --*/
- for (t = 0; t < nGroups; t++) {
- minLen = 32;
- maxLen = 0;
- for (i = 0; i < alphaSize; i++) {
- if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
- if (s->len[t][i] < minLen) minLen = s->len[t][i];
- }
- AssertH ( !(maxLen > 20), 3004 );
- AssertH ( !(minLen < 1), 3005 );
- BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]),
- minLen, maxLen, alphaSize );
- }
-
- /*--- Transmit the mapping table. ---*/
- {
- Bool inUse16[16];
- for (i = 0; i < 16; i++) {
- inUse16[i] = False;
- for (j = 0; j < 16; j++)
- if (s->inUse[i * 16 + j]) inUse16[i] = True;
- }
-
- nBytes = s->numZ;
- for (i = 0; i < 16; i++)
- if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
-
- for (i = 0; i < 16; i++)
- if (inUse16[i])
- for (j = 0; j < 16; j++) {
- if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
- }
-
- if (s->verbosity >= 3)
- VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes );
- }
-
- /*--- Now the selectors. ---*/
- nBytes = s->numZ;
- bsW ( s, 3, nGroups );
- bsW ( s, 15, nSelectors );
- for (i = 0; i < nSelectors; i++) {
- for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
- bsW(s,1,0);
- }
- if (s->verbosity >= 3)
- VPrintf1( "selectors %d, ", s->numZ-nBytes );
-
- /*--- Now the coding tables. ---*/
- nBytes = s->numZ;
-
- for (t = 0; t < nGroups; t++) {
- Int32 curr = s->len[t][0];
- bsW ( s, 5, curr );
- for (i = 0; i < alphaSize; i++) {
- while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
- while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
- bsW ( s, 1, 0 );
- }
- }
-
- if (s->verbosity >= 3)
- VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
-
- /*--- And finally, the block data proper ---*/
- nBytes = s->numZ;
- selCtr = 0;
- gs = 0;
- while (True) {
- if (gs >= s->nMTF) break;
- ge = gs + BZ_G_SIZE - 1;
- if (ge >= s->nMTF) ge = s->nMTF-1;
- AssertH ( s->selector[selCtr] < nGroups, 3006 );
-
- if (nGroups == 6 && 50 == ge-gs+1) {
- /*--- fast track the common case ---*/
- UInt16 mtfv_i;
- UChar* s_len_sel_selCtr
- = &(s->len[s->selector[selCtr]][0]);
- Int32* s_code_sel_selCtr
- = &(s->code[s->selector[selCtr]][0]);
-
-# define BZ_ITAH(nn) \
- mtfv_i = mtfv[gs+(nn)]; \
- bsW ( s, \
- s_len_sel_selCtr[mtfv_i], \
- s_code_sel_selCtr[mtfv_i] )
-
- BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4);
- BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9);
- BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
- BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
- BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
- BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
- BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
- BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
- BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
- BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
-
-# undef BZ_ITAH
-
- } else {
- /*--- slow version which correctly handles all situations ---*/
- for (i = gs; i <= ge; i++) {
- bsW ( s,
- s->len [s->selector[selCtr]] [mtfv[i]],
- s->code [s->selector[selCtr]] [mtfv[i]] );
- }
- }
-
-
- gs = ge+1;
- selCtr++;
- }
- AssertH( selCtr == nSelectors, 3007 );
-
- if (s->verbosity >= 3)
- VPrintf1( "codes %d\n", s->numZ-nBytes );
-}
-
-
-/*---------------------------------------------------*/
-void BZ2_compressBlock ( EState* s, Bool is_last_block )
-{
- if (s->nblock > 0) {
-
- BZ_FINALISE_CRC ( s->blockCRC );
- s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
- s->combinedCRC ^= s->blockCRC;
- if (s->blockNo > 1) s->numZ = 0;
-
- if (s->verbosity >= 2)
- VPrintf4( " block %d: crc = 0x%8x, "
- "combined CRC = 0x%8x, size = %d\n",
- s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
-
- BZ2_blockSort ( s );
- }
-
- s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
-
- /*-- If this is the first block, create the stream header. --*/
- if (s->blockNo == 1) {
- BZ2_bsInitWrite ( s );
- bsPutUChar ( s, 'B' );
- bsPutUChar ( s, 'Z' );
- bsPutUChar ( s, 'h' );
- bsPutUChar ( s, (UChar)('0' + s->blockSize100k) );
- }
-
- if (s->nblock > 0) {
-
- bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
- bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
- bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
-
- /*-- Now the block's CRC, so it is in a known place. --*/
- bsPutUInt32 ( s, s->blockCRC );
-
- /*--
- Now a single bit indicating (non-)randomisation.
- As of version 0.9.5, we use a better sorting algorithm
- which makes randomisation unnecessary. So always set
- the randomised bit to 'no'. Of course, the decoder
- still needs to be able to handle randomised blocks
- so as to maintain backwards compatibility with
- older versions of bzip2.
- --*/
- bsW(s,1,0);
-
- bsW ( s, 24, s->origPtr );
- generateMTFValues ( s );
- sendMTFValues ( s );
- }
-
-
- /*-- If this is the last block, add the stream trailer. --*/
- if (is_last_block) {
-
- bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
- bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
- bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
- bsPutUInt32 ( s, s->combinedCRC );
- if (s->verbosity >= 2)
- VPrintf1( " final combined CRC = 0x%x\n ", s->combinedCRC );
- bsFinishWrite ( s );
- }
-}
-
-
-/*-------------------------------------------------------------*/
-/*--- end compress.c ---*/
-/*-------------------------------------------------------------*/
diff --git a/mdk-stage1/bzlib/crctable.c b/mdk-stage1/bzlib/crctable.c
deleted file mode 100644
index c0ea3f769..000000000
--- a/mdk-stage1/bzlib/crctable.c
+++ /dev/null
@@ -1,148 +0,0 @@
-
-/*-------------------------------------------------------------*/
-/*--- Table for doing CRCs ---*/
-/*--- crctable.c ---*/
-/*-------------------------------------------------------------*/
-
-/*--
- This file is a part of bzip2 and/or libbzip2, a program and
- library for lossless, block-sorting data compression.
-
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
-
- 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. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
- 3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
- 4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-
- Julian Seward, Cambridge, UK.
- jseward@acm.org
- bzip2/libbzip2 version 1.0 of 21 March 2000
-
- This program is based on (at least) the work of:
- Mike Burrows
- David Wheeler
- Peter Fenwick
- Alistair Moffat
- Radford Neal
- Ian H. Witten
- Robert Sedgewick
- Jon L. Bentley
-
- For more information on these sources, see the manual.
---*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "bzlib_private.h"
-
-/*--
- I think this is an implementation of the AUTODIN-II,
- Ethernet & FDDI 32-bit CRC standard. Vaguely derived
- from code by Rob Warnock, in Section 51 of the
- comp.compression FAQ.
---*/
-
-UInt32 BZ2_crc32Table[256] = {
-
- /*-- Ugly, innit? --*/
-
- 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
- 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
- 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
- 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
- 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
- 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
- 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
- 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
- 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
- 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
- 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
- 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
- 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
- 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
- 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
- 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
- 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
- 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
- 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
- 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
- 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
- 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
- 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
- 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
- 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
- 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
- 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
- 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
- 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
- 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
- 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
- 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
- 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
- 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
- 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
- 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
- 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
- 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
- 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
- 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
- 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
- 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
- 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
- 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
- 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
- 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
- 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
- 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
- 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
- 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
- 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
- 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
- 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
- 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
- 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
- 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
- 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
- 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
- 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
- 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
- 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
- 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
- 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
- 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
-};
-
-
-/*-------------------------------------------------------------*/
-/*--- end crctable.c ---*/
-/*-------------------------------------------------------------*/
diff --git a/mdk-stage1/bzlib/decompress.c b/mdk-stage1/bzlib/decompress.c
deleted file mode 100644
index 65cf75d8f..000000000
--- a/mdk-stage1/bzlib/decompress.c
+++ /dev/null
@@ -1,664 +0,0 @@
-
-/*-------------------------------------------------------------*/
-/*--- Decompression machinery ---*/
-/*--- decompress.c ---*/
-/*-------------------------------------------------------------*/
-
-/*--
- This file is a part of bzip2 and/or libbzip2, a program and
- library for lossless, block-sorting data compression.
-
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
-
- 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. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
- 3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
- 4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-
- Julian Seward, Cambridge, UK.
- jseward@acm.org
- bzip2/libbzip2 version 1.0 of 21 March 2000
-
- This program is based on (at least) the work of:
- Mike Burrows
- David Wheeler
- Peter Fenwick
- Alistair Moffat
- Radford Neal
- Ian H. Witten
- Robert Sedgewick
- Jon L. Bentley
-
- For more information on these sources, see the manual.
---*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "bzlib_private.h"
-
-
-/*---------------------------------------------------*/
-static
-void makeMaps_d ( DState* s )
-{
- Int32 i;
- s->nInUse = 0;
- for (i = 0; i < 256; i++)
- if (s->inUse[i]) {
- s->seqToUnseq[s->nInUse] = i;
- s->nInUse++;
- }
-}
-
-
-/*---------------------------------------------------*/
-#define RETURN(rrr) \
- { retVal = rrr; goto save_state_and_return; };
-
-#define GET_BITS(lll,vvv,nnn) \
- case lll: s->state = lll; \
- while (True) { \
- if (s->bsLive >= nnn) { \
- UInt32 v; \
- v = (s->bsBuff >> \
- (s->bsLive-nnn)) & ((1 << nnn)-1); \
- s->bsLive -= nnn; \
- vvv = v; \
- break; \
- } \
- if (s->strm->avail_in == 0) RETURN(BZ_OK); \
- s->bsBuff \
- = (s->bsBuff << 8) | \
- ((UInt32) \
- (*((UChar*)(s->strm->next_in)))); \
- s->bsLive += 8; \
- s->strm->next_in++; \
- s->strm->avail_in--; \
- s->strm->total_in_lo32++; \
- if (s->strm->total_in_lo32 == 0) \
- s->strm->total_in_hi32++; \
- }
-
-#define GET_UCHAR(lll,uuu) \
- GET_BITS(lll,uuu,8)
-
-#define GET_BIT(lll,uuu) \
- GET_BITS(lll,uuu,1)
-
-/*---------------------------------------------------*/
-#define GET_MTF_VAL(label1,label2,lval) \
-{ \
- if (groupPos == 0) { \
- groupNo++; \
- if (groupNo >= nSelectors) \
- RETURN(BZ_DATA_ERROR); \
- groupPos = BZ_G_SIZE; \
- gSel = s->selector[groupNo]; \
- gMinlen = s->minLens[gSel]; \
- gLimit = &(s->limit[gSel][0]); \
- gPerm = &(s->perm[gSel][0]); \
- gBase = &(s->base[gSel][0]); \
- } \
- groupPos--; \
- zn = gMinlen; \
- GET_BITS(label1, zvec, zn); \
- while (1) { \
- if (zn > 20 /* the longest code */) \
- RETURN(BZ_DATA_ERROR); \
- if (zvec <= gLimit[zn]) break; \
- zn++; \
- GET_BIT(label2, zj); \
- zvec = (zvec << 1) | zj; \
- }; \
- if (zvec - gBase[zn] < 0 \
- || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \
- RETURN(BZ_DATA_ERROR); \
- lval = gPerm[zvec - gBase[zn]]; \
-}
-
-
-/*---------------------------------------------------*/
-Int32 BZ2_decompress ( DState* s )
-{
- UChar uc;
- Int32 retVal;
- Int32 minLen, maxLen;
- bz_stream* strm = s->strm;
-
- /* stuff that needs to be saved/restored */
- Int32 i;
- Int32 j;
- Int32 t;
- Int32 alphaSize;
- Int32 nGroups;
- Int32 nSelectors;
- Int32 EOB;
- Int32 groupNo;
- Int32 groupPos;
- Int32 nextSym;
- Int32 nblockMAX;
- Int32 nblock;
- Int32 es;
- Int32 N;
- Int32 curr;
- Int32 zt;
- Int32 zn;
- Int32 zvec;
- Int32 zj;
- Int32 gSel;
- Int32 gMinlen;
- Int32* gLimit;
- Int32* gBase;
- Int32* gPerm;
-
- if (s->state == BZ_X_MAGIC_1) {
- /*initialise the save area*/
- s->save_i = 0;
- s->save_j = 0;
- s->save_t = 0;
- s->save_alphaSize = 0;
- s->save_nGroups = 0;
- s->save_nSelectors = 0;
- s->save_EOB = 0;
- s->save_groupNo = 0;
- s->save_groupPos = 0;
- s->save_nextSym = 0;
- s->save_nblockMAX = 0;
- s->save_nblock = 0;
- s->save_es = 0;
- s->save_N = 0;
- s->save_curr = 0;
- s->save_zt = 0;
- s->save_zn = 0;
- s->save_zvec = 0;
- s->save_zj = 0;
- s->save_gSel = 0;
- s->save_gMinlen = 0;
- s->save_gLimit = NULL;
- s->save_gBase = NULL;
- s->save_gPerm = NULL;
- }
-
- /*restore from the save area*/
- i = s->save_i;
- j = s->save_j;
- t = s->save_t;
- alphaSize = s->save_alphaSize;
- nGroups = s->save_nGroups;
- nSelectors = s->save_nSelectors;
- EOB = s->save_EOB;
- groupNo = s->save_groupNo;
- groupPos = s->save_groupPos;
- nextSym = s->save_nextSym;
- nblockMAX = s->save_nblockMAX;
- nblock = s->save_nblock;
- es = s->save_es;
- N = s->save_N;
- curr = s->save_curr;
- zt = s->save_zt;
- zn = s->save_zn;
- zvec = s->save_zvec;
- zj = s->save_zj;
- gSel = s->save_gSel;
- gMinlen = s->save_gMinlen;
- gLimit = s->save_gLimit;
- gBase = s->save_gBase;
- gPerm = s->save_gPerm;
-
- retVal = BZ_OK;
-
- switch (s->state) {
-
- GET_UCHAR(BZ_X_MAGIC_1, uc);
- if (uc != 'B') RETURN(BZ_DATA_ERROR_MAGIC);
-
- GET_UCHAR(BZ_X_MAGIC_2, uc);
- if (uc != 'Z') RETURN(BZ_DATA_ERROR_MAGIC);
-
- GET_UCHAR(BZ_X_MAGIC_3, uc)
- if (uc != 'h') RETURN(BZ_DATA_ERROR_MAGIC);
-
- GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
- if (s->blockSize100k < '1' ||
- s->blockSize100k > '9') RETURN(BZ_DATA_ERROR_MAGIC);
- s->blockSize100k -= '0';
-
- if (s->smallDecompress) {
- s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
- s->ll4 = BZALLOC(
- ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar)
- );
- if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
- } else {
- s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
- if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
- }
-
- GET_UCHAR(BZ_X_BLKHDR_1, uc);
-
- if (uc == 0x17) goto endhdr_2;
- if (uc != 0x31) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_BLKHDR_2, uc);
- if (uc != 0x41) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_BLKHDR_3, uc);
- if (uc != 0x59) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_BLKHDR_4, uc);
- if (uc != 0x26) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_BLKHDR_5, uc);
- if (uc != 0x53) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_BLKHDR_6, uc);
- if (uc != 0x59) RETURN(BZ_DATA_ERROR);
-
- s->currBlockNo++;
- if (s->verbosity >= 2)
- VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo );
-
- s->storedBlockCRC = 0;
- GET_UCHAR(BZ_X_BCRC_1, uc);
- s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
- GET_UCHAR(BZ_X_BCRC_2, uc);
- s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
- GET_UCHAR(BZ_X_BCRC_3, uc);
- s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
- GET_UCHAR(BZ_X_BCRC_4, uc);
- s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
-
- GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
-
- s->origPtr = 0;
- GET_UCHAR(BZ_X_ORIGPTR_1, uc);
- s->origPtr = (s->origPtr << 8) | ((Int32)uc);
- GET_UCHAR(BZ_X_ORIGPTR_2, uc);
- s->origPtr = (s->origPtr << 8) | ((Int32)uc);
- GET_UCHAR(BZ_X_ORIGPTR_3, uc);
- s->origPtr = (s->origPtr << 8) | ((Int32)uc);
-
- if (s->origPtr < 0)
- RETURN(BZ_DATA_ERROR);
- if (s->origPtr > 10 + 100000*s->blockSize100k)
- RETURN(BZ_DATA_ERROR);
-
- /*--- Receive the mapping table ---*/
- for (i = 0; i < 16; i++) {
- GET_BIT(BZ_X_MAPPING_1, uc);
- if (uc == 1)
- s->inUse16[i] = True; else
- s->inUse16[i] = False;
- }
-
- for (i = 0; i < 256; i++) s->inUse[i] = False;
-
- for (i = 0; i < 16; i++)
- if (s->inUse16[i])
- for (j = 0; j < 16; j++) {
- GET_BIT(BZ_X_MAPPING_2, uc);
- if (uc == 1) s->inUse[i * 16 + j] = True;
- }
- makeMaps_d ( s );
- if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
- alphaSize = s->nInUse+2;
-
- /*--- Now the selectors ---*/
- GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
- if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
- GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
- if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
- for (i = 0; i < nSelectors; i++) {
- j = 0;
- while (True) {
- GET_BIT(BZ_X_SELECTOR_3, uc);
- if (uc == 0) break;
- j++;
- if (j >= nGroups) RETURN(BZ_DATA_ERROR);
- }
- s->selectorMtf[i] = j;
- }
-
- /*--- Undo the MTF values for the selectors. ---*/
- {
- UChar pos[BZ_N_GROUPS], tmp, v;
- for (v = 0; v < nGroups; v++) pos[v] = v;
-
- for (i = 0; i < nSelectors; i++) {
- v = s->selectorMtf[i];
- tmp = pos[v];
- while (v > 0) { pos[v] = pos[v-1]; v--; }
- pos[0] = tmp;
- s->selector[i] = tmp;
- }
- }
-
- /*--- Now the coding tables ---*/
- for (t = 0; t < nGroups; t++) {
- GET_BITS(BZ_X_CODING_1, curr, 5);
- for (i = 0; i < alphaSize; i++) {
- while (True) {
- if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
- GET_BIT(BZ_X_CODING_2, uc);
- if (uc == 0) break;
- GET_BIT(BZ_X_CODING_3, uc);
- if (uc == 0) curr++; else curr--;
- }
- s->len[t][i] = curr;
- }
- }
-
- /*--- Create the Huffman decoding tables ---*/
- for (t = 0; t < nGroups; t++) {
- minLen = 32;
- maxLen = 0;
- for (i = 0; i < alphaSize; i++) {
- if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
- if (s->len[t][i] < minLen) minLen = s->len[t][i];
- }
- BZ2_hbCreateDecodeTables (
- &(s->limit[t][0]),
- &(s->base[t][0]),
- &(s->perm[t][0]),
- &(s->len[t][0]),
- minLen, maxLen, alphaSize
- );
- s->minLens[t] = minLen;
- }
-
- /*--- Now the MTF values ---*/
-
- EOB = s->nInUse+1;
- nblockMAX = 100000 * s->blockSize100k;
- groupNo = -1;
- groupPos = 0;
-
- for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
-
- /*-- MTF init --*/
- {
- Int32 ii, jj, kk;
- kk = MTFA_SIZE-1;
- for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
- for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
- s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
- kk--;
- }
- s->mtfbase[ii] = kk + 1;
- }
- }
- /*-- end MTF init --*/
-
- nblock = 0;
- GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
-
- while (True) {
-
- if (nextSym == EOB) break;
-
- if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
-
- es = -1;
- N = 1;
- do {
- if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
- if (nextSym == BZ_RUNB) es = es + (1+1) * N;
- N = N * 2;
- GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
- }
- while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
-
- es++;
- uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
- s->unzftab[uc] += es;
-
- if (s->smallDecompress)
- while (es > 0) {
- if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
- s->ll16[nblock] = (UInt16)uc;
- nblock++;
- es--;
- }
- else
- while (es > 0) {
- if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
- s->tt[nblock] = (UInt32)uc;
- nblock++;
- es--;
- };
-
- continue;
-
- } else {
-
- if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
-
- /*-- uc = MTF ( nextSym-1 ) --*/
- {
- Int32 ii, jj, kk, pp, lno, off;
- UInt32 nn;
- nn = (UInt32)(nextSym - 1);
-
- if (nn < MTFL_SIZE) {
- /* avoid general-case expense */
- pp = s->mtfbase[0];
- uc = s->mtfa[pp+nn];
- while (nn > 3) {
- Int32 z = pp+nn;
- s->mtfa[(z) ] = s->mtfa[(z)-1];
- s->mtfa[(z)-1] = s->mtfa[(z)-2];
- s->mtfa[(z)-2] = s->mtfa[(z)-3];
- s->mtfa[(z)-3] = s->mtfa[(z)-4];
- nn -= 4;
- }
- while (nn > 0) {
- s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--;
- };
- s->mtfa[pp] = uc;
- } else {
- /* general case */
- lno = nn / MTFL_SIZE;
- off = nn % MTFL_SIZE;
- pp = s->mtfbase[lno] + off;
- uc = s->mtfa[pp];
- while (pp > s->mtfbase[lno]) {
- s->mtfa[pp] = s->mtfa[pp-1]; pp--;
- };
- s->mtfbase[lno]++;
- while (lno > 0) {
- s->mtfbase[lno]--;
- s->mtfa[s->mtfbase[lno]]
- = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
- lno--;
- }
- s->mtfbase[0]--;
- s->mtfa[s->mtfbase[0]] = uc;
- if (s->mtfbase[0] == 0) {
- kk = MTFA_SIZE-1;
- for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
- for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
- s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
- kk--;
- }
- s->mtfbase[ii] = kk + 1;
- }
- }
- }
- }
- /*-- end uc = MTF ( nextSym-1 ) --*/
-
- s->unzftab[s->seqToUnseq[uc]]++;
- if (s->smallDecompress)
- s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
- s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]);
- nblock++;
-
- GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
- continue;
- }
- }
-
- /* Now we know what nblock is, we can do a better sanity
- check on s->origPtr.
- */
- if (s->origPtr < 0 || s->origPtr >= nblock)
- RETURN(BZ_DATA_ERROR);
-
- s->state_out_len = 0;
- s->state_out_ch = 0;
- BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
- s->state = BZ_X_OUTPUT;
- if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
-
- /*-- Set up cftab to facilitate generation of T^(-1) --*/
- s->cftab[0] = 0;
- for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
- for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
-
- if (s->smallDecompress) {
-
- /*-- Make a copy of cftab, used in generation of T --*/
- for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
-
- /*-- compute the T vector --*/
- for (i = 0; i < nblock; i++) {
- uc = (UChar)(s->ll16[i]);
- SET_LL(i, s->cftabCopy[uc]);
- s->cftabCopy[uc]++;
- }
-
- /*-- Compute T^(-1) by pointer reversal on T --*/
- i = s->origPtr;
- j = GET_LL(i);
- do {
- Int32 tmp = GET_LL(j);
- SET_LL(j, i);
- i = j;
- j = tmp;
- }
- while (i != s->origPtr);
-
- s->tPos = s->origPtr;
- s->nblock_used = 0;
- if (s->blockRandomised) {
- BZ_RAND_INIT_MASK;
- BZ_GET_SMALL(s->k0); s->nblock_used++;
- BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
- } else {
- BZ_GET_SMALL(s->k0); s->nblock_used++;
- }
-
- } else {
-
- /*-- compute the T^(-1) vector --*/
- for (i = 0; i < nblock; i++) {
- uc = (UChar)(s->tt[i] & 0xff);
- s->tt[s->cftab[uc]] |= (i << 8);
- s->cftab[uc]++;
- }
-
- s->tPos = s->tt[s->origPtr] >> 8;
- s->nblock_used = 0;
- if (s->blockRandomised) {
- BZ_RAND_INIT_MASK;
- BZ_GET_FAST(s->k0); s->nblock_used++;
- BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
- } else {
- BZ_GET_FAST(s->k0); s->nblock_used++;
- }
-
- }
-
- RETURN(BZ_OK);
-
-
-
- endhdr_2:
-
- GET_UCHAR(BZ_X_ENDHDR_2, uc);
- if (uc != 0x72) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_ENDHDR_3, uc);
- if (uc != 0x45) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_ENDHDR_4, uc);
- if (uc != 0x38) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_ENDHDR_5, uc);
- if (uc != 0x50) RETURN(BZ_DATA_ERROR);
- GET_UCHAR(BZ_X_ENDHDR_6, uc);
- if (uc != 0x90) RETURN(BZ_DATA_ERROR);
-
- s->storedCombinedCRC = 0;
- GET_UCHAR(BZ_X_CCRC_1, uc);
- s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
- GET_UCHAR(BZ_X_CCRC_2, uc);
- s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
- GET_UCHAR(BZ_X_CCRC_3, uc);
- s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
- GET_UCHAR(BZ_X_CCRC_4, uc);
- s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
-
- s->state = BZ_X_IDLE;
- RETURN(BZ_STREAM_END);
-
- default: AssertH ( False, 4001 );
- }
-
- AssertH ( False, 4002 );
-
- save_state_and_return:
-
- s->save_i = i;
- s->save_j = j;
- s->save_t = t;
- s->save_alphaSize = alphaSize;
- s->save_nGroups = nGroups;
- s->save_nSelectors = nSelectors;
- s->save_EOB = EOB;
- s->save_groupNo = groupNo;
- s->save_groupPos = groupPos;
- s->save_nextSym = nextSym;
- s->save_nblockMAX = nblockMAX;
- s->save_nblock = nblock;
- s->save_es = es;
- s->save_N = N;
- s->save_curr = curr;
- s->save_zt = zt;
- s->save_zn = zn;
- s->save_zvec = zvec;
- s->save_zj = zj;
- s->save_gSel = gSel;
- s->save_gMinlen = gMinlen;
- s->save_gLimit = gLimit;
- s->save_gBase = gBase;
- s->save_gPerm = gPerm;
-
- return retVal;
-}
-
-
-/*-------------------------------------------------------------*/
-/*--- end decompress.c ---*/
-/*-------------------------------------------------------------*/
diff --git a/mdk-stage1/bzlib/huffman.c b/mdk-stage1/bzlib/huffman.c
deleted file mode 100644
index 8994f0bb9..000000000
--- a/mdk-stage1/bzlib/huffman.c
+++ /dev/null
@@ -1,232 +0,0 @@
-
-/*-------------------------------------------------------------*/
-/*--- Huffman coding low-level stuff ---*/
-/*--- huffman.c ---*/
-/*-------------------------------------------------------------*/
-
-/*--
- This file is a part of bzip2 and/or libbzip2, a program and
- library for lossless, block-sorting data compression.
-
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
-
- 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. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
- 3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
- 4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-
- Julian Seward, Cambridge, UK.
- jseward@acm.org
- bzip2/libbzip2 version 1.0 of 21 March 2000
-
- This program is based on (at least) the work of:
- Mike Burrows
- David Wheeler
- Peter Fenwick
- Alistair Moffat
- Radford Neal
- Ian H. Witten
- Robert Sedgewick
- Jon L. Bentley
-
- For more information on these sources, see the manual.
---*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "bzlib_private.h"
-
-/*---------------------------------------------------*/
-#define WEIGHTOF(zz0) ((zz0) & 0xffffff00)
-#define DEPTHOF(zz1) ((zz1) & 0x000000ff)
-#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3))
-
-#define ADDWEIGHTS(zw1,zw2) \
- (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \
- (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2)))
-
-#define UPHEAP(z) \
-{ \
- Int32 zz, tmp; \
- zz = z; tmp = heap[zz]; \
- while (weight[tmp] < weight[heap[zz >> 1]]) { \
- heap[zz] = heap[zz >> 1]; \
- zz >>= 1; \
- } \
- heap[zz] = tmp; \
-}
-
-#define DOWNHEAP(z) \
-{ \
- Int32 zz, yy, tmp; \
- zz = z; tmp = heap[zz]; \
- while (True) { \
- yy = zz << 1; \
- if (yy > nHeap) break; \
- if (yy < nHeap && \
- weight[heap[yy+1]] < weight[heap[yy]]) \
- yy++; \
- if (weight[tmp] < weight[heap[yy]]) break; \
- heap[zz] = heap[yy]; \
- zz = yy; \
- } \
- heap[zz] = tmp; \
-}
-
-
-/*---------------------------------------------------*/
-void BZ2_hbMakeCodeLengths ( UChar *len,
- Int32 *freq,
- Int32 alphaSize,
- Int32 maxLen )
-{
- /*--
- Nodes and heap entries run from 1. Entry 0
- for both the heap and nodes is a sentinel.
- --*/
- Int32 nNodes, nHeap, n1, n2, i, j, k;
- Bool tooLong;
-
- Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ];
- Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
- Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ];
-
- for (i = 0; i < alphaSize; i++)
- weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
-
- while (True) {
-
- nNodes = alphaSize;
- nHeap = 0;
-
- heap[0] = 0;
- weight[0] = 0;
- parent[0] = -2;
-
- for (i = 1; i <= alphaSize; i++) {
- parent[i] = -1;
- nHeap++;
- heap[nHeap] = i;
- UPHEAP(nHeap);
- }
-
- AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
-
- while (nHeap > 1) {
- n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
- n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
- nNodes++;
- parent[n1] = parent[n2] = nNodes;
- weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);
- parent[nNodes] = -1;
- nHeap++;
- heap[nHeap] = nNodes;
- UPHEAP(nHeap);
- }
-
- AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 );
-
- tooLong = False;
- for (i = 1; i <= alphaSize; i++) {
- j = 0;
- k = i;
- while (parent[k] >= 0) { k = parent[k]; j++; }
- len[i-1] = j;
- if (j > maxLen) tooLong = True;
- }
-
- if (! tooLong) break;
-
- for (i = 1; i < alphaSize; i++) {
- j = weight[i] >> 8;
- j = 1 + (j / 2);
- weight[i] = j << 8;
- }
- }
-}
-
-
-/*---------------------------------------------------*/
-void BZ2_hbAssignCodes ( Int32 *code,
- UChar *length,
- Int32 minLen,
- Int32 maxLen,
- Int32 alphaSize )
-{
- Int32 n, vec, i;
-
- vec = 0;
- for (n = minLen; n <= maxLen; n++) {
- for (i = 0; i < alphaSize; i++)
- if (length[i] == n) { code[i] = vec; vec++; };
- vec <<= 1;
- }
-}
-
-
-/*---------------------------------------------------*/
-void BZ2_hbCreateDecodeTables ( Int32 *limit,
- Int32 *base,
- Int32 *perm,
- UChar *length,
- Int32 minLen,
- Int32 maxLen,
- Int32 alphaSize )
-{
- Int32 pp, i, j, vec;
-
- pp = 0;
- for (i = minLen; i <= maxLen; i++)
- for (j = 0; j < alphaSize; j++)
- if (length[j] == i) { perm[pp] = j; pp++; };
-
- for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0;
- for (i = 0; i < alphaSize; i++) base[length[i]+1]++;
-
- for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1];
-
- for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0;
- vec = 0;
-
- for (i = minLen; i <= maxLen; i++) {
- vec += (base[i+1] - base[i]);
- limit[i] = vec-1;
- vec <<= 1;
- }
- for (i = minLen + 1; i <= maxLen; i++)
- base[i] = ((limit[i-1] + 1) << 1) - base[i];
-}
-
-
-/*-------------------------------------------------------------*/
-/*--- end huffman.c ---*/
-/*-------------------------------------------------------------*/
diff --git a/mdk-stage1/bzlib/randtable.c b/mdk-stage1/bzlib/randtable.c
deleted file mode 100644
index a1fc82cfb..000000000
--- a/mdk-stage1/bzlib/randtable.c
+++ /dev/null
@@ -1,128 +0,0 @@
-
-/*-------------------------------------------------------------*/
-/*--- Table for randomising repetitive blocks ---*/
-/*--- randtable.c ---*/
-/*-------------------------------------------------------------*/
-
-/*--
- This file is a part of bzip2 and/or libbzip2, a program and
- library for lossless, block-sorting data compression.
-
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
-
- 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. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
- 3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
- 4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-
- Julian Seward, Cambridge, UK.
- jseward@acm.org
- bzip2/libbzip2 version 1.0 of 21 March 2000
-
- This program is based on (at least) the work of:
- Mike Burrows
- David Wheeler
- Peter Fenwick
- Alistair Moffat
- Radford Neal
- Ian H. Witten
- Robert Sedgewick
- Jon L. Bentley
-
- For more information on these sources, see the manual.
---*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "bzlib_private.h"
-
-
-/*---------------------------------------------*/
-Int32 BZ2_rNums[512] = {
- 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
- 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
- 733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
- 419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
- 878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
- 862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
- 150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
- 170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
- 73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
- 909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
- 641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
- 161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
- 382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
- 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
- 227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
- 469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
- 184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
- 715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
- 951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
- 652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
- 645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
- 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
- 653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
- 411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
- 170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
- 857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
- 669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
- 944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
- 344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
- 897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
- 433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
- 686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
- 946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
- 978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
- 680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
- 707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
- 297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
- 134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
- 343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
- 140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
- 170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
- 369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
- 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
- 896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
- 661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
- 768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
- 61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
- 372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
- 780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
- 920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
- 645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
- 936, 638
-};
-
-
-/*-------------------------------------------------------------*/
-/*--- end randtable.c ---*/
-/*-------------------------------------------------------------*/
diff --git a/mdk-stage1/cdrom.c b/mdk-stage1/cdrom.c
index f05bc0341..71db1da16 100644
--- a/mdk-stage1/cdrom.c
+++ b/mdk-stage1/cdrom.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -30,6 +30,8 @@
#include "probing.h"
#include "log.h"
#include "mount.h"
+#include "tools.h"
+#include "utils.h"
#include "cdrom.h"
@@ -37,17 +39,15 @@
static int mount_that_cd_device(char * dev_name)
{
char device_fullname[50];
+ int mount_result;
- strcpy(device_fullname, "/dev/");
- strcat(device_fullname, dev_name);
+ snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev_name);
- return my_mount(device_fullname, IMAGE_LOCATION, "iso9660");
-}
+ mount_result = my_mount(device_fullname, MEDIA_LOCATION, "iso9660", 0);
+ create_IMAGE_LOCATION(MEDIA_LOCATION);
-static int test_that_cd()
-{
- return access(IMAGE_LOCATION LIVE_LOCATION, R_OK);
+ return mount_result;
}
@@ -55,9 +55,9 @@ static enum return_type try_with_device(char * dev_name, char * dev_model);
static enum return_type do_with_device(char * dev_name, char * dev_model)
{
- if (test_that_cd()) {
+ if (!image_has_stage2()) {
enum return_type results;
- umount(IMAGE_LOCATION);
+ umount(MEDIA_LOCATION);
results = ask_yes_no("That CDROM disc does not seem to be a " DISTRIB_NAME " Installation CDROM.\nRetry with another disc?");
if (results == RETURN_OK)
return try_with_device(dev_name, dev_model);
@@ -66,13 +66,13 @@ static enum return_type do_with_device(char * dev_name, char * dev_model)
log_message("found a " DISTRIB_NAME " CDROM, good news!");
- if (IS_SPECIAL_STAGE2 || ramdisk_possible())
- load_ramdisk(); /* we don't care about return code, we'll do it live if we failed */
+ may_load_compressed_image();
- if (IS_RESCUE)
- umount(IMAGE_LOCATION);
+ if (!KEEP_MOUNTED)
+ /* in rescue mode, we don't need the media anymore */
+ umount(MEDIA_LOCATION);
- method_name = strdup("cdrom");
+ add_to_env("METHOD", "cdrom");
return RETURN_OK;
}
@@ -83,7 +83,7 @@ static enum return_type try_with_device(char * dev_name, char * dev_model)
if (mount_that_cd_device(dev_name) == -1) {
enum return_type results;
char msg[500];
- unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */
+ unset_automatic(); /* we are in a fallback mode */
remove_wait_message();
snprintf(msg, sizeof(msg), "I can't access a " DISTRIB_NAME " Installation disc in your CDROM drive (%s).\nRetry?", dev_model);
@@ -97,27 +97,94 @@ static enum return_type try_with_device(char * dev_name, char * dev_model)
return do_with_device(dev_name, dev_model);
}
+int try_automatic(char ** medias, char ** medias_models)
+{
+ static char * already_tried[50] = { NULL };
+ char ** model = medias_models;
+ char ** ptr = medias;
+ int i = 0;
+ while (ptr && *ptr) {
+ char ** p;
+ for (p = already_tried; p && *p; p++)
+ if (streq(*p, *ptr))
+ goto try_automatic_already_tried;
+ *p = strdup(*ptr);
+ *(p+1) = NULL;
+
+ wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model);
+ if (mount_that_cd_device(*ptr) != -1) {
+ if (image_has_stage2()) {
+ remove_wait_message();
+ return i;
+ }
+ else
+ umount(MEDIA_LOCATION);
+ }
+ remove_wait_message();
+
+ try_automatic_already_tried:
+ ptr++;
+ model++;
+ i++;
+ }
+ return -1;
+}
+
enum return_type cdrom_prepare(void)
{
char ** medias, ** ptr, ** medias_models;
char * choice;
int i, count = 0;
enum return_type results;
+ static int already_probed_ide_generic = 0;
- my_insmod("ide-cd", ANY_DRIVER_TYPE, NULL);
- my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL);
-
- get_medias(CDROM, &medias, &medias_models);
+ my_modprobe("ide_cd_mod", ANY_DRIVER_TYPE, NULL);
- ptr = medias;
- while (ptr && *ptr) {
- count++;
- ptr++;
- }
+ if (IS_AUTOMATIC) {
+ get_medias(CDROM, &medias, &medias_models, BUS_IDE);
+ if ((i = try_automatic(medias, medias_models)) != -1)
+ return do_with_device(medias[i], medias_models[i]);
+
+ get_medias(CDROM, &medias, &medias_models, BUS_PCMCIA);
+ if ((i = try_automatic(medias, medias_models)) != -1)
+ return do_with_device(medias[i], medias_models[i]);
+
+ my_modprobe("sr_mod", ANY_DRIVER_TYPE, NULL);
+ get_medias(CDROM, &medias, &medias_models, BUS_SCSI);
+ if ((i = try_automatic(medias, medias_models)) != -1)
+ return do_with_device(medias[i], medias_models[i]);
+
+ get_medias(CDROM, &medias, &medias_models, BUS_USB);
+ if ((i = try_automatic(medias, medias_models)) != -1)
+ return do_with_device(medias[i], medias_models[i]);
+
+ /* detect hybrid isos (isos dumped to an USB stick) */
+ my_modprobe("sd_mod", ANY_DRIVER_TYPE, NULL);
+ get_medias(DISK, &medias, &medias_models, BUS_USB);
+ if ((i = try_automatic(medias, medias_models)) != -1) {
+ return do_with_device(medias[i], medias_models[i]);
+ }
+
+ unset_automatic();
+ } else
+ my_modprobe("sr_mod", ANY_DRIVER_TYPE, NULL);
+
+
+ get_medias(CDROM, &medias, &medias_models, BUS_ANY);
+ ptr = medias;
+ while (ptr && *ptr) {
+ count++;
+ ptr++;
+ }
if (count == 0) {
- error_message("No CDROM device found.");
- i = ask_insmod(SCSI_ADAPTERS);
+ if (!already_probed_ide_generic) {
+ already_probed_ide_generic = 1;
+ my_modprobe("ide_generic", ANY_DRIVER_TYPE, NULL);
+ return cdrom_prepare();
+ }
+ stg1_error_message("No CDROM device found.");
+ i = ask_insmod(MEDIA_ADAPTERS);
if (i == RETURN_BACK)
return RETURN_BACK;
return cdrom_prepare();
@@ -127,54 +194,32 @@ enum return_type cdrom_prepare(void)
results = try_with_device(*medias, *medias_models);
if (results == RETURN_OK)
return RETURN_OK;
- i = ask_insmod(SCSI_ADAPTERS);
+ i = ask_insmod(MEDIA_ADAPTERS);
if (i == RETURN_BACK)
return RETURN_BACK;
return cdrom_prepare();
}
- if (IS_AUTOMATIC) {
+ results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice);
+ if (results == RETURN_OK) {
char ** model = medias_models;
ptr = medias;
- while (ptr && *ptr) {
- wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model);
- if (mount_that_cd_device(*ptr) != -1) {
- if (!test_that_cd()) {
- remove_wait_message();
- return do_with_device(*ptr, *model);
- }
- else
- umount(IMAGE_LOCATION);
- }
- remove_wait_message();
+ while (ptr && *ptr && model && *model) {
+ if (!strcmp(*ptr, choice))
+ break;
ptr++;
model++;
}
- unset_param(MODE_AUTOMATIC);
- return cdrom_prepare();
- }
- else {
- results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice);
- if (results == RETURN_OK) {
- char ** model = medias_models;
- ptr = medias;
- while (ptr && *ptr && model && *model) {
- if (!strcmp(*ptr, choice))
- break;
- ptr++;
- model++;
- }
results = try_with_device(choice, *model);
- } else
- return results;
- }
+ } else
+ return results;
if (results == RETURN_OK)
return RETURN_OK;
if (results == RETURN_BACK)
return cdrom_prepare();
- i = ask_insmod(SCSI_ADAPTERS);
+ i = ask_insmod(MEDIA_ADAPTERS);
if (i == RETURN_BACK)
return RETURN_BACK;
return cdrom_prepare();
diff --git a/mdk-stage1/cdrom.h b/mdk-stage1/cdrom.h
index 639487eed..7d182b257 100644
--- a/mdk-stage1/cdrom.h
+++ b/mdk-stage1/cdrom.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
diff --git a/mdk-stage1/config-stage1.h b/mdk-stage1/config-stage1.h
index 4bfa3896a..e3409df98 100644
--- a/mdk-stage1/config-stage1.h
+++ b/mdk-stage1/config-stage1.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -15,20 +15,52 @@
#ifndef _CONFIG_STAGE1_H_
#define _CONFIG_STAGE1_H_
+#ifdef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
#define _GNU_SOURCE 1
/* If we have more than that amount of memory (in Mbytes), we assume we can load the second stage as a ramdisk */
-#define MEM_LIMIT_RAMDISK 52
+#define MEM_LIMIT_DRAKX 192
+/* If we have more than that amount of memory (in Mbytes), we preload the second stage as a ramdisk */
+#define MEM_LIMIT_DRAKX_PRELOAD 256
+
+/* If we have more than that amount of memory (in Mbytes), we assume we can load the rescue as a ramdisk */
+#define MEM_LIMIT_RESCUE 40
+/* If we have more than that amount of memory (in Mbytes), we preload the rescue as a ramdisk */
+#define MEM_LIMIT_RESCUE_PRELOAD 100
+
+#define KA_MAX_RETRY 5
-#define DISTRIB_NAME "Linux-Mandrake"
+#define LIVE_LOCATION_REL "install/stage2/live/"
+#define COMPRESSED_LOCATION_REL "install/stage2/"
+#define COMPRESSED_STAGE2_NAME "mdkinst.sqfs"
+#define COMPRESSED_RESCUE_NAME "rescue.sqfs"
+#define COMPRESSED_NAME(prefix) (IS_RESCUE ? prefix COMPRESSED_RESCUE_NAME : prefix COMPRESSED_STAGE2_NAME)
+#define COMPRESSED_FILE_REL(prefix) COMPRESSED_NAME(prefix COMPRESSED_LOCATION_REL)
+
+/* the remote media is mounted in MEDIA_LOCATION, and
+ - IMAGE_LOCATION is a symlink image -> image/mdk/mirror/dir
+ - IMAGE_LOCATION is a symlink image -> loop/i686 and iso file is loopback mounted in LOOP_LOCATION
+ */
+#define MEDIA_LOCATION_REL "media"
+#define MEDIA_LOCATION IMAGE_LOCATION_DIR MEDIA_LOCATION_REL
-#define RAMDISK_COMPRESSION_RATIO 1.9
+#define LOOP_LOCATION_REL "loop"
+#define LOOP_LOCATION IMAGE_LOCATION_DIR LOOP_LOCATION_REL
+
+#define IMAGE_LOCATION_REL "image"
+#define IMAGE_LOCATION_DIR "/tmp/"
+#define IMAGE_LOCATION IMAGE_LOCATION_DIR IMAGE_LOCATION_REL
+
+#define COMPRESSED_LOCATION IMAGE_LOCATION "/" COMPRESSED_LOCATION_REL
+
+/* - if we use a compressed image : STAGE2_LOCATION is a the mount point
+ - if we use the live: STAGE2_LOCATION is a relative symlink to image/install/stage2/live
+*/
+#define STAGE2_LOCATION "/tmp/stage2"
-#define LIVE_LOCATION "/Mandrake/mdkinst/"
-#define RAMDISK_LOCATION "/Mandrake/base/"
-#define IMAGE_LOCATION "/tmp/image"
-#define STAGE2_LOCATION "/tmp/stage2"
/* user-definable (in Makefile): DISABLE_NETWORK, DISABLE_DISK, DISABLE_CDROM, DISABLE_PCMCIA */
@@ -41,5 +73,10 @@
#endif
#endif
+/* path to mirror list for net install */
+#ifndef DISABLE_NETWORK
+#define MIRRORLIST_HOST "mirrors.mageia.org"
+#define MIRRORLIST_PATH "/api"
+#endif
#endif
diff --git a/mdk-stage1/dhcp.c b/mdk-stage1/dhcp.c
index e2013994a..678031e85 100644
--- a/mdk-stage1/dhcp.c
+++ b/mdk-stage1/dhcp.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -27,6 +27,7 @@
#include <stdlib.h>
#include <unistd.h>
+#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
@@ -40,18 +41,19 @@
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
+#include <sys/poll.h>
#include "stage1.h"
#include "log.h"
+#include "tools.h"
+#include "utils.h"
#include "network.h"
#include "frontend.h"
+#include "automatic.h"
#include "dhcp.h"
-#define NUM_RETRIES 5
-
-
typedef int bp_int32;
typedef short bp_int16;
@@ -69,6 +71,8 @@ typedef short bp_int16;
#define DHCP_OPTION_OPTIONREQ 55
#define DHCP_OPTION_MAXSIZE 57
+#define DHCP_OPTION_CLIENT_IDENTIFIER 61
+
#define BOOTP_CLIENT_PORT 68
#define BOOTP_SERVER_PORT 67
@@ -176,6 +180,13 @@ static int initial_setup_interface(char * device, int s) {
return -1;
}
+ /* I need to sleep a bit in order for kernel to finish init of the
+ network device; this would allow to not send further multiple
+ dhcp requests when only one is needed. */
+ wait_message("Bringing up networking...");
+ sleep(2);
+ remove_wait_message();
+
return 0;
}
@@ -202,9 +213,16 @@ static void parse_reply(struct bootp_request * breq, struct interface_info * int
unsigned char * chptr;
unsigned char option, length;
+ if (strlen(breq->bootfile) > 0) {
+ if (IS_NETAUTO)
+ add_to_env("KICKSTART", breq->bootfile);
+ else
+ log_message("warning: ignoring `bootfile' DHCP server parameter, since `netauto' boot parameter was not given; reboot with `linux netauto' (and anymore useful boot parameters) if you want `bootfile' to be used as a `auto_inst.cfg.pl' stage2 configuration file");
+ }
+
memcpy(&intf->ip, &breq->yiaddr, 4);
- chptr = breq->vendor;
+ chptr = (unsigned char *) breq->vendor;
chptr += 4;
while (*chptr != 0xFF && (void *) chptr < (void *) breq->vendor + DHCP_VENDOR_LENGTH) {
char tmp_str[500];
@@ -216,33 +234,33 @@ static void parse_reply(struct bootp_request * breq, struct interface_info * int
switch (option) {
case BOOTP_OPTION_DNS:
memcpy(&dns_server, chptr, sizeof(dns_server));
- if (length >= sizeof(dns_server)*2)
+ log_message("got dns %s", inet_ntoa(dns_server));
+ if (length >= sizeof(dns_server)*2) {
memcpy(&dns_server2, chptr+sizeof(dns_server), sizeof(dns_server2));
+ log_message("got dns2 %s", inet_ntoa(dns_server2));
+ }
break;
case BOOTP_OPTION_NETMASK:
- memcpy(&intf->netmask, chptr, 4);
+ memcpy(&intf->netmask, chptr, sizeof(intf->netmask));
+ log_message("got netmask %s", inet_ntoa(intf->netmask));
break;
case BOOTP_OPTION_DOMAIN:
memcpy(tmp_str, chptr, length);
tmp_str[length] = '\0';
domain = strdup(tmp_str);
+ log_message("got domain %s", domain);
break;
case BOOTP_OPTION_BROADCAST:
- memcpy(&intf->broadcast, chptr, 4);
+ memcpy(&intf->broadcast, chptr, sizeof(intf->broadcast));
+ log_message("got broadcast %s", inet_ntoa(intf->broadcast));
break;
case BOOTP_OPTION_GATEWAY:
- memcpy(&gateway, chptr, 4);
- break;
-
- case BOOTP_OPTION_HOSTNAME:
- memcpy(tmp_str, chptr, length);
- tmp_str[length] = '\0';
- hostname = strdup(tmp_str);
- log_message("DHCP: got hostname %s", hostname);
+ memcpy(&gateway, chptr, sizeof(gateway));
+ log_message("got gateway %s", inet_ntoa(gateway));
break;
}
@@ -260,7 +278,7 @@ static void init_vendor_codes(struct bootp_request * breq) {
static char gen_hwaddr[16];
-static int prepare_request(struct bootp_request * breq, int sock, char * device, time_t startTime)
+static int prepare_request(struct bootp_request * breq, int sock, char * device)
{
struct ifreq req;
@@ -274,7 +292,7 @@ static int prepare_request(struct bootp_request * breq, int sock, char * device,
return -1;
}
- breq->hw = 1; /* ethernet */
+ breq->hw = req.ifr_hwaddr.sa_family;
breq->hwlength = IFHWADDRLEN;
memcpy(breq->hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN);
memcpy(gen_hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN);
@@ -291,7 +309,7 @@ static int get_vendor_code(struct bootp_request * bresp, unsigned char option, v
unsigned char * chptr;
unsigned int length, theOption;
- chptr = bresp->vendor + 4;
+ chptr = (unsigned char*) bresp->vendor + 4;
while (*chptr != 0xFF && *chptr != option) {
theOption = *chptr++;
if (!theOption)
@@ -310,12 +328,11 @@ static int get_vendor_code(struct bootp_request * bresp, unsigned char option, v
}
-int
-currticks (void)
+static unsigned long currticks(void)
{
struct timeval tv;
- long csecs;
- int ticks_per_csec, ticks_per_usec;
+ unsigned long csecs;
+ unsigned long ticks_per_csec, ticks_per_usec;
/* Note: 18.2 ticks/sec. */
@@ -329,10 +346,9 @@ currticks (void)
#define BACKOFF_LIMIT 7
#define TICKS_PER_SEC 18
-#define MAX_ARP_RETRIES 4
+#define MAX_ARP_RETRIES 7
-void
-rfc951_sleep (int exp)
+static void rfc951_sleep(int exp)
{
static long seed = 0;
long q;
@@ -365,8 +381,7 @@ rfc951_sleep (int exp)
static int handle_transaction(int s, struct bootp_request * breq, struct bootp_request * bresp,
struct sockaddr_in * server_addr, int dhcp_type)
{
- struct timeval tv;
- fd_set readfs;
+ struct pollfd polls;
int i, j;
int retry = 1;
int sin;
@@ -395,12 +410,10 @@ static int handle_transaction(int s, struct bootp_request * breq, struct bootp_r
return -1;
}
- FD_ZERO(&readfs);
- FD_SET(sin, &readfs);
- tv.tv_usec = 0;
- tv.tv_sec = timeout;
+ polls.fd = sin;
+ polls.events = POLLIN;
- while (select(sin + 1, &readfs, NULL, NULL, &tv) == 1) {
+ while (poll(&polls, 1, timeout*1000) == 1) {
if ((j = recv(sin, eth_packet, sizeof(eth_packet), 0)) == -1) {
log_perror("recv");
@@ -408,7 +421,7 @@ static int handle_transaction(int s, struct bootp_request * breq, struct bootp_r
}
/* We need to do some basic sanity checking of the header */
- if (j < (sizeof(*ip_hdr) + sizeof(*udp_hdr)))
+ if (j < (signed)(sizeof(*ip_hdr) + sizeof(*udp_hdr)))
continue;
ip_hdr = (void *) eth_packet;
@@ -464,7 +477,6 @@ static int handle_transaction(int s, struct bootp_request * breq, struct bootp_r
timeout = 5;
}
- error_message("No DHCP reply received.");
return -1;
}
@@ -473,7 +485,7 @@ static void add_vendor_code(struct bootp_request * breq, unsigned char option, u
unsigned char * chptr;
int theOption, theLength;
- chptr = breq->vendor;
+ chptr = (unsigned char*) breq->vendor;
chptr += 4;
while (*chptr != 0xFF && *chptr != option) {
theOption = *chptr++;
@@ -489,6 +501,8 @@ static void add_vendor_code(struct bootp_request * breq, unsigned char option, u
}
+char * dhcp_hostname = NULL;
+char * dhcp_domain = NULL;
enum return_type perform_dhcp(struct interface_info * intf)
{
@@ -499,15 +513,10 @@ enum return_type perform_dhcp(struct interface_info * intf)
struct bootp_request breq, bresp;
unsigned char messageType;
unsigned int lease;
- time_t startTime = time(NULL);
short aShort;
int num_options;
char requested_options[50];
-
- if (strncmp(intf->device, "eth", 3)) {
- error_message("DHCP available only for Ethernet networking.");
- return RETURN_ERROR;
- }
+ char * client_id_str, * client_id_hwaddr;
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s < 0) {
@@ -515,12 +524,41 @@ enum return_type perform_dhcp(struct interface_info * intf)
return RETURN_ERROR;
}
+ {
+ enum return_type results;
+ char * questions[] = { "Host name", "Domain name", NULL };
+ char * questions_auto[] = { "hostname", "domain" };
+ static char ** answers = NULL;
+ char * boulet;
+
+ client_id_str = client_id_hwaddr = NULL;
+
+ results = ask_from_entries_auto("If the DHCP server needs to know you by name; please fill in this information. "
+ "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for "
+ "domain name, for a machine called `mybox.mynetwork.com' on the Internet.",
+ questions, &answers, 32, questions_auto, NULL);
+ if (results == RETURN_OK)
+ {
+ dhcp_hostname = answers[0];
+ if ((boulet = strchr(dhcp_hostname, '.')) != NULL)
+ boulet[0] = '\0';
+ dhcp_domain = answers[1];
+
+ if (*dhcp_hostname && *dhcp_domain) {
+ /* if we have both, then create client id from them */
+ client_id_str = malloc(1 + strlen(dhcp_hostname) + 1 + strlen(dhcp_domain) + 1);
+ client_id_str[0] = '\0';
+ sprintf(client_id_str+1, "%s.%s", dhcp_hostname, dhcp_domain);
+ }
+ }
+ }
+
if (initial_setup_interface(intf->device, s) != 0) {
close(s);
return RETURN_ERROR;
}
- if (prepare_request(&breq, s, intf->device, startTime) != 0) {
+ if (prepare_request(&breq, s, intf->device) != 0) {
close(s);
return RETURN_ERROR;
}
@@ -528,7 +566,28 @@ enum return_type perform_dhcp(struct interface_info * intf)
messageType = DHCP_TYPE_DISCOVER;
add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType);
- memset(&client_addr.sin_addr, 0, sizeof(&client_addr.sin_addr));
+ /* add pieces needed to have DDNS/DHCP IP selection based on requested name */
+ if (dhcp_hostname && *dhcp_hostname) { /* pick client id form based on absence or presence of domain name */
+ if (*dhcp_domain) /* alternate style <hostname>.<domainname> */
+ add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, strlen(client_id_str+1)+1, client_id_str);
+ else { /* usual style (aka windows / dhcpcd) */
+ /* but put MAC in form required for client identifier first */
+ client_id_hwaddr = malloc(IFHWADDRLEN+2);
+ /* (from pump-0.8.22/dhcp.c)
+ * Microsoft uses a client identifier field of the 802.3 address with a
+ * pre-byte of a "1". In order to re-use the DHCP address that they set
+ * for this interface, we have to mimic their identifier.
+ */
+ client_id_hwaddr[0] = 1; /* set flag for ethernet */
+ memcpy(client_id_hwaddr+1, gen_hwaddr, IFHWADDRLEN);
+ add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, IFHWADDRLEN+1, client_id_hwaddr);
+ }
+ /* this is the one that the dhcp server really wants for DDNS updates */
+ add_vendor_code(&breq, BOOTP_OPTION_HOSTNAME, strlen(dhcp_hostname), dhcp_hostname);
+ log_message("DHCP: telling server to use name = %s", dhcp_hostname);
+ }
+
+ memset(&client_addr.sin_addr, 0, sizeof(client_addr.sin_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(BOOTP_CLIENT_PORT); /* bootp client */
@@ -548,6 +607,7 @@ enum return_type perform_dhcp(struct interface_info * intf)
remove_wait_message();
if (i != 0) {
+ stg1_error_message("No DHCP reply received.");
close(s);
return RETURN_ERROR;
}
@@ -566,6 +626,16 @@ enum return_type perform_dhcp(struct interface_info * intf)
add_vendor_code(&breq, DHCP_OPTION_SERVER, 4, &server_addr.sin_addr);
add_vendor_code(&breq, DHCP_OPTION_REQADDR, 4, &bresp.yiaddr);
+ /* if used the first time, then have to use it again */
+ if (dhcp_hostname && *dhcp_hostname) { /* add pieces needed to have DDNS/DHCP IP selection based on requested name */
+ if (dhcp_domain && *dhcp_domain) /* alternate style */
+ add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, strlen(client_id_str+1)+1, client_id_str);
+ else /* usual style (aka windows / dhcpcd) */
+ add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, IFHWADDRLEN+1, client_id_hwaddr);
+ /* this is the one that the dhcp server really wants for DDNS updates */
+ add_vendor_code(&breq, BOOTP_OPTION_HOSTNAME, strlen(dhcp_hostname), dhcp_hostname);
+ }
+
aShort = ntohs(sizeof(struct bootp_request));
add_vendor_code(&breq, DHCP_OPTION_MAXSIZE, 2, &aShort);
diff --git a/mdk-stage1/dhcp.h b/mdk-stage1/dhcp.h
index 6fb121ea4..e17094adc 100644
--- a/mdk-stage1/dhcp.h
+++ b/mdk-stage1/dhcp.h
@@ -1,9 +1,9 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
- * View the homepage: http://us.mandrakesoft.com/~gc/html/stage1.html
+ * View the homepage: http://us.mandriva.com/~gc/html/stage1.html
*
*
* This software may be freely redistributed under the terms of the GNU
@@ -31,4 +31,7 @@
enum return_type perform_dhcp(struct interface_info * intf);
+extern char * dhcp_hostname;
+extern char * dhcp_domain;
+
#endif
diff --git a/mdk-stage1/dietlibc/AUTHOR b/mdk-stage1/dietlibc/AUTHOR
deleted file mode 100644
index 6d8ab1a05..000000000
--- a/mdk-stage1/dietlibc/AUTHOR
+++ /dev/null
@@ -1 +0,0 @@
-Felix von Leitner <felix-dietlibc@fefe.de>
diff --git a/mdk-stage1/dietlibc/Makefile b/mdk-stage1/dietlibc/Makefile
deleted file mode 100644
index 19fac4a82..000000000
--- a/mdk-stage1/dietlibc/Makefile
+++ /dev/null
@@ -1,79 +0,0 @@
-all: start.o dietlibc.a
-
-ARCH=$(shell uname -m | sed 's/i[4-9]86/i386/')
-
-CFLAGS=-pipe
-CROSS=
-
-VPATH=syscalls.c
-
-SYSCALLOBJ=$(patsubst syscalls.s/%.S,%.o,$(wildcard syscalls.s/*.S))
-
-LIBOBJ=$(patsubst lib/%.c,%.o,$(wildcard lib/*.c))
-
-include $(ARCH)/Makefile.add
-
-ifeq ($(CFLAGS),-pipe)
-CFLAGS+=-O -fomit-frame-pointer
-endif
-
-#CFLAGS += -g
-CFLAGS += -Wall
-
-.SUFFIXES:
-.SUFFIXES: .S .c
-
-%.o: %.S
- $(CROSS)gcc -I. -Iinclude $(CFLAGS) -c $<
-
-%.o: %.c
- $(CROSS)gcc -I. -Iinclude $(CFLAGS) -c $<
-# $(CROSS)strip -x -R .comment -R .note $@
-
-dietlibc.a: $(SYSCALLOBJ) $(LIBOBJ) __longjmp.o longjmp.o setjmp.o \
-start.o unified.o mmap.o
- $(CROSS)ar cru dietlibc.a $^
-
-libdietc.so: dietlibc.a
- $(CROSS)ld -whole-archive -shared -o $@ $^
-
-$(SYSCALLOBJ): syscalls.h
-
-djb: compile load
-
-compile:
- echo 'exec gcc $(CFLAGS) -I$(HOME)/projects/dietlibc/include -c $${1+"$$@"}' > $@
- chmod 755 $@
-
-load:
- echo 'main="$$1"; shift; exec gcc -nostdlib -o "$$main" $(HOME)/projects/dietlibc/start.o "$$main".o $${1+"$$@"} $(HOME)/projects/dietlibc/dietlibc.a -lgcc' > $@
- chmod 755 $@
-
-clean:
- rm -f *.o *.a t t1 compile load exports mapfile libdietc.so
-
-tar: clean
- cd .. && tar cvvf dietlibc.tar.bz2 dietlibc --use=bzip2
-
-exports: dietlibc.a
- nm -g dietlibc.a | grep -w T | awk '{ print $$3 }' | sort -u > exports
-
-.PHONY: t t1
-t:
- $(CROSS)gcc -g $(CFLAGS) -fno-builtin -nostdlib -Iinclude -o t t.c start.o dietlibc.a -lgcc -Wl,-Map,mapfile
-
-t1:
- $(CROSS)gcc -g -o t1 t.c
-
-install:
- cp start.o $(prefix)/lib/dietstart.o
- cp dietlibc.a $(prefix)/lib/libdietc.a
-
-.PHONY: sparc ppc mips arm alpha i386
-
-sparc ppc alpha i386:
- $(MAKE) ARCH=$@ CROSS=$@-linux- all t libdietc.so
-
-mips arm:
- $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all t libdietc.so
-
diff --git a/mdk-stage1/dietlibc/README b/mdk-stage1/dietlibc/README
deleted file mode 100644
index c17aefcc5..000000000
--- a/mdk-stage1/dietlibc/README
+++ /dev/null
@@ -1,11 +0,0 @@
-diet glibc to statically link programs that don't need all the bloat
-from glibc.
-
-malloc, printf and scanf contributed from Olaf Dreesen.
-
-Usage:
- gcc -I~/dietlibc/include -Os -pipe -c *.c
- gcc -nostdlib -o ncp ~/dietlibc/start.o *.o ~/dietlibc/dietlibc.a
-
-If you use the glibc includes, directory reading (and maybe other
-functions) will fail. You have been warned!
diff --git a/mdk-stage1/dietlibc/alpha/Makefile.add b/mdk-stage1/dietlibc/alpha/Makefile.add
deleted file mode 100644
index da3791eb6..000000000
--- a/mdk-stage1/dietlibc/alpha/Makefile.add
+++ /dev/null
@@ -1,5 +0,0 @@
-
-CFLAGS+=-Os -fno-builtin -Iinclude -fomit-frame-pointer -fstrict-aliasing
-override VPATH=alpha:syscalls.s:lib
-
-LIBOBJ+=divq.o
diff --git a/mdk-stage1/dietlibc/alpha/__longjmp.S b/mdk-stage1/dietlibc/alpha/__longjmp.S
deleted file mode 100644
index d86d76717..000000000
--- a/mdk-stage1/dietlibc/alpha/__longjmp.S
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifdef __alpha__
-
-#include <setjmp.h>
-
-.text
-.align 2
-
-.global __longjmp
-__longjmp:
- mov $17, $0 /* a1 -> v0 */
-
- ldq $9, (JB_S0*8) ($16) /* s0 */
- ldq $10, (JB_S1*8) ($16) /* s1 */
- ldq $11, (JB_S2*8) ($16) /* s2 */
- ldq $12, (JB_S3*8) ($16) /* s3 */
- ldq $13, (JB_S4*8) ($16) /* s4 */
- ldq $14, (JB_S5*8) ($16) /* s5 */
-
- ldq $26, (JB_PC*8) ($16) /* ra */
- ldq $fp, (JB_FP*8) ($16) /* fp */
- ldq $1, (JB_SP*8) ($16) /* sp */
-
- ldt $f2, (JB_F2*8) ($16) /* f2 */
- ldt $f3, (JB_F3*8) ($16) /* f3 */
- ldt $f4, (JB_F4*8) ($16) /* f4 */
- ldt $f5, (JB_F5*8) ($16) /* f5 */
- ldt $f6, (JB_F6*8) ($16) /* f6 */
- ldt $f7, (JB_F7*8) ($16) /* f7 */
- ldt $f8, (JB_F8*8) ($16) /* f8 */
- ldt $f9, (JB_F9*8) ($16) /* f9 */
-
- cmoveq $0, 0x1, $0
- mov $1, $sp
-
- ret $31, ($26), 1
-
-
-#endif
diff --git a/mdk-stage1/dietlibc/alpha/accept.S b/mdk-stage1/dietlibc/alpha/accept.S
deleted file mode 100644
index 43a40ee6f..000000000
--- a/mdk-stage1/dietlibc/alpha/accept.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_accept
-syscall(accept,accept)
diff --git a/mdk-stage1/dietlibc/alpha/bind.S b/mdk-stage1/dietlibc/alpha/bind.S
deleted file mode 100644
index 86a04cb70..000000000
--- a/mdk-stage1/dietlibc/alpha/bind.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(bind,bind)
diff --git a/mdk-stage1/dietlibc/alpha/clone.S b/mdk-stage1/dietlibc/alpha/clone.S
deleted file mode 100644
index f01620595..000000000
--- a/mdk-stage1/dietlibc/alpha/clone.S
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "syscalls.h"
-#include <asm/errno.h>
-
-.text
-.align 2
-.weak clone
-clone:
-.global __clone
-.type __clone,@function
-clone:
- ldiq $0, EINVAL
- beq $16, .Lerror
- beq $17, .Lerror
-
- subq $17, 16, $17
- stq $16, 0($17)
- stq $19, 8($17)
- mov $18, $16
-
- lda $0, __NR_pipe($31)
- callsys
- bne $19, .Lerror
-
- beq $0, .Lstart_thread
-
- ret $31, ($26), 0x01
-
-.Lerror:
- jmp error_unified_syscall
-
-.Lstart_thread:
- clr $fp
-
- ldq $27, 0($sp)
- ldq $16, 8($sp)
-
- jsr $26, ($27), 0x04
-
- ldgp $gp, 0($26)
- mov $0, $16
- jsr $26, _exit
-
diff --git a/mdk-stage1/dietlibc/alpha/connect.S b/mdk-stage1/dietlibc/alpha/connect.S
deleted file mode 100644
index da3675760..000000000
--- a/mdk-stage1/dietlibc/alpha/connect.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_connect
-syscall(connect,connect)
diff --git a/mdk-stage1/dietlibc/alpha/divq.S b/mdk-stage1/dietlibc/alpha/divq.S
deleted file mode 100644
index cf70862c4..000000000
--- a/mdk-stage1/dietlibc/alpha/divq.S
+++ /dev/null
@@ -1,102 +0,0 @@
-/* taken from glibc 2.2 */
-
- .set noreorder
- .set noat
-
- .ent __divqu
- .globl __divqu
-
- .align 3
-__divqu :
- lda $30 , - 48 ($30 )
- .frame $30 , 48 , $23 , 0
- .prologue 0
-$udiv:
- stq $1 , 0($30 )
- mov $25 , $1
- stq $2 , 8($30 )
- mov $24 , $2
- stq $0 , 16($30 )
- clr $27
- stq $3 , 24($30 )
- ldiq $0 , 1
- stq $4 ,32($30 )
- beq $1 , $divbyzero
-
- .align 3
-
-
-1: cmpult $1 , $2 , $at
- blt $1 , 2f
- addq $1 , $1 , $1
- addq $0 , $0 , $0
- bne $at , 1b
- unop
-2:
-3: addq $27 ,$0 , $4
- srl $0 , 1, $0
- cmpule $1 , $2 , $at
- subq $2 , $1 , $3
- cmovne $at ,$4 , $27
- srl $1 , 1, $1
- cmovne $at , $3 , $2
- bne $0 , 3b
-
-$done: ldq $1 , 0($30 )
- ldq $2 , 8($30 )
- ldq $0 , 16($30 )
- ldq $3 , 24($30 )
- ldq $4 ,32($30 )
- lda $30 , 48 ($30 )
- ret $31 , ($23 ), 1
-
-$divbyzero:
- mov $16 , $3
- ldiq $16 , -2
- call_pal 170
- mov $3 , $16
- clr $27
- br $done
-
- .end __divqu
-
- .ent __divq
- .globl __divq
-
- .align 3
-__divq :
- lda $30 , - 48 ($30 )
- .frame $30 , 48 , $23 , 0
- .prologue 0
- or $24 , $25 , $at
-
- bge $at , $udiv
-
-
- stq $24 , 0($30 )
- negq $24 , $at
- stq $25 , 8($30 )
- cmovge $at , $at , $24
- stq $23 , 16($30 )
- negq $25 , $at
- stq $3 , 24($30 )
- cmovge $at , $at , $25
-
-
- bsr $23 , __divqu
-
-
- ldq $24 , 0($30 )
- ldq $25 , 8($30 )
- xor $24 , $25 , $at
- negq $27 , $3
-
- ldq $23 , 16($30 )
- cmovlt $at , $3 , $27
- ldq $3 , 24($30 )
-
- lda $30 , 48 ($30 )
- ret $31 , ($23 ), 1
-
- .end __divq
-
diff --git a/mdk-stage1/dietlibc/alpha/getegid.S b/mdk-stage1/dietlibc/alpha/getegid.S
deleted file mode 100644
index 89c35d45e..000000000
--- a/mdk-stage1/dietlibc/alpha/getegid.S
+++ /dev/null
@@ -1,11 +0,0 @@
-.text
-.align 2
-.global getegid
-getegid:
- lda $sp,-8($sp)
- stq $26, 0($sp)
- jsr getgid
- ldq $26, 0($sp)
- lda $sp, 8($sp)
- cmovge $0, $20, $0
- ret
diff --git a/mdk-stage1/dietlibc/alpha/geteuid.S b/mdk-stage1/dietlibc/alpha/geteuid.S
deleted file mode 100644
index 087ca7348..000000000
--- a/mdk-stage1/dietlibc/alpha/geteuid.S
+++ /dev/null
@@ -1,11 +0,0 @@
-.text
-.align 2
-.global geteuid
-geteuid:
- lda $sp,-8($sp)
- stq $26, 0($sp)
- jsr getuid
- ldq $26, 0($sp)
- lda $sp, 8($sp)
- cmovge $0, $20, $0
- ret
diff --git a/mdk-stage1/dietlibc/alpha/getgid.S b/mdk-stage1/dietlibc/alpha/getgid.S
deleted file mode 100644
index 7350082f3..000000000
--- a/mdk-stage1/dietlibc/alpha/getgid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getxgid,getgid)
diff --git a/mdk-stage1/dietlibc/alpha/getpeername.S b/mdk-stage1/dietlibc/alpha/getpeername.S
deleted file mode 100644
index 3b3f48b1a..000000000
--- a/mdk-stage1/dietlibc/alpha/getpeername.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getpeername,getpeername)
diff --git a/mdk-stage1/dietlibc/alpha/getpid.S b/mdk-stage1/dietlibc/alpha/getpid.S
deleted file mode 100644
index d8b3523b2..000000000
--- a/mdk-stage1/dietlibc/alpha/getpid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getxpid,getpid)
diff --git a/mdk-stage1/dietlibc/alpha/getppid.S b/mdk-stage1/dietlibc/alpha/getppid.S
deleted file mode 100644
index e181268c3..000000000
--- a/mdk-stage1/dietlibc/alpha/getppid.S
+++ /dev/null
@@ -1,11 +0,0 @@
-.text
-.align 2
-.global getppid
-getppid:
- lda $sp,-8($sp)
- stq $26, 0($sp)
- jsr getpid
- ldq $26, 0($sp)
- lda $sp, 8($sp)
- cmovge $0, $20, $0
- ret
diff --git a/mdk-stage1/dietlibc/alpha/getsockname.S b/mdk-stage1/dietlibc/alpha/getsockname.S
deleted file mode 100644
index 2727d88da..000000000
--- a/mdk-stage1/dietlibc/alpha/getsockname.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getsockname,getsockname)
diff --git a/mdk-stage1/dietlibc/alpha/getsockopt.S b/mdk-stage1/dietlibc/alpha/getsockopt.S
deleted file mode 100644
index 44b4a910a..000000000
--- a/mdk-stage1/dietlibc/alpha/getsockopt.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getsockopt,getsockopt)
diff --git a/mdk-stage1/dietlibc/alpha/getuid.S b/mdk-stage1/dietlibc/alpha/getuid.S
deleted file mode 100644
index fcb5570c2..000000000
--- a/mdk-stage1/dietlibc/alpha/getuid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getxuid,getuid)
diff --git a/mdk-stage1/dietlibc/alpha/listen.S b/mdk-stage1/dietlibc/alpha/listen.S
deleted file mode 100644
index 1102831d4..000000000
--- a/mdk-stage1/dietlibc/alpha/listen.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(listen,listen)
diff --git a/mdk-stage1/dietlibc/alpha/mmap.S b/mdk-stage1/dietlibc/alpha/mmap.S
deleted file mode 100644
index 2e57fbb74..000000000
--- a/mdk-stage1/dietlibc/alpha/mmap.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(mmap,mmap)
diff --git a/mdk-stage1/dietlibc/alpha/pipe.S b/mdk-stage1/dietlibc/alpha/pipe.S
deleted file mode 100644
index 3dfef10bf..000000000
--- a/mdk-stage1/dietlibc/alpha/pipe.S
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "syscalls.h"
-
-.text
-.align 2
-.global pipe
-.type pipe,@function
-pipe:
- lda $0, __NR_pipe($31)
- callsys
- bne $19, .Lerror
- stl $0, 0($16)
- stl $20, 4($16)
- clr $0
- ret $31, ($26), 0x01
-.Lerror:
- br error_unified_syscall
-
diff --git a/mdk-stage1/dietlibc/alpha/recv.S b/mdk-stage1/dietlibc/alpha/recv.S
deleted file mode 100644
index 71b2e37dc..000000000
--- a/mdk-stage1/dietlibc/alpha/recv.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_recv
-syscall(recv,recv)
diff --git a/mdk-stage1/dietlibc/alpha/recvfrom.S b/mdk-stage1/dietlibc/alpha/recvfrom.S
deleted file mode 100644
index 64779cbb8..000000000
--- a/mdk-stage1/dietlibc/alpha/recvfrom.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_recvfrom
-syscall(recvfrom,recvfrom)
diff --git a/mdk-stage1/dietlibc/alpha/send.S b/mdk-stage1/dietlibc/alpha/send.S
deleted file mode 100644
index baed3b173..000000000
--- a/mdk-stage1/dietlibc/alpha/send.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_send
-syscall(send,send)
diff --git a/mdk-stage1/dietlibc/alpha/sendto.S b/mdk-stage1/dietlibc/alpha/sendto.S
deleted file mode 100644
index 19169b26b..000000000
--- a/mdk-stage1/dietlibc/alpha/sendto.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_sendto
-syscall(sendto,sendto)
diff --git a/mdk-stage1/dietlibc/alpha/setjmp.S b/mdk-stage1/dietlibc/alpha/setjmp.S
deleted file mode 100644
index 3768056be..000000000
--- a/mdk-stage1/dietlibc/alpha/setjmp.S
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <setjmp.h>
-
-.text
-.global __sigsetjmp
-__sigsetjmp:
- ldgp $gp, 0($gp)
-
- mov $sp, $1
- lda $sp, -16($sp)
-
- stq $26, 0($sp) /* save ra */
-
- stq $9, (JB_S0*8) ($16) /* s0 */
- stq $10, (JB_S1*8) ($16) /* s1 */
- stq $11, (JB_S2*8) ($16) /* s2 */
- stq $12, (JB_S3*8) ($16) /* s3 */
- stq $13, (JB_S4*8) ($16) /* s4 */
- stq $14, (JB_S5*8) ($16) /* s5 */
-
- stq $26, (JB_PC*8) ($16) /* ra */
- stq $fp, (JB_FP*8) ($16) /* fp */
- stq $1, (JB_SP*8) ($16) /* sp */
-
- stt $f2, (JB_F2*8) ($16) /* f2 */
- stt $f3, (JB_F3*8) ($16) /* f3 */
- stt $f4, (JB_F4*8) ($16) /* f4 */
- stt $f5, (JB_F5*8) ($16) /* f5 */
- stt $f6, (JB_F6*8) ($16) /* f6 */
- stt $f7, (JB_F7*8) ($16) /* f7 */
- stt $f8, (JB_F8*8) ($16) /* f8 */
- stt $f9, (JB_F9*8) ($16) /* f9 */
-
- br $26, __sigjmp_save /* call __sigjmp_save */
-
- ldq $26, 0($sp) /* restore ra */
-
- lda $sp, 16($sp)
- ret $31, ($26), 1 /* back to caller */
-
-.weak setjmp
-setjmp:
-.weak __setjmp
-__setjmp:
- ldgp $gp, 0($gp)
- mov 0, $17
- br __sigsetjmp
diff --git a/mdk-stage1/dietlibc/alpha/setsockopt.S b/mdk-stage1/dietlibc/alpha/setsockopt.S
deleted file mode 100644
index e3fe1d321..000000000
--- a/mdk-stage1/dietlibc/alpha/setsockopt.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setsockopt,setsockopt)
diff --git a/mdk-stage1/dietlibc/alpha/signal.S b/mdk-stage1/dietlibc/alpha/signal.S
deleted file mode 100644
index ceca0f02d..000000000
--- a/mdk-stage1/dietlibc/alpha/signal.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(osf_signal,signal)
diff --git a/mdk-stage1/dietlibc/alpha/sigprocmask.S b/mdk-stage1/dietlibc/alpha/sigprocmask.S
deleted file mode 100644
index 8255a739a..000000000
--- a/mdk-stage1/dietlibc/alpha/sigprocmask.S
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "syscalls.h"
-
-.text
-.align 2
-.weak sigprocmask
-sigprocmask:
-syscall(osf_sigprocmask,__sigprocmask)
diff --git a/mdk-stage1/dietlibc/alpha/socket.S b/mdk-stage1/dietlibc/alpha/socket.S
deleted file mode 100644
index 85401f56e..000000000
--- a/mdk-stage1/dietlibc/alpha/socket.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(socket,socket)
diff --git a/mdk-stage1/dietlibc/alpha/socketcall.S b/mdk-stage1/dietlibc/alpha/socketcall.S
deleted file mode 100644
index b150bd5d5..000000000
--- a/mdk-stage1/dietlibc/alpha/socketcall.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "syscalls.h"
-
-/*
- * Doesn't exist on alpha ( accept, bind, ... are SYSCALLS !?! )
- */
diff --git a/mdk-stage1/dietlibc/alpha/start.S b/mdk-stage1/dietlibc/alpha/start.S
deleted file mode 100644
index 00b8e950d..000000000
--- a/mdk-stage1/dietlibc/alpha/start.S
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "start.h"
-
-#ifdef __alpha__
-
-.text
-.align 2
- .set noreorder
-
-.global __start
-__start:
-.global _start
-_start:
- clr $fp /* clear frame pointer */
-
- br $gp,.Lstart /* set global pointer */
-.Lstart:
- ldgp $gp, 0($gp)
-
-/* prepare to call main */
- ldl $16, 0($sp) /* argc */
-
- lda $17, 8($sp) /* argv */
-
- addq $16, 1, $18 /* argp */
- s8addq $18, $17, $18 /* (8*(argc+1))+argv -> argp */
-
- stq $18, environ
-
- mov $0, $21 /* mov v0(dynload) to a5 */
-
- jsr $26, main
- mov $0, $16
- jsr $26, exit /* YES, CALL! for threads and atexit ! (+4 byte) */
-
-#endif
diff --git a/mdk-stage1/dietlibc/alpha/strlen.c b/mdk-stage1/dietlibc/alpha/strlen.c
deleted file mode 100644
index ac532254a..000000000
--- a/mdk-stage1/dietlibc/alpha/strlen.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <string.h>
-
-static const unsigned long long magic = 0x0101010101010101LL;
-
-size_t strlen(const char *s)
-{
- const char *t = s;
- unsigned long long word;
-
- if (!s) return 0;
-
- /* Byte compare up until 64 bit word boundary */
- for (; ((unsigned long long) t & 7); t++)
- if (!*t) return t - s;
-
- /* Word compare */
- do {
- word = *((unsigned long long *) t); t += 8;
- word = (word - magic) &~ word;
- word &= (magic << 7);
- } while (word == 0);
-
- /* word & 0x8080808080808080 == word */
- word = (word - 1) & (magic << 8);
- word += (word << 32);
- word += (word << 16);
- word += (word << 8);
- t += word >> 56;
- return ((const char *) t) - 8 - s;
-}
-
-
diff --git a/mdk-stage1/dietlibc/alpha/time.S b/mdk-stage1/dietlibc/alpha/time.S
deleted file mode 100644
index 56a4f9b38..000000000
--- a/mdk-stage1/dietlibc/alpha/time.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(osf_gettimeofday,time)
diff --git a/mdk-stage1/dietlibc/alpha/unified.S b/mdk-stage1/dietlibc/alpha/unified.S
deleted file mode 100644
index 02a1c9bcd..000000000
--- a/mdk-stage1/dietlibc/alpha/unified.S
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <dietfeatures.h>
-
-.global __unified_syscall
-__unified_syscall:
- callsys
- bne $19, .Lerror
- ret $31, ($26), 0x01
-
-.Lerror:
-.global error_unified_syscall
-error_unified_syscall:
-#ifdef WANT_THREAD_SAVE
- lda $sp, -16($sp) /* alloc 2 qwords on stack */
- stq $26, 0($sp) /* save ra to stack */
- stq $0, 8($sp) /* save v0 to stack */
-
- jsr $26, __errno_location /* call __errno_location */
-
- ldq $1, 8($sp) /* write old v0 to errno */
- stl $1, 0($0)
-
- lda $0, -1($31) /* new return value is -1 */
- ldq $26, 0($sp) /* restore return address */
- lda $sp, 16($sp) /* free 2 qwords on stack */
-#else
- lda $1, errno
- stl $0, 0($1)
-#endif
- ret $31, ($26), 0x01 /* return */
diff --git a/mdk-stage1/dietlibc/alpha/utime.S b/mdk-stage1/dietlibc/alpha/utime.S
deleted file mode 100644
index a9a8aada6..000000000
--- a/mdk-stage1/dietlibc/alpha/utime.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(utimes,utime)
diff --git a/mdk-stage1/dietlibc/alpha/waitpid.S b/mdk-stage1/dietlibc/alpha/waitpid.S
deleted file mode 100644
index 0ff429e17..000000000
--- a/mdk-stage1/dietlibc/alpha/waitpid.S
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <syscalls.h>
-
-.text
-.align 2
-.weak __libc_waitpid
-.global waitpid
-waitpid:
- clr $19
- br wait4
diff --git a/mdk-stage1/dietlibc/dietdirent.h b/mdk-stage1/dietlibc/dietdirent.h
deleted file mode 100644
index d732cf7dc..000000000
--- a/mdk-stage1/dietlibc/dietdirent.h
+++ /dev/null
@@ -1,6 +0,0 @@
-struct __dirstream {
- int fd;
- char buf[1024];
- unsigned int num;
- unsigned int cur;
-}; /* stream data from opendir() */
diff --git a/mdk-stage1/dietlibc/dietfeatures.h b/mdk-stage1/dietlibc/dietfeatures.h
deleted file mode 100644
index 979b40d62..000000000
--- a/mdk-stage1/dietlibc/dietfeatures.h
+++ /dev/null
@@ -1,16 +0,0 @@
-
-/* feel free to comment some of these out to reduce code size */
-
-//#define WANT_FLOATING_POINT_IN_PRINTF
-//#define WANT_FLOATING_POINT_IN_SCANF
-#define WANT_NULL_PRINTF
-
-#define SLASH_PROC_OK
-
-// #define WANT_BUFFERED_STDIO
-
-/* use errno_location instead of errno */
-// #define WANT_THREAD_SAVE
-
-/* do you want smaller or faster string routines? */
-#define WANT_SMALL_STRING_ROUTINES
diff --git a/mdk-stage1/dietlibc/dietstdio.h b/mdk-stage1/dietlibc/dietstdio.h
deleted file mode 100644
index 5cacbde23..000000000
--- a/mdk-stage1/dietlibc/dietstdio.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* diet stdio -- no buffering ;-} */
-
-#include "dietfeatures.h"
-#include <sys/types.h>
-
-#define BUFSIZE 128
-
-typedef struct __file {
- int fd;
- int flags;
-#ifdef WANT_BUFFERED_STDIO
- int seekofs;
- int bm;
- char buf[BUFSIZE];
- struct __file *next;
-#endif
-} FILE;
-
-extern FILE *__stdio_root;
-
-#define ERRORINDICATOR 1
-#define EOFINDICATOR 2
-#define BUFINPUT 4
-#define BUFLINEWISE 8
-
-/* internal function to flush buffer.
- * However, if next is BUFINPUT and the buffer is an input buffer, it
- * will not be flushed. Vice versa for output */
-extern int __fflush4(FILE *stream,int next);
-
-FILE *fopen (const char *path, const char *mode);
-FILE *fdopen (int fildes, const char *mode);
-FILE *freopen (const char *path, const char *mode, FILE *stream);
-
-int fgetc(FILE *stream);
-char *fgets(char *s, int size, FILE *stream);
-int getc(FILE *stream);
-int getchar(void);
-char *gets(char *s);
-int ungetc(int c, FILE *stream);
-
-int fputc(int c, FILE *stream);
-int fputs(const char *s, FILE *stream);
-int putc(int c, FILE *stream);
-int putchar(int c);
-int puts(const char *s);
-
-int fseek( FILE *stream, long offset, int whence);
-long ftell( FILE *stream);
-void rewind( FILE *stream);
-int fgetpos( FILE *stream, fpos_t *pos);
-int fsetpos( FILE *stream, fpos_t *pos);
-
-size_t fread( 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 fflush(FILE *stream);
-
-int fclose(FILE *stream);
-
-extern FILE *stdout, *stderr, *stdin;
-
-#define EOF (int)(-1)
diff --git a/mdk-stage1/dietlibc/dirstream.h b/mdk-stage1/dietlibc/dirstream.h
deleted file mode 100644
index dc8fba79c..000000000
--- a/mdk-stage1/dietlibc/dirstream.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright (C) 1991, 1992 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, 1992 Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
-
-/*
- * POSIX Standard: 5.1.2 Directory Operations <dirent.h>
- */
-
-#ifndef _DIRSTREAM_H
-
-#define _DIRSTREAM_H 1
-
-#include <sys/types.h>
-#include <dirent.h>
-#ifdef _POSIX_THREADS
-#include <pthread.h>
-#endif
-
-/* For now, syscall readdir () only supports one entry at a time. It
- * will be changed in the future.
-#define NUMENT 3
-*/
-#ifndef NUMENT
-#define NUMENT 1
-#endif
-
-#define SINGLE_READDIR 11
-#define MULTI_READDIR 12
-#define NEW_READDIR 13
-
-/* Directory stream type. */
-struct __dirstream {
- /* file descriptor */
- int dd_fd;
-
- /* offset of the next dir entry in buffer */
- off_t dd_nextloc;
-
- /* bytes of valid entries in buffer */
- size_t dd_size;
-
- /* -> directory buffer */
- struct dirent *dd_buf;
-
- /* we have to convert */
- struct dirent convbuf;
-
- /* offset of the next dir entry in directory. */
- off_t dd_nextoff;
-
- /* total size of buffer */
- size_t dd_max;
-
- enum {unknown, have_getdents, no_getdents} dd_getdents;
-
- /* lock */
-#ifdef _POSIX_THREADS
- pthread_mutex_t *dd_lock;
-#else
- void *dd_lock;
-#endif
-}; /* stream data from opendir() */
-
-#endif /* dirent.h */
diff --git a/mdk-stage1/dietlibc/i386/Makefile.add b/mdk-stage1/dietlibc/i386/Makefile.add
deleted file mode 100644
index 8d2914e66..000000000
--- a/mdk-stage1/dietlibc/i386/Makefile.add
+++ /dev/null
@@ -1,3 +0,0 @@
-
-CFLAGS+=-march=i386 -mcpu=i386 -Os -fomit-frame-pointer
-override VPATH=i386:syscalls.s:lib
diff --git a/mdk-stage1/dietlibc/i386/__longjmp.S b/mdk-stage1/dietlibc/i386/__longjmp.S
deleted file mode 100644
index 312e01ed1..000000000
--- a/mdk-stage1/dietlibc/i386/__longjmp.S
+++ /dev/null
@@ -1,20 +0,0 @@
-#define _ASM
-#define _SETJMP_H
-#include <bits/setjmp.h>
-
-.text
-.global __longjmp
-__longjmp:
- movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */
- movl 8(%esp), %eax /* Second argument is return value. */
- /* Save the return address now. */
- movl (JB_PC*4)(%ecx), %edx
- /* Restore registers. */
- movl (JB_BX*4)(%ecx), %ebx
- movl (JB_SI*4)(%ecx), %esi
- movl (JB_DI*4)(%ecx), %edi
- movl (JB_BP*4)(%ecx), %ebp
- movl (JB_SP*4)(%ecx), %esp
- /* Jump to saved PC. */
- jmp *%edx
-.size __longjmp,.-__longjmp;
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/select.S b/mdk-stage1/dietlibc/i386/select.S
deleted file mode 100644
index 6e9fce8e3..000000000
--- a/mdk-stage1/dietlibc/i386/select.S
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "syscalls.h"
-
-.text
-.weak select
-select:
-syscall(_newselect,select)
diff --git a/mdk-stage1/dietlibc/i386/setjmp.S b/mdk-stage1/dietlibc/i386/setjmp.S
deleted file mode 100644
index d7898e58f..000000000
--- a/mdk-stage1/dietlibc/i386/setjmp.S
+++ /dev/null
@@ -1,64 +0,0 @@
-#define _ASM
-#define _SETJMP_H
-#include <bits/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
-setjmp:
-.globl __setjmp
-__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. */
-
-.globl __sigsetjmp
-__sigsetjmp:
- movl 4(%esp), %eax /* User's jmp_buf in %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)
- movl 0(%esp), %ecx /* Save PC we are returning to now. */
- 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
-#else
- jmp __sigjmp_save
-#endif
-.size __sigsetjmp,.-__sigsetjmp;
diff --git a/mdk-stage1/dietlibc/i386/start.S b/mdk-stage1/dietlibc/i386/start.S
deleted file mode 100644
index 8a2ba7e38..000000000
--- a/mdk-stage1/dietlibc/i386/start.S
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "start.h"
-
-#ifdef __i386__
-.text
-.globl _start
-_start:
-#if 0
- popl %ecx
- movl %esp, %edx
- leal 4(%esp,%ecx,4),%eax
-#else
- movl (%esp),%ecx /* %ecx = argc */
- leal 4(%esp),%edx /* %edx = argv */
-
- leal 4(%edx,%ecx,4),%eax /* eax = 4*ecx+4 = envp */
-#endif
- pushl %eax
- pushl %edx
- pushl %ecx
- movl %eax,environ
-
- call main
- pushl %eax
- call exit
-.Lfefe:
- .size _start,.Lfefe-_start
-#endif
-
diff --git a/mdk-stage1/dietlibc/i386/strchr.S b/mdk-stage1/dietlibc/i386/strchr.S
deleted file mode 100644
index 0a2a5aa52..000000000
--- a/mdk-stage1/dietlibc/i386/strchr.S
+++ /dev/null
@@ -1,47 +0,0 @@
-#define NEW
-
-.text
-.global strchr
-strchr:
- mov %esi,%edx
- mov 0x4(%esp,1),%esi
- mov 0x8(%esp,1),%cl
- cld
-.L1:
- lods (%esi),%eax
- cmp %al,%cl
- jz .Lafound
- test %al,%al
- jz .Lnotfound
-
- cmp %ah,%cl
- jz .Lbfound
- test %ah,%ah
- jz .Lnotfound
-
- shr $16,%eax
- cmp %al,%cl
- jz .Lcfound
- test %al,%al
- jz .Lnotfound
-
- cmp %ah,%cl
- jz .Ldfound
- test %ah,%ah
-
- jnz .L1
-.Lnotfound:
- sub %eax,%eax
- mov %edx,%esi
- ret
-.Lafound:
- dec %esi
-.Lbfound:
- dec %esi
-.Lcfound:
- dec %esi
-.Ldfound:
- mov %esi,%eax
- mov %edx,%esi
- dec %eax
- ret
diff --git a/mdk-stage1/dietlibc/i386/unified.S b/mdk-stage1/dietlibc/i386/unified.S
deleted file mode 100644
index 740cb0ecc..000000000
--- a/mdk-stage1/dietlibc/i386/unified.S
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <dietfeatures.h>
-
-.text
-.global __unified_syscall
-__unified_syscall:
- and $0xff,%eax
- push %edi
- push %esi
- push %ebx
- movl 0x10(%esp),%ebx
- movl 0x14(%esp),%ecx
- movl 0x18(%esp),%edx
- movl 0x1c(%esp),%esi
- movl 0x20(%esp),%edi
- int $0x80
- cmp $-124,%eax
- jbe .Lnoerror
-#ifdef WANT_THREAD_SAVE
- movl %eax,%ebx
- call __errno_location
- neg %ebx
- movl %ebx,(%eax)
-#else
- neg %eax
- mov %eax,errno
-#endif
- xor %eax,%eax
- dec %eax
-.Lnoerror:
- pop %ebx
- pop %esi
- pop %edi
- ret
diff --git a/mdk-stage1/dietlibc/include/arpa/inet.h b/mdk-stage1/dietlibc/include/arpa/inet.h
deleted file mode 100644
index 6aa71a162..000000000
--- a/mdk-stage1/dietlibc/include/arpa/inet.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef _ARPA_INET_H
-#define _ARPA_INET_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-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;
-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;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/assert.h b/mdk-stage1/dietlibc/include/assert.h
deleted file mode 100644
index adf956022..000000000
--- a/mdk-stage1/dietlibc/include/assert.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef _ASSERT_H
-#define _ASSERT_H
-
-#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)
- __THROW __attribute__ ((__noreturn__));
-
-#ifdef __PRETTY_FUNCTION__
-#define __ASSERT_FUNCTION __PRETTY_FUNCTION__
-#else
-#define __ASSERT_FUNCTION __func__
-#endif
-
-#undef assert
-# define assert(expr) \
- ((void) ((expr) ? 0 : \
- (__assert_fail (#expr, \
- __FILE__, __LINE__, __ASSERT_FUNCTION), 0)))
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/ctype.h b/mdk-stage1/dietlibc/include/ctype.h
deleted file mode 100644
index c8f4e5a34..000000000
--- a/mdk-stage1/dietlibc/include/ctype.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _CTYPE_H
-#define _CTYPE_H
-
-#include <sys/cdefs.h>
-
-extern int isascii (int c) __THROW;
-extern int isblank (int c) __THROW;
-extern int isalnum (int c) __THROW;
-extern int isalpha (int c) __THROW;
-extern int isdigit (int c) __THROW;
-extern int isspace (int c) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/dirent.h b/mdk-stage1/dietlibc/include/dirent.h
deleted file mode 100644
index d277c0762..000000000
--- a/mdk-stage1/dietlibc/include/dirent.h
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef _DIRENT_H
-#define _DIRENT_H 1
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <linux/dirent.h>
-
-#if 0
-struct dirent
- {
-#ifndef __USE_FILE_OFFSET64
- ino_t d_ino;
- off_t d_off;
-#else
- ino64_t d_ino;
- off64_t d_off;
-#endif
- unsigned short int d_reclen;
- unsigned char d_type;
- char d_name[256]; /* We must not include limits.h! */
- };
-
-#ifdef __USE_LARGEFILE64
-struct dirent64
- {
- ino64_t d_ino;
- off64_t d_off;
- unsigned short int d_reclen;
- unsigned char d_type;
- char d_name[256]; /* We must not include limits.h! */
- };
-#endif
-#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
-
-#define opendir(name) __dietopendir(name)
-#define closedir(dir) __dietclosedir(dir)
-#define readdir(dir) __dietreaddir(dir)
-#define readdir64(dir) __dietreaddir64(dir)
-#define rewinddir(dir) __dietrewinddir64(dir)
-#define seekdir(dir,pos) __dietseekdir(dir,pos)
-#define telldir(dir) __diettelldir(dir)
-
-typedef struct __dirstream DIR;
-
-DIR *opendir (const char *__name) __THROW;
-int closedir (DIR *__dirp) __THROW;
-struct dirent *readdir (DIR *__dirp) __THROW;
-struct dirent64 *readdir64 (DIR *__dirp) __THROW;
-void rewinddir (DIR *__dirp) __THROW;
-void seekdir (DIR *__dirp, long int __pos) __THROW;
-long int telldir (DIR *__dirp) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/elf.h b/mdk-stage1/dietlibc/include/elf.h
deleted file mode 100644
index bf9f1ea89..000000000
--- a/mdk-stage1/dietlibc/include/elf.h
+++ /dev/null
@@ -1,1989 +0,0 @@
-/* This file defines standard ELF types, structures, and macros.
- Copyright (C) 1995-1999, 2000 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. */
-
-#ifndef _ELF_H
-#define _ELF_H 1
-
-/* Standard ELF types. */
-
-#include <stdint.h>
-
-/* Type for a 16-bit quantity. */
-typedef uint16_t Elf32_Half;
-typedef uint16_t Elf64_Half;
-
-/* Types for signed and unsigned 32-bit quantities. */
-typedef uint32_t Elf32_Word;
-typedef int32_t Elf32_Sword;
-typedef uint32_t Elf64_Word;
-typedef int32_t Elf64_Sword;
-
-/* Types for signed and unsigned 64-bit quantities. */
-typedef uint64_t Elf32_Xword;
-typedef int64_t Elf32_Sxword;
-typedef uint64_t Elf64_Xword;
-typedef int64_t Elf64_Sxword;
-
-/* Type of addresses. */
-typedef uint32_t Elf32_Addr;
-typedef uint64_t Elf64_Addr;
-
-/* Type of file offsets. */
-typedef uint32_t Elf32_Off;
-typedef uint64_t Elf64_Off;
-
-/* Type for section indices, which are 16-bit quantities. */
-typedef uint16_t Elf32_Section;
-typedef uint16_t Elf64_Section;
-
-/* Type for version symbol information. */
-typedef Elf32_Half Elf32_Versym;
-typedef Elf64_Half Elf64_Versym;
-
-
-/* The ELF file header. This appears at the start of every ELF file. */
-
-#define EI_NIDENT (16)
-
-typedef struct
-{
- unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
- Elf32_Half e_type; /* Object file type */
- Elf32_Half e_machine; /* Architecture */
- Elf32_Word e_version; /* Object file version */
- Elf32_Addr e_entry; /* Entry point virtual address */
- Elf32_Off e_phoff; /* Program header table file offset */
- Elf32_Off e_shoff; /* Section header table file offset */
- Elf32_Word e_flags; /* Processor-specific flags */
- Elf32_Half e_ehsize; /* ELF header size in bytes */
- Elf32_Half e_phentsize; /* Program header table entry size */
- Elf32_Half e_phnum; /* Program header table entry count */
- Elf32_Half e_shentsize; /* Section header table entry size */
- Elf32_Half e_shnum; /* Section header table entry count */
- Elf32_Half e_shstrndx; /* Section header string table index */
-} Elf32_Ehdr;
-
-typedef struct
-{
- unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
- Elf64_Half e_type; /* Object file type */
- Elf64_Half e_machine; /* Architecture */
- Elf64_Word e_version; /* Object file 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; /* Processor-specific flags */
- Elf64_Half e_ehsize; /* ELF header size in bytes */
- Elf64_Half e_phentsize; /* Program header table entry size */
- Elf64_Half e_phnum; /* Program header table entry count */
- Elf64_Half e_shentsize; /* Section header table entry size */
- Elf64_Half e_shnum; /* Section header table entry count */
- Elf64_Half e_shstrndx; /* Section header string table index */
-} Elf64_Ehdr;
-
-/* Fields in the e_ident array. The EI_* macros are indices into the
- array. The macros under each EI_* macro are the values the byte
- may have. */
-
-#define EI_MAG0 0 /* File identification byte 0 index */
-#define ELFMAG0 0x7f /* Magic number byte 0 */
-
-#define EI_MAG1 1 /* File identification byte 1 index */
-#define ELFMAG1 'E' /* Magic number byte 1 */
-
-#define EI_MAG2 2 /* File identification byte 2 index */
-#define ELFMAG2 'L' /* Magic number byte 2 */
-
-#define EI_MAG3 3 /* File identification byte 3 index */
-#define ELFMAG3 'F' /* Magic number byte 3 */
-
-/* Conglomeration of the identification bytes, for easy testing as a word. */
-#define ELFMAG "\177ELF"
-#define SELFMAG 4
-
-#define EI_CLASS 4 /* File class byte index */
-#define ELFCLASSNONE 0 /* Invalid class */
-#define ELFCLASS32 1 /* 32-bit objects */
-#define ELFCLASS64 2 /* 64-bit objects */
-#define ELFCLASSNUM 3
-
-#define EI_DATA 5 /* Data encoding byte index */
-#define ELFDATANONE 0 /* Invalid data encoding */
-#define ELFDATA2LSB 1 /* 2's complement, little endian */
-#define ELFDATA2MSB 2 /* 2's complement, big endian */
-#define ELFDATANUM 3
-
-#define EI_VERSION 6 /* File version byte index */
- /* Value must be EV_CURRENT */
-
-#define EI_OSABI 7 /* OS ABI identification */
-#define ELFOSABI_SYSV 0 /* UNIX System V ABI */
-#define ELFOSABI_HPUX 1 /* HP-UX */
-#define ELFOSABI_ARM 97 /* ARM */
-#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
-
-#define EI_ABIVERSION 8 /* ABI version */
-
-#define EI_PAD 9 /* Byte index of padding bytes */
-
-/* Legal values for e_type (object file type). */
-
-#define ET_NONE 0 /* No file type */
-#define ET_REL 1 /* Relocatable file */
-#define ET_EXEC 2 /* Executable file */
-#define ET_DYN 3 /* Shared object file */
-#define ET_CORE 4 /* Core file */
-#define ET_NUM 5 /* Number of defined types */
-#define ET_LOOS 0xfe00 /* OS-specific range start */
-#define ET_HIOS 0xfeff /* OS-specific range end */
-#define ET_LOPROC 0xff00 /* Processor-specific range start */
-#define ET_HIPROC 0xffff /* Processor-specific range end */
-
-/* Legal values for e_machine (architecture). */
-
-#define EM_NONE 0 /* No machine */
-#define EM_M32 1 /* AT&T WE 32100 */
-#define EM_SPARC 2 /* SUN SPARC */
-#define EM_386 3 /* Intel 80386 */
-#define EM_68K 4 /* Motorola m68k family */
-#define EM_88K 5 /* Motorola m88k family */
-#define EM_860 7 /* Intel 80860 */
-#define EM_MIPS 8 /* MIPS R3000 big-endian */
-#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */
-
-#define EM_PARISC 15 /* HPPA */
-#define EM_VPP500 17 /* Fujitsu VPP500 */
-#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
-#define EM_960 19 /* Intel 80960 */
-#define EM_PPC 20 /* PowerPC */
-#define EM_PPC64 21 /* PowerPC 64-bit */
-
-#define EM_V800 36 /* NEC V800 series */
-#define EM_FR20 37 /* Fujitsu FR20 */
-#define EM_RH32 38 /* TRW RH-32 */
-#define EM_RCE 39 /* Motorola RCE */
-#define EM_ARM 40 /* ARM */
-#define EM_FAKE_ALPHA 41 /* Digital Alpha */
-#define EM_SH 42 /* Hitachi SH */
-#define EM_SPARCV9 43 /* SPARC v9 64-bit */
-#define EM_TRICORE 44 /* Siemens Tricore */
-#define EM_ARC 45 /* Argonaut RISC Core */
-#define EM_H8_300 46 /* Hitachi H8/300 */
-#define EM_H8_300H 47 /* Hitachi H8/300H */
-#define EM_H8S 48 /* Hitachi H8S */
-#define EM_H8_500 49 /* Hitachi H8/500 */
-#define EM_IA_64 50 /* Intel Merced */
-#define EM_MIPS_X 51 /* Stanford MIPS-X */
-#define EM_COLDFIRE 52 /* Motorola Coldfire */
-#define EM_68HC12 53 /* Motorola M68HC12 */
-#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/
-#define EM_PCP 55 /* Siemens PCP */
-#define EM_NCPU 56 /* Sony nCPU embeeded RISC */
-#define EM_NDR1 57 /* Denso NDR1 microprocessor */
-#define EM_STARCORE 58 /* Motorola Start*Core processor */
-#define EM_ME16 59 /* Toyota ME16 processor */
-#define EM_ST100 60 /* STMicroelectronic ST100 processor */
-#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/
-#define EM_X8664 62 /* AMD x86-64 */
-
-#define EM_FX66 66 /* Siemens FX66 microcontroller */
-#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */
-#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */
-#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */
-#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */
-#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */
-#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */
-#define EM_SVX 73 /* Silicon Graphics SVx */
-#define EM_AT19 74 /* STMicroelectronics ST19 8 bit mc */
-#define EM_VAX 75 /* Digital VAX */
-#define EM_NUM 76
-
-/* If it is necessary to assign new unofficial EM_* values, please
- pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
- chances of collision with official or non-GNU unofficial values. */
-
-#define EM_ALPHA 0x9026
-#define EM_S390 0xA390 /* IBM S390 */
-
-/* Legal values for e_version (version). */
-
-#define EV_NONE 0 /* Invalid ELF version */
-#define EV_CURRENT 1 /* Current version */
-#define EV_NUM 2
-
-/* Section header. */
-
-typedef struct
-{
- Elf32_Word sh_name; /* Section name (string tbl index) */
- Elf32_Word sh_type; /* Section type */
- Elf32_Word sh_flags; /* Section flags */
- Elf32_Addr sh_addr; /* Section virtual addr at execution */
- Elf32_Off sh_offset; /* Section file offset */
- Elf32_Word sh_size; /* Section size in bytes */
- Elf32_Word sh_link; /* Link to another section */
- Elf32_Word sh_info; /* Additional section information */
- Elf32_Word sh_addralign; /* Section alignment */
- Elf32_Word sh_entsize; /* Entry size if section holds table */
-} Elf32_Shdr;
-
-typedef struct
-{
- Elf64_Word sh_name; /* Section name (string tbl index) */
- Elf64_Word sh_type; /* Section type */
- Elf64_Xword sh_flags; /* Section flags */
- Elf64_Addr sh_addr; /* Section virtual addr at execution */
- Elf64_Off sh_offset; /* Section file offset */
- Elf64_Xword sh_size; /* Section size in bytes */
- Elf64_Word sh_link; /* Link to 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;
-
-/* Special section indices. */
-
-#define SHN_UNDEF 0 /* Undefined section */
-#define SHN_LORESERVE 0xff00 /* Start of reserved indices */
-#define SHN_LOPROC 0xff00 /* Start of processor-specific */
-#define SHN_HIPROC 0xff1f /* End of processor-specific */
-#define SHN_LOOS 0xff20 /* Start of OS-specific */
-#define SHN_HIOS 0xff3f /* End of OS-specific */
-#define SHN_ABS 0xfff1 /* Associated symbol is absolute */
-#define SHN_COMMON 0xfff2 /* Associated symbol is common */
-#define SHN_XINDEX 0xffff /* Index is in extra table. */
-#define SHN_HIRESERVE 0xffff /* End of reserved indices */
-
-/* Legal values for sh_type (section type). */
-
-#define SHT_NULL 0 /* Section header table entry unused */
-#define SHT_PROGBITS 1 /* Program data */
-#define SHT_SYMTAB 2 /* Symbol table */
-#define SHT_STRTAB 3 /* String table */
-#define SHT_RELA 4 /* Relocation entries with addends */
-#define SHT_HASH 5 /* Symbol hash table */
-#define SHT_DYNAMIC 6 /* Dynamic linking information */
-#define SHT_NOTE 7 /* Notes */
-#define SHT_NOBITS 8 /* Program space with no data (bss) */
-#define SHT_REL 9 /* Relocation entries, no addends */
-#define SHT_SHLIB 10 /* Reserved */
-#define SHT_DYNSYM 11 /* Dynamic linker symbol table */
-#define SHT_INIT_ARRAY 14 /* Array of constructors */
-#define SHT_FINI_ARRAY 15 /* Array of destructors */
-#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */
-#define SHT_GROUP 17 /* Section group */
-#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
-#define SHT_NUM 19 /* Number of defined types. */
-#define SHT_LOOS 0x60000000 /* Start OS-specific */
-#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */
-#define SHT_SUNW_move 0x6ffffffa
-#define SHT_SUNW_COMDAT 0x6ffffffb
-#define SHT_SUNW_syminfo 0x6ffffffc
-#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */
-#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */
-#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */
-#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */
-#define SHT_HIOS 0x6fffffff /* End OS-specific type */
-#define SHT_LOPROC 0x70000000 /* Start of processor-specific */
-#define SHT_HIPROC 0x7fffffff /* End of processor-specific */
-#define SHT_LOUSER 0x80000000 /* Start of application-specific */
-#define SHT_HIUSER 0x8fffffff /* End of application-specific */
-
-/* Legal values for sh_flags (section flags). */
-
-#define SHF_WRITE (1 << 0) /* Writable */
-#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */
-#define SHF_EXECINSTR (1 << 2) /* Executable */
-#define SHF_MERGE (1 << 4) /* Might be merged */
-#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */
-#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */
-#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */
-#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling
- required */
-#define SHF_MASKOS 0x0ff00000 /* OS-specific. */
-#define SHF_MASKPROC 0xf0000000 /* Processor-specific */
-
-/* Section group handling. */
-#define GRP_COMDAT 0x1 /* Mark group as COMDAT. */
-
-/* Symbol table entry. */
-
-typedef struct
-{
- Elf32_Word st_name; /* Symbol name (string tbl index) */
- Elf32_Addr st_value; /* Symbol value */
- Elf32_Word st_size; /* Symbol size */
- unsigned char st_info; /* Symbol type and binding */
- unsigned char st_other; /* Symbol visibility */
- Elf32_Section st_shndx; /* Section index */
-} Elf32_Sym;
-
-typedef struct
-{
- Elf64_Word st_name; /* Symbol name (string tbl index) */
- unsigned char st_info; /* Symbol type and binding */
- unsigned char st_other; /* Symbol visibility */
- Elf64_Section st_shndx; /* Section index */
- Elf64_Addr st_value; /* Symbol value */
- Elf64_Xword st_size; /* Symbol size */
-} Elf64_Sym;
-
-/* The syminfo section if available contains additional information about
- every dynamic symbol. */
-
-typedef struct
-{
- Elf32_Half si_boundto; /* Direct bindings, symbol bound to */
- Elf32_Half si_flags; /* Per symbol flags */
-} Elf32_Syminfo;
-
-typedef struct
-{
- Elf64_Half si_boundto; /* Direct bindings, symbol bound to */
- Elf64_Half si_flags; /* Per symbol flags */
-} Elf64_Syminfo;
-
-/* Possible values for si_boundto. */
-#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */
-#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */
-#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */
-
-/* Possible bitmasks for si_flags. */
-#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */
-#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */
-#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */
-#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy
- loaded */
-/* Syminfo version values. */
-#define SYMINFO_NONE 0
-#define SYMINFO_CURRENT 1
-#define SYMINFO_NUM 2
-
-
-/* Special section index. */
-
-#define SHN_UNDEF 0 /* No section, undefined symbol. */
-
-/* How to extract and insert information held in the st_info field. */
-
-#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4)
-#define ELF32_ST_TYPE(val) ((val) & 0xf)
-#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
-
-/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */
-#define ELF64_ST_BIND(val) ELF32_ST_BIND (val)
-#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val)
-#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type))
-
-/* Legal values for ST_BIND subfield of st_info (symbol binding). */
-
-#define STB_LOCAL 0 /* Local symbol */
-#define STB_GLOBAL 1 /* Global symbol */
-#define STB_WEAK 2 /* Weak symbol */
-#define STB_NUM 3 /* Number of defined types. */
-#define STB_LOOS 10 /* Start of OS-specific */
-#define STB_HIOS 12 /* End of OS-specific */
-#define STB_LOPROC 13 /* Start of processor-specific */
-#define STB_HIPROC 15 /* End of processor-specific */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type). */
-
-#define STT_NOTYPE 0 /* Symbol type is unspecified */
-#define STT_OBJECT 1 /* Symbol is a data object */
-#define STT_FUNC 2 /* Symbol is a code object */
-#define STT_SECTION 3 /* Symbol associated with a section */
-#define STT_FILE 4 /* Symbol's name is file name */
-#define STT_COMMON 5 /* Symbol is a common data object */
-#define STT_NUM 6 /* Number of defined types. */
-#define STT_LOOS 10 /* Start of OS-specific */
-#define STT_HIOS 12 /* End of OS-specific */
-#define STT_LOPROC 13 /* Start of processor-specific */
-#define STT_HIPROC 15 /* End of processor-specific */
-
-
-/* Symbol table indices are found in the hash buckets and chain table
- of a symbol hash table section. This special index value indicates
- the end of a chain, meaning no further symbols are found in that bucket. */
-
-#define STN_UNDEF 0 /* End of a chain. */
-
-
-/* How to extract and insert information held in the st_other field. */
-
-#define ELF32_ST_VISIBILITY(o) ((o) & 0x03)
-
-/* For ELF64 the definitions are the same. */
-#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o)
-
-/* Symbol visibility specification encoded in the st_other field. */
-#define STV_DEFAULT 0 /* Default symbol visibility rules */
-#define STV_INTERNAL 1 /* Processor specific hidden class */
-#define STV_HIDDEN 2 /* Sym unavailable in other modules */
-#define STV_PROTECTED 3 /* Not preemptible, not exported */
-
-
-/* Relocation table entry without addend (in section of type SHT_REL). */
-
-typedef struct
-{
- Elf32_Addr r_offset; /* Address */
- Elf32_Word r_info; /* Relocation type and symbol index */
-} Elf32_Rel;
-
-/* I have seen two different definitions of the Elf64_Rel and
- Elf64_Rela structures, so we'll leave them out until Novell (or
- whoever) gets their act together. */
-/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */
-
-typedef struct
-{
- Elf64_Addr r_offset; /* Address */
- Elf64_Xword r_info; /* Relocation type and symbol index */
-} Elf64_Rel;
-
-/* Relocation table entry with addend (in section of type SHT_RELA). */
-
-typedef struct
-{
- Elf32_Addr r_offset; /* Address */
- Elf32_Word r_info; /* Relocation type and symbol index */
- Elf32_Sword r_addend; /* Addend */
-} Elf32_Rela;
-
-typedef struct
-{
- Elf64_Addr r_offset; /* Address */
- Elf64_Xword r_info; /* Relocation type and symbol index */
- Elf64_Sxword r_addend; /* Addend */
-} Elf64_Rela;
-
-/* How to extract and insert information held in the r_info field. */
-
-#define ELF32_R_SYM(val) ((val) >> 8)
-#define ELF32_R_TYPE(val) ((val) & 0xff)
-#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff))
-
-#define ELF64_R_SYM(i) ((i) >> 32)
-#define ELF64_R_TYPE(i) ((i) & 0xffffffff)
-#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type))
-
-/* Program segment header. */
-
-typedef struct
-{
- Elf32_Word p_type; /* Segment type */
- Elf32_Off p_offset; /* Segment file offset */
- Elf32_Addr p_vaddr; /* Segment virtual address */
- Elf32_Addr p_paddr; /* Segment physical address */
- Elf32_Word p_filesz; /* Segment size in file */
- Elf32_Word p_memsz; /* Segment size in memory */
- Elf32_Word p_flags; /* Segment flags */
- Elf32_Word p_align; /* Segment alignment */
-} Elf32_Phdr;
-
-typedef struct
-{
- Elf64_Word p_type; /* Segment type */
- Elf64_Word p_flags; /* Segment 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 */
-} Elf64_Phdr;
-
-/* Legal values for p_type (segment type). */
-
-#define PT_NULL 0 /* Program header table entry unused */
-#define PT_LOAD 1 /* Loadable program segment */
-#define PT_DYNAMIC 2 /* Dynamic linking information */
-#define PT_INTERP 3 /* Program interpreter */
-#define PT_NOTE 4 /* Auxiliary information */
-#define PT_SHLIB 5 /* Reserved */
-#define PT_PHDR 6 /* Entry for header table itself */
-#define PT_NUM 7 /* Number of defined types */
-#define PT_LOOS 0x60000000 /* Start of OS-specific */
-#define PT_HIOS 0x6fffffff /* End of OS-specific */
-#define PT_LOPROC 0x70000000 /* Start of processor-specific */
-#define PT_HIPROC 0x7fffffff /* End of processor-specific */
-
-/* Legal values for p_flags (segment flags). */
-
-#define PF_X (1 << 0) /* Segment is executable */
-#define PF_W (1 << 1) /* Segment is writable */
-#define PF_R (1 << 2) /* Segment is readable */
-#define PF_MASKOS 0x0ff00000 /* OS-specific */
-#define PF_MASKPROC 0xf0000000 /* Processor-specific */
-
-/* Legal values for note segment descriptor types for core files. */
-
-#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */
-#define NT_FPREGSET 2 /* Contains copy of fpregset struct */
-#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */
-#define NT_PRXREG 4 /* Contains copy of prxregset struct */
-#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */
-#define NT_AUXV 6 /* Contains copy of auxv array */
-#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */
-#define NT_PSTATUS 10 /* Contains copy of pstatus struct */
-#define NT_PSINFO 13 /* Contains copy of psinfo struct */
-#define NT_PRCRED 14 /* Contains copy of prcred struct */
-#define NT_UTSNAME 15 /* Contains copy of utsname struct */
-#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */
-#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */
-#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct*/
-
-/* Legal values for the note segment descriptor types for object files. */
-
-#define NT_VERSION 1 /* Contains a version string. */
-
-
-/* Dynamic section entry. */
-
-typedef struct
-{
- Elf32_Sword d_tag; /* Dynamic entry type */
- union
- {
- Elf32_Word d_val; /* Integer value */
- Elf32_Addr d_ptr; /* Address value */
- } d_un;
-} Elf32_Dyn;
-
-typedef struct
-{
- Elf64_Sxword d_tag; /* Dynamic entry type */
- union
- {
- Elf64_Xword d_val; /* Integer value */
- Elf64_Addr d_ptr; /* Address value */
- } d_un;
-} Elf64_Dyn;
-
-/* Legal values for d_tag (dynamic entry type). */
-
-#define DT_NULL 0 /* Marks end of dynamic section */
-#define DT_NEEDED 1 /* Name of needed library */
-#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */
-#define DT_PLTGOT 3 /* Processor defined value */
-#define DT_HASH 4 /* Address of symbol hash table */
-#define DT_STRTAB 5 /* Address of string table */
-#define DT_SYMTAB 6 /* Address of symbol table */
-#define DT_RELA 7 /* Address of Rela relocs */
-#define DT_RELASZ 8 /* Total size of Rela relocs */
-#define DT_RELAENT 9 /* Size of one Rela reloc */
-#define DT_STRSZ 10 /* Size of string table */
-#define DT_SYMENT 11 /* Size of one symbol table entry */
-#define DT_INIT 12 /* Address of init function */
-#define DT_FINI 13 /* Address of termination function */
-#define DT_SONAME 14 /* Name of shared object */
-#define DT_RPATH 15 /* Library search path (deprecated) */
-#define DT_SYMBOLIC 16 /* Start symbol search here */
-#define DT_REL 17 /* Address of Rel relocs */
-#define DT_RELSZ 18 /* Total size of Rel relocs */
-#define DT_RELENT 19 /* Size of one Rel reloc */
-#define DT_PLTREL 20 /* Type of reloc in PLT */
-#define DT_DEBUG 21 /* For debugging; unspecified */
-#define DT_TEXTREL 22 /* Reloc might modify .text */
-#define DT_JMPREL 23 /* Address of PLT relocs */
-#define DT_BIND_NOW 24 /* Process relocations of object */
-#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */
-#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */
-#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */
-#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */
-#define DT_RUNPATH 29 /* Library search path */
-#define DT_FLAGS 30 /* Flags for the object being loaded */
-#define DT_ENCODING 32 /* Start of encoded range */
-#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/
-#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */
-#define DT_NUM 34 /* Number used */
-#define DT_LOOS 0x60000000 /* Start of OS-specific */
-#define DT_HIOS 0x6fffffff /* End of OS-specific */
-#define DT_LOPROC 0x70000000 /* Start of processor-specific */
-#define DT_HIPROC 0x7fffffff /* End of processor-specific */
-#define DT_PROCNUM DT_MIPS_NUM /* Most used by any processor */
-
-/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
- Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's
- approach. */
-#define DT_VALRNGLO 0x6ffffd00
-#define DT_PLTPADSZ 0x6ffffdf9
-#define DT_MOVEENT 0x6ffffdfa
-#define DT_MOVESZ 0x6ffffdfb
-#define DT_FEATURE_1 0x6ffffdfc /* Feature selection (DTF_*). */
-#define DT_POSFLAG_1 0x6ffffdfd /* Flags for DT_* entries, effecting
- the following DT_* entry. */
-#define DT_SYMINSZ 0x6ffffdfe /* Size of syminfo table (in bytes) */
-#define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */
-#define DT_VALRNGHI 0x6ffffdff
-
-/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
- Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
-
- If any adjustment is made to the ELF object after it has been
- built these entries will need to be adjusted. */
-#define DT_ADDRRNGLO 0x6ffffe00
-#define DT_SYMINFO 0x6ffffeff /* syminfo table */
-#define DT_ADDRRNGHI 0x6ffffeff
-
-/* The versioning entry types. The next are defined as part of the
- GNU extension. */
-#define DT_VERSYM 0x6ffffff0
-
-#define DT_RELACOUNT 0x6ffffff9
-#define DT_RELCOUNT 0x6ffffffa
-
-/* These were chosen by Sun. */
-#define DT_FLAGS_1 0x6ffffffb /* State flags, see DF_1_* below. */
-#define DT_VERDEF 0x6ffffffc /* Address of version definition
- table */
-#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */
-#define DT_VERNEED 0x6ffffffe /* Address of table with needed
- versions */
-#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */
-#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
-#define DT_VERSIONTAGNUM 16
-
-/* Sun added these machine-independent extensions in the "processor-specific"
- range. Be compatible. */
-#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */
-#define DT_FILTER 0x7fffffff /* Shared object to get values from */
-#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
-#define DT_EXTRANUM 3
-
-/* Values of `d_un.d_val' in the DT_FLAGS entry. */
-#define DF_ORIGIN 0x00000001 /* Object may use DF_ORIGIN */
-#define DF_SYMBOLIC 0x00000002 /* Symbol resolutions starts here */
-#define DF_TEXTREL 0x00000004 /* Object contains text relocations */
-#define DF_BIND_NOW 0x00000008 /* No lazy binding for this object */
-
-/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
- entry in the dynamic section. */
-#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */
-#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */
-#define DF_1_GROUP 0x00000004 /* Set RTLD_GROUP for this object. */
-#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/
-#define DF_1_LOADFLTR 0x00000010 /* Trigger filtee loading at runtime.*/
-#define DF_1_INITFIRST 0x00000020 /* Set RTLD_INITFIRST for this object*/
-#define DF_1_NOOPEN 0x00000040 /* Set RTLD_NOOPEN for this object. */
-#define DF_1_ORIGIN 0x00000080 /* $ORIGIN must be handled. */
-#define DF_1_DIRECT 0x00000100 /* Direct binding enabled. */
-#define DF_1_TRANS 0x00000200
-#define DF_1_INTERPOSE 0x00000400 /* Object is used to interpose. */
-#define DF_1_NODEFLIB 0x00000800 /* Ignore default lib search path. */
-#define DF_1_NODUMP 0x00001000
-#define DF_1_CONFALT 0x00002000
-#define DF_1_ENDFILTEE 0x00004000
-
-/* Flags for the feature selection in DT_FEATURE_1. */
-#define DTF_1_PARINIT 0x00000001
-#define DTF_1_CONFEXP 0x00000002
-
-/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */
-#define DF_P1_LAZYLOAD 0x00000001 /* Lazyload following object. */
-#define DF_P1_GROUPPERM 0x00000002 /* Symbols from next object are not
- generally available. */
-
-/* Version definition sections. */
-
-typedef struct
-{
- Elf32_Half vd_version; /* Version revision */
- Elf32_Half vd_flags; /* Version information */
- Elf32_Half vd_ndx; /* Version Index */
- Elf32_Half vd_cnt; /* Number of associated aux entries */
- Elf32_Word vd_hash; /* Version name hash value */
- Elf32_Word vd_aux; /* Offset in bytes to verdaux array */
- Elf32_Word vd_next; /* Offset in bytes to next verdef
- entry */
-} Elf32_Verdef;
-
-typedef struct
-{
- Elf64_Half vd_version; /* Version revision */
- Elf64_Half vd_flags; /* Version information */
- Elf64_Half vd_ndx; /* Version Index */
- Elf64_Half vd_cnt; /* Number of associated aux entries */
- Elf64_Word vd_hash; /* Version name hash value */
- Elf64_Word vd_aux; /* Offset in bytes to verdaux array */
- Elf64_Word vd_next; /* Offset in bytes to next verdef
- entry */
-} Elf64_Verdef;
-
-
-/* Legal values for vd_version (version revision). */
-#define VER_DEF_NONE 0 /* No version */
-#define VER_DEF_CURRENT 1 /* Current version */
-#define VER_DEF_NUM 2 /* Given version number */
-
-/* Legal values for vd_flags (version information flags). */
-#define VER_FLG_BASE 0x1 /* Version definition of file itself */
-#define VER_FLG_WEAK 0x2 /* Weak version identifier */
-
-/* Auxialiary version information. */
-
-typedef struct
-{
- Elf32_Word vda_name; /* Version or dependency names */
- Elf32_Word vda_next; /* Offset in bytes to next verdaux
- entry */
-} Elf32_Verdaux;
-
-typedef struct
-{
- Elf64_Word vda_name; /* Version or dependency names */
- Elf64_Word vda_next; /* Offset in bytes to next verdaux
- entry */
-} Elf64_Verdaux;
-
-
-/* Version dependency section. */
-
-typedef struct
-{
- Elf32_Half vn_version; /* Version of structure */
- Elf32_Half vn_cnt; /* Number of associated aux entries */
- Elf32_Word vn_file; /* Offset of filename for this
- dependency */
- Elf32_Word vn_aux; /* Offset in bytes to vernaux array */
- Elf32_Word vn_next; /* Offset in bytes to next verneed
- entry */
-} Elf32_Verneed;
-
-typedef struct
-{
- Elf64_Half vn_version; /* Version of structure */
- Elf64_Half vn_cnt; /* Number of associated aux entries */
- Elf64_Word vn_file; /* Offset of filename for this
- dependency */
- Elf64_Word vn_aux; /* Offset in bytes to vernaux array */
- Elf64_Word vn_next; /* Offset in bytes to next verneed
- entry */
-} Elf64_Verneed;
-
-
-/* Legal values for vn_version (version revision). */
-#define VER_NEED_NONE 0 /* No version */
-#define VER_NEED_CURRENT 1 /* Current version */
-#define VER_NEED_NUM 2 /* Given version number */
-
-/* Auxiliary needed version information. */
-
-typedef struct
-{
- Elf32_Word vna_hash; /* Hash value of dependency name */
- Elf32_Half vna_flags; /* Dependency specific information */
- Elf32_Half vna_other; /* Unused */
- Elf32_Word vna_name; /* Dependency name string offset */
- Elf32_Word vna_next; /* Offset in bytes to next vernaux
- entry */
-} Elf32_Vernaux;
-
-typedef struct
-{
- Elf64_Word vna_hash; /* Hash value of dependency name */
- Elf64_Half vna_flags; /* Dependency specific information */
- Elf64_Half vna_other; /* Unused */
- Elf64_Word vna_name; /* Dependency name string offset */
- Elf64_Word vna_next; /* Offset in bytes to next vernaux
- entry */
-} Elf64_Vernaux;
-
-
-/* Legal values for vna_flags. */
-#define VER_FLG_WEAK 0x2 /* Weak version identifier */
-
-
-/* Auxiliary vector. */
-
-/* This vector is normally only used by the program interpreter. The
- usual definition in an ABI supplement uses the name auxv_t. The
- vector is not usually defined in a standard <elf.h> file, but it
- can't hurt. We rename it to avoid conflicts. The sizes of these
- types are an arrangement between the exec server and the program
- interpreter, so we don't fully specify them here. */
-
-typedef struct
-{
- int a_type; /* Entry type */
- union
- {
- long int a_val; /* Integer value */
- void *a_ptr; /* Pointer value */
- void (*a_fcn) (void); /* Function pointer value */
- } a_un;
-} Elf32_auxv_t;
-
-typedef struct
-{
- long int a_type; /* Entry type */
- union
- {
- long int a_val; /* Integer value */
- void *a_ptr; /* Pointer value */
- void (*a_fcn) (void); /* Function pointer value */
- } a_un;
-} Elf64_auxv_t;
-
-/* Legal values for a_type (entry type). */
-
-#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_CLKTCK 17 /* Frequency of times() */
-
-/* Some more special a_type values describing the hardware. */
-#define AT_PLATFORM 15 /* String identifying platform. */
-#define AT_HWCAP 16 /* Machine dependent hints about
- processor capabilities. */
-
-/* This entry gives some information about the FPU initialization
- performed by the kernel. */
-#define AT_FPUCW 18 /* Used FPU control word. */
-
-
-/* Note section contents. Each entry in the note section begins with
- a header of a fixed form. */
-
-typedef struct
-{
- Elf32_Word n_namesz; /* Length of the note's name. */
- Elf32_Word n_descsz; /* Length of the note's descriptor. */
- Elf32_Word n_type; /* Type of the note. */
-} Elf32_Nhdr;
-
-typedef struct
-{
- Elf64_Word n_namesz; /* Length of the note's name. */
- Elf64_Word n_descsz; /* Length of the note's descriptor. */
- Elf64_Word n_type; /* Type of the note. */
-} Elf64_Nhdr;
-
-/* Known names of notes. */
-
-/* Solaris entries in the note section have this name. */
-#define ELF_NOTE_SOLARIS "SUNW Solaris"
-
-/* Note entries for GNU systems have this name. */
-#define ELF_NOTE_GNU "GNU"
-
-
-/* Defined types of notes for Solaris. */
-
-/* Value of descriptor (one word) is desired pagesize for the binary. */
-#define ELF_NOTE_PAGESIZE_HINT 1
-
-
-/* Defined note types for GNU systems. */
-
-/* ABI information. The descriptor consists of words:
- word 0: OS descriptor
- word 1: major version of the ABI
- word 2: minor version of the ABI
- word 3: subminor version of the ABI
-*/
-#define ELF_NOTE_ABI 1
-
-/* Known OSes. These value can appear in word 0 of an ELF_NOTE_ABI
- note section entry. */
-#define ELF_NOTE_OS_LINUX 0
-#define ELF_NOTE_OS_GNU 1
-#define ELF_NOTE_OS_SOLARIS2 2
-
-
-/* Move records. */
-typedef struct
-{
- Elf32_Xword m_value; /* Symbol value. */
- Elf32_Word m_info; /* Size and index. */
- Elf32_Word m_poffset; /* Symbol offset. */
- Elf32_Half m_repeat; /* Repeat count. */
- Elf32_Half m_stride; /* Stride info. */
-} Elf32_Move;
-
-typedef struct
-{
- Elf64_Xword m_value; /* Symbol value. */
- Elf64_Xword m_info; /* Size and index. */
- Elf64_Xword m_poffset; /* Symbol offset. */
- Elf64_Half m_repeat; /* Repeat count. */
- Elf64_Half m_stride; /* Stride info. */
-} Elf64_Move;
-
-/* Macro to construct move records. */
-#define ELF32_M_SYM(info) ((info) >> 8)
-#define ELF32_M_SIZE(info) ((unsigned char) (info))
-#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size))
-
-#define ELF64_M_SYM(info) ELF32_M_SYM (info)
-#define ELF64_M_SIZE(info) ELF32_M_SIZE (info)
-#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size)
-
-
-/* Motorola 68k specific definitions. */
-
-/* Values for Elf32_Ehdr.e_flags. */
-#define EF_CPU32 0x00810000
-
-/* m68k relocs. */
-
-#define R_68K_NONE 0 /* No reloc */
-#define R_68K_32 1 /* Direct 32 bit */
-#define R_68K_16 2 /* Direct 16 bit */
-#define R_68K_8 3 /* Direct 8 bit */
-#define R_68K_PC32 4 /* PC relative 32 bit */
-#define R_68K_PC16 5 /* PC relative 16 bit */
-#define R_68K_PC8 6 /* PC relative 8 bit */
-#define R_68K_GOT32 7 /* 32 bit PC relative GOT entry */
-#define R_68K_GOT16 8 /* 16 bit PC relative GOT entry */
-#define R_68K_GOT8 9 /* 8 bit PC relative GOT entry */
-#define R_68K_GOT32O 10 /* 32 bit GOT offset */
-#define R_68K_GOT16O 11 /* 16 bit GOT offset */
-#define R_68K_GOT8O 12 /* 8 bit GOT offset */
-#define R_68K_PLT32 13 /* 32 bit PC relative PLT address */
-#define R_68K_PLT16 14 /* 16 bit PC relative PLT address */
-#define R_68K_PLT8 15 /* 8 bit PC relative PLT address */
-#define R_68K_PLT32O 16 /* 32 bit PLT offset */
-#define R_68K_PLT16O 17 /* 16 bit PLT offset */
-#define R_68K_PLT8O 18 /* 8 bit PLT offset */
-#define R_68K_COPY 19 /* Copy symbol at runtime */
-#define R_68K_GLOB_DAT 20 /* Create GOT entry */
-#define R_68K_JMP_SLOT 21 /* Create PLT entry */
-#define R_68K_RELATIVE 22 /* Adjust by program base */
-/* Keep this the last entry. */
-#define R_68K_NUM 23
-
-/* Intel 80386 specific definitions. */
-
-/* i386 relocs. */
-
-#define R_386_NONE 0 /* No reloc */
-#define R_386_32 1 /* Direct 32 bit */
-#define R_386_PC32 2 /* PC relative 32 bit */
-#define R_386_GOT32 3 /* 32 bit GOT entry */
-#define R_386_PLT32 4 /* 32 bit PLT address */
-#define R_386_COPY 5 /* Copy symbol at runtime */
-#define R_386_GLOB_DAT 6 /* Create GOT entry */
-#define R_386_JMP_SLOT 7 /* Create PLT entry */
-#define R_386_RELATIVE 8 /* Adjust by program base */
-#define R_386_GOTOFF 9 /* 32 bit offset to GOT */
-#define R_386_GOTPC 10 /* 32 bit PC relative offset to GOT */
-/* Keep this the last entry. */
-#define R_386_NUM 11
-
-/* SUN SPARC specific definitions. */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type). */
-
-#define STT_REGISTER 13 /* Global register reserved to app. */
-
-/* Values for Elf64_Ehdr.e_flags. */
-
-#define EF_SPARCV9_MM 3
-#define EF_SPARCV9_TSO 0
-#define EF_SPARCV9_PSO 1
-#define EF_SPARCV9_RMO 2
-#define EF_SPARC_LEDATA 0x800000 /* little endian data */
-#define EF_SPARC_EXT_MASK 0xFFFF00
-#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */
-#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */
-#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */
-#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */
-
-/* SPARC relocs. */
-
-#define R_SPARC_NONE 0 /* No reloc */
-#define R_SPARC_8 1 /* Direct 8 bit */
-#define R_SPARC_16 2 /* Direct 16 bit */
-#define R_SPARC_32 3 /* Direct 32 bit */
-#define R_SPARC_DISP8 4 /* PC relative 8 bit */
-#define R_SPARC_DISP16 5 /* PC relative 16 bit */
-#define R_SPARC_DISP32 6 /* PC relative 32 bit */
-#define R_SPARC_WDISP30 7 /* PC relative 30 bit shifted */
-#define R_SPARC_WDISP22 8 /* PC relative 22 bit shifted */
-#define R_SPARC_HI22 9 /* High 22 bit */
-#define R_SPARC_22 10 /* Direct 22 bit */
-#define R_SPARC_13 11 /* Direct 13 bit */
-#define R_SPARC_LO10 12 /* Truncated 10 bit */
-#define R_SPARC_GOT10 13 /* Truncated 10 bit GOT entry */
-#define R_SPARC_GOT13 14 /* 13 bit GOT entry */
-#define R_SPARC_GOT22 15 /* 22 bit GOT entry shifted */
-#define R_SPARC_PC10 16 /* PC relative 10 bit truncated */
-#define R_SPARC_PC22 17 /* PC relative 22 bit shifted */
-#define R_SPARC_WPLT30 18 /* 30 bit PC relative PLT address */
-#define R_SPARC_COPY 19 /* Copy symbol at runtime */
-#define R_SPARC_GLOB_DAT 20 /* Create GOT entry */
-#define R_SPARC_JMP_SLOT 21 /* Create PLT entry */
-#define R_SPARC_RELATIVE 22 /* Adjust by program base */
-#define R_SPARC_UA32 23 /* Direct 32 bit unaligned */
-
-/* Additional Sparc64 relocs. */
-
-#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */
-#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */
-#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */
-#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */
-#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */
-#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */
-#define R_SPARC_10 30 /* Direct 10 bit */
-#define R_SPARC_11 31 /* Direct 11 bit */
-#define R_SPARC_64 32 /* Direct 64 bit */
-#define R_SPARC_OLO10 33 /* 10bit with secondary 13bit addend */
-#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */
-#define R_SPARC_HM10 35 /* High middle 10 bits of ... */
-#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */
-#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */
-#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */
-#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */
-#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */
-#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */
-#define R_SPARC_7 43 /* Direct 7 bit */
-#define R_SPARC_5 44 /* Direct 5 bit */
-#define R_SPARC_6 45 /* Direct 6 bit */
-#define R_SPARC_DISP64 46 /* PC relative 64 bit */
-#define R_SPARC_PLT64 47 /* Direct 64 bit ref to PLT entry */
-#define R_SPARC_HIX22 48 /* High 22 bit complemented */
-#define R_SPARC_LOX10 49 /* Truncated 11 bit complemented */
-#define R_SPARC_H44 50 /* Direct high 12 of 44 bit */
-#define R_SPARC_M44 51 /* Direct mid 22 of 44 bit */
-#define R_SPARC_L44 52 /* Direct low 10 of 44 bit */
-#define R_SPARC_REGISTER 53 /* Global register usage */
-#define R_SPARC_UA64 54 /* Direct 64 bit unaligned */
-#define R_SPARC_UA16 55 /* Direct 16 bit unaligned */
-/* Keep this the last entry. */
-#define R_SPARC_NUM 56
-
-/* For Sparc64, legal values for d_tag of Elf64_Dyn. */
-
-#define DT_SPARC_REGISTER 0x70000001
-#define DT_SPARC_NUM 2
-
-/* Bits present in AT_HWCAP, primarily for Sparc32. */
-
-#define HWCAP_SPARC_FLUSH 1 /* The cpu supports flush insn. */
-#define HWCAP_SPARC_STBAR 2
-#define HWCAP_SPARC_SWAP 4
-#define HWCAP_SPARC_MULDIV 8
-#define HWCAP_SPARC_V9 16 /* The cpu is v9, so v8plus is ok. */
-
-/* MIPS R3000 specific definitions. */
-
-/* Legal values for e_flags field of Elf32_Ehdr. */
-
-#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used */
-#define EF_MIPS_PIC 2 /* Contains PIC code */
-#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */
-#define EF_MIPS_XGOT 8
-#define EF_MIPS_64BIT_WHIRL 16
-#define EF_MIPS_ABI2 32
-#define EF_MIPS_ABI_ON32 64
-#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */
-
-/* Legal values for MIPS architecture level. */
-
-#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
-#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
-#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
-#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
-#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
-
-/* The following are non-official names and should not be used. */
-
-#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
-#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
-#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
-#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
-#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
-
-/* Special section indices. */
-
-#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */
-#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */
-#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */
-#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */
-#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */
-
-/* Legal values for sh_type field of Elf32_Shdr. */
-
-#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */
-#define SHT_MIPS_MSYM 0x70000001
-#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */
-#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */
-#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */
-#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information*/
-#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */
-#define SHT_MIPS_PACKAGE 0x70000007
-#define SHT_MIPS_PACKSYM 0x70000008
-#define SHT_MIPS_RELD 0x70000009
-#define SHT_MIPS_IFACE 0x7000000b
-#define SHT_MIPS_CONTENT 0x7000000c
-#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */
-#define SHT_MIPS_SHDR 0x70000010
-#define SHT_MIPS_FDESC 0x70000011
-#define SHT_MIPS_EXTSYM 0x70000012
-#define SHT_MIPS_DENSE 0x70000013
-#define SHT_MIPS_PDESC 0x70000014
-#define SHT_MIPS_LOCSYM 0x70000015
-#define SHT_MIPS_AUXSYM 0x70000016
-#define SHT_MIPS_OPTSYM 0x70000017
-#define SHT_MIPS_LOCSTR 0x70000018
-#define SHT_MIPS_LINE 0x70000019
-#define SHT_MIPS_RFDESC 0x7000001a
-#define SHT_MIPS_DELTASYM 0x7000001b
-#define SHT_MIPS_DELTAINST 0x7000001c
-#define SHT_MIPS_DELTACLASS 0x7000001d
-#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */
-#define SHT_MIPS_DELTADECL 0x7000001f
-#define SHT_MIPS_SYMBOL_LIB 0x70000020
-#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */
-#define SHT_MIPS_TRANSLATE 0x70000022
-#define SHT_MIPS_PIXIE 0x70000023
-#define SHT_MIPS_XLATE 0x70000024
-#define SHT_MIPS_XLATE_DEBUG 0x70000025
-#define SHT_MIPS_WHIRL 0x70000026
-#define SHT_MIPS_EH_REGION 0x70000027
-#define SHT_MIPS_XLATE_OLD 0x70000028
-#define SHT_MIPS_PDR_EXCEPTION 0x70000029
-
-/* Legal values for sh_flags field of Elf32_Shdr. */
-
-#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */
-#define SHF_MIPS_MERGE 0x20000000
-#define SHF_MIPS_ADDR 0x40000000
-#define SHF_MIPS_STRINGS 0x80000000
-#define SHF_MIPS_NOSTRIP 0x08000000
-#define SHF_MIPS_LOCAL 0x04000000
-#define SHF_MIPS_NAMES 0x02000000
-#define SHF_MIPS_NODUPE 0x01000000
-
-
-/* Symbol tables. */
-
-/* MIPS specific values for `st_other'. */
-#define STO_MIPS_DEFAULT 0x0
-#define STO_MIPS_INTERNAL 0x1
-#define STO_MIPS_HIDDEN 0x2
-#define STO_MIPS_PROTECTED 0x3
-#define STO_MIPS_SC_ALIGN_UNUSED 0xff
-
-/* MIPS specific values for `st_info'. */
-#define STB_MIPS_SPLIT_COMMON 13
-
-/* Entries found in sections of type SHT_MIPS_GPTAB. */
-
-typedef union
-{
- struct
- {
- Elf32_Word gt_current_g_value; /* -G value used for compilation */
- Elf32_Word gt_unused; /* Not used */
- } gt_header; /* First entry in section */
- struct
- {
- Elf32_Word gt_g_value; /* If this value were used for -G */
- Elf32_Word gt_bytes; /* This many bytes would be used */
- } gt_entry; /* Subsequent entries in section */
-} Elf32_gptab;
-
-/* Entry found in sections of type SHT_MIPS_REGINFO. */
-
-typedef struct
-{
- Elf32_Word ri_gprmask; /* General registers used */
- Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */
- Elf32_Sword ri_gp_value; /* $gp register value */
-} Elf32_RegInfo;
-
-/* Entries found in sections of type SHT_MIPS_OPTIONS. */
-
-typedef struct
-{
- unsigned char kind; /* Determines interpretation of the
- variable part of descriptor. */
- unsigned char size; /* Size of descriptor, including header. */
- Elf32_Section section; /* Section header index of section affected,
- 0 for global options. */
- Elf32_Word info; /* Kind-specific information. */
-} Elf_Options;
-
-/* Values for `kind' field in Elf_Options. */
-
-#define ODK_NULL 0 /* Undefined. */
-#define ODK_REGINFO 1 /* Register usage information. */
-#define ODK_EXCEPTIONS 2 /* Exception processing options. */
-#define ODK_PAD 3 /* Section padding options. */
-#define ODK_HWPATCH 4 /* Hardware workarounds performed */
-#define ODK_FILL 5 /* record the fill value used by the linker. */
-#define ODK_TAGS 6 /* reserve space for desktop tools to write. */
-#define ODK_HWAND 7 /* HW workarounds. 'AND' bits when merging. */
-#define ODK_HWOR 8 /* HW workarounds. 'OR' bits when merging. */
-
-/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */
-
-#define OEX_FPU_MIN 0x1f /* FPE's which MUST be enabled. */
-#define OEX_FPU_MAX 0x1f00 /* FPE's which MAY be enabled. */
-#define OEX_PAGE0 0x10000 /* page zero must be mapped. */
-#define OEX_SMM 0x20000 /* Force sequential memory mode? */
-#define OEX_FPDBUG 0x40000 /* Force floating point debug mode? */
-#define OEX_PRECISEFP OEX_FPDBUG
-#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults? */
-
-#define OEX_FPU_INVAL 0x10
-#define OEX_FPU_DIV0 0x08
-#define OEX_FPU_OFLO 0x04
-#define OEX_FPU_UFLO 0x02
-#define OEX_FPU_INEX 0x01
-
-/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */
-
-#define OHW_R4KEOP 0x1 /* R4000 end-of-page patch. */
-#define OHW_R8KPFETCH 0x2 /* may need R8000 prefetch patch. */
-#define OHW_R5KEOP 0x4 /* R5000 end-of-page patch. */
-#define OHW_R5KCVTL 0x8 /* R5000 cvt.[ds].l bug. clean=1. */
-
-#define OPAD_PREFIX 0x1
-#define OPAD_POSTFIX 0x2
-#define OPAD_SYMBOL 0x4
-
-/* Entry found in `.options' section. */
-
-typedef struct
-{
- Elf32_Word hwp_flags1; /* Extra flags. */
- Elf32_Word hwp_flags2; /* Extra flags. */
-} Elf_Options_Hw;
-
-/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */
-
-#define OHWA0_R4KEOP_CHECKED 0x00000001
-#define OHWA1_R4KEOP_CLEAN 0x00000002
-
-/* MIPS relocs. */
-
-#define R_MIPS_NONE 0 /* No reloc */
-#define R_MIPS_16 1 /* Direct 16 bit */
-#define R_MIPS_32 2 /* Direct 32 bit */
-#define R_MIPS_REL32 3 /* PC relative 32 bit */
-#define R_MIPS_26 4 /* Direct 26 bit shifted */
-#define R_MIPS_HI16 5 /* High 16 bit */
-#define R_MIPS_LO16 6 /* Low 16 bit */
-#define R_MIPS_GPREL16 7 /* GP relative 16 bit */
-#define R_MIPS_LITERAL 8 /* 16 bit literal entry */
-#define R_MIPS_GOT16 9 /* 16 bit GOT entry */
-#define R_MIPS_PC16 10 /* PC relative 16 bit */
-#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */
-#define R_MIPS_GPREL32 12 /* GP relative 32 bit */
-
-#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
-#define R_MIPS_GOT_HI16 22
-#define R_MIPS_GOT_LO16 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
-#define R_MIPS_CALL_HI16 30
-#define R_MIPS_CALL_LO16 31
-#define R_MIPS_SCN_DISP 32
-#define R_MIPS_REL16 33
-#define R_MIPS_ADD_IMMEDIATE 34
-#define R_MIPS_PJUMP 35
-#define R_MIPS_RELGOT 36
-#define R_MIPS_JALR 37
-/* Keep this the last entry. */
-#define R_MIPS_NUM 38
-
-/* Legal values for p_type field of Elf32_Phdr. */
-
-#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */
-#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */
-#define PT_MIPS_OPTIONS 0x70000002
-
-/* Special program header types. */
-
-#define PF_MIPS_LOCAL 0x10000000
-
-/* Legal values for d_tag field of Elf32_Dyn. */
-
-#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime linker interface version */
-#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */
-#define DT_MIPS_ICHECKSUM 0x70000003 /* Checksum */
-#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */
-#define DT_MIPS_FLAGS 0x70000005 /* Flags */
-#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */
-#define DT_MIPS_MSYM 0x70000007
-#define DT_MIPS_CONFLICT 0x70000008 /* Address of CONFLICT section */
-#define DT_MIPS_LIBLIST 0x70000009 /* Address of LIBLIST section */
-#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local GOT entries */
-#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of CONFLICT entries */
-#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of LIBLIST entries */
-#define DT_MIPS_SYMTABNO 0x70000011 /* Number of DYNSYM entries */
-#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */
-#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in DYNSYM */
-#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */
-#define DT_MIPS_RLD_MAP 0x70000016 /* Address of run time loader map. */
-#define DT_MIPS_DELTA_CLASS 0x70000017 /* Delta C++ class definition. */
-#define DT_MIPS_DELTA_CLASS_NO 0x70000018 /* Number of entries in
- DT_MIPS_DELTA_CLASS. */
-#define DT_MIPS_DELTA_INSTANCE 0x70000019 /* Delta C++ class instances. */
-#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
- DT_MIPS_DELTA_INSTANCE. */
-#define DT_MIPS_DELTA_RELOC 0x7000001b /* Delta relocations. */
-#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
- DT_MIPS_DELTA_RELOC. */
-#define DT_MIPS_DELTA_SYM 0x7000001d /* Delta symbols that Delta
- relocations refer to. */
-#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
- DT_MIPS_DELTA_SYM. */
-#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
- class declaration. */
-#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
- DT_MIPS_DELTA_CLASSSYM. */
-#define DT_MIPS_CXX_FLAGS 0x70000022 /* Flags indicating for C++ flavor. */
-#define DT_MIPS_PIXIE_INIT 0x70000023
-#define DT_MIPS_SYMBOL_LIB 0x70000024
-#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
-#define DT_MIPS_LOCAL_GOTIDX 0x70000026
-#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
-#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
-#define DT_MIPS_OPTIONS 0x70000029 /* Address of .options. */
-#define DT_MIPS_INTERFACE 0x7000002a /* Address of .interface. */
-#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
-#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
-#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
- function stored in GOT. */
-#define DT_MIPS_PERF_SUFFIX 0x7000002e /* Default suffix of dso to be added
- by rld on dlopen() calls. */
-#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
-#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */
-#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */
-#define DT_MIPS_NUM 0x32
-
-/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */
-
-#define RHF_NONE 0 /* No flags */
-#define RHF_QUICKSTART (1 << 0) /* Use quickstart */
-#define RHF_NOTPOT (1 << 1) /* Hash size not power of 2 */
-#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) /* Ignore LD_LIBRARY_PATH */
-#define RHF_NO_MOVE (1 << 3)
-#define RHF_SGI_ONLY (1 << 4)
-#define RHF_GUARANTEE_INIT (1 << 5)
-#define RHF_DELTA_C_PLUS_PLUS (1 << 6)
-#define RHF_GUARANTEE_START_INIT (1 << 7)
-#define RHF_PIXIE (1 << 8)
-#define RHF_DEFAULT_DELAY_LOAD (1 << 9)
-#define RHF_REQUICKSTART (1 << 10)
-#define RHF_REQUICKSTARTED (1 << 11)
-#define RHF_CORD (1 << 12)
-#define RHF_NO_UNRES_UNDEF (1 << 13)
-#define RHF_RLD_ORDER_SAFE (1 << 14)
-
-/* Entries found in sections of type SHT_MIPS_LIBLIST. */
-
-typedef struct
-{
- Elf32_Word l_name; /* Name (string table index) */
- Elf32_Word l_time_stamp; /* Timestamp */
- Elf32_Word l_checksum; /* Checksum */
- Elf32_Word l_version; /* Interface version */
- Elf32_Word l_flags; /* Flags */
-} Elf32_Lib;
-
-typedef struct
-{
- Elf64_Word l_name; /* Name (string table index) */
- Elf64_Word l_time_stamp; /* Timestamp */
- Elf64_Word l_checksum; /* Checksum */
- Elf64_Word l_version; /* Interface version */
- Elf64_Word l_flags; /* Flags */
-} Elf64_Lib;
-
-
-/* Legal values for l_flags. */
-
-#define LL_NONE 0
-#define LL_EXACT_MATCH (1 << 0) /* Require exact match */
-#define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */
-#define LL_REQUIRE_MINOR (1 << 2)
-#define LL_EXPORTS (1 << 3)
-#define LL_DELAY_LOAD (1 << 4)
-#define LL_DELTA (1 << 5)
-
-/* Entries found in sections of type SHT_MIPS_CONFLICT. */
-
-typedef Elf32_Addr Elf32_Conflict;
-
-
-/* HPPA specific definitions. */
-
-/* Legal values for e_flags field of Elf32_Ehdr. */
-
-#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */
-#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */
-#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */
-#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */
-#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch
- prediction. */
-#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */
-#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */
-
-/* Defined values for `e_flags & EF_PARISC_ARCH' are: */
-
-#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */
-#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */
-#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */
-
-/* Additional section indeces. */
-
-#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared
- symbols in ANSI C. */
-#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */
-
-/* Legal values for sh_type field of Elf32_Shdr. */
-
-#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */
-#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */
-#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */
-
-/* Legal values for sh_flags field of Elf32_Shdr. */
-
-#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */
-#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */
-#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type). */
-
-#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */
-
-#define STT_HP_OPAQUE (STT_LOOS + 0x1)
-#define STT_HP_STUB (STT_LOOS + 0x2)
-
-/* HPPA relocs. */
-
-#define R_PARISC_NONE 0 /* No reloc. */
-#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */
-#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */
-#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */
-#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */
-#define R_PARISC_DIR14R 5 /* Right 14 bits of eff. address. */
-#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */
-#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */
-#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */
-#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */
-#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */
-#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */
-#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */
-#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */
-#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */
-#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */
-#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */
-#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */
-#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */
-#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */
-#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */
-#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */
-#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */
-#define R_PARISC_FPTR64 64 /* 64 bits function address. */
-#define R_PARISC_PLABEL32 65 /* 32 bits function address. */
-#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */
-#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */
-#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */
-#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */
-#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */
-#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */
-#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */
-#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */
-#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */
-#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */
-#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */
-#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */
-#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */
-#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */
-#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */
-#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */
-#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */
-#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */
-#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */
-#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */
-#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */
-#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */
-#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */
-#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */
-#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */
-#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */
-#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */
-#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */
-#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */
-#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */
-#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */
-#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */
-#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */
-#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */
-#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */
-#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */
-#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */
-#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */
-#define R_PARISC_LORESERVE 128
-#define R_PARISC_COPY 128 /* Copy relocation. */
-#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */
-#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */
-#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */
-#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */
-#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */
-#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */
-#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */
-#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */
-#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */
-#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */
-#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */
-#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */
-#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */
-#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */
-#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */
-#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */
-#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */
-#define R_PARISC_HIRESERVE 255
-
-/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
-
-#define PT_HP_TLS (PT_LOOS + 0x0)
-#define PT_HP_CORE_NONE (PT_LOOS + 0x1)
-#define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
-#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
-#define PT_HP_CORE_COMM (PT_LOOS + 0x4)
-#define PT_HP_CORE_PROC (PT_LOOS + 0x5)
-#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
-#define PT_HP_CORE_STACK (PT_LOOS + 0x7)
-#define PT_HP_CORE_SHM (PT_LOOS + 0x8)
-#define PT_HP_CORE_MMF (PT_LOOS + 0x9)
-#define PT_HP_PARALLEL (PT_LOOS + 0x10)
-#define PT_HP_FASTBIND (PT_LOOS + 0x11)
-#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
-#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
-#define PT_HP_STACK (PT_LOOS + 0x14)
-
-#define PT_PARISC_ARCHEXT 0x70000000
-#define PT_PARISC_UNWIND 0x70000001
-
-/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
-
-#define PF_PARISC_SBP 0x08000000
-
-#define PF_HP_PAGE_SIZE 0x00100000
-#define PF_HP_FAR_SHARED 0x00200000
-#define PF_HP_NEAR_SHARED 0x00400000
-#define PF_HP_CODE 0x01000000
-#define PF_HP_MODIFY 0x02000000
-#define PF_HP_LAZYSWAP 0x04000000
-#define PF_HP_SBP 0x08000000
-
-
-/* Alpha specific definitions. */
-
-/* Legal values for e_flags field of Elf64_Ehdr. */
-
-#define EF_ALPHA_32BIT 1 /* All addresses must be < 2GB. */
-#define EF_ALPHA_CANRELAX 2 /* Relocations for relaxing exist. */
-
-/* Legal values for sh_type field of Elf64_Shdr. */
-
-/* These two are primerily concerned with ECOFF debugging info. */
-#define SHT_ALPHA_DEBUG 0x70000001
-#define SHT_ALPHA_REGINFO 0x70000002
-
-/* Legal values for sh_flags field of Elf64_Shdr. */
-
-#define SHF_ALPHA_GPREL 0x10000000
-
-/* Legal values for st_other field of Elf64_Sym. */
-#define STO_ALPHA_NOPV 0x80 /* No PV required. */
-#define STO_ALPHA_STD_GPLOAD 0x88 /* PV only used for initial ldgp. */
-
-/* Alpha relocs. */
-
-#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 */
-/* Keep this the last entry. */
-#define R_ALPHA_NUM 28
-
-
-/* PowerPC specific declarations */
-
-/* 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 specific declarations */
-
-/* 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
-
-/* ARM-specific values for sh_flags */
-#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
-#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
- in the input to a link step */
-
-/* ARM-specific program header flags */
-#define PF_ARM_SB 0x10000000 /* Segment contains the location
- addressed by the static base */
-
-/* ARM relocs. */
-#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
-
-/* IA-64 specific declarations. */
-
-/* Processor specific flags for the Ehdr e_flags field. */
-#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */
-#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */
-#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */
-
-/* Processor specific values for the Phdr p_type field. */
-#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */
-#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */
-
-/* Processor specific flags for the Phdr p_flags field. */
-#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */
-
-/* Processor specific values for the Shdr sh_type field. */
-#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */
-#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */
-
-/* Processor specific flags for the Shdr sh_flags field. */
-#define SHF_IA_64_SHORT 0x10000000 /* section near gp */
-#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */
-
-/* Processor specific values for the Dyn d_tag field. */
-#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0)
-#define DT_IA_64_NUM 1
-
-/* IA-64 relocations. */
-#define R_IA64_NONE 0x00 /* none */
-#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */
-#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */
-#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
-#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */
-#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */
-#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */
-#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */
-#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */
-#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */
-#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */
-#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */
-#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */
-#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */
-#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */
-#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */
-#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */
-#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */
-#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */
-#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */
-#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */
-#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */
-#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */
-#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */
-#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */
-#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */
-#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */
-#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */
-#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */
-#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */
-#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */
-#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */
-#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */
-#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */
-#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */
-#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */
-#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */
-#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */
-#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */
-#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */
-#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */
-#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */
-#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */
-#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */
-#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */
-#define R_IA64_REL32MSB 0x6c /* data 4 + REL */
-#define R_IA64_REL32LSB 0x6d /* data 4 + REL */
-#define R_IA64_REL64MSB 0x6e /* data 8 + REL */
-#define R_IA64_REL64LSB 0x6f /* data 8 + REL */
-#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */
-#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */
-#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */
-#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */
-#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */
-#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */
-#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */
-#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */
-#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */
-#define R_IA64_COPY 0x84 /* copy relocation */
-#define R_IA64_SUB 0x85 /* Addend and symbol difference */
-#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */
-#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */
-#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */
-#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */
-#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */
-#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */
-#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */
-#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */
-#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */
-#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */
-#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */
-#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */
-#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */
-#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */
-#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */
-#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */
-#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */
-
-/* SH specific declarations */
-
-/* SH relocs. */
-#define R_SH_NONE 0
-#define R_SH_DIR32 1
-#define R_SH_REL32 2
-#define R_SH_DIR8WPN 3
-#define R_SH_IND12W 4
-#define R_SH_DIR8WPL 5
-#define R_SH_DIR8WPZ 6
-#define R_SH_DIR8BP 7
-#define R_SH_DIR8W 8
-#define R_SH_DIR8L 9
-#define R_SH_SWITCH16 25
-#define R_SH_SWITCH32 26
-#define R_SH_USES 27
-#define R_SH_COUNT 28
-#define R_SH_ALIGN 29
-#define R_SH_CODE 30
-#define R_SH_DATA 31
-#define R_SH_LABEL 32
-#define R_SH_SWITCH8 33
-#define R_SH_GNU_VTINHERIT 34
-#define R_SH_GNU_VTENTRY 35
-#define R_SH_GOT32 160
-#define R_SH_PLT32 161
-#define R_SH_COPY 162
-#define R_SH_GLOB_DAT 163
-#define R_SH_JMP_SLOT 164
-#define R_SH_RELATIVE 165
-#define R_SH_GOTOFF 166
-#define R_SH_GOTPC 167
-/* Keep this the last entry. */
-#define R_SH_NUM 256
-
-/* Additional s390 relocs */
-
-#define R_390_NONE 0 /* No reloc. */
-#define R_390_8 1 /* Direct 8 bit. */
-#define R_390_12 2 /* Direct 12 bit. */
-#define R_390_16 3 /* Direct 16 bit. */
-#define R_390_32 4 /* Direct 32 bit. */
-#define R_390_PC32 5 /* PC relative 32 bit. */
-#define R_390_GOT12 6 /* 12 bit GOT offset. */
-#define R_390_GOT32 7 /* 32 bit GOT offset. */
-#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */
-#define R_390_COPY 9 /* Copy symbol at runtime. */
-#define R_390_GLOB_DAT 10 /* Create GOT entry. */
-#define R_390_JMP_SLOT 11 /* Create PLT entry. */
-#define R_390_RELATIVE 12 /* Adjust by program base. */
-#define R_390_GOTOFF 13 /* 32 bit offset to GOT. */
-#define R_390_GOTPC 14 /* 32 bit PC relative offset to GOT. */
-#define R_390_GOT16 15 /* 16 bit GOT offset. */
-#define R_390_PC16 16 /* PC relative 16 bit. */
-#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */
-#define R_390_PLT16DBL 18 /* 32 bit PC rel. PLT shifted by 1. */
-/* Keep this the last entry. */
-#define R_390_NUM 19
-
-#endif /* elf.h */
diff --git a/mdk-stage1/dietlibc/include/endian.h b/mdk-stage1/dietlibc/include/endian.h
deleted file mode 100644
index 463c24fff..000000000
--- a/mdk-stage1/dietlibc/include/endian.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef _ENDIAN_H
-#define _ENDIAN_H
-
-#define __LITTLE_ENDIAN 1234
-#define __BIG_ENDIAN 4321
-
-#ifdef __i386__
-#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
-#endif
-
-#ifdef __mips__
-#ifdef __MIPSEB__
-#define __BIG_ENDIAN__
-#endif
-#endif
-
-#ifndef __BYTE_ORDER
-#ifdef __BIG_ENDIAN__
-#define __BYTE_ORDER __BIG_ENDIAN
-#define __FLOAT_WORD_ORDER __BYTE_ORDER
-#else
-#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
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# define __LONG_LONG_PAIR(HI, LO) LO, HI
-#elif __BYTE_ORDER == __BIG_ENDIAN
-# define __LONG_LONG_PAIR(HI, LO) HI, LO
-#endif
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/errno.h b/mdk-stage1/dietlibc/include/errno.h
deleted file mode 100644
index f4ba482b5..000000000
--- a/mdk-stage1/dietlibc/include/errno.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _ERRNO_H
-#define _ERRNO_H
-
-extern int errno;
-
-#include <linux/errno.h>
-
-extern void __set_errno(int error);
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/fcntl.h b/mdk-stage1/dietlibc/include/fcntl.h
deleted file mode 100644
index b792502c1..000000000
--- a/mdk-stage1/dietlibc/include/fcntl.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _FCNTL_H
-#define _FCNTL_H
-
-#include <sys/cdefs.h>
-
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <asm/fcntl.h>
-
-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;
-
-#define F_ULOCK 0 /* Unlock a previously locked region. */
-#define F_LOCK 1 /* Lock a region for exclusive use. */
-#define F_TLOCK 2 /* Test and lock a region for exclusive use. */
-#define F_TEST 3 /* Test a region for other processes locks. */
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/features.h b/mdk-stage1/dietlibc/include/features.h
deleted file mode 100644
index 02f081006..000000000
--- a/mdk-stage1/dietlibc/include/features.h
+++ /dev/null
@@ -1 +0,0 @@
-#warning "someone included features.h, apparently someone is including glibc headers!"
diff --git a/mdk-stage1/dietlibc/include/ftw.h b/mdk-stage1/dietlibc/include/ftw.h
deleted file mode 100644
index c888f0021..000000000
--- a/mdk-stage1/dietlibc/include/ftw.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef _FTW_H
-#define _FTW_H
-
-#include <sys/cdefs.h>
-#include <sys/stat.h>
-
-struct FTW
- {
- int base;
- int level;
- };
-
-int ftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth) __THROW;
-int nftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s), int depth, int flags) __THROW;
-
-enum
-{
- FTW_F, /* Regular file. */
-#define FTW_F FTW_F
- FTW_D, /* Directory. */
-#define FTW_D FTW_D
- FTW_DNR, /* Unreadable directory. */
-#define FTW_DNR FTW_DNR
- FTW_NS, /* Unstatable file. */
-#define FTW_NS FTW_NS
- FTW_SL, /* Symbolic link. */
-# define FTW_SL FTW_SL
-/* These flags are only passed from the `nftw' function. */
- FTW_DP, /* Directory, all subdirs have been visited. */
-# define FTW_DP FTW_DP
- FTW_SLN /* Symbolic link naming non-existing file. */
-# define FTW_SLN FTW_SLN
-};
-
-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,
- struct FTW *__info) __THROW;
-
-#ifndef __NO_STAT64
-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,
- int __flag, struct FTW *__info) __THROW;
-#endif
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/grp.h b/mdk-stage1/dietlibc/include/grp.h
deleted file mode 100644
index 2acd0f208..000000000
--- a/mdk-stage1/dietlibc/include/grp.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _GRP_H
-#define _GRP_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-struct group
- {
- char *gr_name; /* Group name. */
- char *gr_passwd; /* Password. */
- gid_t gr_gid; /* Group ID. */
- char **gr_mem; /* Member list. */
- };
-
-extern struct passwd *getgrgid (uid_t __uid) __THROW;
-extern struct passwd *getgrnam (const char *__name) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/limits.h b/mdk-stage1/dietlibc/include/limits.h
deleted file mode 100644
index ccc02150d..000000000
--- a/mdk-stage1/dietlibc/include/limits.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _LIMITS_H
-#define _LIMITS_H
-
-#include <linux/limits.h>
-
-#ifndef PATH_MAX
-#define PATH_MAX 4096
-#endif
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/malloc.h b/mdk-stage1/dietlibc/include/malloc.h
deleted file mode 100644
index c8b49f26d..000000000
--- a/mdk-stage1/dietlibc/include/malloc.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <stdlib.h>
diff --git a/mdk-stage1/dietlibc/include/net/if.h b/mdk-stage1/dietlibc/include/net/if.h
deleted file mode 100644
index e6e7be441..000000000
--- a/mdk-stage1/dietlibc/include/net/if.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef _NET_IF_H
-#define _NET_IF_H
-
-#include <sys/cdefs.h>
-
-unsigned int if_nametoindex (const char *ifname) __THROW;
-char *if_indextoname (unsigned int ifindex, char *ifname) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/netdb.h b/mdk-stage1/dietlibc/include/netdb.h
deleted file mode 100644
index 29f452ee9..000000000
--- a/mdk-stage1/dietlibc/include/netdb.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef _NETDB_H
-#define _NETDB_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-/* Absolute file name for network data base files. */
-#define _PATH_HEQUIV "/etc/hosts.equiv"
-#define _PATH_HOSTS "/etc/hosts"
-#define _PATH_NETWORKS "/etc/networks"
-#define _PATH_NSSWITCH_CONF "/etc/nsswitch.conf"
-#define _PATH_PROTOCOLS "/etc/protocols"
-#define _PATH_SERVICES "/etc/services"
-
-/* Description of data base entry for a single service. */
-struct servent
-{
- char *s_name; /* Official service name. */
- char **s_aliases; /* Alias list. */
- int s_port; /* Port number. */
- char *s_proto; /* Protocol to use. */
-};
-
-extern void endservent (void) __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
-{
- char *h_name; /* Official name of host. */
- char **h_aliases; /* Alias list. */
- int h_addrtype; /* Host address type. */
- socklen_t h_length; /* Length of address. */
- char **h_addr_list; /* List of addresses from name server. */
-#define h_addr h_addr_list[0] /* Address, for backward compatibility. */
-};
-
-extern void endhostent (void) __THROW;
-extern struct hostent *gethostent (void) __THROW;
-extern struct hostent *gethostbyaddr (const void *__addr, socklen_t __len,
- int __type) __THROW;
-extern struct hostent *gethostbyname (const char *__name) __THROW;
-extern struct hostent *gethostbyname2 (const char *__name, int __af) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/in.h b/mdk-stage1/dietlibc/include/netinet/in.h
deleted file mode 100644
index d83498a76..000000000
--- a/mdk-stage1/dietlibc/include/netinet/in.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _NETINET_IN_H
-#define _NETINET_IN_H
-
-#include <linux/in.h>
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/in_systm.h b/mdk-stage1/dietlibc/include/netinet/in_systm.h
deleted file mode 100644
index e69de29bb..000000000
--- a/mdk-stage1/dietlibc/include/netinet/in_systm.h
+++ /dev/null
diff --git a/mdk-stage1/dietlibc/include/netinet/ip.h b/mdk-stage1/dietlibc/include/netinet/ip.h
deleted file mode 100644
index 35bf9cc42..000000000
--- a/mdk-stage1/dietlibc/include/netinet/ip.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _NETINET_IP_H
-#define _NETINET_IP_H
-
-#include <linux/ip.h>
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/paths.h b/mdk-stage1/dietlibc/include/paths.h
deleted file mode 100644
index aac47e870..000000000
--- a/mdk-stage1/dietlibc/include/paths.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _PATHS_H
-#define _PATHS_H
-
-#define _PATH_BSHELL "/bin/sh"
-#define _PATH_DEFPATH "/bin:/usr/bin:"
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/pwd.h b/mdk-stage1/dietlibc/include/pwd.h
deleted file mode 100644
index c7120917c..000000000
--- a/mdk-stage1/dietlibc/include/pwd.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef _PWD_H
-#define _PWD_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-struct passwd {
- char *pw_name; /* Username. */
- char *pw_passwd; /* Password. */
- uid_t pw_uid; /* User ID. */
- gid_t pw_gid; /* Group ID. */
- char *pw_gecos; /* Real name. */
- char *pw_dir; /* Home directory. */
- char *pw_shell; /* Shell program. */
-};
-
-extern struct passwd *getpwuid (uid_t __uid) __THROW;
-extern struct passwd *getpwnam (const char *__name) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/setjmp.h b/mdk-stage1/dietlibc/include/setjmp.h
deleted file mode 100644
index a49b450ac..000000000
--- a/mdk-stage1/dietlibc/include/setjmp.h
+++ /dev/null
@@ -1,121 +0,0 @@
-#ifndef _SETJMP_H
-#define _SETJMP_H
-
-#include <sys/cdefs.h>
-
-#ifdef __i386__
-#ifndef __ASSEMBLER__
-typedef int __jmp_buf[6];
-#endif
-# define JB_BX 0
-# define JB_SI 1
-# define JB_DI 2
-# define JB_BP 3
-# define JB_SP 4
-# define JB_PC 5
-# define JB_SIZE 24
-#endif
-
-#ifdef __alpha__
-#define JB_S0 0
-#define JB_S1 1
-#define JB_S2 2
-#define JB_S3 3
-#define JB_S4 4
-#define JB_S5 5
-#define JB_PC 6
-#define JB_FP 7
-#define JB_SP 8
-#define JB_F2 9
-#define JB_F3 10
-#define JB_F4 11
-#define JB_F5 12
-#define JB_F6 13
-#define JB_F7 14
-#define JB_F8 15
-#define JB_F9 16
-#ifndef __ASSEMBLER__
-typedef long int __jmp_buf[17];
-#endif
-#endif
-
-#ifdef __mips__
-#ifndef __ASSEMBLER__
-typedef struct
- {
- void * __pc; /* Program counter. */
- void * __sp; /* Stack pointer. */
- int __regs[8]; /* Callee-saved registers s0 through s7. */
- void * __fp; /* The frame pointer. */
- void * __gp; /* The global pointer. */
- int __fpc_csr; /* Floating point status register. */
- double __fpregs[6]; /* Callee-saved floating point registers. */
- } __jmp_buf[1];
-#endif
-#endif
-
-#ifdef __sparc__
-#define JB_SP 0
-#define JB_FP 1
-#define JB_PC 2
-#ifndef __ASSEMBLER__
-typedef int __jmp_buf[3];
-#endif
-#endif
-
-#ifdef __arm__
-#define __JMP_BUF_SP 8
-#ifndef __ASSEMBLER__
-typedef int __jmp_buf[10];
-#endif
-#endif
-
-#ifdef __powerpc__
-# define JB_GPR1 0 /* Also known as the stack pointer */
-# define JB_GPR2 1
-# define JB_LR 2 /* The address we will return to */
-# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total */
-# define JB_CR 21 /* Condition code registers. */
-# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total */
-# define JB_SIZE (58*4)
-#ifndef __ASSEMBLER__
-typedef long int __jmp_buf[58];
-#endif
-#endif
-
-#ifndef __ASSEMBLER__
-
-typedef int __sig_atomic_t;
-
-# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
-typedef struct
- {
- unsigned long int __val[_SIGSET_NWORDS];
- } __sigset_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];
-
-extern int __sigsetjmp (jmp_buf __env, int __savemask) __THROW;
-
-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__));
-
-#define setjmp(env) __sigsetjmp(env,0)
-
-#endif
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/signal.h b/mdk-stage1/dietlibc/include/signal.h
deleted file mode 100644
index 9214d176d..000000000
--- a/mdk-stage1/dietlibc/include/signal.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef _SIGNAL_H
-#define _SIGNAL_H
-
-#include <sys/cdefs.h>
-
-#include <linux/types.h>
-#include <linux/signal.h>
-
-int sigemptyset(sigset_t *set) __THROW;
-int sigaddset(sigset_t *set, int signum) __THROW;
-int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) __THROW;
-int raise (int sig) __THROW;
-void (*signal(int signum, void (*sighandler)(int)))(int) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/stdint.h b/mdk-stage1/dietlibc/include/stdint.h
deleted file mode 100644
index d287e6794..000000000
--- a/mdk-stage1/dietlibc/include/stdint.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _STDINT_H
-#define _STDINT_H
-
-#include <sys/types.h>
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/stdio.h b/mdk-stage1/dietlibc/include/stdio.h
deleted file mode 100644
index 65974668d..000000000
--- a/mdk-stage1/dietlibc/include/stdio.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef _STDIO_H
-#define _STDIO_H
-
-#include <sys/types.h>
-
-typedef struct __stdio_file FILE;
-
-FILE *fopen (const char *path, const char *mode);
-FILE *fdopen (int fildes, const char *mode);
-FILE *freopen (const char *path, const char *mode, FILE *stream);
-
-int printf(const char *format, ...);
-int fprintf(FILE *stream, const char *format, ...);
-int sprintf(char *str, const char *format, ...);
-int snprintf(char *str, size_t size, const char *format, ...);
-
-int scanf( const char *format, ...);
-int fscanf( FILE *stream, const char *format, ...);
-int sscanf( const char *str, const char *format, ...);
-
-#include <stdarg.h>
-
-int vprintf(const char *format, va_list ap);
-int vfprintf(FILE *stream, const char *format, va_list ap);
-int vsprintf(char *str, const char *format, va_list ap);
-int vsnprintf(char *str, size_t size, const char *format, va_list ap);
-
-int vscanf( const char *format, va_list ap);
-int vsscanf( const char *str, const char *format, va_list ap);
-int vfscanf( FILE *stream, const char *format, va_list ap);
-
-int ferror(FILE *stream);
-int feof(FILE *stream);
-
-int fgetc(FILE *stream);
-char *fgets(char *s, int size, FILE *stream);
-int getc(FILE *stream);
-int getchar(void);
-char *gets(char *s);
-
-int fputc(int c, FILE *stream);
-int fputs(const char *s, FILE *stream);
-int putc(int c, FILE *stream);
-int putchar(int c);
-int puts(const char *s);
-
-int fseek( FILE *stream, long offset, int whence);
-long ftell( FILE *stream);
-void rewind( FILE *stream);
-int fgetpos( FILE *stream, fpos_t *pos);
-int fsetpos( FILE *stream, fpos_t *pos);
-
-size_t fread( 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 fflush(FILE *stream);
-
-int fclose(FILE *stream);
-
-extern FILE *stdin, *stdout, *stderr;
-
-#define EOF (int)(-1)
-
-void perror (const char *__s);
-
-#define BUFSIZ 128
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/stdlib.h b/mdk-stage1/dietlibc/include/stdlib.h
deleted file mode 100644
index c5fea2608..000000000
--- a/mdk-stage1/dietlibc/include/stdlib.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef _STDLIB_H
-#define _STDLIB_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-void *calloc(size_t nmemb, size_t size) __THROW;
-void *malloc(size_t size) __THROW;
-void free(void *ptr) __THROW;
-void *realloc(void *ptr, size_t size) __THROW;
-
-void *alloca(size_t size);
-
-char *getenv(const char *name) __pure__;
-
-int atexit(void (*function)(void)) __THROW;
-
-double strtod(const char *nptr, char **endptr) __THROW;
-long int strtol(const char *nptr, char **endptr, int base);
-unsigned long int strtoul(const char *nptr, char **endptr, int base);
-
-int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
-#ifdef __GNUC__
-long long int strtoll(const char *nptr, char **endptr, int base);
-unsigned long long int strtoull(const char *nptr, char **endptr, int base);
-int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase);
-#endif
-
-int atoi(const char *nptr);
-
-void abort(void);
-void exit(int);
-
-extern char **environ;
-
-#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
-#define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status))
-#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
-#define WTERMSIG(status) ((status) & 0x7f)
-#define WSTOPSIG(status) WEXITSTATUS(status)
-#define WIFEXITED(status) (WTERMSIG(status) == 0)
-
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/string.h b/mdk-stage1/dietlibc/include/string.h
deleted file mode 100644
index 133ac3b61..000000000
--- a/mdk-stage1/dietlibc/include/string.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef _STRING_H
-#define _STRING_H
-
-#include <sys/cdefs.h>
-#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__;
-int memcmp(const void *s1, const void *s2, size_t n) __THROW __pure__;
-int strcmp(const char *s1, const char *s2) __THROW __pure__;
-int strncmp(const char *s1, const char *s2, size_t n) __THROW __pure__;
-char *strstr (const char *__haystack, const char *__needle) __THROW __pure__;
-
-size_t strlen(const char *s) __THROW __pure__;
-
-char *strdup(const char *s) __THROW;
-
-char *strchr(const char *s, int c) __THROW;
-char *strrchr(const char *s, int c) __THROW;
-
-char *strcat(char *dest, const char *src) __THROW;
-char *strncat(char *dest, const char *src, size_t n) __THROW;
-
-size_t strcspn(const char *s, const char *reject);
-
-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 bcmp(s1,s2,n) memcmp(s1,s2,n)
-
-char *strerror (int __errnum) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/cdefs.h b/mdk-stage1/dietlibc/include/sys/cdefs.h
deleted file mode 100644
index 9f256f59f..000000000
--- a/mdk-stage1/dietlibc/include/sys/cdefs.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _SYS_CDEFS_H
-#define _SYS_CDEFS_H
-
-#ifndef __cplusplus
-#define throw ()
-#define __THROW
-#else
-#define __THROW throw ()
-#endif
-
-#ifndef __GNUC__
-#define __attribute__(xyz)
-#endif
-
-#define __pure__
-#ifdef __GNUC__
-#if (__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 96))
-#undef __pure__
-#define __pure__ __attribute__ ((__pure__))
-#endif
-
-#endif
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/ioctl.h b/mdk-stage1/dietlibc/include/sys/ioctl.h
deleted file mode 100644
index fca1aeeab..000000000
--- a/mdk-stage1/dietlibc/include/sys/ioctl.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _IOCTL_H
-#define _IOCTL_H
-
-#include <sys/cdefs.h>
-#include <linux/ioctl.h>
-#include <asm/ioctls.h>
-
-int ioctl(int d, int request, ...) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/mman.h b/mdk-stage1/dietlibc/include/sys/mman.h
deleted file mode 100644
index 03faa37ae..000000000
--- a/mdk-stage1/dietlibc/include/sys/mman.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef _SYS_MMAN_H
-#define _SYS_MMAN_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <linux/mman.h>
-
-#define MAP_FAILED ((void *) -1)
-
-extern void *mmap (void *__addr, size_t __len, int __prot,
- int __flags, int __fd, off_t __offset);
-
-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;
-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
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/mount.h b/mdk-stage1/dietlibc/include/sys/mount.h
deleted file mode 100644
index 1c4368a2f..000000000
--- a/mdk-stage1/dietlibc/include/sys/mount.h
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef _SYS_MOUNT_H
-#define _SYS_MOUNT_H 1
-
-#include <sys/ioctl.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
-};
-
-
-/* Mount a filesystem. */
-int mount(const char *specialfile, const char *dir, const char *filesystemtype, unsigned long rwflag, const void *data) __THROW;
-
-/* Unmount a filesystem. */
-extern int umount (const char *__special_file) __THROW;
-
-/* Unmount a filesystem. Force unmounting if FLAGS is set to MNT_FORCE. */
-extern int umount2 (const char *__special_file, int __flags) __THROW;
-
-#endif /* _SYS_MOUNT_H */
diff --git a/mdk-stage1/dietlibc/include/sys/resource.h b/mdk-stage1/dietlibc/include/sys/resource.h
deleted file mode 100644
index 953fc0eb2..000000000
--- a/mdk-stage1/dietlibc/include/sys/resource.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _SYS_RESOURCE_H
-#define _SYS_RESOURCE_H
-
-#include <sys/cdefs.h>
-#include <linux/resource.h>
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/select.h b/mdk-stage1/dietlibc/include/sys/select.h
deleted file mode 100644
index fa166a530..000000000
--- a/mdk-stage1/dietlibc/include/sys/select.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _SYS_SELECT_H
-#define _SYS_SELECT_H 1
-
-int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/socket.h b/mdk-stage1/dietlibc/include/sys/socket.h
deleted file mode 100644
index f590c35c4..000000000
--- a/mdk-stage1/dietlibc/include/sys/socket.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _SYS_SOCKET_H
-#define _SYS_SOCKET_H
-
-#include <sys/types.h>
-#include <linux/socket.h>
-
-int socket(int domain, int type, int protocol);
-int listen (int fd, int n);
-int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
-int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
-int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
-int recv(int s, void *buf, size_t len, int flags);
-int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
-int recvmsg(int s, struct msghdr *msg, int flags);
-int send(int s, const void *msg, size_t len, int flags);
-int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
-int sendmsg(int s, const struct msghdr *msg, int flags);
-int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
-int getsockname(int s , struct sockaddr * name , socklen_t * namelen );
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/stat.h b/mdk-stage1/dietlibc/include/sys/stat.h
deleted file mode 100644
index 7c3504218..000000000
--- a/mdk-stage1/dietlibc/include/sys/stat.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef _SYS_STAT_H
-#define _SYS_STAT_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <linux/stat.h>
-#include <asm/stat.h>
-
-#ifdef __alpha__
-#define __NO_STAT64
-#endif
-
-#define stat(file,buf) __dietstat(file,buf)
-#define fstat(file,buf) __dietfstat(file,buf)
-#define lstat(file,buf) __dietlstat(file,buf)
-
-#define stat64(file,buf) __dietstat64(file,buf)
-#define fstat64(file,buf) __dietfstat64(file,buf)
-#define lstat64(file,buf) __dietlstat64(file,buf)
-
-#define major(dev) (((dev)>>8) & 0xff)
-#define minor(dev) ((dev) & 0xff)
-#define makedev(major, minor) ((((unsigned int) (major)) << 8) | ((unsigned int) (minor)))
-
-extern int __dietstat (const char *__file, struct stat *__buf) __THROW;
-extern int __dietfstat (int __fd, struct stat *__buf) __THROW;
-extern int __dietlstat (const char *__file, struct stat *__buf) __THROW;
-
-#ifndef __NO_STAT64
-extern int __dietstat64 (const char *__file, struct stat64 *__buf) __THROW;
-extern int __dietfstat64 (int __fd, struct stat64 *__buf) __THROW;
-extern int __dietlstat64 (const char *__file, struct stat64 *__buf) __THROW;
-#endif
-
-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;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/time.h b/mdk-stage1/dietlibc/include/sys/time.h
deleted file mode 100644
index 069d50a83..000000000
--- a/mdk-stage1/dietlibc/include/sys/time.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _SYS_TIME_H
-#define _SYS_TIME_H 1
-
-#include <sys/cdefs.h>
-
-#include <sys/types.h>
-#include <linux/time.h>
-
-#if defined __USE_GNU || defined __USE_BSD
-typedef struct timezone *__timezone_ptr_t;
-#else
-typedef void *__timezone_ptr_t;
-#endif
-
-int getitimer(int which, struct itimerval *value) __THROW;
-int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue) __THROW;
-
-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;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/types.h b/mdk-stage1/dietlibc/include/sys/types.h
deleted file mode 100644
index 34dbaa9f1..000000000
--- a/mdk-stage1/dietlibc/include/sys/types.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#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;
-#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;
-#endif
-
-
-#ifdef __quad_t
-typedef __quad_t off64_t;
-typedef __u_quad_t ino64_t;
-typedef __quad_t blkcnt64_t;
-#endif
-
-typedef long int fpos_t;
-
-#define socklen_t socklen_t
-typedef unsigned int socklen_t;
-
-typedef long int blksize_t;
-typedef long int blkcnt_t;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/utsname.h b/mdk-stage1/dietlibc/include/sys/utsname.h
deleted file mode 100644
index 37bf6c811..000000000
--- a/mdk-stage1/dietlibc/include/sys/utsname.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef _SYS_UTSNAME_H
-#define _SYS_UTSNAME_H 1
-
-#include <sys/cdefs.h>
-
-/* Length of the entries in `struct utsname' is 65. */
-#define _UTSNAME_LENGTH 65
-#define _UTSNAME_NODENAME_LENGTH _UTSNAME_LENGTH
-
-/* Linux provides as additional information in the `struct utsname'
- the name of the current domain. Define _UTSNAME_DOMAIN_LENGTH
- to a value != 0 to activate this entry. */
-#define _UTSNAME_DOMAIN_LENGTH _UTSNAME_LENGTH
-
-struct utsname {
- /* Name of the implementation of the operating system. */
- char sysname[_UTSNAME_LENGTH];
-
- /* Name of this node on the network. */
- char nodename[_UTSNAME_NODENAME_LENGTH];
-
- /* Current release level of this implementation. */
- char release[_UTSNAME_LENGTH];
- /* Current version level of this release. */
- char version[_UTSNAME_LENGTH];
-
- /* Name of the hardware type the system is running on. */
- char machine[_UTSNAME_LENGTH];
-
- /* Name of the domain of this node on the network. */
- char domainname[_UTSNAME_DOMAIN_LENGTH];
-};
-
-extern int uname (struct utsname *__name) __THROW;
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/vfs.h b/mdk-stage1/dietlibc/include/sys/vfs.h
deleted file mode 100644
index e4740a225..000000000
--- a/mdk-stage1/dietlibc/include/sys/vfs.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _SYS_VFS_H
-#define _SYS_VFS_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <linux/vfs.h>
-
-int statfs(const char *path, struct statfs *buf) __THROW;
-int fstatfs(int fd, struct statfs *buf) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/sys/wait.h b/mdk-stage1/dietlibc/include/sys/wait.h
deleted file mode 100644
index 91b5da348..000000000
--- a/mdk-stage1/dietlibc/include/sys/wait.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _SYS_WAIT_H
-#define _SYS_WAIT_H
-
-#include <sys/cdefs.h>
-#include <sys/resource.h>
-
-pid_t wait(int *status) __THROW;
-pid_t waitpid(pid_t pid, int *status, int options) __THROW;
-
-pid_t wait3(int *status, int options, struct rusage *rusage) __THROW;
-
-pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/termios.h b/mdk-stage1/dietlibc/include/termios.h
deleted file mode 100644
index fc297ea19..000000000
--- a/mdk-stage1/dietlibc/include/termios.h
+++ /dev/null
@@ -1,178 +0,0 @@
-#ifndef _TERMIOS_H
-#define _TERMIOS_H
-
-typedef unsigned char cc_t;
-typedef unsigned int speed_t;
-typedef unsigned int tcflag_t;
-
-#define NCCS 32
-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 */
- speed_t c_ispeed; /* input speed */
- speed_t c_ospeed; /* output speed */
- };
-
-/* c_cc characters */
-#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
-
-/* 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 BSDLY 0020000
-#define BS0 0000000
-#define BS1 0020000
-#define FFDLY 0100000
-#define FF0 0000000
-#define FF1 0100000
-
-#define VTDLY 0040000
-#define VT0 0000000
-#define VT1 0040000
-
-#define XTABS 0014000
-
-/* 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 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 TOSTOP 0000400
-#define ECHOCTL 0001000
-#define ECHOPRT 0002000
-#define ECHOKE 0004000
-#define FLUSHO 0010000
-#define PENDIN 0040000
-#define IEXTEN 0100000
-
-/* 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 */
-#define TCSANOW 0
-#define TCSADRAIN 1
-#define TCSAFLUSH 2
-
-
-#define _IOT_termios /* Hurd ioctl type field. */ \
- _IOT (_IOTS (cflag_t), 4, _IOTS (cc_t), NCCS, _IOTS (speed_t), 2)
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/time.h b/mdk-stage1/dietlibc/include/time.h
deleted file mode 100644
index adc3710a4..000000000
--- a/mdk-stage1/dietlibc/include/time.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef _TIME_H
-#define _TIME_H
-
-#include <sys/cdefs.h>
-#include <sys/time.h>
-
-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_wday; /* Day of week. [0-6] */
- int tm_yday; /* Days in year.[0-365] */
- int tm_isdst; /* DST. [-1/0/1]*/
-
- long int tm_gmtoff; /* Seconds east of UTC. */
- const char *tm_zone; /* Timezone abbreviation. */
-};
-
-# define __isleap(year) \
- ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
-
-int nanosleep(const struct timespec *req, struct timespec *rem) __THROW;
-unsigned int sleep(unsigned int secs) __THROW;
-
-struct tm *localtime(const time_t *timep) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/unistd.h b/mdk-stage1/dietlibc/include/unistd.h
deleted file mode 100644
index 5165ba286..000000000
--- a/mdk-stage1/dietlibc/include/unistd.h
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef _UNISTD_H
-#define _UNISTD_H
-
-#include <dirent.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-const enum {
- SEEK_SET=0,
- SEEK_CUR=1,
- SEEK_END=2
-} __seek_types;
-
-off_t lseek(int fildes, off_t offset, int whence) __THROW;
-
-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;
-
-int open(const char* pathname,int flags, ...) __THROW;
-int creat(const char* pathname,mode_t mode) __THROW;
-int write(int fd,const void* buf,size_t len) __THROW;
-int read(int fd,const void* buf,size_t len) __THROW;
-int close(int fd) __THROW;
-
-int pread(int fd, void *buf, size_t count, off_t offset);
-int pwrite(int fd, const void *buf, size_t count, off_t offset);
-
-int execve (const char *filename, char *const argv [], char *const envp[]) __THROW;
-int execl( const char *path, ...);
-int execv (const char *__path, char *const __argv[]) __THROW;
-
-pid_t getpid(void) __attribute__((const)) __THROW;
-pid_t getppid(void) __THROW;
-int kill(pid_t pid, int sig) __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;
-
-pid_t fork() __THROW;
-pid_t vfork() __THROW;
-
-int readlink(const char *path, char *buf, size_t bufsiz) __THROW;
-int symlink(const char *oldpath, const char *newpath) __THROW;
-int link(const char *oldpath, const char *newpath) __THROW;
-int unlink (const char *__name) __THROW;
-
-int chown(const char *path, uid_t owner, gid_t group) __THROW;
-int fchown(int fd, uid_t owner, gid_t group) __THROW;
-int lchown(const char *path, uid_t owner, gid_t group) __THROW;
-
-char *ttyname (int desc) __THROW;
-
-int brk(void *end_data_segment) __THROW;
-void *sbrk(ptrdiff_t increment) __THROW;
-
-int gethostname(char *name, size_t len) __THROW;
-int sethostname(const char *name, size_t len) __THROW;
-
-int setdomainname(const char *name, size_t len) __THROW;
-
-void sync(void) __THROW;
-
-/* Values for the second argument to access.
- These may be OR'd together. */
-#define R_OK 4 /* Test for read permission. */
-#define W_OK 2 /* Test for write permission. */
-#define X_OK 1 /* Test for execute permission. */
-#define F_OK 0 /* Test for existence. */
-
-int access (char *__name, int __type) __THROW;
-
-int dup2 (int __fd, int __fd2) __THROW;
-
-pid_t setsid (void) __THROW;
-
-unsigned int sleep (unsigned int __seconds) __THROW;
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/utime.h b/mdk-stage1/dietlibc/include/utime.h
deleted file mode 100644
index 41674f379..000000000
--- a/mdk-stage1/dietlibc/include/utime.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef _UTIME_H
-#define _UTIME_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <time.h>
-
-struct utimbuf {
- time_t actime; /* access time */
- time_t modtime; /* modification time */
-};
-
-int utime(const char *filename, struct utimbuf *buf) __THROW;
-
-
-#endif
diff --git a/mdk-stage1/dietlibc/include/utmp.h b/mdk-stage1/dietlibc/include/utmp.h
deleted file mode 100644
index 2f598257c..000000000
--- a/mdk-stage1/dietlibc/include/utmp.h
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef _UTMP_H
-#define _UTMP_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <time.h>
-
-#define UT_LINESIZE 32
-#define UT_NAMESIZE 32
-#define UT_HOSTSIZE 256
-
-#define _PATH_UTMP "/var/run/utmp"
-#define _PATH_WTMP "/var/log/wtmp"
-
-/* The structure describing an entry in the database of
- previous logins. */
-struct lastlog
- {
- time_t ll_time;
- char ll_line[UT_LINESIZE];
- char ll_host[UT_HOSTSIZE];
- };
-
-/* The structure describing the status of a terminated process. This
- type is used in `struct utmp' below. */
-struct exit_status
- {
- short int e_termination; /* Process termination status. */
- short int e_exit; /* Process exit status. */
- };
-
-/* The structure describing an entry in the user accounting database. */
-struct utmp
-{
- short int ut_type; /* Type of login. */
- pid_t ut_pid; /* Process ID of login process. */
- char ut_line[UT_LINESIZE]; /* Devicename. */
- char ut_id[4]; /* Inittab ID. */
- char ut_user[UT_NAMESIZE]; /* Username. */
- char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */
- struct exit_status ut_exit; /* Exit status of a process marked
- as DEAD_PROCESS. */
- long int ut_session; /* Session ID, used for windowing. */
- struct timeval ut_tv; /* Time entry was made. */
- int32_t ut_addr_v6[4]; /* Internet address of remote host. */
- char __unused[20]; /* Reserved for future use. */
-};
-
-/* Values for the `ut_type' field of a `struct utmp'. */
-#define EMPTY 0 /* No valid user accounting information. */
-
-#define RUN_LVL 1 /* The system's runlevel. */
-#define BOOT_TIME 2 /* Time of system boot. */
-#define NEW_TIME 3 /* Time after system clock changed. */
-#define OLD_TIME 4 /* Time when system clock changed. */
-
-#define INIT_PROCESS 5 /* Process spawned by the init process. */
-#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */
-#define USER_PROCESS 7 /* Normal process. */
-#define DEAD_PROCESS 8 /* Terminated process. */
-
-#define ACCOUNTING 9
-
-/* Tell the user that we have a modern system with UT_HOST, UT_PID,
- UT_TYPE, UT_ID and UT_TV fields. */
-#define _HAVE_UT_TYPE 1
-#define _HAVE_UT_PID 1
-#define _HAVE_UT_ID 1
-#define _HAVE_UT_TV 1
-#define _HAVE_UT_HOST 1
-
-#endif
diff --git a/mdk-stage1/dietlibc/lib/__dtostr.c b/mdk-stage1/dietlibc/lib/__dtostr.c
deleted file mode 100644
index def091f16..000000000
--- a/mdk-stage1/dietlibc/lib/__dtostr.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* convert double to string. Helper for sprintf. */
-
-int __dtostr(double d,char *buf,int maxlen,int prec) {
- 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;
-/* 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;
- char *oldbuf=buf;
- int initial=1;
-
- if (s) { d=-d; *buf='-'; --maxlen; buf++; }
- if ((i=e10)>=0) {
- 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;
- }
- initial=0;
- e10=e10%len;
- }
- }
- if (maxlen>=0) return buf-oldbuf;
- return 0;
- }
- /* step 5: loop through the digits, inserting the decimal point when
- * appropriate */
- 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;
- --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;
- }
- *buf=0;
- return buf-oldbuf;
-}
diff --git a/mdk-stage1/dietlibc/lib/__lltostr.c b/mdk-stage1/dietlibc/lib/__lltostr.c
deleted file mode 100644
index f53dcfb80..000000000
--- a/mdk-stage1/dietlibc/lib/__lltostr.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <string.h>
-
-static char *num="0123456789abcdefghijklmnopqrstuvwxyz";
-
-int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase)
-{
- char *tmp;
- int j=0;
-
- s[--size]=0;
-
- tmp=s+size;
-
- if ((base==0)||(base>36)) base=10;
-
- j=0;
- if (!i)
- {
- *(--tmp)='0';
- j=1;
- }
-
- while((tmp>s)&&(i))
- {
- tmp--;
- *tmp=num[i%base];
- if ((UpCase)&&(*tmp>96)) (*tmp)-=' ';
- i=i/base;
- j++;
- }
- memmove(s,tmp,j+1);
-
- return j;
-}
diff --git a/mdk-stage1/dietlibc/lib/__ltostr.c b/mdk-stage1/dietlibc/lib/__ltostr.c
deleted file mode 100644
index b2ebeb074..000000000
--- a/mdk-stage1/dietlibc/lib/__ltostr.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <string.h>
-
-static char *num="0123456789abcdefghijklmnopqrstuvwxyz";
-
-int __ltostr(char *s, int size, unsigned long i, int base, char UpCase)
-{
- char *tmp;
- int j=0;
-
- s[--size]=0;
-
- tmp=s+size;
-
- if ((base==0)||(base>36)) base=10;
-
- j=0;
- if (!i)
- {
- *(--tmp)='0';
- j=1;
- }
-
- while((tmp>s)&&(i))
- {
- tmp--;
- *tmp=num[i%base];
- if ((UpCase)&&(*tmp>96)) (*tmp)-=' ';
- i=i/base;
- j++;
- }
- memmove(s,tmp,j+1);
-
- return j;
-}
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
deleted file mode 100644
index 6d0b29c03..000000000
--- a/mdk-stage1/dietlibc/lib/_brk.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <unistd.h>
-
-extern int __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 brk (void *end_data_segment) __attribute__((weak,alias("__brk")));
diff --git a/mdk-stage1/dietlibc/lib/abort.c b/mdk-stage1/dietlibc/lib/abort.c
deleted file mode 100644
index e6374c5ac..000000000
--- a/mdk-stage1/dietlibc/lib/abort.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <linux/types.h>
-#include <linux/signal.h>
-#include <signal.h>
-
-extern int exit(int code) __attribute__ ((noreturn));
-
-void abort() {
- sigset_t t;
- if (!sigemptyset(&t) && !sigaddset(&t, SIGABRT))
- sigprocmask(SIG_UNBLOCK, &t, 0);
- while (1)
- if (raise(SIGABRT))
- exit(127);
-}
diff --git a/mdk-stage1/dietlibc/lib/accept.c b/mdk-stage1/dietlibc/lib/accept.c
deleted file mode 100644
index a7ae824eb..000000000
--- a/mdk-stage1/dietlibc/lib/accept.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <linux/net.h>
-
-extern int socketcall(int callno,long* args);
-
-int 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 __libc_accept(int a, void * addr, void * addr2) __attribute__((weak,alias("accept")));
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
deleted file mode 100644
index 27b6838df..000000000
--- a/mdk-stage1/dietlibc/lib/alloc.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * malloc/free by O.Dreesen
- */
-
-#include <linux/unistd.h>
-#include <asm/mman.h>
-#include <linux/errno.h>
-
-#if 0
-#include <sys/mman.h>
-#define _LIBC
-#include <errno.h>
-#endif
-
-#include <linux/types.h>
-
-#if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
-#define MAP_ANON MAP_ANONYMOUS
-#endif
-
-#ifndef MAP_FAILED
-#define MAP_FAILED ((void*)-1)
-#endif
-
-#ifndef NULL
-#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 struct t_alloc_head {
- struct t_alloc_head *ptr;
- unsigned long size;
-} alloc_head;
-
-/* guess what ? the virtual block size */
-#define MEM_BLOCK_SIZE 4096
-
-/* minimum allocated bytes */
-#define MEM_ALLOC_MIN 4
-
-/* Initial start position in memory */
-#define MEM_ALLOC_START ((char*)0x18000000)
-
-/* 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)))
-
-#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)
-
-/* freelist handler */
-static alloc_head base = {&base,0};
-static char *alloc_get_end = MEM_ALLOC_START;
-
-void free(void *ptr)
-{
- alloc_head *prev,*p,*block;
-
- if (ptr==NULL) return;
-
- block=START_BLOCK(ptr);
- 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 */
-
- /* emergency escape: freelist has ONLY one entry the freelist base */
- if (p->ptr==p) break;
- }
- prev->ptr = block;
-
- if (END_OF_BLOCK(block)==p)
- { /* join right neighbor */
- block->ptr = p->ptr;
- block->size += p->size;
- }
- else
- block->ptr = p;
-
- if (END_OF_BLOCK(prev)==block)
- { /* join left neighbor */
- prev->size += block->size;
- prev->ptr = block->ptr;
- }
-}
-
-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;
-
- /* make a header */
- ah=(alloc_head*)tmp;
- ah->ptr=ah;
- ah->size=size;
-
- /* link new free maped pages in freelist */
- free(START_DATA(tmp));
-
- return &base;
-}
-
-void *malloc(size_t size)
-{
- alloc_head *p, *prev;
- size_t need;
-
- /* 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 */
- }
- 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->ptr=p->ptr;
- tmp->size=p->size-need; /* remaining size */
- }
-
- p->size=need; /* set size */
- }
- p->ptr=p; /* self-link */
-
- return (void*)START_DATA(p);
- }
- else if (p==&base)
- {
- if ((p=alloc_get_mem(need))==NULL) return NULL;
- }
- }
- return NULL;
-}
-
-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 *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;
- }
- return NULL;
- }
- if (diff>0)
- {
- tmp->size=need;
- tf=END_OF_BLOCK(tmp);
- tf->ptr=tf;
- tf->size=diff;
- free(START_DATA(tf));
- }
- return ptr;
- }
- else
- free(ptr);
- }
- else if (size>0)
- return malloc(size);
- return NULL;
-}
diff --git a/mdk-stage1/dietlibc/lib/assert_fail.c b/mdk-stage1/dietlibc/lib/assert_fail.c
deleted file mode 100644
index caa70ef5b..000000000
--- a/mdk-stage1/dietlibc/lib/assert_fail.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.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)
-{
- int alen=strlen(assertion);
- int flen=strlen(file);
- int fulen=strlen(function);
- char *buf=(char*)alloca(alen+flen+fulen+50);
- if (buf) {
- char *tmp;
- *buf=0;
- if (file) strcat(strcat(buf,file),":");
- tmp=buf+strlen(buf);
- __ltostr(tmp,10,line,10,0);
- strcat(buf,": ");
- if (function) strcat(strcat(buf,function),": ");
- strcat(buf,"Assertion `");
- strcat(buf,assertion);
- strcat(buf,"' failed.\n");
- write(2,buf,strlen(buf));
- }
- abort();
-}
diff --git a/mdk-stage1/dietlibc/lib/atexit.c b/mdk-stage1/dietlibc/lib/atexit.c
deleted file mode 100644
index 2b644bf49..000000000
--- a/mdk-stage1/dietlibc/lib/atexit.c
+++ /dev/null
@@ -1,23 +0,0 @@
-typedef void (*function)(void);
-
-static function __atexitlist[4];
-
-int atexit(function t) {
- int i;
- for (i=0; i<4; i++)
- if (__atexitlist[i]==0) {
- __atexitlist[i]=t;
- return 0;
- }
- return -1;
-}
-
-extern void _exit(int code) __attribute__((noreturn));
-
-void exit(int code) {
- if (__atexitlist[0]) __atexitlist[0]();
- if (__atexitlist[1]) __atexitlist[1]();
- if (__atexitlist[2]) __atexitlist[2]();
- if (__atexitlist[3]) __atexitlist[3]();
- _exit(code);
-}
diff --git a/mdk-stage1/dietlibc/lib/atof.c b/mdk-stage1/dietlibc/lib/atof.c
deleted file mode 100644
index 4839e5152..000000000
--- a/mdk-stage1/dietlibc/lib/atof.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <stdlib.h>
-
-double atof(const char *nptr) {
- return strtod(nptr,0);
-}
diff --git a/mdk-stage1/dietlibc/lib/atoi.c b/mdk-stage1/dietlibc/lib/atoi.c
deleted file mode 100644
index fe952b8c4..000000000
--- a/mdk-stage1/dietlibc/lib/atoi.c
+++ /dev/null
@@ -1,8 +0,0 @@
-int atoi(const char* s) {
- 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;
-}
diff --git a/mdk-stage1/dietlibc/lib/atol.c b/mdk-stage1/dietlibc/lib/atol.c
deleted file mode 100644
index 558a004b9..000000000
--- a/mdk-stage1/dietlibc/lib/atol.c
+++ /dev/null
@@ -1,8 +0,0 @@
-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;
-}
diff --git a/mdk-stage1/dietlibc/lib/bind.c b/mdk-stage1/dietlibc/lib/bind.c
deleted file mode 100644
index ec1c93e1b..000000000
--- a/mdk-stage1/dietlibc/lib/bind.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <linux/net.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
- unsigned long args[] = { a, (long) b, c };
- return socketcall(SYS_BIND, args);
-#endif
-}
diff --git a/mdk-stage1/dietlibc/lib/cfgetospeed.c b/mdk-stage1/dietlibc/lib/cfgetospeed.c
deleted file mode 100644
index 4e392a239..000000000
--- a/mdk-stage1/dietlibc/lib/cfgetospeed.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <termios.h>
-#include <sys/types.h>
-
-speed_t cfgetospeed(struct termios *termios_p) {
- return termios_p->c_ospeed;
-}
diff --git a/mdk-stage1/dietlibc/lib/closedir.c b/mdk-stage1/dietlibc/lib/closedir.c
deleted file mode 100644
index c8d834f3b..000000000
--- a/mdk-stage1/dietlibc/lib/closedir.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#undef _POSIX_PTHREADS
-#include "dirstream.h"
-
-#undef closedir
-int closedir(DIR * dir)
-{
- int fd;
-
- if (!dir) {
- errno = EBADF;
- return -1;
- }
-
- /* We need to check dd_fd. */
- if (dir->dd_fd == -1)
- {
- errno = EBADF;
- return -1;
- }
- fd = dir->dd_fd;
- dir->dd_fd = -1;
- free(dir->dd_buf);
- free(dir);
- return close(fd);
-}
diff --git a/mdk-stage1/dietlibc/lib/connect.c b/mdk-stage1/dietlibc/lib/connect.c
deleted file mode 100644
index f7f4f1ed7..000000000
--- a/mdk-stage1/dietlibc/lib/connect.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <linux/net.h>
-
-extern int socketcall(int callno,long* args);
-
-int 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 __libc_connect(int a, void * b, int c) __attribute__((weak,alias("connect")));
diff --git a/mdk-stage1/dietlibc/lib/creat64.c b/mdk-stage1/dietlibc/lib/creat64.c
deleted file mode 100644
index 923c1baaa..000000000
--- a/mdk-stage1/dietlibc/lib/creat64.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <fcntl.h>
-
-int creat64(const char *file,mode_t mode) {
- return open64(file,O_WRONLY|O_CREAT|O_TRUNC,mode);
-}
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/errno_location.c b/mdk-stage1/dietlibc/lib/errno_location.c
deleted file mode 100644
index 286f833c9..000000000
--- a/mdk-stage1/dietlibc/lib/errno_location.c
+++ /dev/null
@@ -1,5 +0,0 @@
-extern int errno;
-
-int *__errno_location() { return &errno; }
-
-int *errno_location() __attribute__((weak,alias("__errno_location")));
diff --git a/mdk-stage1/dietlibc/lib/execl.c b/mdk-stage1/dietlibc/lib/execl.c
deleted file mode 100644
index ae28fb850..000000000
--- a/mdk-stage1/dietlibc/lib/execl.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdarg.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdlib.h>
-
-int execl( const char *path, ...) {
- va_list ap;
- int n,i;
- char **argv,*tmp;
- 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 *);
- va_end (ap);
- return execve(path,argv,environ);
- }
- __set_errno(ENOMEM);
- return -1;
-}
diff --git a/mdk-stage1/dietlibc/lib/execvp.c b/mdk-stage1/dietlibc/lib/execvp.c
deleted file mode 100644
index 809252990..000000000
--- a/mdk-stage1/dietlibc/lib/execvp.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <paths.h>
-#include <errno.h>
-
-extern char **environ;
-
-static int exec_shell(const char *file, char *const argv[]) {
- int i;
-
- for (i = 0; argv[i]; i++);
-
- if (1) {
- char *shell_argv[i + 1];
- shell_argv[0] = _PATH_BSHELL;
- shell_argv[1] = (char *) file;
- for (; i > 1; i--)
- shell_argv[i] = argv[i - 1];
- return execve(_PATH_BSHELL, shell_argv, environ);
- }
-}
-
-int execvp(const char *file, char *const argv[]) {
- 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);
- return -1;
- }
- }
- if (!path) path=_PATH_DEFPATH;
- for (cur=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);
- buf[next-cur]='/';
- 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!=EACCES) && (errno!=ENOENT)) return -1;
- }
- if (*next==0) break;
- next++;
- }
- return -1;
-}
diff --git a/mdk-stage1/dietlibc/lib/ftw.c b/mdk-stage1/dietlibc/lib/ftw.c
deleted file mode 100644
index a3c04af9a..000000000
--- a/mdk-stage1/dietlibc/lib/ftw.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <linux/stat.h>
-#include <unistd.h>
-#include <limits.h>
-#include <ftw.h>
-#include <dirent.h>
-#include <string.h>
-#include <stdlib.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;
- 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;
- }
-/* puts(de->d_name); */
- }
- closedir(d);
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/getdomainname.c b/mdk-stage1/dietlibc/lib/getdomainname.c
deleted file mode 100644
index 2554fe4c3..000000000
--- a/mdk-stage1/dietlibc/lib/getdomainname.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#define _GNU_SOURCE
-
-#include <sys/types.h>
-#include <sys/utsname.h>
-
-int getdomainname(char *name,size_t len) {
- struct utsname u;
- int res=uname(&u);
- if (res==0) {
- int i;
- if (len>=_UTSNAME_DOMAIN_LENGTH)
- len=_UTSNAME_DOMAIN_LENGTH;
- for (i=0; i<len; i++)
- name[i]=u.domainname[i];
- }
- return res;
-}
diff --git a/mdk-stage1/dietlibc/lib/getenv.c b/mdk-stage1/dietlibc/lib/getenv.c
deleted file mode 100644
index fc37e9927..000000000
--- a/mdk-stage1/dietlibc/lib/getenv.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <string.h>
-
-extern char **environ;
-
-extern char *getenv(const char *s)
-{
- int i;
- unsigned int len;
-
- if (!environ || !s) return 0;
- len = strlen(s);
- for (i = 0;environ[i];++i)
- if ((memcmp(environ[i],s,len)==0) && (environ[i][len] == '='))
- return environ[i] + len + 1;
- return 0;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/gethostname.c b/mdk-stage1/dietlibc/lib/gethostname.c
deleted file mode 100644
index ccc0fbc8e..000000000
--- a/mdk-stage1/dietlibc/lib/gethostname.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#define _GNU_SOURCE
-
-#include <sys/types.h>
-#include <sys/utsname.h>
-
-int gethostname(char *name,size_t len) {
- struct utsname u;
- int res=uname(&u);
- if (res==0) {
- int i;
- if (len>=_UTSNAME_NODENAME_LENGTH)
- len=_UTSNAME_NODENAME_LENGTH;
- for (i=0; i<len; i++)
- name[i]=u.nodename[i];
- }
- return res;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/getpeername.c b/mdk-stage1/dietlibc/lib/getpeername.c
deleted file mode 100644
index 8adcddf55..000000000
--- a/mdk-stage1/dietlibc/lib/getpeername.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/net.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 };
- return socketcall(SYS_GETPEERNAME, args);
-#endif
-}
-
diff --git a/mdk-stage1/dietlibc/lib/getservent.c b/mdk-stage1/dietlibc/lib/getservent.c
deleted file mode 100644
index ee6a77c21..000000000
--- a/mdk-stage1/dietlibc/lib/getservent.c
+++ /dev/null
@@ -1,141 +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>
-
-static int servicesfd=-1;
-static char* servicesmap;
-static unsigned int serviceslen;
-
-static char* aliases[10];
-
-static char *cur;
-
-static inline int isalpha(char c) {
- return (c>='a' && c<='z') || (c>='A' && c<='Z');
-}
-
-static inline int isdigit(char c) {
- return (c>='0' && c<='9');
-}
-
-static inline int isalnum(char c) {
- return isalpha(c) || isdigit(c);
-}
-
-static inline int isblank(char c) {
- return (c==' ' || c=='\t');
-}
-
-/* nameserver 42/tcp name # IEN 116 */
-struct servent *getservent(void) {
- static struct servent se;
- char *last;
- int aliasidx;
- if (servicesfd<0) {
- servicesfd=open("/etc/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>=last || !isblank(*cur)) break;
- if (*cur=='\n') { *cur++=0; 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;
-}
-
-struct servent *getservbyname(const char *name, const char *proto) {
- struct servent *s;
- 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);
-#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 setservent(int stayopen) {
- cur=servicesmap;
-}
-
-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
deleted file mode 100644
index 61a3ea24a..000000000
--- a/mdk-stage1/dietlibc/lib/getsockname.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/net.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
- unsigned long args[] = { a, (long) b, c };
- return socketcall(SYS_GETSOCKNAME, args);
-#endif
-}
-
diff --git a/mdk-stage1/dietlibc/lib/getsockopt.c b/mdk-stage1/dietlibc/lib/getsockopt.c
deleted file mode 100644
index 8c0a57557..000000000
--- a/mdk-stage1/dietlibc/lib/getsockopt.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/net.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
- unsigned long args[] = { a, b, c, (long)d, e };
- return socketcall(SYS_GETSOCKOPT, args);
-#endif
-}
-
diff --git a/mdk-stage1/dietlibc/lib/htons.c b/mdk-stage1/dietlibc/lib/htons.c
deleted file mode 100644
index 92a43f937..000000000
--- a/mdk-stage1/dietlibc/lib/htons.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <asm/byteorder.h>
-
-#undef htons
-#ifdef __i386__
-unsigned short int htons(unsigned short int netshort) {
- return ___arch__swab16(netshort);
-}
-#else
-unsigned short int htons(unsigned short int netshort) {
- return netshort;
-}
-#endif
diff --git a/mdk-stage1/dietlibc/lib/if_indextoname.c b/mdk-stage1/dietlibc/lib/if_indextoname.c
deleted file mode 100644
index e683755f6..000000000
--- a/mdk-stage1/dietlibc/lib/if_indextoname.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <linux/if.h>
-#include <linux/net.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <sys/socket.h>
-
-#ifndef SOCK_DGRAM
-#define SOCK_DGRAM 2
-#endif
-
-char* if_indextoname(unsigned int interface,char* blub) {
- struct ifreq ifr;
- int fd;
-
- fd=socket(AF_INET6,SOCK_DGRAM,0);
- if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0);
- ifr.ifr_ifindex=interface;
- if (ioctl(fd,SIOCGIFNAME,&ifr)==0) {
- int i;
- close(fd);
- for (i=0; i<IFNAMSIZ-1; i++)
- if (!(blub[i]=ifr.ifr_name[i]))
- return blub;
- blub[i]=0;
- return blub;
- }
- close(fd);
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/if_nametoindex.c b/mdk-stage1/dietlibc/lib/if_nametoindex.c
deleted file mode 100644
index 5923963b1..000000000
--- a/mdk-stage1/dietlibc/lib/if_nametoindex.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <linux/if.h>
-#include <linux/net.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <sys/socket.h>
-
-#ifndef SOCK_DGRAM
-#define SOCK_DGRAM 2
-#endif
-
-int if_nametoindex(char* blub) {
- struct ifreq ifr;
- int fd;
- char *tmp;
- int len=sizeof(ifr.ifr_name);
- fd=socket(AF_INET6,SOCK_DGRAM,0);
- if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0);
- for (tmp=ifr.ifr_name; len>0; --len) {
- if ((*tmp++=*blub++)==0) break;
- }
- if (ioctl(fd,SIOCGIFINDEX,&ifr)==0) {
- close(fd);
- return ifr.ifr_ifindex;
- }
- close(fd);
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/isalnum.c b/mdk-stage1/dietlibc/lib/isalnum.c
deleted file mode 100644
index 19e5151d5..000000000
--- a/mdk-stage1/dietlibc/lib/isalnum.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <ctype.h>
-
-int isalnum(int c) {
- return isalpha(c) || isdigit(c);
-}
-
diff --git a/mdk-stage1/dietlibc/lib/isalpha.c b/mdk-stage1/dietlibc/lib/isalpha.c
deleted file mode 100644
index db04c3fae..000000000
--- a/mdk-stage1/dietlibc/lib/isalpha.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <ctype.h>
-
-inline int isalpha(int c) {
- return (c>='a' && c<='z') || (c>='A' && c<='Z');
-}
-
diff --git a/mdk-stage1/dietlibc/lib/isascii.c b/mdk-stage1/dietlibc/lib/isascii.c
deleted file mode 100644
index e627efb41..000000000
--- a/mdk-stage1/dietlibc/lib/isascii.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <ctype.h>
-
-inline int isascii(int c) {
- return (c & 0x80) == 0;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/isatty.c b/mdk-stage1/dietlibc/lib/isatty.c
deleted file mode 100644
index b31609720..000000000
--- a/mdk-stage1/dietlibc/lib/isatty.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#define ioctl libc_ioctl
-#include <termios.h>
-#undef ioctl
-#include <sys/ioctl.h>
-
-extern int errno;
-
-int isatty(int fd)
-{
- int save;
- int is_tty;
- struct termios term;
-
- save = errno;
- is_tty = ioctl(fd, TCGETS, &term) == 0;
- errno = save;
-
- return is_tty;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/isblank.c b/mdk-stage1/dietlibc/lib/isblank.c
deleted file mode 100644
index 034e543b1..000000000
--- a/mdk-stage1/dietlibc/lib/isblank.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <ctype.h>
-
-int isblank(int ch)
-{
- return ((ch==' ')||(ch=='\t'));
-}
diff --git a/mdk-stage1/dietlibc/lib/isdigit.c b/mdk-stage1/dietlibc/lib/isdigit.c
deleted file mode 100644
index 734eb5197..000000000
--- a/mdk-stage1/dietlibc/lib/isdigit.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <ctype.h>
-
-inline int isdigit(int c) {
- return (c>='0' && c<='9');
-}
-
diff --git a/mdk-stage1/dietlibc/lib/isspace.c b/mdk-stage1/dietlibc/lib/isspace.c
deleted file mode 100644
index ab39e81bc..000000000
--- a/mdk-stage1/dietlibc/lib/isspace.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <ctype.h>
-
-int isspace(int ch)
-{
- return ((ch==' ')||(ch=='\f')||(ch=='\t')||(ch=='\v')||(ch=='\r')||(ch=='\n'));
-}
diff --git a/mdk-stage1/dietlibc/lib/listen.c b/mdk-stage1/dietlibc/lib/listen.c
deleted file mode 100644
index 56a51be06..000000000
--- a/mdk-stage1/dietlibc/lib/listen.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/net.h>
-
-extern int socketcall(int callno,long* args);
-
-int listen(int a, int b) {
-#ifdef __i386__
- return socketcall(SYS_LISTEN, (long*)&a);
-#else
- unsigned long args[] = { a, b, 0 };
- return socketcall(SYS_LISTEN, args);
-#endif
-}
-
diff --git a/mdk-stage1/dietlibc/lib/lockf.c b/mdk-stage1/dietlibc/lib/lockf.c
deleted file mode 100644
index 2b1d004ef..000000000
--- a/mdk-stage1/dietlibc/lib/lockf.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-int lockf(int fd, int cmd, off_t len) {
- struct flock fl;
- fl.l_whence=SEEK_CUR;
- fl.l_start=0;
- fl.l_len=len;
- fl.l_pid=0;
- switch (cmd) {
- case F_TEST:
- if (fcntl(fd,F_GETLK,&fl)<0)
- return -1;
- if (fl.l_type == F_UNLCK || fl.l_pid == getpid ())
- return 0;
- errno=EACCES;
- return -1;
- case F_ULOCK:
- fl.l_type=F_UNLCK;
- cmd=F_SETLK;
- break;
- case F_LOCK:
- fl.l_type = F_WRLCK;
- cmd = F_SETLKW;
- break;
- case F_TLOCK:
- fl.l_type = F_WRLCK;
- cmd = F_SETLK;
- break;
- default:
- errno=EINVAL;
- return -1;
- }
- return fcntl(fd,cmd,&fl);
-}
diff --git a/mdk-stage1/dietlibc/lib/longjmp.c b/mdk-stage1/dietlibc/lib/longjmp.c
deleted file mode 100644
index d0a5719c1..000000000
--- a/mdk-stage1/dietlibc/lib/longjmp.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* 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);
-
-/*
-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 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")));
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
deleted file mode 100644
index 6d6ac98ab..000000000
--- a/mdk-stage1/dietlibc/lib/memccpy.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#define _POSIX_SOURCE
-#define _XOPEN_SOURCE
-#include <sys/types.h>
-
-void *memccpy(void *dst, const void *src, int c, size_t count)
-{
- char *a = dst;
- const char *b = src;
- while (count--)
- {
- *a++ = *b;
- if (*b==c)
- {
- return (void *)a;
- }
- b++;
- }
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/memchr.c b/mdk-stage1/dietlibc/lib/memchr.c
deleted file mode 100644
index 93d81328a..000000000
--- a/mdk-stage1/dietlibc/lib/memchr.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <sys/types.h>
-
-char *memchr(const char *s, int c, size_t n) {
- int i;
- for (i=n; i; --i)
- if (*s++==c)
- return (char*)s;
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/memcmp.c b/mdk-stage1/dietlibc/lib/memcmp.c
deleted file mode 100644
index 8bce6c975..000000000
--- a/mdk-stage1/dietlibc/lib/memcmp.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <sys/types.h>
-
-int memcmp(const void *dst, const void *src, size_t count) {
- register int r;
- register const char *d=dst;
- register const char *s=src;
- while (count--) {
- if ((r=(*d - *s)))
- return r;
- ++d;
- ++s;
- }
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/memcpy.c b/mdk-stage1/dietlibc/lib/memcpy.c
deleted file mode 100644
index 0c688b509..000000000
--- a/mdk-stage1/dietlibc/lib/memcpy.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sys/types.h>
-
-void* memcpy(void* dst, const void* src, size_t count) {
- register char *d=dst;
- register const char *s=src;
- ++count; /* this actually produces better code than using count-- */
- while (--count) {
- *d = *s;
- ++d; ++s;
- }
- return dst;
-}
diff --git a/mdk-stage1/dietlibc/lib/memmove.c b/mdk-stage1/dietlibc/lib/memmove.c
deleted file mode 100644
index 7adb2be91..000000000
--- a/mdk-stage1/dietlibc/lib/memmove.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#define _POSIX_SOURCE
-#define _XOPEN_SOURCE
-#include <sys/types.h>
-
-void *memmove(void *dst, const void *src, size_t count)
-{
- char *a = dst;
- const char *b = src;
- if (src!=dst)
- {
- if (src>dst)
- {
- while (count--) *a++ = *b++;
- }
- else
- {
- a+=count-1;
- b+=count-1;
- while (count--) *a-- = *b--;
- }
- }
- return dst;
-}
diff --git a/mdk-stage1/dietlibc/lib/memset.c b/mdk-stage1/dietlibc/lib/memset.c
deleted file mode 100644
index 5f9ae49ee..000000000
--- a/mdk-stage1/dietlibc/lib/memset.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <sys/types.h>
-
-void * memset(void * dst, int s, size_t count) {
- register char * a = dst;
- count++; /* this actually creates smaller code than using count-- */
- while (--count)
- *a++ = s;
- return dst;
-}
diff --git a/mdk-stage1/dietlibc/lib/mkfifo.c b/mdk-stage1/dietlibc/lib/mkfifo.c
deleted file mode 100644
index 97659490c..000000000
--- a/mdk-stage1/dietlibc/lib/mkfifo.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <linux/stat.h>
-#include <unistd.h>
-
-int mkfifo(char *fn,int mode) {
- return mknod(fn,S_IFIFO|mode,0);
-}
diff --git a/mdk-stage1/dietlibc/lib/nop.c b/mdk-stage1/dietlibc/lib/nop.c
deleted file mode 100644
index 623278dee..000000000
--- a/mdk-stage1/dietlibc/lib/nop.c
+++ /dev/null
@@ -1,7 +0,0 @@
-
-int __fflush_stdin() __attribute__((weak,alias("__nop")));
-int __fflush_stdout() __attribute__((weak,alias("__nop")));
-int __fflush_stderr() __attribute__((weak,alias("__nop")));
-
-/* used for weak aliases */
-int __nop() { return 0; }
diff --git a/mdk-stage1/dietlibc/lib/open64.c b/mdk-stage1/dietlibc/lib/open64.c
deleted file mode 100644
index cab7e992e..000000000
--- a/mdk-stage1/dietlibc/lib/open64.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <unistd.h>
-
-#ifdef O_LARGEFILE
-int open64(const char* file,int oflag,int mode) {
- return open(file,oflag|O_LARGEFILE,mode);
-}
-
-int __libc_open64(const char* file,int oflag,int mode) __attribute__((weak,alias("open64")));
-#endif
diff --git a/mdk-stage1/dietlibc/lib/opendir.c b/mdk-stage1/dietlibc/lib/opendir.c
deleted file mode 100644
index 05c0b9bc8..000000000
--- a/mdk-stage1/dietlibc/lib/opendir.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#include <sys/stat.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#undef _POSIX_PTHREADS
-#include <errno.h>
-
-#include "dirstream.h"
-
-#ifndef O_DIRECTORY
-#define O_DIRECTORY 0200000 /* must be a directory */
-#endif
-
-/*
- * opendir just makes an open() call - it return NULL if it fails
- * (open sets errno), otherwise it returns a DIR * pointer.
- */
-#undef opendir
-DIR *
-opendir(const char * name)
-{
- int fd;
- struct stat statbuf;
- struct dirent *buf;
- DIR *ptr;
-
- /*
- if (stat(name,&statbuf)) return NULL;
- if (!S_ISDIR(statbuf.st_mode)) {
- errno = ENOTDIR;
- return NULL;
- }
- */
- if ((fd = open(name,O_RDONLY|O_DIRECTORY)) < 0)
- return NULL;
- /* According to POSIX, directory streams should be closed when
- * exec. From "Anna Pluzhnikov" <besp@midway.uchicago.edu>.
- */
- if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
- return NULL;
- if (!(ptr=malloc(sizeof(*ptr)))) {
- close(fd);
- errno = ENOMEM;
- return NULL;
- }
-
- ptr->dd_max = statbuf.st_blksize;
- if (ptr->dd_max < 512)
- ptr->dd_max = 512;
-
- if (!(buf=malloc(ptr->dd_max))) {
- close(fd);
- free(ptr);
- errno = ENOMEM;
- return NULL;
- }
- ptr->dd_fd = fd;
- ptr->dd_nextoff = ptr->dd_nextloc = ptr->dd_size = 0;
- ptr->dd_buf = buf;
- ptr->dd_getdents = unknown;
- return ptr;
-}
diff --git a/mdk-stage1/dietlibc/lib/perror.c b/mdk-stage1/dietlibc/lib/perror.c
deleted file mode 100644
index 5476d76a1..000000000
--- a/mdk-stage1/dietlibc/lib/perror.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <unistd.h>
-#include <string.h>
-
-extern char *sys_errlist[];
-extern int sys_nerr;
-extern int 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)
- message=sys_errlist[errno];
- 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
deleted file mode 100644
index b922aa93e..000000000
--- a/mdk-stage1/dietlibc/lib/pread.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <endian.h>
-#include <sys/types.h>
-
-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) {
- return __pread(fd,buf,count,offset,0);
-}
-
-int pread(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread")));
diff --git a/mdk-stage1/dietlibc/lib/pread64.c b/mdk-stage1/dietlibc/lib/pread64.c
deleted file mode 100644
index e6ba4d103..000000000
--- a/mdk-stage1/dietlibc/lib/pread64.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <endian.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#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) {
- return __pread(fd,buf,count,__LONG_LONG_PAIR (offset&0xffffffff,offset>>32));
-}
-
-int pread64(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread64")));
-#endif
diff --git a/mdk-stage1/dietlibc/lib/putenv.c b/mdk-stage1/dietlibc/lib/putenv.c
deleted file mode 100644
index 274b16b0e..000000000
--- a/mdk-stage1/dietlibc/lib/putenv.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-
-int putenv(const char *string) {
- int len;
- int envc;
- char *tmp;
- const char **ep;
- char **newenv;
- static char **origenv=0;
- if (!origenv) origenv=environ;
- if (!(tmp=strchr(string,'=')))
- len=strlen(string);
- else
- len=tmp-string+1;
- for (envc=0, ep=(const char**)environ; *ep; ++ep) {
- if (!memcmp(string,*ep,len)) { /* found */
- if (!tmp) {
- for (; ep[1]; ++ep) ep[0]=ep[1];
- ep[0]=0;
- return 0;
- }
- *ep=string;
- return 0;
- }
- ++envc;
- }
- if (tmp) {
- newenv=(char**)malloc((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 01f6e50c4..000000000
--- a/mdk-stage1/dietlibc/lib/puts.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <unistd.h>
-#include <string.h>
-
-int puts(const char *s) {
- return write(1,s,strlen(s)) && write(1,"\n",1);
-}
diff --git a/mdk-stage1/dietlibc/lib/raise.c b/mdk-stage1/dietlibc/lib/raise.c
deleted file mode 100644
index 606546034..000000000
--- a/mdk-stage1/dietlibc/lib/raise.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <linux/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/readdir.c b/mdk-stage1/dietlibc/lib/readdir.c
deleted file mode 100644
index 5accd32a1..000000000
--- a/mdk-stage1/dietlibc/lib/readdir.c
+++ /dev/null
@@ -1,83 +0,0 @@
-#if 0
-
-Sorry, currently broken
-
-#include <dirent.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "dirstream.h"
-
-#ifdef __ELF__
-#pragma weak readdir = __libc_readdir
-#endif
-
-struct dirent *
-__libc_readdir(DIR * dir)
-{
- int result;
- struct dirent *de;
-
- if (!dir) {
- errno = EBADF;
- return NULL;
- }
-
- /* Are we running an old kernel? */
- if (dir->dd_getdents == no_getdents)
- {
- abort();
- }
-
- if (dir->dd_size <= dir->dd_nextloc)
- {
- /* read dir->dd_max bytes of directory entries. */
- result=getdents(dir->dd_fd,dir->dd_buf,dir->dd_max);
-
- /* We assume we have getdents (). */
- dir->dd_getdents = have_getdents;
- if (result <= 0)
- {
- result = -result;
- if (result > 0)
- {
- /* Are we right? */
- if (result == ENOSYS)
- {
- dir->dd_getdents = no_getdents;
- abort();
- }
- errno = result;
- }
-
- return NULL;
- }
-
- dir->dd_size = result;
- dir->dd_nextloc = 0;
- }
-
- de = (struct dirent *) (((char *)dir->dd_buf) + dir->dd_nextloc);
-
- /* Am I right? H.J. */
- dir->dd_nextloc += de->d_reclen;
-
- /* We have to save the next offset here. */
- dir->dd_nextoff = de->d_off;
-
- /* convert */
- dir->convbuf.d_ino=de->d_ino;
- dir->convbuf.d_off=de->d_off;
- dir->convbuf.d_reclen=de->d_reclen;
- dir->convbuf.d_type=0;
- if (strlen((char*)&de->d_type)>10)
- de->d_name[10]=0;
- strcpy(dir->convbuf.d_name,(char*)&de->d_type);
- errno=0;
-
- return &dir->convbuf;
-}
-
-#endif
diff --git a/mdk-stage1/dietlibc/lib/recv.c b/mdk-stage1/dietlibc/lib/recv.c
deleted file mode 100644
index cc778712c..000000000
--- a/mdk-stage1/dietlibc/lib/recv.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/net.h>
-
-extern int socketcall(int callno,long* args);
-
-int 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
-}
-
diff --git a/mdk-stage1/dietlibc/lib/recvfrom.c b/mdk-stage1/dietlibc/lib/recvfrom.c
deleted file mode 100644
index a07afe7ad..000000000
--- a/mdk-stage1/dietlibc/lib/recvfrom.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <linux/net.h>
-
-extern int socketcall(int callno,long* args);
-
-int 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
-}
diff --git a/mdk-stage1/dietlibc/lib/rewind.c b/mdk-stage1/dietlibc/lib/rewind.c
deleted file mode 100644
index 48434a316..000000000
--- a/mdk-stage1/dietlibc/lib/rewind.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <dietstdio.h>
-#include <unistd.h>
-
-void rewind( FILE *stream) {
- fseek(stream, 0L, SEEK_SET);
-}
diff --git a/mdk-stage1/dietlibc/lib/rewinddir.c b/mdk-stage1/dietlibc/lib/rewinddir.c
deleted file mode 100644
index 138936527..000000000
--- a/mdk-stage1/dietlibc/lib/rewinddir.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <unistd.h>
-#include <errno.h>
-
-#include "dirstream.h"
-
-/*
- * rewinddir() just does an lseek(fd,0,0) - see close for comments
- */
-void rewinddir(DIR * dir)
-{
- if (!dir) {
- errno = EBADF;
- return;
- }
- lseek(dir->dd_fd,0,SEEK_SET);
- dir->dd_nextoff = dir->dd_nextloc = dir->dd_size = 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/sbrk.c b/mdk-stage1/dietlibc/lib/sbrk.c
deleted file mode 100644
index 945ad5a16..000000000
--- a/mdk-stage1/dietlibc/lib/sbrk.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <unistd.h>
-
-extern int __brk(void *end_data_segment);
-
-extern void* __curbrk;
-
-void* __sbrk(ptrdiff_t increment) {
- void* oldbrk;
- if (__curbrk==0)
- if (__brk(0) < 0)
- return (void*)-1;
- if (increment==0)
- return __curbrk;
- oldbrk=__curbrk;
- if (__brk(oldbrk+increment)<0)
- return (void*)-1;
- return oldbrk;
-}
-
-void* sbrk (ptrdiff_t increment) __attribute__((weak,alias("__sbrk")));
diff --git a/mdk-stage1/dietlibc/lib/seekdir.c b/mdk-stage1/dietlibc/lib/seekdir.c
deleted file mode 100644
index f83052250..000000000
--- a/mdk-stage1/dietlibc/lib/seekdir.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <unistd.h>
-#include <errno.h>
-
-#include "dirstream.h"
-
-#undef seekdir
-void seekdir(DIR * dir, off_t offset)
-{
- if (!dir) {
- errno = EBADF;
- return;
- }
- dir->dd_nextoff = lseek(dir->dd_fd, offset, SEEK_SET);
- dir->dd_size = dir->dd_nextloc = 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/send.c b/mdk-stage1/dietlibc/lib/send.c
deleted file mode 100644
index be43b4e63..000000000
--- a/mdk-stage1/dietlibc/lib/send.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/net.h>
-
-extern int socketcall(int callno,long* args);
-
-int 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
-}
-
diff --git a/mdk-stage1/dietlibc/lib/sendto.c b/mdk-stage1/dietlibc/lib/sendto.c
deleted file mode 100644
index e6c2560f3..000000000
--- a/mdk-stage1/dietlibc/lib/sendto.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/net.h>
-
-extern int socketcall(int callno,long* args);
-
-int 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
-}
-
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/setsockopt.c b/mdk-stage1/dietlibc/lib/setsockopt.c
deleted file mode 100644
index 781e9c31c..000000000
--- a/mdk-stage1/dietlibc/lib/setsockopt.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <linux/net.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
- unsigned long args[] = { a, b, c, (long)d, (long) e };
- return socketcall(SYS_SETSOCKOPT, args);
-#endif
-}
-
diff --git a/mdk-stage1/dietlibc/lib/sigaddset.c b/mdk-stage1/dietlibc/lib/sigaddset.c
deleted file mode 100644
index 0c9d95c28..000000000
--- a/mdk-stage1/dietlibc/lib/sigaddset.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#define __USE_EXTERN_INLINES 1
-#include <signal.h>
-
-# define __sigmask(sig) \
- (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int))))
-
-# 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 __sigaddset(__sigset_t *set, int signo) {
- unsigned long int __mask = __sigmask (signo);
- unsigned long int __word = __sigword (signo);
- return ((set->__val[__word] |= __mask), 0);
-}
-
-int sigaddset (sigset_t *env, int signo) __attribute__((weak,alias("__sigaddset")));
diff --git a/mdk-stage1/dietlibc/lib/sigemptyset.c b/mdk-stage1/dietlibc/lib/sigemptyset.c
deleted file mode 100644
index f4532f96e..000000000
--- a/mdk-stage1/dietlibc/lib/sigemptyset.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#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;
- }
- memset(set,0,sizeof(*set));
- return 0;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/sigjmp.c b/mdk-stage1/dietlibc/lib/sigjmp.c
deleted file mode 100644
index d7db58fd2..000000000
--- a/mdk-stage1/dietlibc/lib/sigjmp.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* 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 <stddef.h>
-#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);
-
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/sleep.c b/mdk-stage1/dietlibc/lib/sleep.c
deleted file mode 100644
index ec5b99533..000000000
--- a/mdk-stage1/dietlibc/lib/sleep.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <linux/time.h>
-#include <time.h>
-
-unsigned int sleep(unsigned int secs) {
- struct timespec t;
- t.tv_sec=secs;
- t.tv_nsec=0;
- nanosleep(&t,&t);
- return secs-t.tv_sec;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/snprintf.c b/mdk-stage1/dietlibc/lib/snprintf.c
deleted file mode 100644
index 096c06115..000000000
--- a/mdk-stage1/dietlibc/lib/snprintf.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdarg.h>
-#include <sys/types.h>
-
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
-int snprintf(char *str,size_t size,const char *format,...)
-{
- int n;
- va_list arg_ptr;
- va_start(arg_ptr, format);
- n=vsnprintf(str,size,format,arg_ptr);
- va_end (arg_ptr);
- return n;
-}
diff --git a/mdk-stage1/dietlibc/lib/socket.c b/mdk-stage1/dietlibc/lib/socket.c
deleted file mode 100644
index 1684a6a2b..000000000
--- a/mdk-stage1/dietlibc/lib/socket.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <linux/net.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
- unsigned long args[] = { a, b, c };
- return socketcall(SYS_SOCKET, args);
-#endif
-}
diff --git a/mdk-stage1/dietlibc/lib/sprintf.c b/mdk-stage1/dietlibc/lib/sprintf.c
deleted file mode 100644
index f1b554ce2..000000000
--- a/mdk-stage1/dietlibc/lib/sprintf.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdarg.h>
-#include <linux/types.h>
-#include <stdlib.h>
-
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
-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);
- va_end (arg_ptr);
- return n;
-}
diff --git a/mdk-stage1/dietlibc/lib/sscanf.c b/mdk-stage1/dietlibc/lib/sscanf.c
deleted file mode 100644
index 341e74bba..000000000
--- a/mdk-stage1/dietlibc/lib/sscanf.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdarg.h>
-
-int vsscanf(const char *str, const char *format, va_list arg_ptr);
-
-int sscanf(const char *str, const char *format, ...)
-{
- int n;
- va_list arg_ptr;
- va_start(arg_ptr, format);
- n=vsscanf(str,format,arg_ptr);
- va_end (arg_ptr);
- return n;
-}
diff --git a/mdk-stage1/dietlibc/lib/strcat.c b/mdk-stage1/dietlibc/lib/strcat.c
deleted file mode 100644
index 8a755afea..000000000
--- a/mdk-stage1/dietlibc/lib/strcat.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include "dietfeatures.h"
-#include <string.h>
-
-char* strcat(register char* s,register const char* t)
-{
- char *dest=s;
- s+=strlen(s);
- for (;;) {
- if (!(*s = *t)) break; ++s; ++t;
-#ifndef WANT_SMALL_STRING_ROUTINES
- if (!(*s = *t)) break; ++s; ++t;
- if (!(*s = *t)) break; ++s; ++t;
- if (!(*s = *t)) break; ++s; ++t;
-#endif
- }
- return dest;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/strchr.c b/mdk-stage1/dietlibc/lib/strchr.c
deleted file mode 100644
index b908853f8..000000000
--- a/mdk-stage1/dietlibc/lib/strchr.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "dietfeatures.h"
-
-char *strchr(register const char *t, int c) {
- register char ch;
-
- ch = c;
- for (;;) {
- if (*t == ch) break; if (!*t) return 0; ++t;
-#ifndef WANT_SMALL_STRING_ROUTINES
- if (*t == ch) break; if (!*t) return 0; ++t;
- if (*t == ch) break; if (!*t) return 0; ++t;
- if (*t == ch) break; if (!*t) return 0; ++t;
-#endif
- }
- return (char*)t;
-}
diff --git a/mdk-stage1/dietlibc/lib/strcmp.c b/mdk-stage1/dietlibc/lib/strcmp.c
deleted file mode 100644
index 0db324e66..000000000
--- a/mdk-stage1/dietlibc/lib/strcmp.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "dietfeatures.h"
-
-int strcmp(register const char *s,register const char *t) {
- register char x;
-
- for (;;) {
- x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
-#ifndef WANT_SMALL_STRING_ROUTINES
- x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
- x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
- x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
-#endif
- }
- return ((int)(unsigned int)(unsigned char) x)
- - ((int)(unsigned int)(unsigned char) *t);
-}
diff --git a/mdk-stage1/dietlibc/lib/strcpy.c b/mdk-stage1/dietlibc/lib/strcpy.c
deleted file mode 100644
index 49693c30d..000000000
--- a/mdk-stage1/dietlibc/lib/strcpy.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "dietfeatures.h"
-
-char* strcpy(register char* s,register const char* t)
-{
- char *dest=s;
- 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
- }
-}
-
diff --git a/mdk-stage1/dietlibc/lib/strcspn.c b/mdk-stage1/dietlibc/lib/strcspn.c
deleted file mode 100644
index 37053c72c..000000000
--- a/mdk-stage1/dietlibc/lib/strcspn.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <sys/types.h>
-#include <string.h>
-
-size_t strcspn(const char *s, const char *reject)
-{
- size_t 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;
-}
diff --git a/mdk-stage1/dietlibc/lib/strdup.c b/mdk-stage1/dietlibc/lib/strdup.c
deleted file mode 100644
index 6a2ea5f95..000000000
--- a/mdk-stage1/dietlibc/lib/strdup.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <string.h>
-#include <stdlib.h>
-
-char *strdup(const char *s) {
- char *tmp=(char *)malloc(strlen(s)+1);
- if (!tmp) return 0;
- strcpy(tmp,s);
- return tmp;
-}
diff --git a/mdk-stage1/dietlibc/lib/strerror.c b/mdk-stage1/dietlibc/lib/strerror.c
deleted file mode 100644
index f15b86aae..000000000
--- a/mdk-stage1/dietlibc/lib/strerror.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <string.h>
-
-extern char *sys_errlist[];
-extern int sys_nerr;
-
-char *strerror(int errnum) {
- if (errnum>=0 && errnum<sys_nerr)
- return sys_errlist[errnum];
- return "[unknown error]";
-}
diff --git a/mdk-stage1/dietlibc/lib/strlcat.c b/mdk-stage1/dietlibc/lib/strlcat.c
deleted file mode 100644
index fd35ec8af..000000000
--- a/mdk-stage1/dietlibc/lib/strlcat.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* $OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $ */
-
-/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- * All rights reserved.
- *
- * 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.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``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 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.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-#include <string.h>
-
-/*
- * Appends src to string dst of size siz (unlike strncat, siz is the
- * full size of dst, not space left). At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz == 0).
- * Returns strlen(initial dst) + strlen(src); if retval >= siz,
- * truncation occurred.
- */
-size_t strlcat(dst, src, siz)
- char *dst;
- const char *src;
- size_t siz;
-{
- register char *d = dst;
- register const char *s = src;
- register size_t n = siz;
- size_t dlen;
-
- /* Find the end of dst and adjust bytes left but don't go past end */
- while (*d != '\0' && n-- != 0)
- d++;
- dlen = d - dst;
- n = siz - dlen;
-
- if (n == 0)
- return(dlen + strlen(s));
- while (*s != '\0') {
- if (n != 1) {
- *d++ = *s;
- n--;
- }
- s++;
- }
- *d = '\0';
-
- return(dlen + (s - src)); /* count does not include NUL */
-}
diff --git a/mdk-stage1/dietlibc/lib/strlcpy.c b/mdk-stage1/dietlibc/lib/strlcpy.c
deleted file mode 100644
index b935b9527..000000000
--- a/mdk-stage1/dietlibc/lib/strlcpy.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $OpenBSD: strlcpy.c,v 1.3 1999/04/24 01:17:37 millert Exp $ */
-
-/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- * All rights reserved.
- *
- * 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.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``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 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.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: strlcpy.c,v 1.3 1999/04/24 01:17:37 millert Exp $";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-#include <string.h>
-
-/*
- * Copy src to string dst of size siz. At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz == 0).
- * Returns strlen(src); if retval >= siz, truncation occurred.
- */
-size_t strlcpy(dst, src, siz)
- char *dst;
- const char *src;
- size_t siz;
-{
- register char *d = dst;
- register const char *s = src;
- register size_t n = siz;
-
- /* Copy as many bytes as will fit */
- if (n != 0 && --n != 0) {
- do {
- if ((*d++ = *s++) == 0)
- break;
- } while (--n != 0);
- }
-
- /* Not enough room in dst, add NUL and traverse rest of src */
- if (n == 0) {
- if (siz != 0)
- *d = '\0'; /* NUL-terminate dst */
- while (*s++)
- ;
- }
-
- return(s - src - 1); /* count does not include NUL */
-}
diff --git a/mdk-stage1/dietlibc/lib/strlen.c b/mdk-stage1/dietlibc/lib/strlen.c
deleted file mode 100644
index 56c085dac..000000000
--- a/mdk-stage1/dietlibc/lib/strlen.c
+++ /dev/null
@@ -1,47 +0,0 @@
-#include <endian.h>
-#include "dietfeatures.h"
-#include <string.h>
-
-#ifdef WANT_SMALL_STRING_ROUTINES
-size_t strlen(const char *s) {
- register int i;
- if (!s) return 0;
- for (i=0; *s; ++s) ++i;
- return i;
-}
-#else
-static const unsigned long magic = 0x01010101;
-
-size_t strlen(const char *s)
-{
- const char *t = s;
- unsigned long word;
-
- if (!s) return 0;
-
- /* Byte compare up until word boundary */
- for (; ((unsigned long) t & 3); t++)
- if (!*t) return t - s;
-
- /* Word compare */
- do {
- word = *((unsigned long *) t); t += 4;
- word = (word - magic) &~ word;
- word &= (magic << 7);
- } while (word == 0);
-
-#if BYTE_ORDER == LITTLE_ENDIAN
- /* word & 0x80808080 == word */
- word = (word - 1) & (magic << 10);
- word += (word << 8) + (word << 16);
- t += word >> 26;
-#else
- if ((word & 0x80800000) == 0) {
- word <<= 16;
- t += 2;
- }
- if ((word & 0x80000000) == 0) t += 1;
-#endif
- return ((const char *) t) - 4 - s;
-}
-#endif
diff --git a/mdk-stage1/dietlibc/lib/strncat.c b/mdk-stage1/dietlibc/lib/strncat.c
deleted file mode 100644
index 1d3b94ca5..000000000
--- a/mdk-stage1/dietlibc/lib/strncat.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "dietfeatures.h"
-#include <string.h>
-
-char *strncat(char *s, const char *t, size_t n) {
- char *dest=s;
- register char *max=s+n-1;
- s+=strlen(s);
- for (;;) {
- if (!(*s = *t)) break; if (++s==max) break; ++t;
-#ifndef WANT_SMALL_STRING_ROUTINES
- if (!(*s = *t)) break; if (++s==max) break; ++t;
- if (!(*s = *t)) break; if (++s==max) break; ++t;
- if (!(*s = *t)) break; if (++s==max) break; ++t;
-#endif
- }
- *s=0;
- return dest;
-}
-
diff --git a/mdk-stage1/dietlibc/lib/strncmp.c b/mdk-stage1/dietlibc/lib/strncmp.c
deleted file mode 100644
index 7c08c0fa7..000000000
--- a/mdk-stage1/dietlibc/lib/strncmp.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <sys/types.h>
-#include <string.h>
-
-int strncmp(const char *s1, const char *s2, size_t n) {
- return memccmp(s1,s2,0,n);
-}
diff --git a/mdk-stage1/dietlibc/lib/strncpy.c b/mdk-stage1/dietlibc/lib/strncpy.c
deleted file mode 100644
index 531387b7f..000000000
--- a/mdk-stage1/dietlibc/lib/strncpy.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#define _POSIX_SOURCE
-#define _XOPEN_SOURCE
-#include <sys/types.h>
-#include <string.h>
-
-char *strncpy(char *dest, const char *src, size_t n)
-{
- memccpy(dest,src,0,n);
- return dest;
-}
diff --git a/mdk-stage1/dietlibc/lib/strpbrk.c b/mdk-stage1/dietlibc/lib/strpbrk.c
deleted file mode 100644
index e18fd2a2d..000000000
--- a/mdk-stage1/dietlibc/lib/strpbrk.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <sys/types.h>
-#include <string.h>
-
-char *strpbrk(const char *s, const char *accept) {
- register int i,l=strlen(accept);
- for (; *s; s++)
- for (i=0; i<l; i++)
- if (*s == accept[i])
- return (char*)s;
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/lib/strrchr.c b/mdk-stage1/dietlibc/lib/strrchr.c
deleted file mode 100644
index 3c91e9bc8..000000000
--- a/mdk-stage1/dietlibc/lib/strrchr.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <string.h>
-#include "dietfeatures.h"
-
-char *strrchr(const char *t, int c) {
- register char ch;
- register const char *l=0;
-
- ch = c;
- for (;;) {
- if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
-#ifndef WANT_SMALL_STRING_ROUTINES
- if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
- if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
- if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
-#endif
- }
- return (char*)l;
-}
diff --git a/mdk-stage1/dietlibc/lib/strspn.c b/mdk-stage1/dietlibc/lib/strspn.c
deleted file mode 100644
index 2b3a4c116..000000000
--- a/mdk-stage1/dietlibc/lib/strspn.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <sys/types.h>
-#include <string.h>
-
-size_t strspn(const char *s, const char *accept)
-{
- size_t l=0;
- int a=1,i,al=strlen(accept);
-
- while((a)&&(*s))
- {
- for(a=i=0;(!a)&&(i<al);i++)
- if (*s==accept[i]) a=1;
- if (a) l++;
- s++;
- }
- return l;
-}
diff --git a/mdk-stage1/dietlibc/lib/strstr.c b/mdk-stage1/dietlibc/lib/strstr.c
deleted file mode 100644
index 641d9d7ac..000000000
--- a/mdk-stage1/dietlibc/lib/strstr.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <sys/types.h>
-#include <string.h>
-
-char *strstr(const char *haystack, const char *needle) {
- int nl=strlen(needle);
- int hl=strlen(haystack);
- 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/strtod.c b/mdk-stage1/dietlibc/lib/strtod.c
deleted file mode 100644
index 767be679f..000000000
--- a/mdk-stage1/dietlibc/lib/strtod.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <string.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;
- }
- }
- if ((*c|32)=='e') {
- int exp=0;
- char neg=0;
- if (c[1]<'0') {
- switch (*c) {
- case '-': neg=1;
- case '+': c++; break;
- default:
- d=0;
- c=nptr;
- goto done;
- }
- }
- while (isdigit(*++c))
- exp=exp*10+(*c-'0');
- while (exp) { /* XXX: this introduces rounding errors */
- d*=10; --exp;
- }
- }
-done:
- if (endptr) *endptr=(char*)c;
- return d;
-}
diff --git a/mdk-stage1/dietlibc/lib/strtok.c b/mdk-stage1/dietlibc/lib/strtok.c
deleted file mode 100644
index 525665e59..000000000
--- a/mdk-stage1/dietlibc/lib/strtok.c
+++ /dev/null
@@ -1,6 +0,0 @@
-char *strtok_r(char *s, const char *delim, char **ptrptr);
-static char *strtok_pos;
-char *strtok(char *s, const char *delim)
-{
- return strtok_r(s,delim,&strtok_pos);
-}
diff --git a/mdk-stage1/dietlibc/lib/strtok_r.c b/mdk-stage1/dietlibc/lib/strtok_r.c
deleted file mode 100644
index 93f9401de..000000000
--- a/mdk-stage1/dietlibc/lib/strtok_r.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <string.h>
-
-char *strtok_r(char *s, const char *delim, char **ptrptr)
-{
- int i;
- char *tmp=0;
-
- if (s) (*ptrptr)=s;
-
- if (**ptrptr)
- {
- while(!(i=strcspn(*ptrptr,delim))) (*ptrptr)++;
- if (**ptrptr)
- {
- tmp=(*ptrptr);
- (*ptrptr)+=i;
- if (**ptrptr) *(*ptrptr)++=0;
- }
- }
- return tmp;
-}
diff --git a/mdk-stage1/dietlibc/lib/strtol.c b/mdk-stage1/dietlibc/lib/strtol.c
deleted file mode 100644
index ead89f408..000000000
--- a/mdk-stage1/dietlibc/lib/strtol.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <ctype.h>
-
-extern unsigned long int strtoul(const char *nptr, char **endptr, int base);
-
-long int strtol(const char *nptr, char **endptr, int base)
-{
- int neg=0;
- unsigned long int v;
-
- while(isspace(*nptr)) nptr++;
-
- if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; }
- v=strtoul(nptr,endptr,base);
- return (neg?-v:v);
-}
diff --git a/mdk-stage1/dietlibc/lib/strtoll.c b/mdk-stage1/dietlibc/lib/strtoll.c
deleted file mode 100644
index 7b8e28a1d..000000000
--- a/mdk-stage1/dietlibc/lib/strtoll.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <ctype.h>
-
-extern unsigned long int strtoull(const char *nptr, char **endptr, int base);
-
-long int strtoll(const char *nptr, char **endptr, int base)
-{
- int neg=0;
- unsigned long long int v;
-
- while(isspace(*nptr)) nptr++;
-
- if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; }
- v=strtoull(nptr,endptr,base);
- return (neg?-v:v);
-}
diff --git a/mdk-stage1/dietlibc/lib/strtoul.c b/mdk-stage1/dietlibc/lib/strtoul.c
deleted file mode 100644
index bee849685..000000000
--- a/mdk-stage1/dietlibc/lib/strtoul.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <ctype.h>
-
-static char *num="0123456789abcdefghijklmnopqrstuvwxyz";
-
-unsigned long int strtoul(const char *nptr, char **endptr, int base)
-{
- long int v=0;
- int a=1,i;
-
- while(isspace(*nptr)) nptr++;
-
- if (*nptr == '+') { nptr++; }
- if (!base)
- {
- if (*nptr=='0')
- {
- base=8;
- if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) base=16;
- }
- else
- base=10;
- }
- while((a)&&(*nptr))
- {
- a=0;
- for (i=0;(!a)&&(i<base);i++)
- {
- if ((*nptr == num[i]) || (*nptr == (num[i]-' ')))
- {
- a=1;
- v=(v*base)+(&num[i]-num);
- }
- }
- if ((!a)&&(base==16)&&((*nptr=='x')||(*nptr=='X'))) a=1;
- if (a) nptr++;
- }
- if (endptr) *endptr=(char *)nptr;
- return v;
-}
diff --git a/mdk-stage1/dietlibc/lib/strtoull.c b/mdk-stage1/dietlibc/lib/strtoull.c
deleted file mode 100644
index 64f095f60..000000000
--- a/mdk-stage1/dietlibc/lib/strtoull.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <ctype.h>
-
-static char *num="0123456789abcdefghijklmnopqrstuvwxyz";
-
-unsigned long long int strtoull(const char *nptr, char **endptr, int base)
-{
- long long int v=0;
- int a=1,i;
-
- while(isspace(*nptr)) nptr++;
-
- if (*nptr == '+') { nptr++; }
- if (!base)
- {
- if (*nptr=='0')
- {
- base=8;
- if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) base=16;
- }
- else
- base=10;
- }
- while((a)&&(*nptr))
- {
- a=0;
- for (i=0;(!a)&&(i<base);i++)
- {
- if ((*nptr == num[i]) || (*nptr == (num[i]-' ')))
- {
- a=1;
- v=(v*base)+(&num[i]-num);
- }
- }
- if ((!a)&&(base==16)&&((*nptr=='x')||(*nptr=='X'))) a=1;
- if (a) nptr++;
- }
- if (endptr) *endptr=(char *)nptr;
- return v;
-}
diff --git a/mdk-stage1/dietlibc/lib/sys_siglist.c b/mdk-stage1/dietlibc/lib/sys_siglist.c
deleted file mode 100644
index 80d7b3fb0..000000000
--- a/mdk-stage1/dietlibc/lib/sys_siglist.c
+++ /dev/null
@@ -1,37 +0,0 @@
-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
- };
-
diff --git a/mdk-stage1/dietlibc/lib/tcgetattr.c b/mdk-stage1/dietlibc/lib/tcgetattr.c
deleted file mode 100644
index f35d39442..000000000
--- a/mdk-stage1/dietlibc/lib/tcgetattr.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <termios.h>
-#include <sys/ioctl.h>
-
-int tcgetattr(int fildes, struct termios *termios_p)
-{
- return ioctl(fildes, TCGETS, termios_p);
-}
diff --git a/mdk-stage1/dietlibc/lib/tcsetattr.c b/mdk-stage1/dietlibc/lib/tcsetattr.c
deleted file mode 100644
index 642588d47..000000000
--- a/mdk-stage1/dietlibc/lib/tcsetattr.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#define tcsetattr libc_tcsetattr
-#include <termios.h>
-#include <sys/ioctl.h>
-#undef tcsetattr
-
-#include <asm/errno.h>
-
-extern int errno;
-
-int tcsetattr(int fildes, int optional_actions, struct termios *termios_p)
-{
- 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;
- }
-}
diff --git a/mdk-stage1/dietlibc/lib/telldir.c b/mdk-stage1/dietlibc/lib/telldir.c
deleted file mode 100644
index eca175381..000000000
--- a/mdk-stage1/dietlibc/lib/telldir.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <unistd.h>
-#include <errno.h>
-
-#include "dirstream.h"
-
-#undef telldir
-off_t
-telldir(DIR * dir)
-{
- off_t offset;
-
- if (!dir) {
- errno = EBADF;
- return -1;
- }
-
- switch (dir->dd_getdents)
- {
- case no_getdents:
- /* We are running the old kernel. This is the starting offset
- of the next readdir(). */
- offset = lseek(dir->dd_fd, 0, SEEK_CUR);
- break;
-
- case unknown:
- /* readdir () is not called yet. but seekdir () may be called. */
- case have_getdents:
- /* The next entry. */
- offset = dir->dd_nextoff;
- break;
-
- default:
- errno = EBADF;
- offset = -1;
- }
-
- return offset;
-}
diff --git a/mdk-stage1/dietlibc/lib/ttyname.c b/mdk-stage1/dietlibc/lib/ttyname.c
deleted file mode 100644
index 81a0cbc66..000000000
--- a/mdk-stage1/dietlibc/lib/ttyname.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#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);
-
-char *ttyname(int fd) {
-#ifdef SLASH_PROC_OK
- char ibuf[20];
- static char obuf[20];
- 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;
- return obuf;
-#else
- static char buf[20]="/dev/tty";
- struct stat s;
- char *c=buf+8;
- int n;
- if (fstat(fd,&s)) return 0;
- 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';
- ++c;
- }
-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;
- case 136:
- case 137:
- case 138:
- case 139:
- buf[5]='p'; buf[7]='s';
- n+=(major(s.st_rdev)-136)<<8;
- *c='/'; ++c;
- goto num;
- default:
- return 0;
- }
- return buf;
- }
- return 0;
-#endif
-}
-
-#endif
diff --git a/mdk-stage1/dietlibc/lib/vfork.c b/mdk-stage1/dietlibc/lib/vfork.c
deleted file mode 100644
index 795cddb05..000000000
--- a/mdk-stage1/dietlibc/lib/vfork.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <linux/types.h>
-#include <unistd.h>
-
-pid_t vfork(void) {
- return fork();
-}
diff --git a/mdk-stage1/dietlibc/lib/vfprintf.c b/mdk-stage1/dietlibc/lib/vfprintf.c
deleted file mode 100644
index 03dfe87a9..000000000
--- a/mdk-stage1/dietlibc/lib/vfprintf.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int vfprintf(FILE *fstream, const char *format, va_list ap)
-{
- char tmp[1000000];
- size_t n = vsnprintf(tmp, sizeof(tmp), 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
deleted file mode 100644
index 5bbc51620..000000000
--- a/mdk-stage1/dietlibc/lib/vsnprintf.c
+++ /dev/null
@@ -1,239 +0,0 @@
-#include "dietfeatures.h"
-#include <stdarg.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <string.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);
-
-#include <unistd.h>
-void print_int(int fd, int i)
-{
- char buf[10];
- char * chptr = buf + 9;
- int j = 0;
-
- if (i < 0)
- {
- write(1, "-", 1);
- i = -1 * i;
- }
-
- while (i)
- {
- *chptr-- = '0' + (i % 10);
- j++;
- i = i / 10;
- }
-
- write(fd, chptr + 1, j);
-}
-
-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=1;
- 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 '.':
- flag_dot=1;
- 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);
-
-print_out:
- if (str) {
- if (width && (!flag_left))
- {
- for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith;
- }
- for(i=0;(pb[i])&&(apos<size);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;
- else {
- int a=strlen(pb);
- if (a>size) apos+=size; else apos+=a;
- }
- }
-
- 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 'g':
- {
- double d=va_arg(arg_ptr,double);
- buf_len=__dtostr(d,buf,sizeof(buf),6);
- 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;
- }
- }
- if (str) str[apos]=0;
- return apos;
-}
diff --git a/mdk-stage1/dietlibc/lib/vsprintf.c b/mdk-stage1/dietlibc/lib/vsprintf.c
deleted file mode 100644
index af4eea852..000000000
--- a/mdk-stage1/dietlibc/lib/vsprintf.c
+++ /dev/null
@@ -1,11 +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 vsprintf(char *str, const char *format, va_list ap)
-{
- return vsnprintf(str, 1000000, format, ap);
-}
diff --git a/mdk-stage1/dietlibc/lib/vsscanf.c b/mdk-stage1/dietlibc/lib/vsscanf.c
deleted file mode 100644
index a646ad92d..000000000
--- a/mdk-stage1/dietlibc/lib/vsscanf.c
+++ /dev/null
@@ -1,243 +0,0 @@
-#include "dietfeatures.h"
-#include <stdarg.h>
-#include <sys/types.h>
-#include <ctype.h>
-#include <stdlib.h>
-
-const char *skip_ws(const char *str)
-{
- while ((*str)&&(isspace(*str))) str++;
- return str;
-}
-
-extern double strtod(const char *s,char **f);
-
-int vsscanf(const char *str, const char *format, va_list arg_ptr)
-{
- int n=0,div;
- char ch;
-
- char flag_discard, flag_malloc, flag_half, flag_long, flag_longlong;
- char flag_width;
-
- unsigned long width;
-
-#ifdef WANT_FLOATING_POINT_IN_SCANF
- /* arg_ptr tmps */
- 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 && *str && (!isspace(*str)))
- {
- if (!flag_discard) *(s++)=*(str);
- ++str;
- --width;
- }
- *s = '\0';
- }
- break;
- }
- break;
-
- default:
- if (prevfmt<format) {
- while (prevfmt<format) {
- if (*str!=*prevfmt) return n;
- ++str; ++prevfmt;
- }
- } else
- if (*(str++)!=ch) return n;
- break;
- }
- }
- return n;
-}
diff --git a/mdk-stage1/dietlibc/lib/wait.c b/mdk-stage1/dietlibc/lib/wait.c
deleted file mode 100644
index 8459af18c..000000000
--- a/mdk-stage1/dietlibc/lib/wait.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <sys/types.h>
-#include <sys/wait.h>
-
-pid_t wait(int *status) {
- return waitpid(-1,status,0);
-}
diff --git a/mdk-stage1/dietlibc/lib/wait3.c b/mdk-stage1/dietlibc/lib/wait3.c
deleted file mode 100644
index 19e90740c..000000000
--- a/mdk-stage1/dietlibc/lib/wait3.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <sys/wait.h>
-
-int wait3(int* status,int opts,struct rusage* rusage) {
- return wait4(-1,status,opts,rusage);
-}
diff --git a/mdk-stage1/dietlibc/ppc/Makefile.add b/mdk-stage1/dietlibc/ppc/Makefile.add
deleted file mode 100644
index b71031e05..000000000
--- a/mdk-stage1/dietlibc/ppc/Makefile.add
+++ /dev/null
@@ -1,3 +0,0 @@
-
-CFLAGS+=-mpowerpc-gpopt -mpowerpc-gfxopt -Os
-override VPATH=ppc:syscalls.s:lib
diff --git a/mdk-stage1/dietlibc/ppc/__longjmp.S b/mdk-stage1/dietlibc/ppc/__longjmp.S
deleted file mode 100644
index deada115e..000000000
--- a/mdk-stage1/dietlibc/ppc/__longjmp.S
+++ /dev/null
@@ -1,61 +0,0 @@
-#define _ASM
-#define _SETJMP_H
-#include <bits/setjmp.h>
-
-
-#ifdef PIC
-#define JUMPTARGET(name) name##@plt
-#else
-#define JUMPTARGET(name) name
-#endif
-
-.global __longjmp
-.type __longjmp,@function
-.align 2
-__longjmp:
- lwz 1,(JB_GPR1*4)(3)
- lwz 2,(JB_GPR2*4)(3)
- lwz 0,(JB_LR*4)(3)
- lwz 14,((JB_GPRS+0)*4)(3)
- lfd 14,((JB_FPRS+0*2)*4)(3)
- lwz 15,((JB_GPRS+1)*4)(3)
- lfd 15,((JB_FPRS+1*2)*4)(3)
- lwz 16,((JB_GPRS+2)*4)(3)
- lfd 16,((JB_FPRS+2*2)*4)(3)
- lwz 17,((JB_GPRS+3)*4)(3)
- lfd 17,((JB_FPRS+3*2)*4)(3)
- lwz 18,((JB_GPRS+4)*4)(3)
- lfd 18,((JB_FPRS+4*2)*4)(3)
- lwz 19,((JB_GPRS+5)*4)(3)
- lfd 19,((JB_FPRS+5*2)*4)(3)
- lwz 20,((JB_GPRS+6)*4)(3)
- lfd 20,((JB_FPRS+6*2)*4)(3)
- mtlr 0
- lwz 21,((JB_GPRS+7)*4)(3)
- lfd 21,((JB_FPRS+7*2)*4)(3)
- lwz 22,((JB_GPRS+8)*4)(3)
- lfd 22,((JB_FPRS+8*2)*4)(3)
- lwz 0,(JB_CR*4)(3)
- lwz 23,((JB_GPRS+9)*4)(3)
- lfd 23,((JB_FPRS+9*2)*4)(3)
- lwz 24,((JB_GPRS+10)*4)(3)
- lfd 24,((JB_FPRS+10*2)*4)(3)
- lwz 25,((JB_GPRS+11)*4)(3)
- lfd 25,((JB_FPRS+11*2)*4)(3)
- mtcrf 0xFF,0
- lwz 26,((JB_GPRS+12)*4)(3)
- lfd 26,((JB_FPRS+12*2)*4)(3)
- lwz 27,((JB_GPRS+13)*4)(3)
- lfd 27,((JB_FPRS+13*2)*4)(3)
- lwz 28,((JB_GPRS+14)*4)(3)
- lfd 28,((JB_FPRS+14*2)*4)(3)
- lwz 29,((JB_GPRS+15)*4)(3)
- lfd 29,((JB_FPRS+15*2)*4)(3)
- lwz 30,((JB_GPRS+16)*4)(3)
- lfd 30,((JB_FPRS+16*2)*4)(3)
- lwz 31,((JB_GPRS+17)*4)(3)
- lfd 31,((JB_FPRS+17*2)*4)(3)
- mr 3,4
- blr
-.size __longjmp,.-__longjmp
-
diff --git a/mdk-stage1/dietlibc/ppc/mmap.c b/mdk-stage1/dietlibc/ppc/mmap.c
deleted file mode 100644
index 25d2926b2..000000000
--- a/mdk-stage1/dietlibc/ppc/mmap.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <linux/types.h>
-#include <linux/unistd.h>
-
-int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) {
- unsigned long __sc_ret, __sc_err;
- {
- register unsigned long __sc_0 __asm__ ("r0");
- register unsigned long __sc_3 __asm__ ("r3");
- register unsigned long __sc_4 __asm__ ("r4");
- register unsigned long __sc_5 __asm__ ("r5");
- register unsigned long __sc_6 __asm__ ("r6");
- register unsigned long __sc_7 __asm__ ("r7");
- register unsigned long __sc_8 __asm__ ("r8");
-
- __sc_3 = (unsigned long) (start);
- __sc_4 = (unsigned long) (length);
- __sc_5 = (unsigned long) (prot);
- __sc_6 = (unsigned long) (flags);
- __sc_7 = (unsigned long) (fd);
- __sc_8 = (unsigned long) (offset);
- __sc_0 = __NR_mmap;
- __asm__ __volatile__
- ("sc \n\t"
- "mfcr %1 "
- : "=&r" (__sc_3), "=&r" (__sc_0)
- : "0" (__sc_3), "1" (__sc_0),
- "r" (__sc_4),
- "r" (__sc_5),
- "r" (__sc_6),
- "r" (__sc_7),
- "r" (__sc_8)
- : __syscall_clobbers);
- __sc_ret = __sc_3;
- __sc_err = __sc_0;
- }
- __syscall_return (int);
-}
diff --git a/mdk-stage1/dietlibc/ppc/setjmp.S b/mdk-stage1/dietlibc/ppc/setjmp.S
deleted file mode 100644
index 50fa2bdd4..000000000
--- a/mdk-stage1/dietlibc/ppc/setjmp.S
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <setjmp.h>
-
-#ifdef PIC
-#define JUMPTARGET(name) name##@plt
-#else
-#define JUMPTARGET(name) name
-#endif
-
-.global __sigsetjmp
-.type __sigsetjmp,@function
-.align 2
-__sigsetjmp:
- stw 1,(JB_GPR1*4)(3)
- mflr 0
- stw 2,(JB_GPR2*4)(3)
- stw 14,((JB_GPRS+0)*4)(3)
- stfd 14,((JB_FPRS+0*2)*4)(3)
- stw 0,(JB_LR*4)(3)
- stw 15,((JB_GPRS+1)*4)(3)
- stfd 15,((JB_FPRS+1*2)*4)(3)
- mfcr 0
- stw 16,((JB_GPRS+2)*4)(3)
- stfd 16,((JB_FPRS+2*2)*4)(3)
- stw 0,(JB_CR*4)(3)
- stw 17,((JB_GPRS+3)*4)(3)
- stfd 17,((JB_FPRS+3*2)*4)(3)
- stw 18,((JB_GPRS+4)*4)(3)
- stfd 18,((JB_FPRS+4*2)*4)(3)
- stw 19,((JB_GPRS+5)*4)(3)
- stfd 19,((JB_FPRS+5*2)*4)(3)
- stw 20,((JB_GPRS+6)*4)(3)
- stfd 20,((JB_FPRS+6*2)*4)(3)
- stw 21,((JB_GPRS+7)*4)(3)
- stfd 21,((JB_FPRS+7*2)*4)(3)
- stw 22,((JB_GPRS+8)*4)(3)
- stfd 22,((JB_FPRS+8*2)*4)(3)
- stw 23,((JB_GPRS+9)*4)(3)
- stfd 23,((JB_FPRS+9*2)*4)(3)
- stw 24,((JB_GPRS+10)*4)(3)
- stfd 24,((JB_FPRS+10*2)*4)(3)
- stw 25,((JB_GPRS+11)*4)(3)
- stfd 25,((JB_FPRS+11*2)*4)(3)
- stw 26,((JB_GPRS+12)*4)(3)
- stfd 26,((JB_FPRS+12*2)*4)(3)
- stw 27,((JB_GPRS+13)*4)(3)
- stfd 27,((JB_FPRS+13*2)*4)(3)
- stw 28,((JB_GPRS+14)*4)(3)
- stfd 28,((JB_FPRS+14*2)*4)(3)
- stw 29,((JB_GPRS+15)*4)(3)
- stfd 29,((JB_FPRS+15*2)*4)(3)
- stw 30,((JB_GPRS+16)*4)(3)
- stfd 30,((JB_FPRS+16*2)*4)(3)
- stw 31,((JB_GPRS+17)*4)(3)
- stfd 31,((JB_FPRS+17*2)*4)(3)
- b JUMPTARGET (__sigjmp_save)
-.size __sigsetjmp,.-__sigsetjmp
diff --git a/mdk-stage1/dietlibc/ppc/start.S b/mdk-stage1/dietlibc/ppc/start.S
deleted file mode 100644
index c7afeecd2..000000000
--- a/mdk-stage1/dietlibc/ppc/start.S
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "start.h"
-
-#ifdef __powerpc__
-
-.text
-.global _start
-.type _start,@function
-_start:
- /* Save the stack pointer, in case we're statically linked under Linux. */
- mr 9,1
- /* Set up an initial stack frame, and clear the LR. */
- clrrwi 1,1,4
- li 0,0
- stwu 1,-16(1)
- mtlr 0
- stw 0,0(1)
-
- /* r9 enthält den initialen Stackpointer.
- argc = (r9)
- argv = (r9+4)
- envp = argv+(argc+1)*4 */
-
- lwzu 3,0(9) /* argc */
- addi 4,9,4 /* argv */
- add 5,0,3 /* argc... */
- addi 5,5,1 /* argc+1...*/
- slwi 5,5,2 /* (argc+1)*4 */
- add 5,5,4 /* argv+(argc+1)*4 */
-
- lis 6,environ@ha
- stw 5,environ@l(6)
-
- bl main
- b exit
-.size _start,.-_start
-
-
-/* Define a symbol for the first piece of initialized data. */
- .section ".data"
-__data_start:
-
-
-#endif
-
diff --git a/mdk-stage1/dietlibc/ppc/unified.S b/mdk-stage1/dietlibc/ppc/unified.S
deleted file mode 100644
index d2b419f0b..000000000
--- a/mdk-stage1/dietlibc/ppc/unified.S
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <dietfeatures.h>
-
-.text
-.global __unified_syscall
-__unified_syscall:
- sc
- mfcr 0
- andis. 9,0,4096
- mr 0,3
- beq .L1
-#ifdef WANT_THREAD_SAVE
- bl __set_errno
-#else
- lis 9,errno@ha
- stw 3,errno@l(9)
-#endif
- li 0,-1
-.L1:
- mr 3,0
- blr
-
diff --git a/mdk-stage1/dietlibc/sparc/Makefile.add b/mdk-stage1/dietlibc/sparc/Makefile.add
deleted file mode 100644
index a12a0446a..000000000
--- a/mdk-stage1/dietlibc/sparc/Makefile.add
+++ /dev/null
@@ -1,3 +0,0 @@
-
-CFLAGS+=-mcpu=supersparc -Os
-override VPATH=sparc:syscalls.s:lib
diff --git a/mdk-stage1/dietlibc/sparc/__longjmp.S b/mdk-stage1/dietlibc/sparc/__longjmp.S
deleted file mode 100644
index 81dd24af2..000000000
--- a/mdk-stage1/dietlibc/sparc/__longjmp.S
+++ /dev/null
@@ -1,66 +0,0 @@
-#define _ASM
-#define _SETJMP_H
-#include <bits/setjmp.h>
-
-
-#define ENV(base,reg) [%base + (reg * 4)]
-#define ST_FLUSH_WINDOWS 3
-#define RW_FP [%fp + 0x48]
-
-.text
-.global __longjmp
-__longjmp:
- /* Store our arguments in global registers so we can still
- use them while unwinding frames and their register windows. */
-
- ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */
- mov %o0, %g1 /* ENV in %g1 */
- orcc %o1, %g0, %g2 /* VAL in %g2 */
- be,a 0f /* Branch if zero; else skip delay slot. */
- mov 1, %g2 /* Delay slot only hit if zero: VAL = 1. */
-0:
- xor %fp, %g3, %o0
- add %fp, 512, %o1
- andncc %o0, 4095, %o0
- bne .Lthread
- cmp %o1, %g3
- bl .Lthread
-
- /* Now we will loop, unwinding the register windows up the stack
- until the restored %fp value matches the target value in %g3. */
-
-.Lloop:
- cmp %fp, %g3 /* Have we reached the target frame? */
- bl,a .Lloop /* Loop while current fp is below target. */
- restore /* Unwind register window in delay slot. */
- be,a .Lfound /* Better have hit it exactly. */
- ld ENV(g1,JB_SP), %o0 /* Delay slot: extract target SP. */
-
-.Lthread:
- /*
- * Do a "flush register windows trap". The trap handler in the
- * kernel writes all the register windows to their stack slots, and
- * marks them all as invalid (needing to be sucked up from the
- * stack when used). This ensures that all information needed to
- * unwind to these callers is in memory, not in the register
- * windows.
- */
- ta ST_FLUSH_WINDOWS
- ld ENV(g1,JB_PC), %o7 /* Set return PC. */
- ld ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */
- sub %fp, 64, %sp /* Allocate a register frame. */
- st %g3, RW_FP /* Set saved FP on restore below. */
- retl
- restore %g2, 0, %o0 /* Restore values from above register frame. */
-
-.Lfound:
- /* We have unwound register windows so %fp matches the target. */
- mov %o0, %sp /* OK, install new SP. */
-
-.Lsp_ok:
- ld ENV(g1,JB_PC), %o0 /* Extract target return PC. */
- jmp %o0 + 8 /* Return there. */
- mov %g2, %o0 /* Delay slot: set return value. */
-
-.size __longjmp, . - __longjmp
-
diff --git a/mdk-stage1/dietlibc/sparc/fork.S b/mdk-stage1/dietlibc/sparc/fork.S
deleted file mode 100644
index 150839971..000000000
--- a/mdk-stage1/dietlibc/sparc/fork.S
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "syscalls.h"
-
-.text
-.global fork
-fork:
- mov 2, %g1
- ta 0x10
- bcc,a 1f
- nop
-
- sethi %hi(errno), %o3
- or %o3, %lo(errno), %o3
- st %i0, [%o3]
-
- retl
- mov -1, %o0
-1: dec %o1
- retl
- and %o0, %o1, %o0
diff --git a/mdk-stage1/dietlibc/sparc/mmap.c b/mdk-stage1/dietlibc/sparc/mmap.c
deleted file mode 100644
index 25ebdc24e..000000000
--- a/mdk-stage1/dietlibc/sparc/mmap.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <linux/types.h>
-#include <linux/unistd.h>
-
-#define __SYSCALL_STRING \
- "ta 0x10;" \
- "bcs 2f;" \
- " nop;" \
- "1:" \
- ".subsection 2;" \
- "2:" \
- "save %%sp, -192, %%sp;" \
- "call __errno_location;" \
- " nop;" \
- "st %%i0,[%%o0];" \
- "ba 1b;" \
- " restore %%g0, -1, %%o0;" \
- ".previous;"
-
-#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g7", \
- "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
- "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
- "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \
- "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \
- "cc", "memory"
-
-#define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \
-({ \
- register long __o0 __asm__ ("o0") = (long)(arg1); \
- register long __o1 __asm__ ("o1") = (long)(arg2); \
- register long __o2 __asm__ ("o2") = (long)(arg3); \
- register long __o3 __asm__ ("o3") = (long)(arg4); \
- register long __o4 __asm__ ("o4") = (long)(arg5); \
- register long __o5 __asm__ ("o5") = (long)(arg6); \
- register long __g1 __asm__ ("g1") = __NR_##name; \
- __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \
- "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2), \
- "r" (__o3), "r" (__o4), "r" (__o5) : \
- __SYSCALL_CLOBBERS); \
- __o0; \
-})
-int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) {
- return inline_syscall6(mmap,start,length,prot,flags,fd,offset);
-}
diff --git a/mdk-stage1/dietlibc/sparc/pipe.S b/mdk-stage1/dietlibc/sparc/pipe.S
deleted file mode 100644
index b8ad1d251..000000000
--- a/mdk-stage1/dietlibc/sparc/pipe.S
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "syscalls.h"
-
-.text
-.global pipe
-pipe:
- mov __NR_pipe, %g1
- ta 0x10
- bcc,a .Lnoerror
- nop
- save %sp, -96, %sp
- call __errno_location
- nop
- st %i0, [ %o0 ]
- ret
- restore %g0, -1, %o0
-.Lnoerror:
- st %o0, [ %o2 ]
- st %o1, [ %o2 + 4 ]
- retl
- mov %g0, %o0
diff --git a/mdk-stage1/dietlibc/sparc/setjmp.S b/mdk-stage1/dietlibc/sparc/setjmp.S
deleted file mode 100644
index be77af3c4..000000000
--- a/mdk-stage1/dietlibc/sparc/setjmp.S
+++ /dev/null
@@ -1,35 +0,0 @@
-#define _ASM
-#define _SETJMP_H
-#include <bits/setjmp.h>
-
-#define ST_FLUSH_WINDOWS 0x03
-
-.section .rodata
-.text
-.globl __setjmp
-__setjmp:
- b 1f
- set 0, %o1
-.size __setjmp,.-__setjmp
-
-.globl setjmp
-setjmp:
- set 1, %o1
-.size setjmp,.-setjmp
-
-.globl __sigsetjmp
-__sigsetjmp:
-1:
- /* Save our PC, SP and FP. Save the signal mask if requested with
- a tail-call for simplicity; it always returns zero. */
- ta ST_FLUSH_WINDOWS
-
- st %o7, [%o0 + (JB_PC * 4)]
- st %sp, [%o0 + (JB_SP * 4)]
- st %fp, [%o0 + (JB_FP * 4)]
-
- mov %o7, %g1
- call __sigjmp_save
- mov %g1, %o7
-.size __sigsetjmp,.-__sigsetjmp
-
diff --git a/mdk-stage1/dietlibc/sparc/start.S b/mdk-stage1/dietlibc/sparc/start.S
deleted file mode 100644
index e948aaddc..000000000
--- a/mdk-stage1/dietlibc/sparc/start.S
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "start.h"
-
-#ifdef __sparc__
- .section ".text"
- .align 4
- .global _start
- .type _start,@function
-_start:
-
- /* Terminate the stack frame, and reserve space for functions to
- drop their arguments. */
- mov %g0, %fp
- sub %sp, 6*4, %sp
-
- /* Extract the arguments and environment as encoded on the stack. The
- argument info starts after one register window (16 words) past the SP. */
- ld [%sp+22*4], %o0
- add %sp, 23*4, %o1
- add %o1, %o0, %o2
- add %o2, %o0, %o2
- add %o2, %o0, %o2
- add %o2, %o0, %o2
- add %o2, 4, %o2
-
- sethi %hi(environ), %o3
- or %o3, %lo(environ), %o3
- st %o2, [%o3]
-
- /* When starting a binary via the dynamic linker, %g1 contains the
- address of the shared library termination function, which will be
- registered with atexit(). If we are statically linked, this will
- be NULL. */
-
- /* Let libc do the rest of the initialization, and call main. */
- call main
- mov %g1, %o5
-
- b exit
- mov %o0, %i0
-
- /* Die very horribly if exit returns. */
- unimp
-
- .size _start, .-_start
-#endif
-
diff --git a/mdk-stage1/dietlibc/sparc/udiv.S b/mdk-stage1/dietlibc/sparc/udiv.S
deleted file mode 100644
index 87479e7bd..000000000
--- a/mdk-stage1/dietlibc/sparc/udiv.S
+++ /dev/null
@@ -1,363 +0,0 @@
-#ifdef __sparc__
- /* This file is generated from divrem.m4; DO NOT EDIT! */
-/*
- * Division and remainder, from Appendix E of the Sparc Version 8
- * Architecture Manual, with fixes from Gordon Irlam.
- */
-
-/*
- * Input: dividend and divisor in %o0 and %o1 respectively.
- *
- * m4 parameters:
- * .udiv name of function to generate
- * div div=div => %o0 / %o1; div=rem => %o0 % %o1
- * false false=true => signed; false=false => unsigned
- *
- * Algorithm parameters:
- * N how many bits per iteration we try to get (4)
- * WORDSIZE total number of bits (32)
- *
- * Derived constants:
- * TOPBITS number of bits in the top decade of a number
- *
- * Important variables:
- * Q the partial quotient under development (initially 0)
- * R the remainder so far, initially the dividend
- * ITER number of main division loop iterations required;
- * equal to ceil(log2(quotient) / N). Note that this
- * is the log base (2^N) of the quotient.
- * V the current comparand, initially divisor*2^(ITER*N-1)
- *
- * Cost:
- * Current estimate for non-large dividend is
- * ceil(log2(quotient) / N) * (10 + 7N/2) + C
- * A large dividend is one greater than 2^(31-TOPBITS) and takes a
- * different path, as the upper bits of the quotient must be developed
- * one bit at a time.
- */
-
-
-
-#define C_LABEL(name) name:
-
-#define C_SYMBOL_NAME(name) name
-
-#define ENTRY(name) \
- .global C_SYMBOL_NAME(name); \
- .align 4;\
- C_LABEL(name);\
- .type name,@function;
-
-#define LOC(name) . ## L ## name
-
-#define END(name) \
- .size name, . - name
-
-#define ST_DIV0 0x02
-
-ENTRY(.udiv)
-
- ! Ready to divide. Compute size of quotient; scale comparand.
- orcc %o1, %g0, %o5
- bne 1f
- mov %o0, %o3
-
- ! Divide by zero trap. If it returns, return 0 (about as
- ! wrong as possible, but that is what SunOS does...).
- ta ST_DIV0
- retl
- clr %o0
-
-1:
- cmp %o3, %o5 ! if %o1 exceeds %o0, done
- blu LOC(got_result) ! (and algorithm fails otherwise)
- clr %o2
- sethi %hi(1 << (32 - 4 - 1)), %g1
- cmp %o3, %g1
- blu LOC(not_really_big)
- clr %o4
-
- ! Here the dividend is >= 2**(31-N) or so. We must be careful here,
- ! as our usual N-at-a-shot divide step will cause overflow and havoc.
- ! The number of bits in the result here is N*ITER+SC, where SC <= N.
- ! Compute ITER in an unorthodox manner: know we need to shift V into
- ! the top decade: so do not even bother to compare to R.
- 1:
- cmp %o5, %g1
- bgeu 3f
- mov 1, %g2
- sll %o5, 4, %o5
- b 1b
- add %o4, 1, %o4
-
- ! Now compute %g2.
- 2: addcc %o5, %o5, %o5
- bcc LOC(not_too_big)
- add %g2, 1, %g2
-
- ! We get here if the %o1 overflowed while shifting.
- ! This means that %o3 has the high-order bit set.
- ! Restore %o5 and subtract from %o3.
- sll %g1, 4, %g1 ! high order bit
- srl %o5, 1, %o5 ! rest of %o5
- add %o5, %g1, %o5
- b LOC(do_single_div)
- sub %g2, 1, %g2
-
- LOC(not_too_big):
- 3: cmp %o5, %o3
- blu 2b
- nop
- be LOC(do_single_div)
- nop
- /* NB: these are commented out in the V8-Sparc manual as well */
- /* (I do not understand this) */
- ! %o5 > %o3: went too far: back up 1 step
- ! srl %o5, 1, %o5
- ! dec %g2
- ! do single-bit divide steps
- !
- ! We have to be careful here. We know that %o3 >= %o5, so we can do the
- ! first divide step without thinking. BUT, the others are conditional,
- ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high-
- ! order bit set in the first step, just falling into the regular
- ! division loop will mess up the first time around.
- ! So we unroll slightly...
- LOC(do_single_div):
- subcc %g2, 1, %g2
- bl LOC(end_regular_divide)
- nop
- sub %o3, %o5, %o3
- mov 1, %o2
- b LOC(end_single_divloop)
- nop
- LOC(single_divloop):
- sll %o2, 1, %o2
- bl 1f
- srl %o5, 1, %o5
- ! %o3 >= 0
- sub %o3, %o5, %o3
- b 2f
- add %o2, 1, %o2
- 1: ! %o3 < 0
- add %o3, %o5, %o3
- sub %o2, 1, %o2
- 2:
- LOC(end_single_divloop):
- subcc %g2, 1, %g2
- bge LOC(single_divloop)
- tst %o3
- b,a LOC(end_regular_divide)
-
-LOC(not_really_big):
-1:
- sll %o5, 4, %o5
- cmp %o5, %o3
- bleu 1b
- addcc %o4, 1, %o4
- be LOC(got_result)
- sub %o4, 1, %o4
-
- tst %o3 ! set up for initial iteration
-LOC(divloop):
- sll %o2, 4, %o2
- ! depth 1, accumulated bits 0
- bl LOC(1.16)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 2, accumulated bits 1
- bl LOC(2.17)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 3, accumulated bits 3
- bl LOC(3.19)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 4, accumulated bits 7
- bl LOC(4.23)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (7*2+1), %o2
-
-LOC(4.23):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (7*2-1), %o2
-
-
-LOC(3.19):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 4, accumulated bits 5
- bl LOC(4.21)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (5*2+1), %o2
-
-LOC(4.21):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (5*2-1), %o2
-
-
-
-LOC(2.17):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 3, accumulated bits 1
- bl LOC(3.17)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 4, accumulated bits 3
- bl LOC(4.19)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (3*2+1), %o2
-
-LOC(4.19):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (3*2-1), %o2
-
-
-LOC(3.17):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 4, accumulated bits 1
- bl LOC(4.17)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (1*2+1), %o2
-
-LOC(4.17):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (1*2-1), %o2
-
-
-
-
-LOC(1.16):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 2, accumulated bits -1
- bl LOC(2.15)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 3, accumulated bits -1
- bl LOC(3.15)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 4, accumulated bits -1
- bl LOC(4.15)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (-1*2+1), %o2
-
-LOC(4.15):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (-1*2-1), %o2
-
-
-LOC(3.15):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 4, accumulated bits -3
- bl LOC(4.13)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (-3*2+1), %o2
-
-LOC(4.13):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (-3*2-1), %o2
-
-
-
-LOC(2.15):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 3, accumulated bits -3
- bl LOC(3.13)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 4, accumulated bits -5
- bl LOC(4.11)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (-5*2+1), %o2
-
-LOC(4.11):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (-5*2-1), %o2
-
-
-LOC(3.13):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 4, accumulated bits -7
- bl LOC(4.9)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (-7*2+1), %o2
-
-LOC(4.9):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (-7*2-1), %o2
-
-
-
-
- 9:
-LOC(end_regular_divide):
- subcc %o4, 1, %o4
- bge LOC(divloop)
- tst %o3
- bl,a LOC(got_result)
- ! non-restoring fixup here (one instruction only!)
- sub %o2, 1, %o2
-
-
-LOC(got_result):
-
- retl
- mov %o2, %o0
-
-END(.udiv)
-
-#endif
diff --git a/mdk-stage1/dietlibc/sparc/umul.S b/mdk-stage1/dietlibc/sparc/umul.S
deleted file mode 100644
index 15038ab2a..000000000
--- a/mdk-stage1/dietlibc/sparc/umul.S
+++ /dev/null
@@ -1,170 +0,0 @@
-#ifdef __sparc__
-/*
- * Unsigned multiply. Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the
- * upper 32 bits of the 64-bit product).
- *
- * This code optimizes short (less than 13-bit) multiplies. Short
- * multiplies require 25 instruction cycles, and long ones require
- * 45 instruction cycles.
- *
- * On return, overflow has occurred (%o1 is not zero) if and only if
- * the Z condition code is clear, allowing, e.g., the following:
- *
- * call .umul
- * nop
- * bnz overflow (or tnz)
- */
-
-#define C_LABEL(name) name:
-
-#define C_SYMBOL_NAME(name) name
-
-#define ENTRY(name) \
- .global C_SYMBOL_NAME(name); \
- .align 4;\
- C_LABEL(name);\
- .type name,@function;
-
-#define LOC(name) . ## L ## name
-
-#define END(name) \
- .size name, . - name
-
-ENTRY(.umul)
- or %o0, %o1, %o4
- mov %o0, %y ! multiplier -> Y
- andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args
- be LOC(mul_shortway) ! if zero, can do it the short way
- andcc %g0, %g0, %o4 ! zero the partial product; clear N & V
-
- /*
- * Long multiply. 32 steps, followed by a final shift step.
- */
- mulscc %o4, %o1, %o4 ! 1
- mulscc %o4, %o1, %o4 ! 2
- mulscc %o4, %o1, %o4 ! 3
- mulscc %o4, %o1, %o4 ! 4
- mulscc %o4, %o1, %o4 ! 5
- mulscc %o4, %o1, %o4 ! 6
- mulscc %o4, %o1, %o4 ! 7
- mulscc %o4, %o1, %o4 ! 8
- mulscc %o4, %o1, %o4 ! 9
- mulscc %o4, %o1, %o4 ! 10
- mulscc %o4, %o1, %o4 ! 11
- mulscc %o4, %o1, %o4 ! 12
- mulscc %o4, %o1, %o4 ! 13
- mulscc %o4, %o1, %o4 ! 14
- mulscc %o4, %o1, %o4 ! 15
- mulscc %o4, %o1, %o4 ! 16
- mulscc %o4, %o1, %o4 ! 17
- mulscc %o4, %o1, %o4 ! 18
- mulscc %o4, %o1, %o4 ! 19
- mulscc %o4, %o1, %o4 ! 20
- mulscc %o4, %o1, %o4 ! 21
- mulscc %o4, %o1, %o4 ! 22
- mulscc %o4, %o1, %o4 ! 23
- mulscc %o4, %o1, %o4 ! 24
- mulscc %o4, %o1, %o4 ! 25
- mulscc %o4, %o1, %o4 ! 26
- mulscc %o4, %o1, %o4 ! 27
- mulscc %o4, %o1, %o4 ! 28
- mulscc %o4, %o1, %o4 ! 29
- mulscc %o4, %o1, %o4 ! 30
- mulscc %o4, %o1, %o4 ! 31
- mulscc %o4, %o1, %o4 ! 32
- mulscc %o4, %g0, %o4 ! final shift
-
- /*
- * Normally, with the shift-and-add approach, if both numbers are
- * positive you get the correct result. With 32-bit two's-complement
- * numbers, -x is represented as
- *
- * x 32
- * ( 2 - ------ ) mod 2 * 2
- * 32
- * 2
- *
- * (the `mod 2' subtracts 1 from 1.bbbb). To avoid lots of 2^32s,
- * we can treat this as if the radix point were just to the left
- * of the sign bit (multiply by 2^32), and get
- *
- * -x = (2 - x) mod 2
- *
- * Then, ignoring the `mod 2's for convenience:
- *
- * x * y = xy
- * -x * y = 2y - xy
- * x * -y = 2x - xy
- * -x * -y = 4 - 2x - 2y + xy
- *
- * For signed multiplies, we subtract (x << 32) from the partial
- * product to fix this problem for negative multipliers (see mul.s).
- * Because of the way the shift into the partial product is calculated
- * (N xor V), this term is automatically removed for the multiplicand,
- * so we don't have to adjust.
- *
- * But for unsigned multiplies, the high order bit wasn't a sign bit,
- * and the correction is wrong. So for unsigned multiplies where the
- * high order bit is one, we end up with xy - (y << 32). To fix it
- * we add y << 32.
- */
-#if 0
- tst %o1
- bl,a 1f ! if %o1 < 0 (high order bit = 1),
- add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half)
-1: rd %y, %o0 ! get lower half of product
- retl
- addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0
-#else
- /* Faster code from tege@sics.se. */
- sra %o1, 31, %o2 ! make mask from sign bit
- and %o0, %o2, %o2 ! %o2 = 0 or %o0, depending on sign of %o1
- rd %y, %o0 ! get lower half of product
- retl
- addcc %o4, %o2, %o1 ! add compensation and put upper half in place
-#endif
-
-LOC(mul_shortway):
- /*
- * Short multiply. 12 steps, followed by a final shift step.
- * The resulting bits are off by 12 and (32-12) = 20 bit positions,
- * but there is no problem with %o0 being negative (unlike above),
- * and overflow is impossible (the answer is at most 24 bits long).
- */
- mulscc %o4, %o1, %o4 ! 1
- mulscc %o4, %o1, %o4 ! 2
- mulscc %o4, %o1, %o4 ! 3
- mulscc %o4, %o1, %o4 ! 4
- mulscc %o4, %o1, %o4 ! 5
- mulscc %o4, %o1, %o4 ! 6
- mulscc %o4, %o1, %o4 ! 7
- mulscc %o4, %o1, %o4 ! 8
- mulscc %o4, %o1, %o4 ! 9
- mulscc %o4, %o1, %o4 ! 10
- mulscc %o4, %o1, %o4 ! 11
- mulscc %o4, %o1, %o4 ! 12
- mulscc %o4, %g0, %o4 ! final shift
-
- /*
- * %o4 has 20 of the bits that should be in the result; %y has
- * the bottom 12 (as %y's top 12). That is:
- *
- * %o4 %y
- * +----------------+----------------+
- * | -12- | -20- | -12- | -20- |
- * +------(---------+------)---------+
- * -----result-----
- *
- * The 12 bits of %o4 left of the `result' area are all zero;
- * in fact, all top 20 bits of %o4 are zero.
- */
-
- rd %y, %o5
- sll %o4, 12, %o0 ! shift middle bits left 12
- srl %o5, 20, %o5 ! shift low bits right 20
- or %o5, %o0, %o0
- retl
- addcc %g0, %g0, %o1 ! %o1 = zero, and set Z
-
-END(.umul)
-#endif
diff --git a/mdk-stage1/dietlibc/sparc/unified.S b/mdk-stage1/dietlibc/sparc/unified.S
deleted file mode 100644
index 53b1612a9..000000000
--- a/mdk-stage1/dietlibc/sparc/unified.S
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <dietfeatures.h>
-
-.text
-.global __unified_syscall
-__unified_syscall:
- ta 0x10
-
- bcc 1f
- save %sp, -104, %sp
-
- neg %i0, %i0
-1:
- add %i0, 0xff, %l2
- cmp %l2, 0xfe
- bgu 2f
- neg %i0, %l3
-#ifdef WANT_THREAD_SAVE
- call __errno_location
- nop
-#else
- sethi %hi(errno), %o0
- or %o0, %lo(errno), %o0
-#endif
- st %l3, [ %o0 ]
- mov -1, %o0
-2:
- ret
- restore
diff --git a/mdk-stage1/dietlibc/sparc/urem.S b/mdk-stage1/dietlibc/sparc/urem.S
deleted file mode 100644
index 943cb7873..000000000
--- a/mdk-stage1/dietlibc/sparc/urem.S
+++ /dev/null
@@ -1,362 +0,0 @@
-#ifdef __sparc__
- /* This file is generated from divrem.m4; DO NOT EDIT! */
-/*
- * Division and remainder, from Appendix E of the Sparc Version 8
- * Architecture Manual, with fixes from Gordon Irlam.
- */
-
-/*
- * Input: dividend and divisor in %o0 and %o1 respectively.
- *
- * m4 parameters:
- * .urem name of function to generate
- * rem rem=div => %o0 / %o1; rem=rem => %o0 % %o1
- * false false=true => signed; false=false => unsigned
- *
- * Algorithm parameters:
- * N how many bits per iteration we try to get (4)
- * WORDSIZE total number of bits (32)
- *
- * Derived constants:
- * TOPBITS number of bits in the top decade of a number
- *
- * Important variables:
- * Q the partial quotient under development (initially 0)
- * R the remainder so far, initially the dividend
- * ITER number of main division loop iterations required;
- * equal to ceil(log2(quotient) / N). Note that this
- * is the log base (2^N) of the quotient.
- * V the current comparand, initially divisor*2^(ITER*N-1)
- *
- * Cost:
- * Current estimate for non-large dividend is
- * ceil(log2(quotient) / N) * (10 + 7N/2) + C
- * A large dividend is one greater than 2^(31-TOPBITS) and takes a
- * different path, as the upper bits of the quotient must be developed
- * one bit at a time.
- */
-
-
-
-#define C_LABEL(name) name:
-
-#define C_SYMBOL_NAME(name) name
-
-#define ENTRY(name) \
- .global C_SYMBOL_NAME(name); \
- .align 4;\
- C_LABEL(name);\
- .type name,@function;
-
-#define LOC(name) . ## L ## name
-
-#define END(name) \
- .size name, . - name
-
-#define ST_DIV0 0x02
-
-ENTRY(.urem)
-
- ! Ready to divide. Compute size of quotient; scale comparand.
- orcc %o1, %g0, %o5
- bne 1f
- mov %o0, %o3
-
- ! Divide by zero trap. If it returns, return 0 (about as
- ! wrong as possible, but that is what SunOS does...).
- ta ST_DIV0
- retl
- clr %o0
-
-1:
- cmp %o3, %o5 ! if %o1 exceeds %o0, done
- blu LOC(got_result) ! (and algorithm fails otherwise)
- clr %o2
- sethi %hi(1 << (32 - 4 - 1)), %g1
- cmp %o3, %g1
- blu LOC(not_really_big)
- clr %o4
-
- ! Here the dividend is >= 2**(31-N) or so. We must be careful here,
- ! as our usual N-at-a-shot divide step will cause overflow and havoc.
- ! The number of bits in the result here is N*ITER+SC, where SC <= N.
- ! Compute ITER in an unorthodox manner: know we need to shift V into
- ! the top decade: so do not even bother to compare to R.
- 1:
- cmp %o5, %g1
- bgeu 3f
- mov 1, %g2
- sll %o5, 4, %o5
- b 1b
- add %o4, 1, %o4
-
- ! Now compute %g2.
- 2: addcc %o5, %o5, %o5
- bcc LOC(not_too_big)
- add %g2, 1, %g2
-
- ! We get here if the %o1 overflowed while shifting.
- ! This means that %o3 has the high-order bit set.
- ! Restore %o5 and subtract from %o3.
- sll %g1, 4, %g1 ! high order bit
- srl %o5, 1, %o5 ! rest of %o5
- add %o5, %g1, %o5
- b LOC(do_single_div)
- sub %g2, 1, %g2
-
- LOC(not_too_big):
- 3: cmp %o5, %o3
- blu 2b
- nop
- be LOC(do_single_div)
- nop
- /* NB: these are commented out in the V8-Sparc manual as well */
- /* (I do not understand this) */
- ! %o5 > %o3: went too far: back up 1 step
- ! srl %o5, 1, %o5
- ! dec %g2
- ! do single-bit divide steps
- !
- ! We have to be careful here. We know that %o3 >= %o5, so we can do the
- ! first divide step without thinking. BUT, the others are conditional,
- ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high-
- ! order bit set in the first step, just falling into the regular
- ! division loop will mess up the first time around.
- ! So we unroll slightly...
- LOC(do_single_div):
- subcc %g2, 1, %g2
- bl LOC(end_regular_divide)
- nop
- sub %o3, %o5, %o3
- mov 1, %o2
- b LOC(end_single_divloop)
- nop
- LOC(single_divloop):
- sll %o2, 1, %o2
- bl 1f
- srl %o5, 1, %o5
- ! %o3 >= 0
- sub %o3, %o5, %o3
- b 2f
- add %o2, 1, %o2
- 1: ! %o3 < 0
- add %o3, %o5, %o3
- sub %o2, 1, %o2
- 2:
- LOC(end_single_divloop):
- subcc %g2, 1, %g2
- bge LOC(single_divloop)
- tst %o3
- b,a LOC(end_regular_divide)
-
-LOC(not_really_big):
-1:
- sll %o5, 4, %o5
- cmp %o5, %o3
- bleu 1b
- addcc %o4, 1, %o4
- be LOC(got_result)
- sub %o4, 1, %o4
-
- tst %o3 ! set up for initial iteration
-LOC(divloop):
- sll %o2, 4, %o2
- ! depth 1, accumulated bits 0
- bl LOC(1.16)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 2, accumulated bits 1
- bl LOC(2.17)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 3, accumulated bits 3
- bl LOC(3.19)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 4, accumulated bits 7
- bl LOC(4.23)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (7*2+1), %o2
-
-LOC(4.23):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (7*2-1), %o2
-
-
-LOC(3.19):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 4, accumulated bits 5
- bl LOC(4.21)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (5*2+1), %o2
-
-LOC(4.21):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (5*2-1), %o2
-
-
-
-LOC(2.17):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 3, accumulated bits 1
- bl LOC(3.17)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 4, accumulated bits 3
- bl LOC(4.19)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (3*2+1), %o2
-
-LOC(4.19):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (3*2-1), %o2
-
-
-LOC(3.17):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 4, accumulated bits 1
- bl LOC(4.17)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (1*2+1), %o2
-
-LOC(4.17):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (1*2-1), %o2
-
-
-
-
-LOC(1.16):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 2, accumulated bits -1
- bl LOC(2.15)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 3, accumulated bits -1
- bl LOC(3.15)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 4, accumulated bits -1
- bl LOC(4.15)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (-1*2+1), %o2
-
-LOC(4.15):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (-1*2-1), %o2
-
-
-LOC(3.15):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 4, accumulated bits -3
- bl LOC(4.13)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (-3*2+1), %o2
-
-LOC(4.13):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (-3*2-1), %o2
-
-
-
-LOC(2.15):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 3, accumulated bits -3
- bl LOC(3.13)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- ! depth 4, accumulated bits -5
- bl LOC(4.11)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (-5*2+1), %o2
-
-LOC(4.11):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (-5*2-1), %o2
-
-
-LOC(3.13):
- ! remainder is negative
- addcc %o3,%o5,%o3
- ! depth 4, accumulated bits -7
- bl LOC(4.9)
- srl %o5,1,%o5
- ! remainder is positive
- subcc %o3,%o5,%o3
- b 9f
- add %o2, (-7*2+1), %o2
-
-LOC(4.9):
- ! remainder is negative
- addcc %o3,%o5,%o3
- b 9f
- add %o2, (-7*2-1), %o2
-
-
-
-
- 9:
-LOC(end_regular_divide):
- subcc %o4, 1, %o4
- bge LOC(divloop)
- tst %o3
- bl,a LOC(got_result)
- ! non-restoring fixup here (one instruction only!)
- add %o3, %o1, %o3
-
-
-LOC(got_result):
-
- retl
- mov %o3, %o0
-
-END(.urem)
-#endif
diff --git a/mdk-stage1/dietlibc/start.h b/mdk-stage1/dietlibc/start.h
deleted file mode 100644
index 5983b0462..000000000
--- a/mdk-stage1/dietlibc/start.h
+++ /dev/null
@@ -1,10 +0,0 @@
-.section ".bss"
- .align 8
-
- .weak errno
-errno:
- .long 0
-
- .weak environ
-environ:
- .long 0
diff --git a/mdk-stage1/dietlibc/syscalls.h b/mdk-stage1/dietlibc/syscalls.h
deleted file mode 100644
index 5e9782ee9..000000000
--- a/mdk-stage1/dietlibc/syscalls.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifdef __ASSEMBLER__
-
-#include <asm/unistd.h>
-
-#else
-
-#include <linux/unistd.h>
-
-#endif
-
-#ifdef __i386__
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-sym: \
- movb $__NR_##name,%al; \
- jmp __unified_syscall
-
-#endif
-
-#ifdef __sparc__
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-sym: \
- b __unified_syscall; \
- mov __NR_##name, %g1
-
-#endif
-
-#ifdef __powerpc__
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-sym: \
- li 0,__NR_##name; \
- b __unified_syscall
-
-#endif
-
-
-#ifdef __mips__
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-.ent sym; \
-sym: \
- li $2,__NR_##name; \
- la $25,__unified_syscall; \
- jr $25; \
-.end sym
-
-#endif
-
-#ifdef __arm__
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-sym: \
- swi __NR_##name; \
- b __unified_syscall
-
-#endif
-
-
-#ifdef __alpha__
-
-#define syscall(name,sym) \
-.text ; \
-.align 2 ; \
-.global sym ; \
-.type sym,@function ; \
-sym: ; \
- lda $0, __NR_##name($31) ; \
- br __unified_syscall
-
-#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/__pread.S b/mdk-stage1/dietlibc/syscalls.s/__pread.S
deleted file mode 100644
index 4603a1009..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/__pread.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_pread
-syscall(pread,__pread)
diff --git a/mdk-stage1/dietlibc/syscalls.s/_llseek.S b/mdk-stage1/dietlibc/syscalls.s/_llseek.S
deleted file mode 100644
index 3e240d822..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/_llseek.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(_llseek,_llseek)
diff --git a/mdk-stage1/dietlibc/syscalls.s/access.S b/mdk-stage1/dietlibc/syscalls.s/access.S
deleted file mode 100644
index d1edafd8c..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/access.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(access,access)
diff --git a/mdk-stage1/dietlibc/syscalls.s/brk.S b/mdk-stage1/dietlibc/syscalls.s/brk.S
deleted file mode 100644
index 6e21810bd..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/brk.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(brk,__diet_brk)
diff --git a/mdk-stage1/dietlibc/syscalls.s/chdir.S b/mdk-stage1/dietlibc/syscalls.s/chdir.S
deleted file mode 100644
index 204f3dd6c..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/chdir.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(chdir,chdir)
diff --git a/mdk-stage1/dietlibc/syscalls.s/chmod.S b/mdk-stage1/dietlibc/syscalls.s/chmod.S
deleted file mode 100644
index c1b85f5a4..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/chmod.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(chmod,chmod)
diff --git a/mdk-stage1/dietlibc/syscalls.s/chown.S b/mdk-stage1/dietlibc/syscalls.s/chown.S
deleted file mode 100644
index daac3bf13..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/chown.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(chown,chown)
diff --git a/mdk-stage1/dietlibc/syscalls.s/chroot.S b/mdk-stage1/dietlibc/syscalls.s/chroot.S
deleted file mode 100644
index 65de1e473..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/chroot.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(chroot,chroot)
diff --git a/mdk-stage1/dietlibc/syscalls.s/close.S b/mdk-stage1/dietlibc/syscalls.s/close.S
deleted file mode 100644
index 0f72ca1ae..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/close.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_close
-__libc_close:
-syscall(close,close)
diff --git a/mdk-stage1/dietlibc/syscalls.s/dup.S b/mdk-stage1/dietlibc/syscalls.s/dup.S
deleted file mode 100644
index b2977fd43..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/dup.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(dup,dup)
diff --git a/mdk-stage1/dietlibc/syscalls.s/dup2.S b/mdk-stage1/dietlibc/syscalls.s/dup2.S
deleted file mode 100644
index 774bfbfe7..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/dup2.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(dup2,dup2)
diff --git a/mdk-stage1/dietlibc/syscalls.s/execve.S b/mdk-stage1/dietlibc/syscalls.s/execve.S
deleted file mode 100644
index ff952ae7d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/execve.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(execve,execve)
diff --git a/mdk-stage1/dietlibc/syscalls.s/exit.S b/mdk-stage1/dietlibc/syscalls.s/exit.S
deleted file mode 100644
index 89d3145e9..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/exit.S
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "syscalls.h"
-
-.text
-.weak exit
-exit:
-syscall(exit,_exit)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fchdir.S b/mdk-stage1/dietlibc/syscalls.s/fchdir.S
deleted file mode 100644
index 0aeaf610b..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/fchdir.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(fchdir,fchdir)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fchmod.S b/mdk-stage1/dietlibc/syscalls.s/fchmod.S
deleted file mode 100644
index 30bc2e210..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/fchmod.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(fchmod,fchmod)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fchown.S b/mdk-stage1/dietlibc/syscalls.s/fchown.S
deleted file mode 100644
index bc2a296ea..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/fchown.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(fchown,fchown)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fcntl.S b/mdk-stage1/dietlibc/syscalls.s/fcntl.S
deleted file mode 100644
index 8516bc232..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/fcntl.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_fcntl
-__libc_fcntl:
-syscall(fcntl,fcntl)
diff --git a/mdk-stage1/dietlibc/syscalls.s/flock.S b/mdk-stage1/dietlibc/syscalls.s/flock.S
deleted file mode 100644
index 7b4daeff7..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/flock.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(flock,flock)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fork.S b/mdk-stage1/dietlibc/syscalls.s/fork.S
deleted file mode 100644
index 66732d27e..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/fork.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_fork
-__libc_fork:
-syscall(fork,fork)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fstatfs.S b/mdk-stage1/dietlibc/syscalls.s/fstatfs.S
deleted file mode 100644
index a23c8770c..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/fstatfs.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(fstatfs,fstatfs)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fsync.S b/mdk-stage1/dietlibc/syscalls.s/fsync.S
deleted file mode 100644
index 624cbaf97..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/fsync.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(fsync,fsync)
diff --git a/mdk-stage1/dietlibc/syscalls.s/ftruncate.S b/mdk-stage1/dietlibc/syscalls.s/ftruncate.S
deleted file mode 100644
index dde57a615..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/ftruncate.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(ftruncate,ftruncate)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getcwd.S b/mdk-stage1/dietlibc/syscalls.s/getcwd.S
deleted file mode 100644
index 8ff0a026e..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getcwd.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getcwd,getcwd)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents.S b/mdk-stage1/dietlibc/syscalls.s/getdents.S
deleted file mode 100644
index f476e939d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getdents.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getdents,getdents)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents64.S b/mdk-stage1/dietlibc/syscalls.s/getdents64.S
deleted file mode 100644
index 16859addf..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getdents64.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "syscalls.h"
-
-#ifdef __NR_getdents64
-syscall(getdents64,getdents64)
-#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/getegid.S b/mdk-stage1/dietlibc/syscalls.s/getegid.S
deleted file mode 100644
index 64843ee35..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getegid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getegid,getegid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/geteuid.S b/mdk-stage1/dietlibc/syscalls.s/geteuid.S
deleted file mode 100644
index 55dc00981..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/geteuid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(geteuid,geteuid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getgid.S b/mdk-stage1/dietlibc/syscalls.s/getgid.S
deleted file mode 100644
index 39f092685..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getgid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getgid,getgid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getgroups.S b/mdk-stage1/dietlibc/syscalls.s/getgroups.S
deleted file mode 100644
index b4c57689c..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getgroups.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getgroups,getgroups)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getpgid.S b/mdk-stage1/dietlibc/syscalls.s/getpgid.S
deleted file mode 100644
index e568f060f..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getpgid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getpgid,getpgid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getpid.S b/mdk-stage1/dietlibc/syscalls.s/getpid.S
deleted file mode 100644
index 093884785..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getpid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getpid,getpid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getppid.S b/mdk-stage1/dietlibc/syscalls.s/getppid.S
deleted file mode 100644
index b05e64ae3..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getppid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getppid,getppid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getresgid.S b/mdk-stage1/dietlibc/syscalls.s/getresgid.S
deleted file mode 100644
index a1d873c15..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getresgid.S
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "syscalls.h"
-
-#ifdef __NR_getresgid
-
-syscall(getresgid,getresgid)
-
-#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/getresuid.S b/mdk-stage1/dietlibc/syscalls.s/getresuid.S
deleted file mode 100644
index 62f6d764f..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getresuid.S
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "syscalls.h"
-
-#ifdef __getresuid
-
-syscall(getresuid)
-
-#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/getrlimit.S b/mdk-stage1/dietlibc/syscalls.s/getrlimit.S
deleted file mode 100644
index 1c63c0196..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getrlimit.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getrlimit,getrlimit)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getrusage.S b/mdk-stage1/dietlibc/syscalls.s/getrusage.S
deleted file mode 100644
index 2972c4938..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getrusage.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getrusage,getrusage)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getsid.S b/mdk-stage1/dietlibc/syscalls.s/getsid.S
deleted file mode 100644
index cf5cce9d5..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getsid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getsid,getsid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S b/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S
deleted file mode 100644
index f364b787a..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(gettimeofday,gettimeofday)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getuid.S b/mdk-stage1/dietlibc/syscalls.s/getuid.S
deleted file mode 100644
index c53c25a7a..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/getuid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(getuid,getuid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/ioctl.S b/mdk-stage1/dietlibc/syscalls.s/ioctl.S
deleted file mode 100644
index 463d319dc..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/ioctl.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(ioctl,ioctl)
diff --git a/mdk-stage1/dietlibc/syscalls.s/kill.S b/mdk-stage1/dietlibc/syscalls.s/kill.S
deleted file mode 100644
index eb466dd33..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/kill.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(kill,kill)
diff --git a/mdk-stage1/dietlibc/syscalls.s/lchown.S b/mdk-stage1/dietlibc/syscalls.s/lchown.S
deleted file mode 100644
index 19dfefaef..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/lchown.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(lchown,lchown)
diff --git a/mdk-stage1/dietlibc/syscalls.s/link.S b/mdk-stage1/dietlibc/syscalls.s/link.S
deleted file mode 100644
index 8015d11c8..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/link.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(link,link)
diff --git a/mdk-stage1/dietlibc/syscalls.s/lseek.S b/mdk-stage1/dietlibc/syscalls.s/lseek.S
deleted file mode 100644
index 454827483..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/lseek.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(lseek,lseek)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mkdir.S b/mdk-stage1/dietlibc/syscalls.s/mkdir.S
deleted file mode 100644
index d6214ee46..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/mkdir.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(mkdir,mkdir)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mknod.S b/mdk-stage1/dietlibc/syscalls.s/mknod.S
deleted file mode 100644
index c1b2af12d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/mknod.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(mknod,mknod)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mount.S b/mdk-stage1/dietlibc/syscalls.s/mount.S
deleted file mode 100644
index 2fd845561..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/mount.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(mount,mount)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mprotect.S b/mdk-stage1/dietlibc/syscalls.s/mprotect.S
deleted file mode 100644
index 73e9a8e17..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/mprotect.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(mprotect,mprotect)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mremap.S b/mdk-stage1/dietlibc/syscalls.s/mremap.S
deleted file mode 100644
index 259ccec99..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/mremap.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(mremap,mremap)
diff --git a/mdk-stage1/dietlibc/syscalls.s/munmap.S b/mdk-stage1/dietlibc/syscalls.s/munmap.S
deleted file mode 100644
index b43a7b22d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/munmap.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(munmap,munmap)
diff --git a/mdk-stage1/dietlibc/syscalls.s/nanosleep.S b/mdk-stage1/dietlibc/syscalls.s/nanosleep.S
deleted file mode 100644
index 7dce9956d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/nanosleep.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(nanosleep,nanosleep)
diff --git a/mdk-stage1/dietlibc/syscalls.s/open.S b/mdk-stage1/dietlibc/syscalls.s/open.S
deleted file mode 100644
index 11cfecd4a..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/open.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(open,open)
diff --git a/mdk-stage1/dietlibc/syscalls.s/pipe.S b/mdk-stage1/dietlibc/syscalls.s/pipe.S
deleted file mode 100644
index 03994d055..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/pipe.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(pipe,pipe)
diff --git a/mdk-stage1/dietlibc/syscalls.s/poll.S b/mdk-stage1/dietlibc/syscalls.s/poll.S
deleted file mode 100644
index 359f55ddd..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/poll.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(poll,poll)
diff --git a/mdk-stage1/dietlibc/syscalls.s/pwrite.S b/mdk-stage1/dietlibc/syscalls.s/pwrite.S
deleted file mode 100644
index f52ead7b2..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/pwrite.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(pwrite,__pwrite)
diff --git a/mdk-stage1/dietlibc/syscalls.s/read.S b/mdk-stage1/dietlibc/syscalls.s/read.S
deleted file mode 100644
index 98ad98c17..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/read.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_read
-__libc_read:
-syscall(read,read)
diff --git a/mdk-stage1/dietlibc/syscalls.s/readlink.S b/mdk-stage1/dietlibc/syscalls.s/readlink.S
deleted file mode 100644
index 850e77c4e..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/readlink.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(readlink,readlink)
diff --git a/mdk-stage1/dietlibc/syscalls.s/rename.S b/mdk-stage1/dietlibc/syscalls.s/rename.S
deleted file mode 100644
index f92f1dc5d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/rename.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(rename,rename)
diff --git a/mdk-stage1/dietlibc/syscalls.s/rmdir.S b/mdk-stage1/dietlibc/syscalls.s/rmdir.S
deleted file mode 100644
index 341216e8c..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/rmdir.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(rmdir,rmdir)
diff --git a/mdk-stage1/dietlibc/syscalls.s/select.S b/mdk-stage1/dietlibc/syscalls.s/select.S
deleted file mode 100644
index 3353848ff..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/select.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "syscalls.h"
-
-.text
-syscall(select,select)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sendfile.S b/mdk-stage1/dietlibc/syscalls.s/sendfile.S
deleted file mode 100644
index d56219dc6..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/sendfile.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_sendfile
-__libc_sendfile:
-syscall(sendfile,sendfile)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setdomainname.S b/mdk-stage1/dietlibc/syscalls.s/setdomainname.S
deleted file mode 100644
index eaade25da..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setdomainname.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setdomainname,setdomainname)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setgid.S b/mdk-stage1/dietlibc/syscalls.s/setgid.S
deleted file mode 100644
index 69b18a9c9..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setgid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setgid,setgid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setgroups.S b/mdk-stage1/dietlibc/syscalls.s/setgroups.S
deleted file mode 100644
index ce8e800a6..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setgroups.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setgroups,setgroups)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sethostname.S b/mdk-stage1/dietlibc/syscalls.s/sethostname.S
deleted file mode 100644
index 7616d4848..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/sethostname.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(sethostname,sethostname)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setitimer.S b/mdk-stage1/dietlibc/syscalls.s/setitimer.S
deleted file mode 100644
index bcb0623ba..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setitimer.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setitimer,setitimer)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setpgid.S b/mdk-stage1/dietlibc/syscalls.s/setpgid.S
deleted file mode 100644
index e93db31dc..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setpgid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setpgid,setpgid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setregid.S b/mdk-stage1/dietlibc/syscalls.s/setregid.S
deleted file mode 100644
index 3a7abbc28..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setregid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setregid,setregid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setresgid.S b/mdk-stage1/dietlibc/syscalls.s/setresgid.S
deleted file mode 100644
index 64cbac94e..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setresgid.S
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "syscalls.h"
-
-#ifdef __setresgid
-
-syscall(setresgid)
-
-#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/setresuid.S b/mdk-stage1/dietlibc/syscalls.s/setresuid.S
deleted file mode 100644
index 20b6abee9..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setresuid.S
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "syscalls.h"
-
-#ifdef __setresuid
-
-syscall(setresuid)
-
-#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/setreuid.S b/mdk-stage1/dietlibc/syscalls.s/setreuid.S
deleted file mode 100644
index 33ca8deed..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setreuid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setreuid,setreuid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setrlimit.S b/mdk-stage1/dietlibc/syscalls.s/setrlimit.S
deleted file mode 100644
index 605105658..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setrlimit.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setrlimit,setrlimit)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setsid.S b/mdk-stage1/dietlibc/syscalls.s/setsid.S
deleted file mode 100644
index d1ef1c58e..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setsid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setsid,setsid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setuid.S b/mdk-stage1/dietlibc/syscalls.s/setuid.S
deleted file mode 100644
index d20571cbf..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/setuid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(setuid,setuid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sigaction.S b/mdk-stage1/dietlibc/syscalls.s/sigaction.S
deleted file mode 100644
index 32382870c..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/sigaction.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(sigaction,sigaction)
diff --git a/mdk-stage1/dietlibc/syscalls.s/signal.S b/mdk-stage1/dietlibc/syscalls.s/signal.S
deleted file mode 100644
index 86c4d5db0..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/signal.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(signal,signal)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sigpending.S b/mdk-stage1/dietlibc/syscalls.s/sigpending.S
deleted file mode 100644
index 08715bef5..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/sigpending.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(sigpending,sigpending)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S b/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S
deleted file mode 100644
index 8d6563b8f..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "syscalls.h"
-
-.text
-.weak sigprocmask
-sigprocmask:
-syscall(sigprocmask,__sigprocmask)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S b/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S
deleted file mode 100644
index c832c2b5d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(sigsuspend,sigsuspend)
diff --git a/mdk-stage1/dietlibc/syscalls.s/socketcall.S b/mdk-stage1/dietlibc/syscalls.s/socketcall.S
deleted file mode 100644
index 5837c049a..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/socketcall.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(socketcall,socketcall)
diff --git a/mdk-stage1/dietlibc/syscalls.s/statfs.S b/mdk-stage1/dietlibc/syscalls.s/statfs.S
deleted file mode 100644
index 7560f569d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/statfs.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(statfs,statfs)
diff --git a/mdk-stage1/dietlibc/syscalls.s/swapoff.S b/mdk-stage1/dietlibc/syscalls.s/swapoff.S
deleted file mode 100644
index f75ec94e0..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/swapoff.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(swapoff,swapoff)
diff --git a/mdk-stage1/dietlibc/syscalls.s/swapon.S b/mdk-stage1/dietlibc/syscalls.s/swapon.S
deleted file mode 100644
index d10594168..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/swapon.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(swapon,swapon)
diff --git a/mdk-stage1/dietlibc/syscalls.s/symlink.S b/mdk-stage1/dietlibc/syscalls.s/symlink.S
deleted file mode 100644
index 07a6a7fdc..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/symlink.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(symlink,symlink)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sync.S b/mdk-stage1/dietlibc/syscalls.s/sync.S
deleted file mode 100644
index 1ee021693..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/sync.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(sync,sync)
diff --git a/mdk-stage1/dietlibc/syscalls.s/syslog.S b/mdk-stage1/dietlibc/syscalls.s/syslog.S
deleted file mode 100644
index 55df87d53..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/syslog.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(syslog,syslog)
diff --git a/mdk-stage1/dietlibc/syscalls.s/time.S b/mdk-stage1/dietlibc/syscalls.s/time.S
deleted file mode 100644
index 26c79091c..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/time.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(time,time)
diff --git a/mdk-stage1/dietlibc/syscalls.s/truncate.S b/mdk-stage1/dietlibc/syscalls.s/truncate.S
deleted file mode 100644
index 7052bdcee..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/truncate.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(truncate,truncate)
diff --git a/mdk-stage1/dietlibc/syscalls.s/umask.S b/mdk-stage1/dietlibc/syscalls.s/umask.S
deleted file mode 100644
index 9f8ffeda6..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/umask.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(umask,umask)
diff --git a/mdk-stage1/dietlibc/syscalls.s/umount.S b/mdk-stage1/dietlibc/syscalls.s/umount.S
deleted file mode 100644
index 4a423d964..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/umount.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(umount,umount)
diff --git a/mdk-stage1/dietlibc/syscalls.s/uname.S b/mdk-stage1/dietlibc/syscalls.s/uname.S
deleted file mode 100644
index a460d2aa6..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/uname.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(uname,uname)
diff --git a/mdk-stage1/dietlibc/syscalls.s/unlink.S b/mdk-stage1/dietlibc/syscalls.s/unlink.S
deleted file mode 100644
index bd6713061..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/unlink.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(unlink,unlink)
diff --git a/mdk-stage1/dietlibc/syscalls.s/utime.S b/mdk-stage1/dietlibc/syscalls.s/utime.S
deleted file mode 100644
index 08cd22158..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/utime.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(utime,utime)
diff --git a/mdk-stage1/dietlibc/syscalls.s/vhangup.S b/mdk-stage1/dietlibc/syscalls.s/vhangup.S
deleted file mode 100644
index 6e2d1d343..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/vhangup.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(vhangup,vhangup)
diff --git a/mdk-stage1/dietlibc/syscalls.s/wait4.S b/mdk-stage1/dietlibc/syscalls.s/wait4.S
deleted file mode 100644
index ca6773569..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/wait4.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(wait4,wait4)
diff --git a/mdk-stage1/dietlibc/syscalls.s/waitpid.S b/mdk-stage1/dietlibc/syscalls.s/waitpid.S
deleted file mode 100644
index 569d8f68d..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/waitpid.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(waitpid,waitpid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/write.S b/mdk-stage1/dietlibc/syscalls.s/write.S
deleted file mode 100644
index 409575be0..000000000
--- a/mdk-stage1/dietlibc/syscalls.s/write.S
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "syscalls.h"
-
-.weak __libc_write
-__libc_write:
-syscall(write,write)
diff --git a/mdk-stage1/directory.c b/mdk-stage1/directory.c
new file mode 100644
index 000000000..0538b55b6
--- /dev/null
+++ b/mdk-stage1/directory.c
@@ -0,0 +1,169 @@
+/*
+ * Guillaume Cottenceau (gc)
+ * Olivier Blin (oblin)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * Portions from Erik Troan (ewt@redhat.com)
+ *
+ * Copyright 1996 Red Hat Software
+ *
+ */
+
+#include <unistd.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <libgen.h>
+#include "stage1.h"
+#include "frontend.h"
+#include "log.h"
+#include "tools.h"
+#include "utils.h"
+#include "lomount.h"
+
+char * extract_list_directory(char * direct)
+{
+ char ** full = list_directory(direct);
+ char tmp[20000] = "";
+ int i;
+ for (i=0; i<50 ; i++) {
+ if (!full || !*full)
+ break;
+ strcat(tmp, *full);
+ strcat(tmp, "\n");
+ full++;
+ }
+ return strdup(tmp);
+}
+
+static void choose_iso_in_directory(char *directory, char *location_full)
+{
+ char **file;
+ char *stage2_isos[100] = { "Use directory as a mirror tree", "-----" };
+ int stage2_iso_number = 2;
+
+ log_message("\"%s\" exists and is a directory, looking for iso files", directory);
+
+ for (file = list_directory(directory); *file; file++) {
+ char isofile[500];
+ char * loopdev = NULL;
+
+ if (strstr(*file, ".iso") != *file + strlen(*file) - 4)
+ /* file doesn't end in .iso, skipping */
+ continue;
+
+ strcpy(isofile, directory);
+ strcat(isofile, "/");
+ strcat(isofile, *file);
+
+ if (lomount(isofile, LOOP_LOCATION, &loopdev, 0)) {
+ log_message("unable to mount iso file \"%s\", skipping", isofile);
+ continue;
+ }
+ symlink(LOOP_LOCATION_REL "/" ARCH, IMAGE_LOCATION);
+
+ if (image_has_stage2()) {
+ log_message("stage2 installer found in ISO image \"%s\"", isofile);
+ stage2_isos[stage2_iso_number++] = strdup(*file);
+ } else {
+ log_message("ISO image \"%s\" doesn't contain stage2 installer", isofile);
+ }
+
+ unlink(IMAGE_LOCATION);
+ umount(LOOP_LOCATION);
+ del_loop(loopdev);
+ }
+
+ stage2_isos[stage2_iso_number] = NULL;
+
+ if (stage2_iso_number > 2) {
+ enum return_type results;
+ do {
+ results = ask_from_list("Please choose the ISO image to be used to install the "
+ DISTRIB_NAME " Distribution.",
+ stage2_isos, file);
+ if (results == RETURN_BACK) {
+ return;
+ } else if (results == RETURN_OK) {
+ if (!strcmp(*file, stage2_isos[0])) {
+ /* use directory as a mirror tree */
+ continue;
+ } else if (!strcmp(*file, stage2_isos[1])) {
+ /* the separator has been selected */
+ results = RETURN_ERROR;
+ continue;
+ } else {
+ /* use selected ISO image */
+ strcat(location_full, "/");
+ strcat(location_full, *file);
+ log_message("installer will use ISO image \"%s\"", location_full);
+ }
+ }
+ } while (results == RETURN_ERROR);
+ } else {
+ log_message("no ISO image found in \"%s\" directory", location_full);
+ }
+}
+
+
+enum return_type try_with_directory(char *directory, char *method_live, char *method_iso) {
+ char location_full[500];
+ char * loopdev = NULL;
+ struct stat statbuf;
+ enum return_type ret = RETURN_OK;
+
+ unlink(IMAGE_LOCATION);
+ strcpy(location_full, directory);
+
+ if (!stat(directory, &statbuf) && S_ISDIR(statbuf.st_mode)) {
+ choose_iso_in_directory(directory, location_full);
+ }
+
+ loopdev = NULL;
+ if (!stat(location_full, &statbuf) && !S_ISDIR(statbuf.st_mode)) {
+ log_message("%s exists and is not a directory, assuming this is an ISO image", location_full);
+ if (lomount(location_full, LOOP_LOCATION, &loopdev, 0)) {
+ stg1_error_message("Could not mount file %s as an ISO image of the " DISTRIB_NAME " Distribution.", location_full);
+ return RETURN_ERROR;
+ }
+ symlink(LOOP_LOCATION_REL "/" ARCH, IMAGE_LOCATION);
+ add_to_env("ISOPATH", location_full);
+ add_to_env("METHOD", method_iso);
+ } else {
+ create_IMAGE_LOCATION(location_full);
+ add_to_env("METHOD", method_live);
+ }
+
+ if (access(IMAGE_LOCATION "/" COMPRESSED_LOCATION_REL, R_OK)) {
+ stg1_error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. "
+ "(I need the subdirectory " COMPRESSED_LOCATION_REL ")\n"
+ "Here's a short extract of the files in the directory:\n"
+ "%s", extract_list_directory(IMAGE_LOCATION));
+ ret = RETURN_BACK;
+ } else if (may_load_compressed_image() != RETURN_OK) {
+ stg1_error_message("Could not load program into memory.");
+ ret = RETURN_ERROR;
+ }
+
+ if (ret == RETURN_OK)
+ log_message("found the " DISTRIB_NAME " Installation, good news!");
+
+ if (!KEEP_MOUNTED || ret != RETURN_OK) {
+ /* in rescue mode, we don't need the media anymore */
+ umount(LOOP_LOCATION);
+ del_loop(loopdev);
+ }
+
+ return ret;
+}
diff --git a/mdk-stage1/directory.h b/mdk-stage1/directory.h
new file mode 100644
index 000000000..2fdc81edb
--- /dev/null
+++ b/mdk-stage1/directory.h
@@ -0,0 +1,29 @@
+/*
+ * Guillaume Cottenceau (gc)
+ * Olivier Blin (oblin)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * Portions from Erik Troan (ewt@redhat.com)
+ *
+ * Copyright 1996 Red Hat Software
+ *
+ */
+
+#ifndef _DIRECTORY_H_
+#define _DIRECTORY_H_
+
+char * extract_list_directory(char * direct);
+enum return_type try_with_directory(char *location_full, char *method_live, char *method_iso);
+
+#endif
diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c
index 0a15f0e67..51a033639 100644
--- a/mdk-stage1/disk.c
+++ b/mdk-stage1/disk.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -19,192 +19,200 @@
*
*/
+#define _GNU_SOURCE /* We want the non segfaulting my_dirname() -- See dirname(3) */
+#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
-#include <string.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <libgen.h>
#include "stage1.h"
#include "frontend.h"
#include "modules.h"
#include "probing.h"
#include "log.h"
+#include "tools.h"
+#include "utils.h"
#include "mount.h"
-#include "lomount.h"
#include "automatic.h"
+#include "directory.h"
+#include "partition.h"
#include "disk.h"
-static char * disk_extract_list_directory(char * direct)
+static enum return_type try_automatic_with_partition(char *dev) {
+ enum return_type results;
+ int mounted;
+ char *dir= get_auto_value("directory");
+ char location_full[500];
+ strcpy(location_full, MEDIA_LOCATION);
+ if (dir) {
+ strcat(location_full, "/");
+ strcat(location_full, dir);
+ }
+ wait_message("Trying to access " DISTRIB_NAME " disk (partition %s)", dev);
+ mounted = !try_mount(dev, MEDIA_LOCATION);
+ remove_wait_message();
+ if (mounted) {
+ create_IMAGE_LOCATION(MEDIA_LOCATION);
+ if (image_has_stage2()) {
+ results = try_with_directory(MEDIA_LOCATION, "disk", "disk-iso");
+ } else {
+ results = try_with_directory(location_full, "disk", "disk-iso");
+ }
+ if (results == RETURN_OK) {
+ if (!KEEP_MOUNTED)
+ umount(MEDIA_LOCATION);
+ return RETURN_OK;
+ }
+ }
+ if (mounted)
+ umount(MEDIA_LOCATION);
+ return RETURN_ERROR;
+}
+
+static enum return_type try_automatic_with_disk(char *disk, char *model) {
+ char * parts[50];
+ char * parts_comments[50];
+ enum return_type results;
+ char **dev;
+ char *part = get_auto_value("partition");
+ wait_message("Trying to access " DISTRIB_NAME " disk (drive %s)", model);
+ if (list_partitions(disk, parts, parts_comments)) {
+ stg1_error_message("Could not read partitions information.");
+ return RETURN_ERROR;
+ }
+ remove_wait_message();
+ dev = parts;
+ while (dev && *dev) {
+ if (part && strcmp(part, *dev) != 0)
+ goto next;
+ results = try_automatic_with_partition(*dev);
+ if (results == RETURN_OK) {
+ return RETURN_OK;
+ }
+ next:
+ dev++;
+ }
+ return RETURN_ERROR;
+}
+
+static enum return_type try_automatic(char ** medias, char ** medias_models)
{
- char ** full = list_directory(direct);
- char tmp[2000] = "";
- int i;
- for (i=0; i<5 ; i++) {
- if (!full || !*full)
- break;
- strcat(tmp, *full);
- strcat(tmp, "\n");
- full++;
+ char ** model = medias_models;
+ char ** ptr = medias;
+ char *disk = get_auto_value("disk");
+ while (ptr && *ptr) {
+ enum return_type results;
+ if (disk && strcmp(disk, *ptr) != 0)
+ goto next;
+ results = try_automatic_with_disk(*ptr, *model);
+ if (results == RETURN_OK)
+ return RETURN_OK;
+ next:
+ ptr++;
+ model++;
}
- return strdup(tmp);
+ return RETURN_ERROR;
}
static enum return_type try_with_device(char *dev_name)
{
- char * questions_location[] = { "Directory or ISO image", NULL };
+ char * questions_location[] = { "Directory or ISO images directory or ISO image", NULL };
char * questions_location_auto[] = { "directory", NULL };
static char ** answers_location = NULL;
- char device_fullname[50];
char location_full[500];
- char * disk_own_mount = "/tmp/hdimage";
-
- int major, minor, blocks;
- char name[100];
-
- char buf[512];
- FILE * f;
char * parts[50];
char * parts_comments[50];
- struct stat statbuf;
- int i = 0;
enum return_type results;
char * choice;
-
- if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) {
- log_perror(dev_name);
- error_message("Could not read partitions information.");
- return RETURN_ERROR;
- }
-
- while (fgets(buf, sizeof(buf), f)) {
- sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name);
- if ((strstr(name, dev_name) == name) && (blocks > 1) && (name[strlen(dev_name)] != '\0')) {
- parts[i] = strdup(name);
- parts_comments[i] = (char *) malloc(sizeof(char) * 25);
- snprintf(parts_comments[i], 24, "size: %d Mbytes", blocks >> 10);
- i++;
- }
- }
- parts[i] = NULL;
- fclose(f);
-
- if (parts[0] == NULL) {
- error_message("No partitions found.");
+
+ if (list_partitions(dev_name, parts, parts_comments)) {
+ stg1_error_message("Could not read partitions information.");
return RETURN_ERROR;
- }
-
- results = ask_from_list_comments_auto("Please choose the partition where is copied the " DISTRIB_NAME " Distribution.",
- parts, parts_comments, &choice, "partition", parts);
- if (results != RETURN_OK)
- return results;
-
- strcpy(device_fullname, "/dev/");
- strcat(device_fullname, choice);
-
- if (my_mount(device_fullname, disk_own_mount, "ext2") == -1 &&
- my_mount(device_fullname, disk_own_mount, "vfat") == -1 &&
- my_mount(device_fullname, disk_own_mount, "reiserfs") == -1) {
- error_message("I can't find a valid filesystem.");
+ }
+
+ /* uglyness to allow auto starting with devfs */
+ if (!IS_AUTOMATIC || streq((choice = get_auto_value("partition")), "")) {
+ if (parts[0] == NULL) {
+ stg1_error_message("No partition found.");
+ return RETURN_ERROR;
+ }
+
+ results = ask_from_list_comments_auto("Please select the partition containing the copy of the "
+ DISTRIB_NAME " Distribution install source.",
+ parts, parts_comments, &choice, "partition", parts);
+ if (results != RETURN_OK)
+ return results;
+ }
+
+ /* in testing mode, assume the partition is already mounted on MEDIA_LOCATION */
+ if (!IS_TESTING && try_mount(choice, MEDIA_LOCATION)) {
+ stg1_error_message("I can't find a valid filesystem (tried: ext4, vfat, ntfs, reiserfs). "
+ "Make sure the partition has been cleanly unmounted.");
return try_with_device(dev_name);
}
- if (ask_from_entries_auto("Please enter the directory (or ISO image file) containing the " DISTRIB_NAME " Distribution.",
+ ask_dir:
+ if (ask_from_entries_auto("Please enter the directory (or ISO image file) containing the "
+ DISTRIB_NAME " Distribution install source.",
questions_location, &answers_location, 24, questions_location_auto, NULL) != RETURN_OK) {
- umount(disk_own_mount);
+ umount(MEDIA_LOCATION);
return try_with_device(dev_name);
}
- strcpy(location_full, disk_own_mount);
+ strcpy(location_full, MEDIA_LOCATION);
strcat(location_full, "/");
strcat(location_full, answers_location[0]);
if (access(location_full, R_OK)) {
- error_message("Directory or ISO image file could not be found on partition.\n"
- "Here's a short extract of the files in the root of the partition:\n"
- "%s", disk_extract_list_directory(disk_own_mount));
- umount(disk_own_mount);
- return try_with_device(dev_name);
+ char * path = strdup(answers_location[0]);
+ stg1_error_message("Directory or ISO image file could not be found on partition.\n"
+ "Here's a short extract of the files in the directory %s:\n"
+ "%s", my_dirname(path), extract_list_directory(my_dirname(location_full)));
+ free(path);
+ goto ask_dir;
}
- unlink(IMAGE_LOCATION);
-
- if (!stat(location_full, &statbuf) && !S_ISDIR(statbuf.st_mode)) {
- log_message("%s exists and is not a directory, assuming this is an ISO image", location_full);
- if (lomount(location_full, IMAGE_LOCATION)) {
- error_message("Could not mount file %s as an ISO image of the " DISTRIB_NAME " Distribution.", answers_location[0]);
- umount(disk_own_mount);
- return try_with_device(dev_name);
- }
- } else
- symlink(location_full, IMAGE_LOCATION);
-
- if (IS_SPECIAL_STAGE2 || ramdisk_possible()) {
- /* RAMDISK install */
- if (access(IMAGE_LOCATION RAMDISK_LOCATION, R_OK)) {
- error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. "
- "(I need the subdirectory " RAMDISK_LOCATION ")\n"
- "Here's a short extract of the files in the directory:\n"
- "%s", disk_extract_list_directory(IMAGE_LOCATION));
- umount(disk_own_mount);
- return try_with_device(dev_name);
- }
- if (load_ramdisk() != RETURN_OK) {
- error_message("Could not load program into memory.");
- umount(disk_own_mount);
- return try_with_device(dev_name);
- }
- } else {
- /* LIVE install */
- char p;
- if (access(IMAGE_LOCATION LIVE_LOCATION, R_OK)) {
- error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. "
- "(I need the subdirectory " LIVE_LOCATION ")\n"
- "Here's a short extract of the files in the directory:\n"
- "%s", disk_extract_list_directory(IMAGE_LOCATION));
- umount(disk_own_mount);
- return try_with_device(dev_name);
- }
- if (readlink(IMAGE_LOCATION LIVE_LOCATION "/usr/bin/runinstall2", &p, 1) != 1) {
- error_message("The " DISTRIB_NAME " Distribution seems to be copied on a Windows partition. "
- "You need more memory to perform an installation from a Windows partition. "
- "Another solution if to copy the " DISTRIB_NAME " Distribution on a Linux partition.");
- umount(disk_own_mount);
- return try_with_device(dev_name);
- }
- log_message("found the " DISTRIB_NAME " Installation, good news!");
+ results = try_with_directory(location_full, "disk", "disk-iso");
+ if (results != RETURN_OK) {
+ goto ask_dir;
}
- if (IS_RESCUE)
- umount(IMAGE_LOCATION);
+ if (!KEEP_MOUNTED)
+ umount(MEDIA_LOCATION);
- method_name = strdup("disk");
return RETURN_OK;
}
enum return_type disk_prepare(void)
{
- char ** medias, ** ptr, ** medias_models;
+ char ** medias, ** medias_models;
char * choice;
- int i, count = 0;
+ int i;
enum return_type results;
+ static int already_probed_ide_generic = 0;
- my_insmod("sd_mod", ANY_DRIVER_TYPE, NULL);
-
- get_medias(DISK, &medias, &medias_models);
+ int count = get_disks(&medias, &medias_models);
- ptr = medias;
- while (ptr && *ptr) {
- count++;
- ptr++;
- }
+ if (IS_AUTOMATIC) {
+ results = try_automatic(medias, medias_models);
+ if (results != RETURN_ERROR)
+ return results;
+ unset_automatic();
+ }
if (count == 0) {
- error_message("No DISK drive found.");
- i = ask_insmod(SCSI_ADAPTERS);
+ if (!already_probed_ide_generic) {
+ already_probed_ide_generic = 1;
+ my_modprobe("ide_generic", ANY_DRIVER_TYPE, NULL);
+ return disk_prepare();
+ }
+ stg1_error_message("No DISK drive found.");
+ i = ask_insmod(MEDIA_ADAPTERS);
if (i == RETURN_BACK)
return RETURN_BACK;
return disk_prepare();
@@ -212,24 +220,25 @@ enum return_type disk_prepare(void)
if (count == 1) {
results = try_with_device(*medias);
- if (results == RETURN_OK)
- return RETURN_OK;
- i = ask_insmod(SCSI_ADAPTERS);
+ if (results != RETURN_ERROR)
+ return results;
+ i = ask_insmod(MEDIA_ADAPTERS);
if (i == RETURN_BACK)
return RETURN_BACK;
return disk_prepare();
}
- results = ask_from_list_comments_auto("Please choose the DISK drive on which you copied the " DISTRIB_NAME " Distribution.",
+ results = ask_from_list_comments_auto("Please select the disk containing the copy of the "
+ DISTRIB_NAME " Distribution install source.",
medias, medias_models, &choice, "disk", medias);
if (results != RETURN_OK)
return results;
results = try_with_device(choice);
- if (results == RETURN_OK)
- return RETURN_OK;
- i = ask_insmod(SCSI_ADAPTERS);
+ if (results != RETURN_ERROR)
+ return results;
+ i = ask_insmod(MEDIA_ADAPTERS);
if (i == RETURN_BACK)
return RETURN_BACK;
return disk_prepare();
diff --git a/mdk-stage1/disk.h b/mdk-stage1/disk.h
index 54213cf68..8a6d1021f 100644
--- a/mdk-stage1/disk.h
+++ b/mdk-stage1/disk.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
diff --git a/mdk-stage1/dns.c b/mdk-stage1/dns.c
index ca750536a..f711758aa 100644
--- a/mdk-stage1/dns.c
+++ b/mdk-stage1/dns.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -19,136 +19,72 @@
*
*/
-#include <alloca.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <resolv.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
#include <stdlib.h>
+
+#include <unistd.h>
#include <string.h>
+#include <stdio.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <resolv.h>
+#include "network.h"
#include "log.h"
#include "dns.h"
-/* This is dumb, but glibc doesn't like to do hostname lookups w/o libc.so */
+int mygethostbyname(char * name, struct in_addr * addr)
+{
+ struct addrinfo hints, *res, *p;
+ int status;
+ char ipstr[INET6_ADDRSTRLEN];
-union dns_response {
- HEADER hdr;
- u_char buf[PACKETSZ];
-} ;
+ memset(&hints, 0, sizeof hints);
+ hints.ai_family = AF_INET; //AF_UNSPEC for both IPv4 & IPv6
+ hints.ai_socktype = SOCK_STREAM;
-static int do_query(char * query, int queryType, char ** domainName, struct in_addr * ipNum)
-{
- int len, ancount, type;
- u_char * data, * end;
- char name[MAXDNAME];
- union dns_response response;
-
-#ifdef __sparc__
- /* from jj: */
- /* We have to wait till ethernet negotiation is done */
- _res.retry = 3;
-#else
- _res.retry = 2;
-#endif
-
-
- len = res_search(query, C_IN, queryType, (void *) &response, sizeof(response));
- if (len <= 0)
+ /* prevent from timeouts */
+ if (_res.nscount == 0)
return -1;
- if (ntohs(response.hdr.rcode) != NOERROR)
- return -1;
+ if ((status = getaddrinfo(name, NULL, &hints, &res)) != 0) {
+ log_message("getaddrinfo: %s\n", gai_strerror(status));
+ return -1;
+ }
- ancount = ntohs(response.hdr.ancount);
- if (ancount < 1)
- return -1;
-
- data = response.buf + sizeof(HEADER);
- end = response.buf + len;
-
- /* skip the question */
- data += dn_skipname(data, end) + QFIXEDSZ;
-
- /* parse the answer(s) */
- while (--ancount >= 0 && data < end) {
-
- /* skip the domain name portion of the RR record */
- data += dn_skipname(data, end);
-
- /* get RR information */
- GETSHORT(type, data);
- data += INT16SZ; /* skipp class */
- data += INT32SZ; /* skipp TTL */
- GETSHORT(len, data);
-
- if (type == T_PTR) {
- /* we got a pointer */
- len = dn_expand(response.buf, end, data, name, sizeof(name));
- if (len <= 0) return -1;
- if (queryType == T_PTR && domainName) {
- /* we wanted a pointer */
- *domainName = malloc(strlen(name) + 1);
- strcpy(*domainName, name);
- return 0;
- }
- } else if (type == T_A) {
- /* we got an address */
- if (queryType == T_A && ipNum) {
- /* we wanted an address */
- memcpy(ipNum, data, sizeof(*ipNum));
- return 0;
- }
- }
-
- /* move ahead to next RR */
- data += len;
- }
-
- return -1;
-}
+ for (p = res;p != NULL; p = p->ai_next) {
+ void *tmp_addr;
+
+ struct sockaddr_in *ipv = (struct sockaddr_in *)p->ai_addr;
+ tmp_addr = &(ipv->sin_addr);
-char * mygethostbyaddr(char * ipnum) {
- int rc;
- char * result;
- char * strbuf;
- char * chptr;
- char * splits[4];
- int i;
-
- _res.retry = 1;
-
- strbuf = alloca(strlen(ipnum) + 1);
- strcpy(strbuf, ipnum);
-
- ipnum = alloca(strlen(strbuf) + 20);
-
- for (i = 0; i < 4; i++) {
- chptr = strbuf;
- while (*chptr && *chptr != '.')
- chptr++;
- *chptr = '\0';
-
- if (chptr - strbuf > 3) return NULL;
- splits[i] = strbuf;
- strbuf = chptr + 1;
+ /* convert the IP to a string: */
+ inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
+
+ memcpy(addr, tmp_addr, sizeof(*addr));
+ log_message("is-at: %s\n", inet_ntoa(*addr));
}
-
- sprintf(ipnum, "%s.%s.%s.%s.in-addr.arpa", splits[3], splits[2], splits[1], splits[0]);
-
- rc = do_query(ipnum, T_PTR, &result, NULL);
-
- if (rc)
- return NULL;
- else
- return result;
+
+ freeaddrinfo(res); // free the linked list
+ return 0;
}
-int mygethostbyname(char * name, struct in_addr * addr) {
- int rc = do_query(name, T_A, NULL, addr);
- if (!rc)
- log_message("%s is-at %s", name, inet_ntoa(*addr));
- return rc;
+char * mygethostbyaddr(char * ipnum)
+{
+ struct sockaddr_in sa;
+ char hbuf[NI_MAXHOST];
+
+ /* prevent from timeouts */
+ if (_res.nscount == 0)
+ return NULL;
+
+ memset(&sa, 0, sizeof sa);
+ sa.sin_family = AF_INET;
+
+ if (inet_pton(AF_INET, ipnum, &sa.sin_addr) != 1)
+ return NULL;
+
+ if (getnameinfo((struct sockaddr*)&sa, sizeof(sa), hbuf, sizeof(hbuf), NULL, 0, 0 |NI_NAMEREQD) == 0) //NI_NUMERICHOST NI_NAMEREQD
+ return strdup(hbuf);
+ else return NULL;
}
diff --git a/mdk-stage1/dns.h b/mdk-stage1/dns.h
index 97af9c08a..107ad1bce 100644
--- a/mdk-stage1/dns.h
+++ b/mdk-stage1/dns.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
diff --git a/mdk-stage1/doc/HACKING b/mdk-stage1/doc/HACKING
new file mode 100644
index 000000000..d196c8010
--- /dev/null
+++ b/mdk-stage1/doc/HACKING
@@ -0,0 +1,31 @@
+If you have to boot pretty often, you'll appreciate to speed the things up
+a little.
+
+Here's what we use: the GRUB feature to boot from the network using the
+DHCP protocol and the TFTP protocol.
+
+Here's the "menu.lst" to do that:
+
+-=-=--
+
+timeout 0
+
+title linux
+dhcp
+tftpserver 192.168.1.17
+kernel (nd)/tftpboot/gc/vmlinuz ramdisk=32000 vga=788
+initrd (nd)/tftpboot/gc/network.rdz
+
+-=-=--
+
+
+The option "tftpserver" is used to override the tftpserver address given
+as an answer by the DHCP server. That way, you'll not need to bother your
+system administrator to modify his dhcp server configuration.
+
+The directory /tftpboot seems to be the only one defaultly accepted by the
+server, and its subdirs.
+
+
+Of course, your GRUB needs to be compiled with the specific code for your
+network card; use ./configure --help in the GRUB build dir for more infos.
diff --git a/mdk-stage1/doc/README b/mdk-stage1/doc/README
new file mode 100644
index 000000000..28b81b39e
--- /dev/null
+++ b/mdk-stage1/doc/README
@@ -0,0 +1,185 @@
+-------------------------------------------------------
+* Stage1 of the Mandriva Linux installation program *
+-------------------------------------------------------
+
+
+[ Author ]
+
+ Guillaume Cottenceau (gc at mandriva.com)
+
+
+[ Copyright ]
+
+ Copyright 2000, 2001, 2002 Mandriva
+
+ Partially inspired by Redhat stuff (install from 5.x and 7.x) copyright
+ Red Hat Software, and Debian stuff (boot-floppies) copyright by their
+ respective holders.
+
+
+[ Licence ]
+
+ 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
+
+
+ *** WARNING! ***
+
+ This General Public License does not permit incorporating any part
+ of this program as a library into proprietary programs.
+
+
+[ Online ]
+
+ http://people.mandriva.com/~gc/html/stage1.html
+
+
+[ Purpose ]
+
+ This code will take the control of the computer after that Linux
+ kernel booted properly, and will try to run the main installer
+ (also known as "stage 2") from a series of different media
+ including harddrive, cdrom, and network.
+
+ Use the source, Luke.
+
+
+
+
+ -=-=-- Okay, now, more details --=-=-
+
+
+ [ Installing Mandriva Linux ]
+
+Per default, just insert your Mandriva Linux Installation CD into your
+CDROM tray, be sure your system BIOS is configured to boot on your CDROM,
+and that's all.
+
+If you have multiple CDROM drives and the installer can't autodetect in
+which CDROM drive is the disc, it may ask you to choose the correct drive,
+between your CDROM drives.
+
+Also, if you want to install from an SCSI CDROM, the installer should
+detect your SCSI adapter; if it fails you may have to select the right
+driver and/or supply additional parameters.
+
+
+ [ Position of the problem ]
+
+The need for alternate installation methods come with more specific
+hardware configuration and/or need for frequent updates of the Installer
+software.
+
+All of these methods will require to use a special boot disk. The method
+is to download it and then to copy it "physically" to a floppy with the
+command:
+
+# dd if=<boot-disk> of=/dev/fd0
+
+Our boot disks are called "cdrom.img", "network.img", etc.
+
+
+ [ Installation from CDROM ]
+
+The first situation you may encounter is an old BIOS which does not permit
+you to boot from your CDROM drive.
+
+In that case, you'll need to use the "cdrom.img" image file. The steps are
+the same as with CDROM boot, and everything should be automatic.
+
+
+ [ Installation from DISK ]
+
+If you like trying occasionnally our development version, the Cooker, one
+of the easiest way is to grab a local copy of the Distribution on one of
+your local hard drives, and to install from that location.
+
+At present time, you can install from IDE or SCSI drives, from Linux
+(ext4), Windows (vfat) or Reiserfs partition.
+
+In that case, you'll need to use the "hd.img" image file. The dialogs will
+ask you to choose the DISK drive to use to install from, then the
+partition on which you copied the Distribution, then the location
+(directory) in which you copied the Distribution.
+
+
+ [ Installation from NETWORK ]
+
+For convenience, you can also install from a NFS volume, from a FTP
+server, or from a HTTP server. NFS installs are maybe the fastest
+and most convenient possible, so if you need to do frequent and/or
+multiple installs, you may like this option.
+
+In that case, you'll need to use the "network.img" image file. If you have
+PCI network card(s), you'll probably have to only setup your network
+options. If not, you'll have to choose the appropriate driver(s) and/or
+optional parameters. Supported network configurations include static IP
+allocation and DHCP automatic configuration.
+
+
+ [ Installation from PCMCIA ]
+
+If you want to perform an installation on your laptop that is not based on
+local IDE CDROM or DISK, nor on built-in network card, but on PCMCIA
+extension (probably a network adapter or CDROM drive), you'll need the
+"pcmcia.img" image file.
+
+PCMCIA services should automatically start and be transparent to you.
+Then, you'll follow the instructions according to your preferred
+installation method.
+
+
+ [ Monitoring a stage1 session ]
+
+Linux supports virtual consoles. You can switch between them by issueing
+Ctrl+Alt+Fx key, in which 'x' is the number of the console. Here's console
+occupancy during stage1.
+
+(#1) The user-interface of the stage1 is on the first console. In case of
+newt interaction, it's provided with a neat blue and black color scheme,
+and nice widgets. In case of stdio interaction (cdrom and disk installs),
+it's more basic but still usable :-).
+
+(#2) A shell is provided on second console in some cases (you need to
+compile it with -DSPAWN_SHELL and you need to provide a valid shell in the
+initrd) and of course it's not in, in image files of Mandriva Linux
+releases because it's too much diskspace.
+
+(#3) The log is printed out on the third console. This is the location
+where you can find most valuable information, prefixed by a '*'. See
+"log.h" for calls that print things out to the log.
+
+(#4) The kernel messages are printed on the fourth console. There is a
+process forked very early in the init (the program before the stage1)
+which monitors /proc/kmsg for new kernel messages. Also, syslog stuff (the
+logs commited by the programs) should appear on the /dev/log Unix socket,
+this is also printed on this console.
+
+(#5) Former place for the stderr of insmod calls. It's not used anymore.
+
+(#6) Place where a trivial interactive communication with the stage1 is
+set up if the parameter -DSPAWN_INTERACTIVE is compiled in. Basically, you
+can set switches such as "expert" and "rescue" on the fly with this
+feature. It's implemented with a fork and a Unix pipe.
+
+
+ [ Rescueing a system ]
+
+Since Mandriva Linux 7.1, we provide a rescue system through each of the
+previously described methods. You don't need a special "rescue.img" file.
+Just hit "F1" at boot time, type in "rescue", and follow the first steps
+of the installation according to the method you chose (choose
+disks/partitions for disk method, network parameters for network method,
+etc). Then, you'll end up with a workable system, very useful to rescue a
+damaged system, or do other basic actions.
diff --git a/mdk-stage1/doc/TECH-INFOS b/mdk-stage1/doc/TECH-INFOS
new file mode 100644
index 000000000..81d559a7f
--- /dev/null
+++ b/mdk-stage1/doc/TECH-INFOS
@@ -0,0 +1,106 @@
+
+| (*) Automatic install
+\----------------------
+
+This feature is used to replace redhat kickstart. It uses the kernel
+parameter "automatic" with keywords separated with commas and colons, on
+the following genres:
+
+ automatic=method:nfs,network:static,ip:192.168.1.24,server:192.168.1.7,directory:/stable/i686
+
+ automatic=method:ftp,network:dhcp,server:ftp.ciril.fr,directory:/pub/linux/mandriva-devel/cooker
+
+ automatic=method:ftp,network:dhcp,server:companyserver,directory:/mdkinst,user:XXX,pass:XXX
+
+ automatic=method:ftp,interface:eth1,network:dhcp,...
+
+ automatic=method:ftp,network:adsl,adsluser:XXX,adslpass:XXX,...
+
+ automatic=method:cdrom
+
+ automatic=method:disk,disk:hdb,partition:hdb7,directory:/cooker
+
+
+The keywords correspond to each "virtual" question answered automatically,
+either from a list or from a free field.
+
+
+Keywords are:
+
+
+`method' <- (nfs,ftp,http,cdrom,disk)
+
+if nfs/ftp/http:
+
+ `network' <- (static,dhcp,adsl)
+
+ if multiple interfaces detected:
+
+ `interface' <- (list-of-detected-interfaces)
+ if "auto":
+ use the first interface with a link beat
+ if "wired":
+ use the first wired interface with a link beat
+ or the first wired interface if none has a link beat
+
+ fi
+
+ if static:
+
+ `ip', `dns', `gateway', `netmask' (free fields)
+
+ elsif adsl:
+
+ `adsluser', `adslpass' (free field)
+
+ fi
+
+ if resolving fails:
+
+ `hostname', `domain' (free fields)
+
+ fi
+
+ `server', `directory' (free fields)
+
+ if ftp:
+
+ `user', `pass' (free fields)
+
+ fi
+
+fi
+
+if disk:
+
+ `disk' <- (list-of-detected-disks)
+
+ `partition' <- (list-of-detected-partitions)
+
+ `directory' (free fields)
+
+fi
+
+
+
+You may use shorter versions of keywords (it helps reducing size of
+commandline), please find each keyword short-alias counterpart in file
+../automatic.c under the identifier named "short_aliases".
+
+This gives for example for:
+
+ automatic=method:nfs,network:static,ip:192.168.1.24,server:192.168.1.7,directory:/stable/i686
+==>
+ automatic=met:nfs,net:static,ip:192.168.1.24,ser:192.168.1.7,dir:/stable/i686
+
+
+
+You may specify a stage2 auto-install file, different from the
+default `auto_inst.cfg.pl' in install/, by filling the
+`bootfile' parameter of your DHCP server response.
+
+Note that if the name ends with `-IP' or `-IP.pl', IP will be
+replaced by the IP address given to the host, normalized to
+hexadecimal (that is, `192.168.100.57' would give 'C0A86439').
+
+
diff --git a/mdk-stage1/doc/UPDATEMODULES b/mdk-stage1/doc/UPDATEMODULES
new file mode 100644
index 000000000..cfae4dc54
--- /dev/null
+++ b/mdk-stage1/doc/UPDATEMODULES
@@ -0,0 +1,96 @@
+This is the documentation for the "Update Modules" (Update Drivers)
+feature.
+
+This feature aims to propose new modules or replacement modules for the
+install and afterwards. This is useful when there is a firmware update for a
+given driver, an additional driver needed for something, etc.
+
+
+You must use a floppy disk with e2fs filesystem (NOT vfat/windows
+formatted). Use "mke2fs /dev/fd0" on your own box to format a floppy with
+e2fs filesystem.
+
+This disk may contain a number of kernel modules; some of them
+may replace existing modules, some of them may be added.
+
+Create a directory per kernel version, named from the version, for example
+2.6.27-desktop586-0.rc8.2mnb. In this directory put the modules and a special
+file, named "to_load". This file will contain a series of module names, with
+optional module options; the program will try to load all these modules one
+after another, using file on the floppy if present, else using file within
+standard module repository. It can contain comments, these are strictly defined
+by the presence of a hash (#) character on column 0 of any line.
+
+This disk may also contain some update or new modules for installed kernels.
+Those modules must be placed in directory <kernel-version>. They must be
+gzipped if the installed kernel modules are gzipped.
+
+You may need to specify the "category" so that new modules are used correctly.
+For example, a scsi module should be put in category disk/scsi so that it is
+put in scsi_hostadapter and initrd.
+
+
+Here's a typical scenario:
+
+
+1. Boot the floppy (or cdrom) with the option "updatemodules"
+
+ (you may do that by pressing F1 then entering "linux updatemodules")
+
+
+2. At the very beginning of the User Interface, you are asked to insert
+ the Update Modules disk. Insert the Update Modules disk and press
+ Enter.
+
+--=----=----=----=----=----=----=----=----=--
+Our example disk contains:
+
+[root@obiwan mnt]# ll floppy/*
+2.6.27-desktop586-0.rc8.2mnb/:
+total 541
+drwxrwxr-x 3 a a 1024 2009-03-09 12:09 kernel/
+-rw-rw-r-- 1 a a 547480 2009-03-09 12:04 msdos.ko
+-rw-rw-r-- 1 a a 54748 2009-03-09 12:04 ppa.ko
+-rw-rw-r-- 1 a a 79 2009-03-09 12:08 to_load
+[root@obiwan mnt]# cat floppy/*/to_load
+# Update Drivers description file
+3c59x
+# fat is a dep for msdos
+fat
+# updated msdos (handling of 9+4 filenames)
+msdos
+ppa
+# ISA network card needing options
+ne io=0x300 irq=7
+# New module [list_modules: disk/scsi]
+a320raid
+[root@obiwan mnt]# (cd floppy/2.6.27-desktop586-0.rc8.2mnb ; find -type f)
+./msdos.ko
+./ppa.ko
+./to_load
+./kernel/fs/msdos/msdos.ko.gz
+./kernel/drivers/scsi/ppa.ko.gz
+./kernel/drivers/usb/host/uhci-hcd.ko.gz
+./kernel/drivers/usb/input/wacom.ko.gz
+[root@obiwan mnt]#
+--=----=----=----=----=----=----=----=----=--
+
+
+3. The program reads the special file "to_load" and processes the files.
+
+ a- 3c59x loaded from the marfile on the boot floppy
+ b- fat loaded from the marfile on the boot floppy
+ c- msdos loaded from the update modules floppy
+ d- ppa loaded from the update modules floppy
+ e- ne loaded from the marfile on the boot floppy
+
+
+
+!!! Beware !!!, the dependencies are not handled automatically in
+the case of load from the update modules floppy, that's why on
+our example we need to load "fat" from the standard modules
+before "msdos" from the update floppy.
+
+
+4. When system is installed, update floppy is asked again so that update
+modules for the installed kernels can be copied. Then depmod is called.
diff --git a/mdk-stage1/doc/documented..frontend.h b/mdk-stage1/doc/documented..frontend.h
new file mode 100644
index 000000000..96e4dc8d8
--- /dev/null
+++ b/mdk-stage1/doc/documented..frontend.h
@@ -0,0 +1,69 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * Using high-level UI.
+ *
+ * These functions are frontend-independant: your program won't know each
+ * `frontend' (e.g. each way to grab user input) will be used.
+ *
+ * Then you may link your binary against any `frontend' that implement all
+ * these functions (and possibly necessary libraries).
+ */
+
+
+#ifndef _FRONTEND_H_
+#define _FRONTEND_H_
+
+/* this must be called before anything else */
+void init_frontend(void);
+
+/* this must be called before exit of program */
+void finish_frontend(void);
+
+
+void info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* (blocks program) */
+
+void error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* (blocks program) */
+
+/* (doesn't block program)
+ * (this is not necessarily stackable, e.g. only one wait_message at a time) */
+void wait_message(char *msg, ...) __attribute__ ((format (printf, 1, 2)));
+
+/* call this to finish the wait on wait_message */
+void remove_wait_message(void);
+
+/* monitor progression of something (downloading a file, etc)
+ * if size of progression is unknown, use `0' */
+void init_progression(char *msg, int size);
+void update_progression(int current_size);
+void end_progression(void);
+
+enum frontend_return { RETURN_OK, RETURN_BACK, RETURN_ERROR };
+
+/* Yes == RETURN_OK No == RETURN_ERROR Back == RETURN_BACK */
+enum frontend_return ask_yes_no(char *msg);
+
+/* [elems] NULL terminated array of char*
+ * [choice] address of a (unitialized) char* */
+enum frontend_return ask_from_list(char *msg, char ** elems, char ** choice);
+
+enum frontend_return ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice);
+
+/* [questions] NULL terminated array of char*
+ * [answers] address of a (unitialized) char**, will contain a non-NULL terminated array of char*
+ * [callback_func] function called at most when the answers change; it can examine the array of char* and assign some new char* */
+enum frontend_return ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings));
+
+#endif
diff --git a/mdk-stage1/frontend-common.c b/mdk-stage1/frontend-common.c
new file mode 100644
index 000000000..cdc972740
--- /dev/null
+++ b/mdk-stage1/frontend-common.c
@@ -0,0 +1,64 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include <probing.h>
+
+#include "frontend.h"
+
+
+void info_message(char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ vinfo_message(msg, args);
+ va_end(args);
+}
+
+void wait_message(char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ vwait_message(msg, args);
+ va_end(args);
+}
+
+void error_message(char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ verror_message(msg, args);
+ va_end(args);
+}
+
+enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice)
+{
+ int answer = 0;
+ enum return_type results;
+
+ results = ask_from_list_index(msg, elems, elems_comments, &answer);
+
+ if (results == RETURN_OK)
+ *choice = strdup(elems[answer]);
+
+ return results;
+}
+
+enum return_type ask_from_list(char *msg, char ** elems, char ** choice)
+{
+ return ask_from_list_comments(msg, elems, NULL, choice);
+}
diff --git a/mdk-stage1/frontend.h b/mdk-stage1/frontend.h
index 2869590e7..367d46735 100644
--- a/mdk-stage1/frontend.h
+++ b/mdk-stage1/frontend.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -13,29 +13,56 @@
*/
/*
- * Each different frontend must implement all functions defined here
+ * For doc please read doc/documented..frontend.h
*/
-
#ifndef _FRONTEND_H_
#define _FRONTEND_H_
-#include "stage1.h"
+#include <stdarg.h>
+
+/* 'unused' atttribute, gcc specific and just to turn down some warnings. */
+#if defined __GNUC__
+#define UNUSED __attribute__((unused))
+#else
+#define UNUSED
+#endif
-void init_frontend(void);
+enum return_type { RETURN_OK, RETURN_BACK, RETURN_ERROR };
+
+void init_frontend(char * welcome_msg);
void finish_frontend(void);
-void error_message(char *msg, ...); /* blocking */
-void info_message(char *msg, ...); /* blocking */
-void wait_message(char *msg, ...); /* non-blocking */
+
+void error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* blocking */
+void info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* blocking */
+void wait_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* non-blocking */
void remove_wait_message(void);
+void init_progression_raw(char *msg, int size);
+void update_progression_raw(int current_size);
+void end_progression_raw(void);
+
+#ifdef ENABLE_BOOTSPLASH
void init_progression(char *msg, int size);
void update_progression(int current_size);
void end_progression(void);
+#else
+#define init_progression init_progression_raw
+#define update_progression update_progression_raw
+#define end_progression end_progression_raw
+#endif
enum return_type ask_yes_no(char *msg);
+enum return_type ask_from_list_index(char *msg, char ** elems, char ** elems_comments, int *answer);
enum return_type ask_from_list(char *msg, char ** elems, char ** choice);
enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice);
enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings));
+void suspend_to_console(void);
+void resume_from_suspend(void);
+
+void verror_message(char *msg, va_list ap);
+void vinfo_message(char *msg, va_list ap);
+void vwait_message(char *msg, va_list ap);
+
#endif
diff --git a/mdk-stage1/init-data/emptyboot.img.bz2 b/mdk-stage1/init-data/emptyboot.img.bz2
deleted file mode 100644
index 6ae939c1b..000000000
--- a/mdk-stage1/init-data/emptyboot.img.bz2
+++ /dev/null
Binary files differ
diff --git a/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 b/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2
deleted file mode 100644
index 9d5d276fb..000000000
--- a/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2
+++ /dev/null
Binary files differ
diff --git a/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 b/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2
deleted file mode 100644
index c650dce8b..000000000
--- a/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2
+++ /dev/null
Binary files differ
diff --git a/mdk-stage1/init-data/msgboot.img.bz2 b/mdk-stage1/init-data/msgboot.img.bz2
deleted file mode 100644
index c5f3a7ed7..000000000
--- a/mdk-stage1/init-data/msgboot.img.bz2
+++ /dev/null
Binary files differ
diff --git a/mdk-stage1/init-libc-headers.h b/mdk-stage1/init-libc-headers.h
deleted file mode 100644
index f5f6aa2e6..000000000
--- a/mdk-stage1/init-libc-headers.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/*
- * Portions from Erik Troan (ewt@redhat.com)
- *
- * Copyright 1996 Red Hat Software
- *
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/mount.h>
-#include <linux/un.h>
-#include <errno.h>
-#include <signal.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
-#include <linux/unistd.h>
-#include <sys/select.h>
-
-#ifndef SOCK_STREAM
-#define SOCK_STREAM 1
-#endif
-
-_syscall3(int, syslog, int, type, char *, bufp, int, len);
-_syscall3(int, reboot, int, magic, int, magic2, int, flag);
diff --git a/mdk-stage1/init.c b/mdk-stage1/init.c
index b5f5631f8..7c48f64ec 100644
--- a/mdk-stage1/init.c
+++ b/mdk-stage1/init.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -19,21 +19,54 @@
*
*/
-#ifndef INIT_HEADERS
-#include "init-libc-headers.h"
-#else
-#include INIT_HEADERS
-#endif
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mount.h>
+#include <linux/un.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/resource.h>
+#include <sys/wait.h>
+#include <linux/unistd.h>
+#include <sys/select.h>
+#include <sys/ioctl.h>
+#include <linux/reboot.h>
+
+#include <sys/syscall.h>
+#define syslog(...) syscall(__NR_syslog, __VA_ARGS__)
+
+static unsigned int reboot_magic = LINUX_REBOOT_CMD_RESTART;
+
+static inline long reboot(unsigned int command)
+{
+ return (long) syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, command, 0);
+}
#include "config-stage1.h"
+#include <linux/cdrom.h>
+
+
+#define BINARY_STAGE2 "/usr/bin/runinstall2"
char * env[] = {
"PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin",
- "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib:/usr/X11R6/lib:/mnt/usr/X11R6/lib",
+ "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib"
+#if defined(__x86_64__)
+ ":/lib64:/usr/lib64:/mnt/lib64:/mnt/usr/lib64"
+#endif
+ ,
"HOME=/",
"TERM=linux",
"TERMINFO=/etc/terminfo",
+ "LC_CTYPE=UTF-8",
NULL
};
@@ -48,14 +81,14 @@ char * env[] = {
*
*/
-int testing;
+int testing = 0;
int klog_pid;
void fatal_error(char *msg)
{
printf("FATAL ERROR IN INIT: %s\n\nI can't recover from this, please reboot manually and send bugreport.\n", msg);
- while (1);
+ select(0, NULL, NULL, NULL, NULL);
}
void print_error(char *msg)
@@ -73,20 +106,20 @@ void print_int_init(int fd, int i)
char buf[10];
char * chptr = buf + 9;
int j = 0;
-
+
if (i < 0)
{
write(1, "-", 1);
i = -1 * i;
}
-
+
while (i)
{
*chptr-- = '0' + (i % 10);
j++;
i = i / 10;
}
-
+
write(fd, chptr + 1, j);
}
@@ -95,7 +128,6 @@ void print_str_init(int fd, char * string)
write(fd, string, strlen(string));
}
-
/* fork to:
* (1) watch /proc/kmsg and copy the stuff to /dev/tty4
* (2) listens to /dev/log and copy also this stuff (log from programs)
@@ -105,7 +137,7 @@ void doklog()
fd_set readset, unixs;
int in, out, i;
int log;
- int s;
+ socklen_t s;
int sock = -1;
struct sockaddr_un sockaddr;
char buf[1024];
@@ -118,7 +150,7 @@ void doklog()
return;
}
- if ((log = open("/tmp/syslog", O_WRONLY | O_CREAT, 0644)) < 0) {
+ if ((log = open("/tmp/syslog", O_WRONLY | O_CREAT | O_APPEND, 0644)) < 0) {
print_error("error opening /tmp/syslog");
sleep(5);
return;
@@ -133,7 +165,7 @@ void doklog()
close(1);
close(2);
}
-
+
out = open("/dev/tty4", O_WRONLY, 0);
if (out < 0)
print_warning("couldn't open tty for syslog -- still using /tmp/syslog\n");
@@ -153,8 +185,7 @@ void doklog()
// print_str_init(log, "] bind error: ");
// print_int_init(log, errno);
// print_str_init(log, "\n");
-// sleep(5);
-// }
+// sleep(// }
//
// print_str_init(log, "] bound socket\n");
// chmod("/dev/log", 0666);
@@ -176,7 +207,7 @@ void doklog()
if (sock >= 0)
FD_SET(sock, &readset);
FD_SET(in, &readset);
-
+
i = select(20, &readset, NULL, NULL, NULL);
if (i <= 0)
continue;
@@ -191,25 +222,6 @@ void doklog()
}
}
- /* examine some fd's in the hope to find some syslog outputs from programs */
- for (readfd = 0; readfd < 20; ++readfd) {
- if (FD_ISSET(readfd, &readset) && FD_ISSET(readfd, &unixs)) {
- i = read(readfd, buf, sizeof(buf));
- if (i > 0) {
- /* grep out the output of RPM telling that it installed/removed some packages */
- if (!strstr(buf, "mdk installed") && !strstr(buf, "mdk removed")) {
- if (out >= 0)
- write(out, buf, i);
- write(log, buf, i);
- }
- } else if (i == 0) {
- /* socket closed */
- close(readfd);
- FD_CLR(readfd, &unixs);
- }
- }
- }
-
/* the socket has moved, new stuff to do */
if (sock >= 0 && FD_ISSET(sock, &readset)) {
s = sizeof(sockaddr);
@@ -231,20 +243,28 @@ void doklog()
#define LOOP_CLR_FD 0x4C01
-void del_loop(char *device)
+void del_loops(void)
{
- int fd;
- if ((fd = open(device, O_RDONLY, 0)) < 0) {
- printf("del_loop open failed\n");
- return;
- }
-
- if (ioctl(fd, LOOP_CLR_FD, 0) < 0) {
- printf("del_loop ioctl failed");
- return;
- }
-
- close(fd);
+ char loopdev[] = "/dev/loop0";
+ char chloopdev[] = "/dev/chloop0";
+ int i;
+ for (i=0; i<8; i++) {
+ int fd;
+ loopdev[9] = '0' + i;
+ fd = open(loopdev, O_RDONLY, 0);
+ if (fd > 0) {
+ if (!ioctl(fd, LOOP_CLR_FD, 0))
+ printf("\t%s\n", loopdev);
+ close(fd);
+ }
+ chloopdev[11] = '0' + i;
+ fd = open(chloopdev, O_RDONLY, 0);
+ if (fd > 0) {
+ if (!ioctl(fd, LOOP_CLR_FD, 0))
+ printf("\t%s\n", chloopdev);
+ close(fd);
+ }
+ }
}
struct filesystem
@@ -255,6 +275,18 @@ struct filesystem
int mounted;
};
+char* strcat(register char* s,register const char* t)
+{
+ char *dest=s;
+ s+=strlen(s);
+ for (;;) {
+ if (!(*s = *t))
+ break;
+ ++s; ++t;
+ }
+ return dest;
+}
+
/* attempt to unmount all filesystems in /proc/mounts */
void unmount_filesystems(void)
{
@@ -264,9 +296,9 @@ void unmount_filesystems(void)
struct filesystem fs[500];
int numfs = 0;
int i, nb;
-
+
printf("unmounting filesystems...\n");
-
+
fd = open("/proc/mounts", O_RDONLY, 0);
if (fd < 1) {
print_error("failed to open /proc/mounts");
@@ -293,7 +325,12 @@ void unmount_filesystems(void)
*p++ = '\0';
while (*p != '\n') p++;
p++;
- if (strcmp(fs[numfs].name, "/") != 0) numfs++; /* skip if root, no need to take initrd root in account */
+ if (strcmp(fs[numfs].name, "/")
+ && !strstr(fs[numfs].dev, "ram")
+ && strcmp(fs[numfs].name, "/dev")
+ && strcmp(fs[numfs].name, "/sys")
+ && strncmp(fs[numfs].name, "/proc", 5))
+ numfs++;
}
/* Pixel's ultra-optimized sorting algorithm:
@@ -303,31 +340,123 @@ void unmount_filesystems(void)
nb = 0;
for (i = 0; i < numfs; i++) {
/*printf("trying with %s\n", fs[i].name);*/
+ del_loops();
if (fs[i].mounted && umount(fs[i].name) == 0) {
- if (strncmp(fs[i].dev + sizeof("/dev/") - 1, "loop",
- sizeof("loop") - 1) == 0)
- del_loop(fs[i].dev);
-
printf("\t%s\n", fs[i].name);
fs[i].mounted = 0;
nb++;
}
}
} while (nb);
-
+
for (i = nb = 0; i < numfs; i++)
if (fs[i].mounted) {
- printf("\t%s umount failed\n", fs[i].name);
- if (strcmp(fs[i].fs, "ext2") == 0) nb++; /* don't count not-ext2 umount failed */
+ printf("\tumount failed: %s\n", fs[i].name);
+ if (strcmp(fs[i].fs, "ext3") == 0) nb++; /* don't count not-ext3 umount failed */
}
-
+
+
if (nb) {
printf("failed to umount some filesystems\n");
- while (1);
+ select(0, NULL, NULL, NULL, NULL);
}
}
-int exit_value_rescue = 66;
+int in_reboot(void)
+{
+ int fd;
+ if ((fd = open("/var/run/rebootctl", O_RDONLY, 0)) > 0) {
+ char buf[100];
+ int i = read(fd, buf, sizeof(buf));
+ close(fd);
+ if (strstr(buf, "halt"))
+ reboot_magic = LINUX_REBOOT_CMD_POWER_OFF;
+ return i > 0;
+ }
+ return 0;
+}
+
+int recursive_remove(char *file);
+int recursive_remove(char *file)
+{
+ struct stat sb;
+
+ if (lstat(file, &sb) != 0) {
+ printf("failed to stat %s: %d\n", file, errno);
+ return -1;
+ }
+
+ /* only descend into subdirectories if device is same as dir */
+ if (S_ISDIR(sb.st_mode)) {
+ char * strBuf = alloca(strlen(file) + 1024);
+ DIR * dir;
+ struct dirent * d;
+
+ if (!(dir = opendir(file))) {
+ printf("error opening %s: %d\n", file, errno);
+ return -1;
+ }
+ while ((d = readdir(dir))) {
+ if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+ continue;
+
+ strcpy(strBuf, file);
+ strcat(strBuf, "/");
+ strcat(strBuf, d->d_name);
+
+ if (recursive_remove(strBuf) != 0) {
+ closedir(dir);
+ return -1;
+ }
+ }
+ closedir(dir);
+
+ if (rmdir(file)) {
+ printf("failed to rmdir %s: %d\n", file, errno);
+ return -1;
+ }
+ } else {
+ if (unlink(file) != 0) {
+ printf("failed to remove %s: %d\n", file, errno);
+ return -1;
+ }
+ }
+ return 0;
+}
+
+
+int create_initial_fs_symlinks(char* symlinks)
+{
+ FILE *f;
+ char buf[5000];
+
+ if (!(f = fopen(symlinks, "rb"))) {
+ printf("Error opening symlink definitions file '%s'\n", symlinks);
+ return -1;
+ }
+ while (fgets(buf, sizeof(buf), f)) {
+ char oldpath[500], newpath[500];
+ struct stat sb;
+
+ buf[strlen(buf)-1] = '\0'; // trim \n
+ if (sscanf(buf, "%s %s", oldpath, newpath) != 2) {
+ snprintf(oldpath, sizeof(oldpath), "%s%s", STAGE2_LOCATION, buf);
+ snprintf(newpath, sizeof(newpath), "%s", buf);
+ }
+ if (lstat(newpath, &sb) == 0)
+ recursive_remove(newpath);
+ printf("Creating symlink %s -> %s\n", oldpath, newpath);
+ if (symlink(oldpath, newpath)) {
+ printf("Error creating symlink\n");
+ return -1;
+ }
+ }
+ fclose(f);
+ return 0;
+}
+
+
+int exit_value_restart = 0x35;
int main(int argc, char **argv)
{
@@ -335,10 +464,12 @@ int main(int argc, char **argv)
int wait_status;
int fd;
int abnormal_termination = 0;
- int end_stage2 = 0;
- /* getpid() != 1 should work, by linuxrc tends to get a larger pid */
- testing = (getpid() > 50);
+ if (argc > 1 && argv[1][0] >= '0' && argv[1][0] <= '9') {
+ printf("This is no normal init, sorry.\n"
+ "Call `reboot' or `halt' directly.\n");
+ return 0;
+ }
if (!testing) {
/* turn off screen blanking */
@@ -346,46 +477,39 @@ int main(int argc, char **argv)
printf("\033[8]");
}
else
- printf("*** TESTING MODE ***\n");
+ printf("*** TESTING MODE *** (pid is %d)\n", getpid());
- printf("\n\t\t\t\033[1;40mWelcome to Linux-\033[1;36mMandrake\033[0;39m\n\n");
-
- if (!testing) {
- if (mount("/proc", "/proc", "proc", 0, NULL))
- fatal_error("Unable to mount proc filesystem");
- }
-
+ // needed for ldetect:
+ if (!testing)
+ if (mount("none", "/sys/kernel/debug", "debugfs", MS_NOSUID, "mode=0755"))
+ fatal_error("Unable to mount debugfs filesystem");
+
/* ignore Control-C and keyboard stop signals */
signal(SIGINT, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
-
if (!testing) {
- fd = open("/dev/tty1", O_RDWR, 0);
- if (fd < 0)
- /* try with devfs */
- fd = open("/dev/vc/1", O_RDWR, 0);
-
+ fd = open("/dev/console", O_RDWR, 0);
if (fd < 0)
- fatal_error("failed to open /dev/tty1 and /dev/vc/1");
-
+ fatal_error("failed to open /dev/console");
+
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
close(fd);
}
-
+
/* I set me up as session leader (probably not necessary?) */
setsid();
- if (ioctl(0, TIOCSCTTY, NULL))
- print_error("could not set new controlling tty");
+// if (ioctl(0, TIOCSCTTY, NULL))
+// print_error("could not set new controlling tty");
if (!testing) {
- char * my_hostname = "localhost.localdomain";
- sethostname(my_hostname, strlen(my_hostname));
+ char my_hostname[] = "localhost";
+ sethostname(my_hostname, sizeof(my_hostname));
/* the default domainname (as of 2.0.35) is "(none)", which confuses
glibc */
setdomainname("", 0);
@@ -394,50 +518,78 @@ int main(int argc, char **argv)
if (!testing)
doklog();
- /* Go into normal init mode - keep going, and then do a orderly shutdown
- when:
-
- 1) install exits
- 2) we receive a SIGHUP
- */
-
- printf("Traktopel says: drink an egg white each morning builds a man! (c) Warly\n");
- printf("Running install...\n");
-
- if (!(installpid = fork())) {
- /* child */
- char * child_argv[2];
- child_argv[0] = "/sbin/stage1";
- child_argv[1] = NULL;
+ if (create_initial_fs_symlinks(STAGE2_LOCATION "/usr/share/symlinks") != 0)
+ fatal_error("Fatal error finishing initialization (could not create symlinks).");
+
+ /* kernel modules and firmware is needed by stage2, so move them to the root */
+ if (rename("/usr/lib/modules", "/modules"))
+ fatal_error("Cannot rename modules folder");
+ if (rename("/usr/lib/firmware", "/firmware"))
+ fatal_error("Cannot rename firmware folder");
+
+ /* Add some symlinks so stage1 is still valid on it's own - not strictly needed */
+ if (symlink("/modules", "/usr/lib/modules"))
+ fatal_error("Cannot symlink modules folder");
+
+ if (symlink("/firmware", "/usr/lib/firmware"))
+ fatal_error("Cannot symlink firmware folder");
+
+ if (mount(STAGE2_LOCATION "/usr", "/usr", "none", MS_BIND|MS_RDONLY, NULL))
+ fatal_error("Unable to bind mount /usr filesystem from rescue or installer stage2");
+
+
+ if (access("/run/drakx/run-init", R_OK) == 0) {
+ /* This is typically used in rescue mode */
+ char * child_argv[2] = { "/sbin/init", NULL };
+
+ kill(klog_pid, 9);
+ printf("proceeding, please wait...\n");
execve(child_argv[0], child_argv, env);
- printf("error in exec of stage1 :-(\n");
- return 0;
+ fatal_error("failed to exec /sbin/init");
}
- while (!end_stage2) {
- childpid = wait4(-1, &wait_status, 0, NULL);
- if (childpid == installpid)
- end_stage2 = 1;
- }
+ /* This is installer mode */
+ do {
+ printf("proceeding, please wait...\n");
+
+ if (!(installpid = fork())) {
+ /* child */
+ char * child_argv[2] = { BINARY_STAGE2, NULL };
+ execve(child_argv[0], child_argv, env);
+ printf("error in exec of %s :-( [%d]\n", child_argv[0], errno);
+ return 0;
+ }
- if (!WIFEXITED(wait_status) || (WEXITSTATUS(wait_status) != 0 && WEXITSTATUS(wait_status) != exit_value_rescue)) {
- printf("install exited abnormally :-( ");
+ do {
+ childpid = wait4(-1, &wait_status, 0, NULL);
+ } while (childpid != installpid);
+ } while (WIFEXITED(wait_status) && WEXITSTATUS(wait_status) == exit_value_restart);
+
+ /* allow Ctrl Alt Del to reboot */
+ reboot(LINUX_REBOOT_CMD_CAD_ON);
+
+ if (in_reboot()) {
+ // any exitcode is valid if we're in_reboot
+ } else if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) {
+ printf("exited abnormally :-( ");
if (WIFSIGNALED(wait_status))
printf("-- received signal %d", WTERMSIG(wait_status));
printf("\n");
- abnormal_termination = 1;
- } else if (WIFEXITED(wait_status) && WEXITSTATUS(wait_status) == exit_value_rescue) {
- kill(klog_pid, 9);
- printf("exiting init -- giving hand to rescue\n");
- return 0;
- } else
- printf("install succeeded\n");
+ abnormal_termination = 1;
+ }
+
+ if (!abnormal_termination) {
+ int i;
+ for (i=0; i<50; i++)
+ printf("\n"); /* cleanup startkde messages */
+ }
if (testing)
return 0;
sync(); sync();
+ sleep(2);
printf("sending termination signals...");
kill(-1, 15);
@@ -451,14 +603,22 @@ int main(int argc, char **argv)
unmount_filesystems();
+ sync(); sync();
+
if (!abnormal_termination) {
- printf("rebooting system\n");
- sleep(2);
- reboot(0xfee1dead, 672274793, 0x01234567);
+ if (reboot_magic == LINUX_REBOOT_CMD_RESTART) {
+#ifdef DEBUG
+ printf("automatic reboot in 10 seconds\n");
+ sleep(10);
+#endif
+ reboot(reboot_magic);
+ } else {
+ printf("you may safely poweroff your computer now\n");
+ }
} else {
- printf("you may safely reboot your system\n");
- while (1);
+ printf("you may safely reboot or halt your system\n");
}
+ select(0, NULL, NULL, NULL, NULL);
return 0;
}
diff --git a/mdk-stage1/insmod-busybox/.cvsignore b/mdk-stage1/insmod-busybox/.cvsignore
deleted file mode 100644
index c4f870044..000000000
--- a/mdk-stage1/insmod-busybox/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-insmod
diff --git a/mdk-stage1/insmod-busybox/Config.h b/mdk-stage1/insmod-busybox/Config.h
deleted file mode 100644
index 8388416b7..000000000
--- a/mdk-stage1/insmod-busybox/Config.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* vi: set sw=4 ts=4: */
-// This file defines the feature set to be compiled into busybox.
-// When you turn things off here, they won't be compiled in at all.
-//
-//// This file is parsed by sed. You MUST use single line comments.
-// i.e. //#define BB_BLAH
-//
-//
-// BusyBox Applications
-#define BB_INSMOD
-// End of Applications List
-//
-//
-//
-// ---------------------------------------------------------
-// This is where feature definitions go. Generally speaking,
-// turning this stuff off makes things a bit smaller (and less
-// pretty/useful).
-//
-//
-//
-// Turn this on to use Erik's very cool devps, and devmtab kernel drivers,
-// thereby eliminating the need for the /proc filesystem and thereby saving
-// lots and lots memory for more important things. You can not use this and
-// USE_PROCFS at the same time... NOTE: If you enable this feature, you
-// _must_ have patched the kernel to include the devps patch that is included
-// in the busybox/kernel-patches directory. You will also need to create some
-// device special files in /dev on your embedded system:
-// mknod /dev/mtab c 10 22
-// mknod /dev/ps c 10 21
-// I emailed Linus and this patch will not be going into the stock kernel.
-//#define BB_FEATURE_USE_DEVPS_PATCH
-//
-// enable features that use the /proc filesystem (apps that
-// break without this will tell you on compile)...
-// You can't use this and BB_FEATURE_USE_DEVPS_PATCH
-// at the same time...
-#define BB_FEATURE_USE_PROCFS
-
-//
-// Enable tab completion in the shell (not yet
-// working very well -- so don't turn this on)
-//#define BB_FEATURE_SH_TAB_COMPLETION
-//
-//Turn on extra fbset options
-//#define BB_FEATURE_FBSET_FANCY
-//
-//Turn on fbset readmode support
-//#define BB_FEATURE_FBSET_READMODE
-//
-// You must enable one or both of these features
-// Support installing modules from pre 2.1 kernels
-//#define BB_FEATURE_INSMOD_OLD_KERNEL
-// Support installing modules from kernel versions after 2.1.18
-#define BB_FEATURE_INSMOD_NEW_KERNEL
-//
-// Support module version checking
-//#define BB_FEATURE_INSMOD_VERSION_CHECKING
-//
-// Support for Minix filesystem, version 2
-//#define BB_FEATURE_MINIX2
-//
-//
-// Enable busybox --install [-s]
-// to create links (or symlinks) for all the commands that are
-// compiled into the binary. (needs /proc filesystem)
-// #define BB_FEATURE_INSTALLER
-//
-// Clean up all memory before exiting -- usually not needed
-// as the OS can clean up... Don't enable this unless you
-// have a really good reason for cleaning things up manually.
-//#define BB_FEATURE_CLEAN_UP
-//
-// End of Features List
-//
-//
-//
-//
-//
-//
-//---------------------------------------------------
-// Nothing beyond this point should ever be touched by
-// mere mortals so leave this stuff alone.
-//
-#ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT
-#define BB_MTAB
-#endif
-//
-#if defined BB_FEATURE_SH_COMMAND_EDITING && defined BB_SH
-#define BB_CMDEDIT
-#endif
-//
-#ifdef BB_KILLALL
-#ifndef BB_KILL
-#define BB_KILL
-#endif
-#endif
-//
-#ifdef BB_FEATURE_LINUXRC
-#ifndef BB_INIT
-#define BB_INIT
-#endif
-#define BB_LINUXRC
-#endif
-//
-#ifdef BB_GZIP
-#ifndef BB_GUNZIP
-#define BB_GUNZIP
-#endif
-#endif
-//
-#if defined BB_MOUNT && defined BB_FEATURE_NFSMOUNT
-#define BB_NFSMOUNT
-#endif
-//
-#if defined BB_FEATURE_SH_COMMAND_EDITING
-#ifndef BB_FEATURE_USE_TERMIOS
-#define BB_FEATURE_USE_TERMIOS
-#endif
-#endif
-//
-#if defined BB_FEATURE_AUTOWIDTH
-#ifndef BB_FEATURE_USE_TERMIOS
-#define BB_FEATURE_USE_TERMIOS
-#endif
-#endif
-//
-#if defined BB_INSMOD
-#ifndef BB_FEATURE_INSMOD_OLD_KERNEL
-#define BB_FEATURE_INSMOD_NEW_KERNEL
-#endif
-#endif
diff --git a/mdk-stage1/insmod-busybox/Makefile b/mdk-stage1/insmod-busybox/Makefile
deleted file mode 100644
index ca05279e9..000000000
--- a/mdk-stage1/insmod-busybox/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
- #******************************************************************************
- #
- # insmod from busybox (i386 only)
- #
- # $Id$
- #
- # Copyright (C) 1999,2000 by Lineo, inc.
- #
- #*****************************************************************************
-
-top_dir = ..
-
-include $(top_dir)/Makefile.common
-
-
-all: insmod libinsmod.a libinsmod-DIET.a
-
-clean:
- rm -f *.o insmod libinsmod.a libinsmod-DIET.a
-
-
-FLAGS = -c -Wall -Os -fomit-frame-pointer -D_GNU_SOURCE -DBB_VER='"0.47"' -DBB_BT='"2000.12.06-14:02+0000"'
-
-
-insmod: insmod-frontend.o insmod.o utility-standalone.o
- gcc -o $@ $^
- $(STRIPCMD) $@
-
-libinsmod.a: insmod.o utility.o
- ar cru $@ $^
- ranlib $@
-
-libinsmod-DIET.a: insmod-DIET.o utility-DIET.o
- ar cru $@ $^
- ranlib $@
-
-insmod-frontend.o: insmod-frontend.c busybox.h
- gcc $(FLAGS) $(GLIBC_INCLUDES) insmod-frontend.c
-
-utility.o: utility.c busybox.h
- gcc $(FLAGS) $(GLIBC_INCLUDES) utility.c
-
-utility-DIET.o: utility.c busybox.h
- gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ utility.c
-
-utility-standalone.o: utility.c busybox.h
- gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ utility.c
-
-insmod.o: insmod.c busybox.h
- gcc $(FLAGS) $(GLIBC_INCLUDES) insmod.c
-
-insmod-DIET.o: insmod.c busybox.h
- gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ insmod.c
-
diff --git a/mdk-stage1/insmod-busybox/README b/mdk-stage1/insmod-busybox/README
deleted file mode 100644
index 06695074a..000000000
--- a/mdk-stage1/insmod-busybox/README
+++ /dev/null
@@ -1,8 +0,0 @@
-This insmod code comes from busybox-0.47
-
-ftp://ftp.lineo.com/pub/busybox
-
-It is cool but works only for ix86 architecture.
-
-
-gc
diff --git a/mdk-stage1/insmod-busybox/busybox.h b/mdk-stage1/insmod-busybox/busybox.h
deleted file mode 100644
index 6e7bae39b..000000000
--- a/mdk-stage1/insmod-busybox/busybox.h
+++ /dev/null
@@ -1,467 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Busybox main internal header file
- *
- *
- * 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
- *
- * Based in part on code from sash, Copyright (c) 1999 by David I. Bell
- * Permission has been granted to redistribute this code under the GPL.
- *
- */
-#ifndef _BB_INTERNAL_H_
-#define _BB_INTERNAL_H_ 1
-
-#include "Config.h"
-
-#ifdef DMALLOC
-#include "dmalloc.h"
-#endif
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-/* for the _syscall() macros */
-#include <sys/syscall.h>
-#include <linux/unistd.h>
-
-
-/* Some useful definitions */
-#define FALSE ((int) 1)
-#define TRUE ((int) 0)
-
-/* for mtab.c */
-#define MTAB_GETMOUNTPT '1'
-#define MTAB_GETDEVICE '2'
-
-#define BUF_SIZE 8192
-#define EXPAND_ALLOC 1024
-
-
-#define isBlank(ch) (((ch) == ' ') || ((ch) == '\t'))
-#define isDecimal(ch) (((ch) >= '0') && ((ch) <= '9'))
-#define isOctal(ch) (((ch) >= '0') && ((ch) <= '7'))
-#define isWildCard(ch) (((ch) == '*') || ((ch) == '?') || ((ch) == '['))
-
-/* Macros for min/max. */
-#ifndef MIN
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#endif
-
-#ifndef MAX
-#define MAX(a,b) (((a)>(b))?(a):(b))
-#endif
-
-
-/* I don't like nested includes, but the string and io functions are used
- * too often
- */
-#include <stdio.h>
-#if !defined(NO_STRING_H) || defined(STDC_HEADERS)
-# include <string.h>
-# if !defined(STDC_HEADERS) && !defined(NO_MEMORY_H) && !defined(__GNUC__)
-# include <memory.h>
-# endif
-# define memzero(s, n) memset ((void *)(s), 0, (n))
-#else
-# include <strings.h>
-# define strchr index
-# define strrchr rindex
-# define memcpy(d, s, n) bcopy((s), (d), (n))
-# define memcmp(s1, s2, n) bcmp((s1), (s2), (n))
-# define memzero(s, n) bzero((s), (n))
-#endif
-
-
-enum Location {
- _BB_DIR_ROOT = 0,
- _BB_DIR_BIN,
- _BB_DIR_SBIN,
- _BB_DIR_USR_BIN,
- _BB_DIR_USR_SBIN
-};
-
-struct BB_applet {
- const char* name;
- int (*main)(int argc, char** argv);
- enum Location location;
- const char* usage;
-};
-/* From busybox.c */
-extern const struct BB_applet applets[];
-
-extern int ar_main(int argc, char **argv);
-extern int basename_main(int argc, char **argv);
-extern int bogomips_main(int argc, char **argv);
-extern int busybox_main(int argc, char** argv);
-extern int cat_main(int argc, char** argv);
-extern int chmod_chown_chgrp_main(int argc, char** argv);
-extern int chroot_main(int argc, char** argv);
-extern int chvt_main(int argc, char** argv);
-extern int clear_main(int argc, char** argv);
-extern int cp_mv_main(int argc, char** argv);
-extern int cut_main(int argc, char** argv);
-extern int date_main(int argc, char** argv);
-extern int dc_main(int argc, char** argv);
-extern int dd_main(int argc, char** argv);
-extern int dirname_main(int argc, char** argv);
-extern int deallocvt_main(int argc, char** argv);
-extern int df_main(int argc, char** argv);
-extern int dmesg_main(int argc, char** argv);
-extern int dos2unix_main(int argc, char** argv);
-extern int du_main(int argc, char** argv);
-extern int dumpkmap_main(int argc, char** argv);
-extern int dutmp_main(int argc, char** argv);
-extern int echo_main(int argc, char** argv);
-extern int expr_main(int argc, char** argv);
-extern int false_main(int argc, char** argv);
-extern int fbset_main(int argc, char** argv);
-extern int fdisk_main(int argc, char** argv);
-extern int fdflush_main(int argc, char **argv);
-extern int fsck_minix_main(int argc, char **argv);
-extern int find_main(int argc, char** argv);
-extern int free_main(int argc, char** argv);
-extern int freeramdisk_main(int argc, char** argv);
-extern int getopt_main(int argc, char** argv);
-extern int grep_main(int argc, char** argv);
-extern int gunzip_main (int argc, char** argv);
-extern int gzip_main(int argc, char** argv);
-extern int halt_main(int argc, char** argv);
-extern int head_main(int argc, char** argv);
-extern int hostid_main(int argc, char** argv);
-extern int hostname_main(int argc, char** argv);
-extern int id_main(int argc, char** argv);
-extern int init_main(int argc, char** argv);
-extern int insmod_main(int argc, char** argv);
-extern int kill_main(int argc, char** argv);
-extern int length_main(int argc, char** argv);
-extern int ln_main(int argc, char** argv);
-extern int loadacm_main(int argc, char** argv);
-extern int loadfont_main(int argc, char** argv);
-extern int loadkmap_main(int argc, char** argv);
-extern int losetup_main(int argc, char** argv);
-extern int logger_main(int argc, char **argv);
-extern int logname_main(int argc, char **argv);
-extern int ls_main(int argc, char** argv);
-extern int lsmod_main(int argc, char** argv);
-extern int makedevs_main(int argc, char** argv);
-extern int md5sum_main(int argc, char** argv);
-extern int mkdir_main(int argc, char** argv);
-extern int mkfifo_main(int argc, char **argv);
-extern int mkfs_minix_main(int argc, char **argv);
-extern int mknod_main(int argc, char** argv);
-extern int mkswap_main(int argc, char** argv);
-extern int mktemp_main(int argc, char **argv);
-extern int nc_main(int argc, char** argv);
-extern int more_main(int argc, char** argv);
-extern int mount_main(int argc, char** argv);
-extern int mt_main(int argc, char** argv);
-extern int nslookup_main(int argc, char **argv);
-extern int ping_main(int argc, char **argv);
-extern int poweroff_main(int argc, char **argv);
-extern int printf_main(int argc, char** argv);
-extern int ps_main(int argc, char** argv);
-extern int pwd_main(int argc, char** argv);
-extern int rdate_main(int argc, char** argv);
-extern int reboot_main(int argc, char** argv);
-extern int renice_main(int argc, char** argv);
-extern int reset_main(int argc, char** argv);
-extern int rm_main(int argc, char** argv);
-extern int rmdir_main(int argc, char **argv);
-extern int rmmod_main(int argc, char** argv);
-extern int sed_main(int argc, char** argv);
-extern int sfdisk_main(int argc, char** argv);
-extern int setkeycodes_main(int argc, char** argv);
-extern int shell_main(int argc, char** argv);
-extern int sleep_main(int argc, char** argv);
-extern int sort_main(int argc, char** argv);
-extern int swap_on_off_main(int argc, char** argv);
-extern int sync_main(int argc, char** argv);
-extern int syslogd_main(int argc, char **argv);
-extern int tail_main(int argc, char** argv);
-extern int tar_main(int argc, char** argv);
-extern int tee_main(int argc, char** argv);
-extern int test_main(int argc, char** argv);
-extern int telnet_main(int argc, char** argv);
-extern int touch_main(int argc, char** argv);
-extern int tr_main(int argc, char** argv);
-extern int true_main(int argc, char** argv);
-extern int tput_main(int argc, char** argv);
-extern int tryopen_main(int argc, char** argv);
-extern int tty_main(int argc, char** argv);
-extern int umount_main(int argc, char** argv);
-extern int uname_main(int argc, char** argv);
-extern int uniq_main(int argc, char** argv);
-extern int unix2dos_main(int argc, char** argv);
-extern int unrpm_main(int argc, char** argv);
-extern int update_main(int argc, char** argv);
-extern int uptime_main(int argc, char** argv);
-extern int usleep_main(int argc, char** argv);
-extern int uuencode_main(int argc, char** argv);
-extern int uudecode_main(int argc, char** argv);
-extern int wc_main(int argc, char** argv);
-extern int wget_main(int argc, char** argv);
-extern int which_main(int argc, char** argv);
-extern int whoami_main(int argc, char** argv);
-extern int xargs_main(int argc, char** argv);
-extern int yes_main(int argc, char** argv);
-
-extern const char ar_usage[];
-extern const char basename_usage[];
-extern const char cat_usage[];
-extern const char chgrp_usage[];
-extern const char chmod_usage[];
-extern const char chown_usage[];
-extern const char chroot_usage[];
-extern const char chvt_usage[];
-extern const char clear_usage[];
-extern const char cp_usage[];
-extern const char cut_usage[];
-extern const char date_usage[];
-extern const char dc_usage[];
-extern const char dd_usage[];
-extern const char deallocvt_usage[];
-extern const char df_usage[];
-extern const char dirname_usage[];
-extern const char dmesg_usage[];
-extern const char dos2unix_usage[];
-extern const char du_usage[];
-extern const char dumpkmap_usage[];
-extern const char dutmp_usage[];
-extern const char echo_usage[];
-extern const char expr_usage[];
-extern const char false_usage[];
-extern const char fdflush_usage[];
-extern const char find_usage[];
-extern const char free_usage[];
-extern const char freeramdisk_usage[];
-extern const char fsck_minix_usage[];
-extern const char grep_usage[];
-extern const char gunzip_usage[];
-extern const char gzip_usage[];
-extern const char halt_usage[];
-extern const char head_usage[];
-extern const char hostid_usage[];
-extern const char hostname_usage[];
-extern const char id_usage[];
-extern const char insmod_usage[];
-extern const char kill_usage[];
-extern const char killall_usage[];
-extern const char length_usage[];
-extern const char ln_usage[];
-extern const char loadacm_usage[];
-extern const char loadfont_usage[];
-extern const char loadkmap_usage[];
-extern const char logger_usage[];
-extern const char logname_usage[];
-extern const char ls_usage[];
-extern const char lsmod_usage[];
-extern const char makedevs_usage[];
-extern const char md5sum_usage[];
-extern const char mkdir_usage[];
-extern const char mkfifo_usage[];
-extern const char mkfs_minix_usage[];
-extern const char mknod_usage[];
-extern const char mkswap_usage[];
-extern const char mktemp_usage[];
-extern const char more_usage[];
-extern const char mount_usage[];
-extern const char mt_usage[];
-extern const char mv_usage[];
-extern const char nc_usage[];
-extern const char nslookup_usage[];
-extern const char ping_usage[];
-extern const char poweroff_usage[];
-extern const char printf_usage[];
-extern const char ps_usage[];
-extern const char pwd_usage[];
-extern const char rdate_usage[];
-extern const char reboot_usage[];
-extern const char renice_usage[];
-extern const char reset_usage[];
-extern const char rm_usage[];
-extern const char rmdir_usage[];
-extern const char rmmod_usage[];
-extern const char sed_usage[];
-extern const char setkeycodes_usage[];
-extern const char shell_usage[];
-extern const char sleep_usage[];
-extern const char sort_usage[];
-extern const char swapoff_usage[];
-extern const char swapon_usage[];
-extern const char sync_usage[];
-extern const char syslogd_usage[];
-extern const char tail_usage[];
-extern const char tar_usage[];
-extern const char tee_usage[];
-extern const char telnet_usage[];
-extern const char test_usage[];
-extern const char touch_usage[];
-extern const char tr_usage[];
-extern const char true_usage[];
-extern const char tty_usage[];
-extern const char umount_usage[];
-extern const char uname_usage[];
-extern const char uniq_usage[];
-extern const char unix2dos_usage[];
-extern const char unrpm_usage[];
-extern const char update_usage[];
-extern const char uptime_usage[];
-extern const char usleep_usage[];
-extern const char uudecode_usage[];
-extern const char uuencode_usage[];
-extern const char wc_usage[];
-extern const char wget_usage[];
-extern const char which_usage[];
-extern const char whoami_usage[];
-extern const char xargs_usage[];
-extern const char yes_usage[];
-
-extern const char *applet_name;
-
-extern void usage(const char *usage) __attribute__ ((noreturn));
-extern void errorMsg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
-extern void logperror(char *s);
-extern void fatalError(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
-
-const char *modeString(int mode);
-const char *timeString(time_t timeVal);
-int isDirectory(const char *name, const int followLinks, struct stat *statBuf);
-int isDevice(const char *name);
-
-typedef struct ino_dev_hash_bucket_struct {
- struct ino_dev_hash_bucket_struct *next;
- ino_t ino;
- dev_t dev;
- char name[1];
-} ino_dev_hashtable_bucket_t;
-int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name);
-void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name);
-void reset_ino_dev_hashtable(void);
-
-int copyFile(const char *srcName, const char *destName,
- int setModes, int followLinks, int forceFlag);
-int copySubFile(int srcFd, int dstFd, size_t remaining);
-char *buildName(const char *dirName, const char *fileName);
-int makeString(int argc, const char **argv, char *buf, int bufLen);
-char *getChunk(int size);
-char *chunkstrdup(const char *str);
-void freeChunks(void);
-int fullWrite(int fd, const char *buf, int len);
-int fullRead(int fd, char *buf, int len);
-int recursiveAction(const char *fileName, int recurse, int followLinks, int depthFirst,
- int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData),
- int (*dirAction) (const char *fileName, struct stat* statbuf, void* userData),
- void* userData);
-
-extern int createPath (const char *name, int mode);
-extern int parse_mode( const char* s, mode_t* theMode);
-
-extern int get_kernel_revision(void);
-
-extern int get_console_fd(char* tty_name);
-extern struct mntent *findMountPoint(const char *name, const char *table);
-extern void write_mtab(char* blockDevice, char* directory,
- char* filesystemType, long flags, char* string_flags);
-extern void erase_mtab(const char * name);
-extern void mtab_read(void);
-extern char *mtab_first(void **iter);
-extern char *mtab_next(void **iter);
-extern char *mtab_getinfo(const char *match, const char which);
-extern int check_wildcard_match(const char* text, const char* pattern);
-extern long getNum (const char *cp);
-extern pid_t* findPidByName( char* pidName);
-extern int find_real_root_device_name(char* name);
-extern char *get_line_from_file(FILE *file);
-extern void print_file(FILE *file);
-extern int print_file_by_name(char *filename);
-extern char process_escape_sequence(char **ptr);
-extern char *get_last_path_component(char *path);
-// extern void xregcomp(regex_t *preg, const char *regex, int cflags);
-
-#ifndef DMALLOC
-extern void *xmalloc (size_t size);
-extern void *xrealloc(void *old, size_t size);
-extern void *xcalloc(size_t nmemb, size_t size);
-extern char *xstrdup (const char *s);
-#endif
-extern char *xstrndup (const char *s, int n);
-
-
-/* These parse entries in /etc/passwd and /etc/group. This is desirable
- * for BusyBox since we want to avoid using the glibc NSS stuff, which
- * increases target size and is often not needed embedded systems. */
-extern long my_getpwnam(char *name);
-extern long my_getgrnam(char *name);
-extern void my_getpwuid(char *name, long uid);
-extern void my_getgrgid(char *group, long gid);
-extern long my_getpwnamegid(char *name);
-
-extern int device_open(char *device, int mode);
-
-#if defined BB_FEATURE_MOUNT_LOOP
-extern int del_loop(const char *device);
-extern int set_loop(const char *device, const char *file, int offset, int *loopro);
-extern char *find_unused_loop_device (void);
-#endif
-
-
-#if (__GLIBC__ < 2) && (defined BB_SYSLOGD || defined BB_INIT)
-extern int vdprintf(int d, const char *format, va_list ap);
-#endif
-
-#if defined BB_NFSMOUNT
-int nfsmount(const char *spec, const char *node, int *flags,
- char **extra_opts, char **mount_opts, int running_bg);
-#endif
-
-#ifndef RB_POWER_OFF
-/* Stop system and switch power off if possible. */
-#define RB_POWER_OFF 0x4321fedc
-#endif
-
-/* Include our own copy of struct sysinfo to avoid binary compatability
- * problems with Linux 2.4, which changed things. Grumble, grumble. */
-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 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.. */
-};
-extern int sysinfo (struct sysinfo* info);
-
-/* Bit map related macros -- libc5 doens't provide these... sigh. */
-#ifndef setbit
-#define NBBY CHAR_BIT
-#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY))
-#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
-#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY)))
-#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
-#endif
-
-#endif /* _BB_INTERNAL_H_ */
diff --git a/mdk-stage1/insmod-busybox/insmod.c b/mdk-stage1/insmod-busybox/insmod.c
deleted file mode 100644
index d1027004c..000000000
--- a/mdk-stage1/insmod-busybox/insmod.c
+++ /dev/null
@@ -1,2951 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Mini insmod implementation for busybox
- *
- * Copyright (C) 1999,2000 by Lineo, inc.
- * Written by Erik Andersen <andersen@lineo.com>
- * and Ron Alder <alder@lineo.com>
- *
- * Modified by Bryan Rittmeyer <bryan@ixiacom.com> to support SH4
- * and (theoretically) SH3. Note that there is still no true
- * multiple architecture support. You just get SH3|SH4|i386, despite
- * the mention of ARM and m68k--which may or may not work (but
- * almost certainly do not, due to at least MATCH_MACHINE). I have
- * only tested SH4 in little endian mode.
- *
- * Based almost entirely on the Linux modutils-2.3.11 implementation.
- * Copyright 1996, 1997 Linux International.
- * New implementation contributed by Richard Henderson <rth@tamu.edu>
- * Based on original work by Bjorn Ekwall <bj0rn@blox.se>
- * Restructured (and partly rewritten) by:
- * Björn Ekwall <bj0rn@blox.se> February 1999
- *
- * 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 "../insmod.h"
-#include "busybox.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <stddef.h>
-#include <errno.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <ctype.h>
-#include <assert.h>
-#include <sys/utsname.h>
-
-//----------------------------------------------------------------------------
-//--------modutils module.h, lines 45-242
-//----------------------------------------------------------------------------
-
-/* Definitions for the Linux module syscall interface.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-
-#ifndef MODUTILS_MODULE_H
-#define MODUTILS_MODULE_H 1
-
-#ident "$Id$"
-
-/* This file contains the structures used by the 2.0 and 2.1 kernels.
- We do not use the kernel headers directly because we do not wish
- to be dependant on a particular kernel version to compile insmod. */
-
-
-/*======================================================================*/
-/* The structures used by Linux 2.0. */
-
-/* The symbol format used by get_kernel_syms(2). */
-struct old_kernel_sym
-{
- unsigned long value;
- char name[60];
-};
-
-struct old_module_ref
-{
- unsigned long module; /* kernel addresses */
- unsigned long next;
-};
-
-struct old_module_symbol
-{
- unsigned long addr;
- unsigned long name;
-};
-
-struct old_symbol_table
-{
- int size; /* total, including string table!!! */
- int n_symbols;
- int n_refs;
- struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */
- struct old_module_ref ref[0]; /* actual size defined by n_refs */
-};
-
-struct old_mod_routines
-{
- unsigned long init;
- unsigned long cleanup;
-};
-
-struct old_module
-{
- unsigned long next;
- unsigned long ref; /* the list of modules that refer to me */
- unsigned long symtab;
- unsigned long name;
- int size; /* size of module in pages */
- unsigned long addr; /* address of module */
- int state;
- unsigned long cleanup; /* cleanup routine */
-};
-
-/* Sent to init_module(2) or'ed into the code size parameter. */
-#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */
-
-int get_kernel_syms(struct old_kernel_sym *);
-int old_sys_init_module(const char *name, char *code, unsigned codesize,
- struct old_mod_routines *, struct old_symbol_table *);
-
-/*======================================================================*/
-/* For sizeof() which are related to the module platform and not to the
- environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */
-
-#define tgt_sizeof_char sizeof(char)
-#define tgt_sizeof_short sizeof(short)
-#define tgt_sizeof_int sizeof(int)
-#define tgt_sizeof_long sizeof(long)
-#define tgt_sizeof_char_p sizeof(char *)
-#define tgt_sizeof_void_p sizeof(void *)
-#define tgt_long long
-
-#if defined(__sparc__) && !defined(__sparc_v9__) && defined(ARCH_sparc64)
-#undef tgt_sizeof_long
-#undef tgt_sizeof_char_p
-#undef tgt_sizeof_void_p
-#undef tgt_long
-#define tgt_sizeof_long 8
-#define tgt_sizeof_char_p 8
-#define tgt_sizeof_void_p 8
-#define tgt_long long long
-#endif
-
-/*======================================================================*/
-/* The structures used in Linux 2.1. */
-
-/* Note: new_module_symbol does not use tgt_long intentionally */
-struct new_module_symbol
-{
- unsigned long value;
- unsigned long name;
-};
-
-struct new_module_persist;
-
-struct new_module_ref
-{
- unsigned tgt_long dep; /* kernel addresses */
- unsigned tgt_long ref;
- unsigned tgt_long next_ref;
-};
-
-struct new_module
-{
- unsigned tgt_long size_of_struct; /* == sizeof(module) */
- unsigned tgt_long next;
- unsigned tgt_long name;
- unsigned tgt_long size;
-
- tgt_long usecount;
- unsigned tgt_long flags; /* AUTOCLEAN et al */
-
- unsigned nsyms;
- unsigned ndeps;
-
- unsigned tgt_long syms;
- unsigned tgt_long deps;
- unsigned tgt_long refs;
- unsigned tgt_long init;
- unsigned tgt_long cleanup;
- unsigned tgt_long ex_table_start;
- unsigned tgt_long ex_table_end;
-#ifdef __alpha__
- unsigned tgt_long gp;
-#endif
- /* Everything after here is extension. */
- unsigned tgt_long persist_start;
- unsigned tgt_long persist_end;
- unsigned tgt_long can_unload;
- unsigned tgt_long runsize;
-};
-
-struct new_module_info
-{
- unsigned long addr;
- unsigned long size;
- unsigned long flags;
- long usecount;
-};
-
-/* Bits of module.flags. */
-#define NEW_MOD_RUNNING 1
-#define NEW_MOD_DELETED 2
-#define NEW_MOD_AUTOCLEAN 4
-#define NEW_MOD_VISITED 8
-#define NEW_MOD_USED_ONCE 16
-
-int new_sys_init_module(const char *name, const struct new_module *);
-int query_module(const char *name, int which, void *buf, size_t bufsize,
- size_t *ret);
-
-/* Values for query_module's which. */
-
-#define QM_MODULES 1
-#define QM_DEPS 2
-#define QM_REFS 3
-#define QM_SYMBOLS 4
-#define QM_INFO 5
-
-/*======================================================================*/
-/* The system calls unchanged between 2.0 and 2.1. */
-
-unsigned long create_module(const char *, size_t);
-int delete_module(const char *);
-
-
-#endif /* module.h */
-
-//----------------------------------------------------------------------------
-//--------end of modutils module.h
-//----------------------------------------------------------------------------
-
-
-
-//----------------------------------------------------------------------------
-//--------modutils obj.h, lines 253-462
-//----------------------------------------------------------------------------
-
-/* Elf object file loading and relocation routines.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-
-#ifndef MODUTILS_OBJ_H
-#define MODUTILS_OBJ_H 1
-
-#ident "$Id$"
-
-/* The relocatable object is manipulated using elfin types. */
-
-#include <stdio.h>
-#include <elf.h>
-
-
-/* Machine-specific elf macros for i386 et al. */
-
-/* the SH changes have only been tested on the SH4 in =little endian= mode */
-/* I'm not sure about big endian, so let's warn: */
-
-#if (defined(__SH4__) || defined(__SH3__)) && defined(__BIG_ENDIAN__)
-#error insmod.c may require changes for use on big endian SH4/SH3
-#endif
-
-/* it may or may not work on the SH1/SH2... So let's error on those
- also */
-#if (defined(__sh__) && (!(defined(__SH3__) || defined(__SH4__))))
-#error insmod.c may require changes for non-SH3/SH4 use
-#endif
-
-#define ELFCLASSM ELFCLASS32
-#define ELFDATAM ELFDATA2LSB
-
-
-
-#if defined(__sh__)
-
-#define MATCH_MACHINE(x) (x == EM_SH)
-#define SHT_RELM SHT_RELA
-#define Elf32_RelM Elf32_Rela
-
-#else
-
-/* presumably we can use these for anything but the SH */
-/* this is the previous behavior, but it does result in
- insmod.c being broken on anything except i386 */
-
-#define MATCH_MACHINE(x) (x == EM_386)
-#define SHT_RELM SHT_REL
-#define Elf32_RelM Elf32_Rel
-
-#endif
-
-#ifndef ElfW
-# if ELFCLASSM == ELFCLASS32
-# define ElfW(x) Elf32_ ## x
-# define ELFW(x) ELF32_ ## x
-# else
-# define ElfW(x) Elf64_ ## x
-# define ELFW(x) ELF64_ ## x
-# endif
-#endif
-
-/* For some reason this is missing from libc5. */
-#ifndef ELF32_ST_INFO
-# define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
-#endif
-
-#ifndef ELF64_ST_INFO
-# define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
-#endif
-
-struct obj_string_patch;
-struct obj_symbol_patch;
-
-struct obj_section
-{
- ElfW(Shdr) header;
- const char *name;
- char *contents;
- struct obj_section *load_next;
- int idx;
-};
-
-struct obj_symbol
-{
- struct obj_symbol *next; /* hash table link */
- const char *name;
- unsigned long value;
- unsigned long size;
- int secidx; /* the defining section index/module */
- int info;
- int ksymidx; /* for export to the kernel symtab */
- int referenced; /* actually used in the link */
-};
-
-/* Hardcode the hash table size. We shouldn't be needing so many
- symbols that we begin to degrade performance, and we get a big win
- by giving the compiler a constant divisor. */
-
-#define HASH_BUCKETS 521
-
-struct obj_file
-{
- ElfW(Ehdr) header;
- ElfW(Addr) baseaddr;
- struct obj_section **sections;
- struct obj_section *load_order;
- struct obj_section **load_order_search_start;
- struct obj_string_patch *string_patches;
- struct obj_symbol_patch *symbol_patches;
- int (*symbol_cmp)(const char *, const char *);
- unsigned long (*symbol_hash)(const char *);
- unsigned long local_symtab_size;
- struct obj_symbol **local_symtab;
- struct obj_symbol *symtab[HASH_BUCKETS];
-};
-
-enum obj_reloc
-{
- obj_reloc_ok,
- obj_reloc_overflow,
- obj_reloc_dangerous,
- obj_reloc_unhandled
-};
-
-struct obj_string_patch
-{
- struct obj_string_patch *next;
- int reloc_secidx;
- ElfW(Addr) reloc_offset;
- ElfW(Addr) string_offset;
-};
-
-struct obj_symbol_patch
-{
- struct obj_symbol_patch *next;
- int reloc_secidx;
- ElfW(Addr) reloc_offset;
- struct obj_symbol *sym;
-};
-
-
-/* Generic object manipulation routines. */
-
-unsigned long obj_elf_hash(const char *);
-
-unsigned long obj_elf_hash_n(const char *, unsigned long len);
-
-struct obj_symbol *obj_add_symbol (struct obj_file *f, const char *name,
- unsigned long symidx, int info, int secidx,
- ElfW(Addr) value, unsigned long size);
-
-struct obj_symbol *obj_find_symbol (struct obj_file *f,
- const char *name);
-
-ElfW(Addr) obj_symbol_final_value(struct obj_file *f,
- struct obj_symbol *sym);
-
-void obj_set_symbol_compare(struct obj_file *f,
- int (*cmp)(const char *, const char *),
- unsigned long (*hash)(const char *));
-
-struct obj_section *obj_find_section (struct obj_file *f,
- const char *name);
-
-void obj_insert_section_load_order (struct obj_file *f,
- struct obj_section *sec);
-
-struct obj_section *obj_create_alloced_section (struct obj_file *f,
- const char *name,
- unsigned long align,
- unsigned long size);
-
-struct obj_section *obj_create_alloced_section_first (struct obj_file *f,
- const char *name,
- unsigned long align,
- unsigned long size);
-
-void *obj_extend_section (struct obj_section *sec, unsigned long more);
-
-int obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
- const char *string);
-
-int obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
- struct obj_symbol *sym);
-
-int obj_check_undefineds(struct obj_file *f);
-
-void obj_allocate_commons(struct obj_file *f);
-
-unsigned long obj_load_size (struct obj_file *f);
-
-int obj_relocate (struct obj_file *f, ElfW(Addr) base);
-
-struct obj_file *obj_load(FILE *f);
-
-int obj_create_image (struct obj_file *f, char *image);
-
-/* Architecture specific manipulation routines. */
-
-struct obj_file *arch_new_file (void);
-
-struct obj_section *arch_new_section (void);
-
-struct obj_symbol *arch_new_symbol (void);
-
-enum obj_reloc arch_apply_relocation (struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- ElfW(RelM) *rel, ElfW(Addr) value);
-
-int arch_create_got (struct obj_file *f);
-
-struct new_module;
-int arch_init_module (struct obj_file *f, struct new_module *);
-
-#endif /* obj.h */
-//----------------------------------------------------------------------------
-//--------end of modutils obj.h
-//----------------------------------------------------------------------------
-
-
-
-
-
-#define _PATH_MODULES "/lib/modules"
-#define STRVERSIONLEN 32
-
-#if !defined(BB_FEATURE_INSMOD_NEW_KERNEL) && !defined(BB_FEATURE_INSMOD_OLD_KERNEL)
-#error "Must have ether BB_FEATURE_INSMOD_NEW_KERNEL or BB_FEATURE_INSMOD_OLD_KERNEL defined"
-#endif
-
-/*======================================================================*/
-
-int flag_force_load = 0;
-int flag_autoclean = 0;
-int flag_export = 1;
-
-
-/*======================================================================*/
-
-/* previously, these were named i386_* but since we could be
- compiling for the sh, I've renamed them to the more general
- arch_* These structures are the same between the x86 and SH,
- and we can't support anything else right now anyway. In the
- future maybe they should be #if defined'd */
-
-struct arch_got_entry {
- int offset;
- unsigned offset_done:1;
- unsigned reloc_done:1;
-};
-
-struct arch_file {
- struct obj_file root;
- struct obj_section *got;
-};
-
-struct arch_symbol {
- struct obj_symbol root;
- struct arch_got_entry gotent;
-};
-
-
-struct external_module {
- const char *name;
- ElfW(Addr) addr;
- int used;
- size_t nsyms;
- struct new_module_symbol *syms;
-};
-
-struct new_module_symbol *ksyms;
-size_t nksyms;
-
-struct external_module *ext_modules;
-int n_ext_modules;
-int n_ext_modules_used;
-
-
-
-/* Some firendly syscalls to cheer everyone's day... */
-#define __NR_new_sys_init_module __NR_init_module
-_syscall2(int, new_sys_init_module, const char *, name,
- const struct new_module *, info)
-#define __NR_old_sys_init_module __NR_init_module
-_syscall5(int, old_sys_init_module, const char *, name, char *, code,
- unsigned, codesize, struct old_mod_routines *, routines,
- struct old_symbol_table *, symtab)
-#ifndef BB_RMMOD
-_syscall1(int, delete_module, const char *, name)
-#else
-extern int delete_module(const char *);
-#endif
-
-/* This is kind of troublesome. See, we don't actually support
- the m68k or the arm the same way we support i386 and (now)
- sh. In doing my SH patch, I just assumed that whatever works
- for i386 also works for m68k and arm since currently insmod.c
- does nothing special for them. If this isn't true, the below
- line is rather misleading IMHO, and someone should either
- change it or add more proper architecture-dependent support
- for these boys.
-
- -- Bryan Rittmeyer <bryan@ixiacom.com> */
-
-#if defined(__i386__) || defined(__m68k__) || defined(__arm__)
-/* Jump through hoops to fixup error return codes */
-#define __NR__create_module __NR_create_module
-static inline _syscall2(long, _create_module, const char *, name, size_t,
- size)
-unsigned long create_module(const char *name, size_t size)
-{
- long ret = _create_module(name, size);
-
- if (ret == -1 && errno > 125) {
- ret = -errno;
- errno = 0;
- }
- return ret;
-}
-#else
-_syscall2(unsigned long, create_module, const char *, name, size_t, size)
-#endif
-static char m_filename[BUFSIZ + 1] = "\0";
-static char m_fullName[BUFSIZ + 1] = "\0";
-
-/*======================================================================*/
-
-
-/*======================================================================*/
-
-struct obj_file *arch_new_file(void)
-{
- struct arch_file *f;
- f = xmalloc(sizeof(*f));
- f->got = NULL;
- return &f->root;
-}
-
-struct obj_section *arch_new_section(void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *arch_new_symbol(void)
-{
- struct arch_symbol *sym;
- sym = xmalloc(sizeof(*sym));
- memset(&sym->gotent, 0, sizeof(sym->gotent));
- return &sym->root;
-}
-
-enum obj_reloc
-arch_apply_relocation(struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
-#if defined(__sh__)
- Elf32_Rela * rel, Elf32_Addr v)
-#else
- Elf32_Rel * rel, Elf32_Addr v)
-#endif
-{
- struct arch_file *ifile = (struct arch_file *) f;
- struct arch_symbol *isym = (struct arch_symbol *) sym;
-
- Elf32_Addr *loc = (Elf32_Addr *) (targsec->contents + rel->r_offset);
- Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
- Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF32_R_TYPE(rel->r_info)) {
-
-/* even though these constants seem to be the same for
- the i386 and the sh, we "#if define" them for clarity
- and in case that ever changes */
-#if defined(__sh__)
- case R_SH_NONE:
-#else
- case R_386_NONE:
-#endif
- break;
-
-#if defined(__sh__)
- case R_SH_DIR32:
-#else
- case R_386_32:
-#endif
- *loc += v;
- break;
-
-#if defined(__sh__)
- case R_SH_REL32:
-#else
- case R_386_PLT32:
- case R_386_PC32:
-#endif
- *loc += v - dot;
- break;
-
-#if defined(__sh__)
- case R_SH_PLT32:
- *loc = v - dot;
- break;
-#endif
-
-
-#if defined(__sh__)
- case R_SH_GLOB_DAT:
- case R_SH_JMP_SLOT:
- *loc = v;
- break;
-#else
- case R_386_GLOB_DAT:
- case R_386_JMP_SLOT:
- *loc = v;
- break;
-#endif
-
-#if defined(__sh__)
- case R_SH_RELATIVE:
- *loc += f->baseaddr + rel->r_addend;
- break;
-#else
- case R_386_RELATIVE:
- *loc += f->baseaddr;
- break;
-#endif
-
-#if defined(__sh__)
- case R_SH_GOTPC:
- assert(got != 0);
- *loc += got - dot + rel->r_addend;;
- break;
-#else
- case R_386_GOTPC:
- assert(got != 0);
- *loc += got - dot;
- break;
-#endif
-
-#if defined(__sh__)
- case R_SH_GOT32:
- assert(isym != NULL);
- if (!isym->gotent.reloc_done) {
- isym->gotent.reloc_done = 1;
- *(Elf32_Addr *) (ifile->got->contents + isym->gotent.offset) =
- v;
- }
- *loc += isym->gotent.offset + rel->r_addend;
- break;
-#else
- case R_386_GOT32:
- assert(isym != NULL);
- if (!isym->gotent.reloc_done) {
- isym->gotent.reloc_done = 1;
- *(Elf32_Addr *) (ifile->got->contents + isym->gotent.offset) =
- v;
- }
- *loc += isym->gotent.offset;
- break;
-#endif
-
-#if defined(__sh__)
- case R_SH_GOTOFF:
-#else
- case R_386_GOTOFF:
-#endif
- assert(got != 0);
- *loc += v - got;
- break;
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int arch_create_got(struct obj_file *f)
-{
- struct arch_file *ifile = (struct arch_file *) f;
- int i, n, offset = 0, gotneeded = 0;
-
- n = ifile->root.header.e_shnum;
- for (i = 0; i < n; ++i) {
- struct obj_section *relsec, *symsec, *strsec;
-#if defined(__sh__)
- Elf32_Rela *rel, *relend;
-#else
- Elf32_Rel *rel, *relend;
-#endif
- Elf32_Sym *symtab;
- const char *strtab;
-
- relsec = ifile->root.sections[i];
- if (relsec->header.sh_type != SHT_REL)
- continue;
-
- symsec = ifile->root.sections[relsec->header.sh_link];
- strsec = ifile->root.sections[symsec->header.sh_link];
-
-
-#if defined(__sh__)
- rel = (Elf32_Rela *) relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rela));
-#else
- rel = (Elf32_Rel *) relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel));
-#endif
- symtab = (Elf32_Sym *) symsec->contents;
- strtab = (const char *) strsec->contents;
-
- for (; rel < relend; ++rel) {
- Elf32_Sym *extsym;
- struct arch_symbol *intsym;
- const char *name;
-
- switch (ELF32_R_TYPE(rel->r_info)) {
-#if defined(__sh__)
- case R_SH_GOTPC:
- case R_SH_GOTOFF:
-#else
- case R_386_GOTPC:
- case R_386_GOTOFF:
-#endif
- gotneeded = 1;
- default:
- continue;
-
-#if defined(__sh__)
- case R_SH_GOT32:
-#else
- case R_386_GOT32:
-#endif
- break;
- }
-
- extsym = &symtab[ELF32_R_SYM(rel->r_info)];
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym =
- (struct arch_symbol *) obj_find_symbol(&ifile->root, name);
-
- if (!intsym->gotent.offset_done) {
- intsym->gotent.offset_done = 1;
- intsym->gotent.offset = offset;
- offset += 4;
- }
- }
- }
-
- if (offset > 0 || gotneeded)
- ifile->got =
- obj_create_alloced_section(&ifile->root, ".got", 4, offset);
-
- return 1;
-}
-
-int arch_init_module(struct obj_file *f, struct new_module *mod)
-{
- return 1;
-}
-
-
-/*======================================================================*/
-
-/* Standard ELF hash function. */
-inline unsigned long obj_elf_hash_n(const char *name, unsigned long n)
-{
- unsigned long h = 0;
- unsigned long g;
- unsigned char ch;
-
- while (n > 0) {
- ch = *name++;
- h = (h << 4) + ch;
- if ((g = (h & 0xf0000000)) != 0) {
- h ^= g >> 24;
- h &= ~g;
- }
- n--;
- }
- return h;
-}
-
-unsigned long obj_elf_hash(const char *name)
-{
- return obj_elf_hash_n(name, strlen(name));
-}
-
-#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
-/* Get the kernel version in the canonical integer form. */
-
-static int get_kernel_version(char str[STRVERSIONLEN])
-{
- struct utsname uts_info;
- char *p, *q;
- int a, b, c;
-
- if (uname(&uts_info) < 0)
- return -1;
- strncpy(str, uts_info.release, STRVERSIONLEN);
- p = uts_info.release;
-
- a = strtoul(p, &p, 10);
- if (*p != '.')
- return -1;
- b = strtoul(p + 1, &p, 10);
- if (*p != '.')
- return -1;
- c = strtoul(p + 1, &q, 10);
- if (p + 1 == q)
- return -1;
-
- return a << 16 | b << 8 | c;
-}
-
-/* String comparison for non-co-versioned kernel and module. */
-
-static int ncv_strcmp(const char *a, const char *b)
-{
- size_t alen = strlen(a), blen = strlen(b);
-
- if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R')
- return strncmp(a, b, alen);
- else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R')
- return strncmp(a, b, blen);
- else
- return strcmp(a, b);
-}
-
-/* String hashing for non-co-versioned kernel and module. Here
- we are simply forced to drop the crc from the hash. */
-
-static unsigned long ncv_symbol_hash(const char *str)
-{
- size_t len = strlen(str);
- if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R')
- len -= 10;
- return obj_elf_hash_n(str, len);
-}
-
-void
-obj_set_symbol_compare(struct obj_file *f,
- int (*cmp) (const char *, const char *),
- unsigned long (*hash) (const char *))
-{
- if (cmp)
- f->symbol_cmp = cmp;
- if (hash) {
- struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
- int i;
-
- f->symbol_hash = hash;
-
- memcpy(tmptab, f->symtab, sizeof(tmptab));
- memset(f->symtab, 0, sizeof(f->symtab));
-
- for (i = 0; i < HASH_BUCKETS; ++i)
- for (sym = tmptab[i]; sym; sym = next) {
- unsigned long h = hash(sym->name) % HASH_BUCKETS;
- next = sym->next;
- sym->next = f->symtab[h];
- f->symtab[h] = sym;
- }
- }
-}
-
-#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
-
-
-struct obj_symbol *obj_add_symbol(struct obj_file *f, const char *name,
- unsigned long symidx, int info,
- int secidx, ElfW(Addr) value,
- unsigned long size)
-{
- struct obj_symbol *sym;
- unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
- int n_type = ELFW(ST_TYPE) (info);
- int n_binding = ELFW(ST_BIND) (info);
-
- for (sym = f->symtab[hash]; sym; sym = sym->next)
- if (f->symbol_cmp(sym->name, name) == 0) {
- int o_secidx = sym->secidx;
- int o_info = sym->info;
- int o_type = ELFW(ST_TYPE) (o_info);
- int o_binding = ELFW(ST_BIND) (o_info);
-
- /* A redefinition! Is it legal? */
-
- if (secidx == SHN_UNDEF)
- return sym;
- else if (o_secidx == SHN_UNDEF)
- goto found;
- else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) {
- /* Cope with local and global symbols of the same name
- in the same object file, as might have been created
- by ld -r. The only reason locals are now seen at this
- level at all is so that we can do semi-sensible things
- with parameters. */
-
- struct obj_symbol *nsym, **p;
-
- nsym = arch_new_symbol();
- nsym->next = sym->next;
- nsym->ksymidx = -1;
-
- /* Excise the old (local) symbol from the hash chain. */
- for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
- continue;
- *p = sym = nsym;
- goto found;
- } else if (n_binding == STB_LOCAL) {
- /* Another symbol of the same name has already been defined.
- Just add this to the local table. */
- sym = arch_new_symbol();
- sym->next = NULL;
- sym->ksymidx = -1;
- f->local_symtab[symidx] = sym;
- goto found;
- } else if (n_binding == STB_WEAK)
- return sym;
- else if (o_binding == STB_WEAK)
- goto found;
- /* Don't unify COMMON symbols with object types the programmer
- doesn't expect. */
- else if (secidx == SHN_COMMON
- && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
- return sym;
- else if (o_secidx == SHN_COMMON
- && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
- goto found;
- else {
- /* Don't report an error if the symbol is coming from
- the kernel or some external module. */
- if (secidx <= SHN_HIRESERVE)
- errorMsg("%s multiply defined", name);
- return sym;
- }
- }
-
- /* Completely new symbol. */
- sym = arch_new_symbol();
- sym->next = f->symtab[hash];
- f->symtab[hash] = sym;
- sym->ksymidx = -1;
-
- if (ELFW(ST_BIND) (info) == STB_LOCAL)
- f->local_symtab[symidx] = sym;
-
- found:
- sym->name = name;
- sym->value = value;
- sym->size = size;
- sym->secidx = secidx;
- sym->info = info;
-
- return sym;
-}
-
-struct obj_symbol *obj_find_symbol(struct obj_file *f, const char *name)
-{
- struct obj_symbol *sym;
- unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
-
- for (sym = f->symtab[hash]; sym; sym = sym->next)
- if (f->symbol_cmp(sym->name, name) == 0)
- return sym;
-
- return NULL;
-}
-
-ElfW(Addr)
- obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
-{
- if (sym) {
- if (sym->secidx >= SHN_LORESERVE)
- return sym->value;
-
- return sym->value + f->sections[sym->secidx]->header.sh_addr;
- } else {
- /* As a special case, a NULL sym has value zero. */
- return 0;
- }
-}
-
-struct obj_section *obj_find_section(struct obj_file *f, const char *name)
-{
- int i, n = f->header.e_shnum;
-
- for (i = 0; i < n; ++i)
- if (strcmp(f->sections[i]->name, name) == 0)
- return f->sections[i];
-
- return NULL;
-}
-
-static int obj_load_order_prio(struct obj_section *a)
-{
- unsigned long af, ac;
-
- af = a->header.sh_flags;
-
- ac = 0;
- if (a->name[0] != '.' || strlen(a->name) != 10 ||
- strcmp(a->name + 5, ".init"))
- ac |= 32;
- if (af & SHF_ALLOC)
- ac |= 16;
- if (!(af & SHF_WRITE))
- ac |= 8;
- if (af & SHF_EXECINSTR)
- ac |= 4;
- if (a->header.sh_type != SHT_NOBITS)
- ac |= 2;
-
- return ac;
-}
-
-void
-obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
-{
- struct obj_section **p;
- int prio = obj_load_order_prio(sec);
- for (p = f->load_order_search_start; *p; p = &(*p)->load_next)
- if (obj_load_order_prio(*p) < prio)
- break;
- sec->load_next = *p;
- *p = sec;
-}
-
-struct obj_section *obj_create_alloced_section(struct obj_file *f,
- const char *name,
- unsigned long align,
- unsigned long size)
-{
- int newidx = f->header.e_shnum++;
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
- f->sections[newidx] = sec = arch_new_section();
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
- sec->header.sh_size = size;
- sec->header.sh_addralign = align;
- sec->name = name;
- sec->idx = newidx;
- if (size)
- sec->contents = xmalloc(size);
-
- obj_insert_section_load_order(f, sec);
-
- return sec;
-}
-
-struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
- const char *name,
- unsigned long align,
- unsigned long size)
-{
- int newidx = f->header.e_shnum++;
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
- f->sections[newidx] = sec = arch_new_section();
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
- sec->header.sh_size = size;
- sec->header.sh_addralign = align;
- sec->name = name;
- sec->idx = newidx;
- if (size)
- sec->contents = xmalloc(size);
-
- sec->load_next = f->load_order;
- f->load_order = sec;
- if (f->load_order_search_start == &f->load_order)
- f->load_order_search_start = &sec->load_next;
-
- return sec;
-}
-
-void *obj_extend_section(struct obj_section *sec, unsigned long more)
-{
- unsigned long oldsize = sec->header.sh_size;
- sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
- return sec->contents + oldsize;
-}
-
-
-
-/* Conditionally add the symbols from the given symbol set to the
- new module. */
-
-static int
-add_symbols_from(
- struct obj_file *f,
- int idx, struct new_module_symbol *syms, size_t nsyms)
-{
- struct new_module_symbol *s;
- size_t i;
- int used = 0;
-
- for (i = 0, s = syms; i < nsyms; ++i, ++s) {
-
- /* Only add symbols that are already marked external. If we
- override locals we may cause problems for argument initialization.
- We will also create a false dependency on the module. */
- struct obj_symbol *sym;
-
- sym = obj_find_symbol(f, (char *) s->name);
- if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) {
- sym = obj_add_symbol(f, (char *) s->name, -1,
- ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE),
- idx, s->value, 0);
- /* Did our symbol just get installed? If so, mark the
- module as "used". */
- if (sym->secidx == idx)
- used = 1;
- }
- }
-
- return used;
-}
-
-static void add_kernel_symbols(struct obj_file *f)
-{
- struct external_module *m;
- int i, nused = 0;
-
- /* Add module symbols first. */
-
- for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m)
- if (m->nsyms
- && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms,
- m->nsyms)) m->used = 1, ++nused;
-
- n_ext_modules_used = nused;
-
- /* And finally the symbols from the kernel proper. */
-
- if (nksyms)
- add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
-}
-
-static char *get_modinfo_value(struct obj_file *f, const char *key)
-{
- struct obj_section *sec;
- char *p, *v, *n, *ep;
- size_t klen = strlen(key);
-
- sec = obj_find_section(f, ".modinfo");
- if (sec == NULL)
- return NULL;
- p = sec->contents;
- ep = p + sec->header.sh_size;
- while (p < ep) {
- v = strchr(p, '=');
- n = strchr(p, '\0');
- if (v) {
- if (p + klen == v && strncmp(p, key, klen) == 0)
- return v + 1;
- } else {
- if (p + klen == n && strcmp(p, key) == 0)
- return n;
- }
- p = n + 1;
- }
-
- return NULL;
-}
-
-
-/*======================================================================*/
-/* Functions relating to module loading in pre 2.1 kernels. */
-
-static int
-old_process_module_arguments(struct obj_file *f, int argc, char **argv)
-{
- while (argc > 0) {
- char *p, *q;
- struct obj_symbol *sym;
- int *loc;
-
- p = *argv;
- if ((q = strchr(p, '=')) == NULL) {
- argc--;
- continue;
- }
- *q++ = '\0';
-
- sym = obj_find_symbol(f, p);
-
- /* Also check that the parameter was not resolved from the kernel. */
- if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
- errorMsg("symbol for parameter %s not found", p);
- return 0;
- }
-
- loc = (int *) (f->sections[sym->secidx]->contents + sym->value);
-
- /* Do C quoting if we begin with a ". */
- if (*q == '"') {
- char *r, *str;
-
- str = alloca(strlen(q));
- for (r = str, q++; *q != '"'; ++q, ++r) {
- if (*q == '\0') {
- errorMsg("improperly terminated string argument for %s", p);
- return 0;
- } else if (*q == '\\')
- switch (*++q) {
- case 'a':
- *r = '\a';
- break;
- case 'b':
- *r = '\b';
- break;
- case 'e':
- *r = '\033';
- break;
- case 'f':
- *r = '\f';
- break;
- case 'n':
- *r = '\n';
- break;
- case 'r':
- *r = '\r';
- break;
- case 't':
- *r = '\t';
- break;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- {
- int c = *q - '0';
- if (q[1] >= '0' && q[1] <= '7') {
- c = (c * 8) + *++q - '0';
- if (q[1] >= '0' && q[1] <= '7')
- c = (c * 8) + *++q - '0';
- }
- *r = c;
- }
- break;
-
- default:
- *r = *q;
- break;
- } else
- *r = *q;
- }
- *r = '\0';
- obj_string_patch(f, sym->secidx, sym->value, str);
- } else if (*q >= '0' && *q <= '9') {
- do
- *loc++ = strtoul(q, &q, 0);
- while (*q++ == ',');
- } else {
- char *contents = f->sections[sym->secidx]->contents;
- char *loc = contents + sym->value;
- char *r; /* To search for commas */
-
- /* Break the string with comas */
- while ((r = strchr(q, ',')) != (char *) NULL) {
- *r++ = '\0';
- obj_string_patch(f, sym->secidx, loc - contents, q);
- loc += sizeof(char *);
- q = r;
- }
-
- /* last part */
- obj_string_patch(f, sym->secidx, loc - contents, q);
- }
-
- argc--, argv++;
- }
-
- return 1;
-}
-
-#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
-static int old_is_module_checksummed(struct obj_file *f)
-{
- return obj_find_symbol(f, "Using_Versions") != NULL;
-}
-/* Get the module's kernel version in the canonical integer form. */
-
-static int
-old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
-{
- struct obj_symbol *sym;
- char *p, *q;
- int a, b, c;
-
- sym = obj_find_symbol(f, "kernel_version");
- if (sym == NULL)
- return -1;
-
- p = f->sections[sym->secidx]->contents + sym->value;
- strncpy(str, p, STRVERSIONLEN);
-
- a = strtoul(p, &p, 10);
- if (*p != '.')
- return -1;
- b = strtoul(p + 1, &p, 10);
- if (*p != '.')
- return -1;
- c = strtoul(p + 1, &q, 10);
- if (p + 1 == q)
- return -1;
-
- return a << 16 | b << 8 | c;
-}
-
-#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
-
-#ifdef BB_FEATURE_INSMOD_OLD_KERNEL
-
-/* Fetch all the symbols and divvy them up as appropriate for the modules. */
-
-static int old_get_kernel_symbols(const char *m_name)
-{
- struct old_kernel_sym *ks, *k;
- struct new_module_symbol *s;
- struct external_module *mod;
- int nks, nms, nmod, i;
-
- nks = get_kernel_syms(NULL);
- if (nks < 0) {
- errorMsg("get_kernel_syms: %s: %s", m_name, strerror(errno));
- return 0;
- }
-
- ks = k = xmalloc(nks * sizeof(*ks));
-
- if (get_kernel_syms(ks) != nks) {
- logperror("inconsistency with get_kernel_syms -- is someone else "
- "playing with modules?");
- free(ks);
- return 0;
- }
-
- /* Collect the module information. */
-
- mod = NULL;
- nmod = -1;
-
- while (k->name[0] == '#' && k->name[1]) {
- struct old_kernel_sym *k2;
- struct new_module_symbol *s;
-
- /* Find out how many symbols this module has. */
- for (k2 = k + 1; k2->name[0] != '#'; ++k2)
- continue;
- nms = k2 - k - 1;
-
- mod = xrealloc(mod, (++nmod + 1) * sizeof(*mod));
- mod[nmod].name = k->name + 1;
- mod[nmod].addr = k->value;
- mod[nmod].used = 0;
- mod[nmod].nsyms = nms;
- mod[nmod].syms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL);
-
- for (i = 0, ++k; i < nms; ++i, ++s, ++k) {
- s->name = (unsigned long) k->name;
- s->value = k->value;
- }
-
- k = k2;
- }
-
- ext_modules = mod;
- n_ext_modules = nmod + 1;
-
- /* Now collect the symbols for the kernel proper. */
-
- if (k->name[0] == '#')
- ++k;
-
- nksyms = nms = nks - (k - ks);
- ksyms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL);
-
- for (i = 0; i < nms; ++i, ++s, ++k) {
- s->name = (unsigned long) k->name;
- s->value = k->value;
- }
-
- return 1;
-}
-
-/* Return the kernel symbol checksum version, or zero if not used. */
-
-static int old_is_kernel_checksummed(void)
-{
- /* Using_Versions is the first symbol. */
- if (nksyms > 0
- && strcmp((char *) ksyms[0].name,
- "Using_Versions") == 0) return ksyms[0].value;
- else
- return 0;
-}
-
-
-static int old_create_mod_use_count(struct obj_file *f)
-{
- struct obj_section *sec;
-
- sec = obj_create_alloced_section_first(f, ".moduse", sizeof(long),
- sizeof(long));
-
- obj_add_symbol(f, "mod_use_count_", -1,
- ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0,
- sizeof(long));
-
- return 1;
-}
-
-static int
-old_init_module(const char *m_name, struct obj_file *f,
- unsigned long m_size)
-{
- char *image;
- struct old_mod_routines routines;
- struct old_symbol_table *symtab;
- int ret;
-
- /* Create the symbol table */
- {
- int nsyms = 0, strsize = 0, total;
-
- /* Size things first... */
- if (flag_export) {
- int i;
- for (i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (ELFW(ST_BIND) (sym->info) != STB_LOCAL
- && sym->secidx <= SHN_HIRESERVE)
- {
- sym->ksymidx = nsyms++;
- strsize += strlen(sym->name) + 1;
- }
- }
- }
-
- total = (sizeof(struct old_symbol_table)
- + nsyms * sizeof(struct old_module_symbol)
- + n_ext_modules_used * sizeof(struct old_module_ref)
- + strsize);
- symtab = xmalloc(total);
- symtab->size = total;
- symtab->n_symbols = nsyms;
- symtab->n_refs = n_ext_modules_used;
-
- if (flag_export && nsyms) {
- struct old_module_symbol *ksym;
- char *str;
- int i;
-
- ksym = symtab->symbol;
- str = ((char *) ksym + nsyms * sizeof(struct old_module_symbol)
- + n_ext_modules_used * sizeof(struct old_module_ref));
-
- for (i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (sym->ksymidx >= 0) {
- ksym->addr = obj_symbol_final_value(f, sym);
- ksym->name =
- (unsigned long) str - (unsigned long) symtab;
-
- str = stpcpy(str, sym->name) + 1;
- ksym++;
- }
- }
- }
-
- if (n_ext_modules_used) {
- struct old_module_ref *ref;
- int i;
-
- ref = (struct old_module_ref *)
- ((char *) symtab->symbol + nsyms * sizeof(struct old_module_symbol));
-
- for (i = 0; i < n_ext_modules; ++i)
- if (ext_modules[i].used)
- ref++->module = ext_modules[i].addr;
- }
- }
-
- /* Fill in routines. */
-
- routines.init =
- obj_symbol_final_value(f, obj_find_symbol(f, "init_module"));
- routines.cleanup =
- obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module"));
-
- /* Whew! All of the initialization is complete. Collect the final
- module image and give it to the kernel. */
-
- image = xmalloc(m_size);
- obj_create_image(f, image);
-
- /* image holds the complete relocated module, accounting correctly for
- mod_use_count. However the old module kernel support assume that
- it is receiving something which does not contain mod_use_count. */
- ret = old_sys_init_module(m_name, image + sizeof(long),
- m_size | (flag_autoclean ? OLD_MOD_AUTOCLEAN
- : 0), &routines, symtab);
- if (ret)
- errorMsg("init_module: %s: %s", m_name, strerror(errno));
-
- free(image);
- free(symtab);
-
- return ret == 0;
-}
-
-#else
-
-#define old_create_mod_use_count(x) TRUE
-#define old_init_module(x, y, z) TRUE
-
-#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */
-
-
-
-/*======================================================================*/
-/* Functions relating to module loading after 2.1.18. */
-
-static int
-new_process_module_arguments(struct obj_file *f, int argc, char **argv)
-{
- while (argc > 0) {
- char *p, *q, *key;
- struct obj_symbol *sym;
- char *contents, *loc;
- int min, max, n;
-
- p = *argv;
- if ((q = strchr(p, '=')) == NULL) {
- argc--;
- continue;
- }
-
- key = alloca(q - p + 6);
- memcpy(key, "parm_", 5);
- memcpy(key + 5, p, q - p);
- key[q - p + 5] = 0;
-
- p = get_modinfo_value(f, key);
- key += 5;
- if (p == NULL) {
- errorMsg("invalid parameter %s", key);
- return 0;
- }
-
- sym = obj_find_symbol(f, key);
-
- /* Also check that the parameter was not resolved from the kernel. */
- if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
- errorMsg("symbol for parameter %s not found", key);
- return 0;
- }
-
- if (isdigit(*p)) {
- min = strtoul(p, &p, 10);
- if (*p == '-')
- max = strtoul(p + 1, &p, 10);
- else
- max = min;
- } else
- min = max = 1;
-
- contents = f->sections[sym->secidx]->contents;
- loc = contents + sym->value;
- n = (*++q != '\0');
-
- while (1) {
- if ((*p == 's') || (*p == 'c')) {
- char *str;
-
- /* Do C quoting if we begin with a ", else slurp the lot. */
- if (*q == '"') {
- char *r;
-
- str = alloca(strlen(q));
- for (r = str, q++; *q != '"'; ++q, ++r) {
- if (*q == '\0') {
- errorMsg("improperly terminated string argument for %s",
- key);
- return 0;
- } else if (*q == '\\')
- switch (*++q) {
- case 'a':
- *r = '\a';
- break;
- case 'b':
- *r = '\b';
- break;
- case 'e':
- *r = '\033';
- break;
- case 'f':
- *r = '\f';
- break;
- case 'n':
- *r = '\n';
- break;
- case 'r':
- *r = '\r';
- break;
- case 't':
- *r = '\t';
- break;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- {
- int c = *q - '0';
- if (q[1] >= '0' && q[1] <= '7') {
- c = (c * 8) + *++q - '0';
- if (q[1] >= '0' && q[1] <= '7')
- c = (c * 8) + *++q - '0';
- }
- *r = c;
- }
- break;
-
- default:
- *r = *q;
- break;
- } else
- *r = *q;
- }
- *r = '\0';
- ++q;
- } else {
- char *r;
-
- /* In this case, the string is not quoted. We will break
- it using the coma (like for ints). If the user wants to
- include comas in a string, he just has to quote it */
-
- /* Search the next coma */
- r = strchr(q, ',');
-
- /* Found ? */
- if (r != (char *) NULL) {
- /* Recopy the current field */
- str = alloca(r - q + 1);
- memcpy(str, q, r - q);
-
- /* I don't know if it is usefull, as the previous case
- doesn't null terminate the string ??? */
- str[r - q] = '\0';
-
- /* Keep next fields */
- q = r;
- } else {
- /* last string */
- str = q;
- q = "";
- }
- }
-
- if (*p == 's') {
- /* Normal string */
- obj_string_patch(f, sym->secidx, loc - contents, str);
- loc += tgt_sizeof_char_p;
- } else {
- /* Array of chars (in fact, matrix !) */
- unsigned long charssize; /* size of each member */
-
- /* Get the size of each member */
- /* Probably we should do that outside the loop ? */
- if (!isdigit(*(p + 1))) {
- errorMsg("parameter type 'c' for %s must be followed by"
- " the maximum size", key);
- return 0;
- }
- charssize = strtoul(p + 1, (char **) NULL, 10);
-
- /* Check length */
- if (strlen(str) >= charssize) {
- errorMsg("string too long for %s (max %ld)", key,
- charssize - 1);
- return 0;
- }
-
- /* Copy to location */
- strcpy((char *) loc, str);
- loc += charssize;
- }
- } else {
- long v = strtoul(q, &q, 0);
- switch (*p) {
- case 'b':
- *loc++ = v;
- break;
- case 'h':
- *(short *) loc = v;
- loc += tgt_sizeof_short;
- break;
- case 'i':
- *(int *) loc = v;
- loc += tgt_sizeof_int;
- break;
- case 'l':
- *(long *) loc = v;
- loc += tgt_sizeof_long;
- break;
-
- default:
- errorMsg("unknown parameter type '%c' for %s", *p, key);
- return 0;
- }
- }
-
- retry_end_of_value:
- switch (*q) {
- case '\0':
- goto end_of_arg;
-
- case ' ':
- case '\t':
- case '\n':
- case '\r':
- ++q;
- goto retry_end_of_value;
-
- case ',':
- if (++n > max) {
- errorMsg("too many values for %s (max %d)", key, max);
- return 0;
- }
- ++q;
- break;
-
- default:
- errorMsg("invalid argument syntax for %s", key);
- return 0;
- }
- }
-
- end_of_arg:
- if (n < min) {
- errorMsg("too few values for %s (min %d)", key, min);
- return 0;
- }
-
- argc--, argv++;
- }
-
- return 1;
-}
-
-#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
-static int new_is_module_checksummed(struct obj_file *f)
-{
- const char *p = get_modinfo_value(f, "using_checksums");
- if (p)
- return atoi(p);
- else
- return 0;
-}
-
-/* Get the module's kernel version in the canonical integer form. */
-
-static int
-new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
-{
- char *p, *q;
- int a, b, c;
-
- p = get_modinfo_value(f, "kernel_version");
- if (p == NULL)
- return -1;
- strncpy(str, p, STRVERSIONLEN);
-
- a = strtoul(p, &p, 10);
- if (*p != '.')
- return -1;
- b = strtoul(p + 1, &p, 10);
- if (*p != '.')
- return -1;
- c = strtoul(p + 1, &q, 10);
- if (p + 1 == q)
- return -1;
-
- return a << 16 | b << 8 | c;
-}
-
-#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
-
-
-#ifdef BB_FEATURE_INSMOD_NEW_KERNEL
-
-/* Fetch the loaded modules, and all currently exported symbols. */
-
-static int new_get_kernel_symbols(void)
-{
- char *module_names, *mn;
- struct external_module *modules, *m;
- struct new_module_symbol *syms, *s;
- size_t ret, bufsize, nmod, nsyms, i, j;
-
- /* Collect the loaded modules. */
-
- module_names = xmalloc(bufsize = 256);
- retry_modules_load:
- if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
- if (errno == ENOSPC) {
- module_names = xrealloc(module_names, bufsize = ret);
- goto retry_modules_load;
- }
- errorMsg("QM_MODULES: %s", strerror(errno));
- return 0;
- }
-
- n_ext_modules = nmod = ret;
- ext_modules = modules = xmalloc(nmod * sizeof(*modules));
- memset(modules, 0, nmod * sizeof(*modules));
-
- /* Collect the modules' symbols. */
-
- for (i = 0, mn = module_names, m = modules;
- i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
- struct new_module_info info;
-
- if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
- if (errno == ENOENT) {
- /* The module was removed out from underneath us. */
- continue;
- }
- errorMsg("query_module: QM_INFO: %s: %s", mn, strerror(errno));
- return 0;
- }
-
- syms = xmalloc(bufsize = 1024);
- retry_mod_sym_load:
- if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
- switch (errno) {
- case ENOSPC:
- syms = xrealloc(syms, bufsize = ret);
- goto retry_mod_sym_load;
- case ENOENT:
- /* The module was removed out from underneath us. */
- continue;
- default:
- errorMsg("query_module: QM_SYMBOLS: %s: %s", mn, strerror(errno));
- return 0;
- }
- }
- nsyms = ret;
-
- m->name = mn;
- m->addr = info.addr;
- m->nsyms = nsyms;
- m->syms = syms;
-
- for (j = 0, s = syms; j < nsyms; ++j, ++s) {
- s->name += (unsigned long) syms;
- }
- }
-
- /* Collect the kernel's symbols. */
-
- syms = xmalloc(bufsize = 16 * 1024);
- retry_kern_sym_load:
- if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
- if (errno == ENOSPC) {
- syms = xrealloc(syms, bufsize = ret);
- goto retry_kern_sym_load;
- }
- errorMsg("kernel: QM_SYMBOLS: %s", strerror(errno));
- return 0;
- }
- nksyms = nsyms = ret;
- ksyms = syms;
-
- for (j = 0, s = syms; j < nsyms; ++j, ++s) {
- s->name += (unsigned long) syms;
- }
- return 1;
-}
-
-
-/* Return the kernel symbol checksum version, or zero if not used. */
-
-static int new_is_kernel_checksummed(void)
-{
- struct new_module_symbol *s;
- size_t i;
-
- /* Using_Versions is not the first symbol, but it should be in there. */
-
- for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
- if (strcmp((char *) s->name, "Using_Versions") == 0)
- return s->value;
-
- return 0;
-}
-
-
-static int new_create_this_module(struct obj_file *f, const char *m_name)
-{
- struct obj_section *sec;
-
- sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
- sizeof(struct new_module));
- memset(sec->contents, 0, sizeof(struct new_module));
-
- obj_add_symbol(f, "__this_module", -1,
- ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0,
- sizeof(struct new_module));
-
- obj_string_patch(f, sec->idx, offsetof(struct new_module, name),
- m_name);
-
- return 1;
-}
-
-
-static int new_create_module_ksymtab(struct obj_file *f)
-{
- struct obj_section *sec;
- int i;
-
- /* We must always add the module references. */
-
- if (n_ext_modules_used) {
- struct new_module_ref *dep;
- struct obj_symbol *tm;
-
- sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
- (sizeof(struct new_module_ref)
- * n_ext_modules_used));
- if (!sec)
- return 0;
-
- tm = obj_find_symbol(f, "__this_module");
- dep = (struct new_module_ref *) sec->contents;
- for (i = 0; i < n_ext_modules; ++i)
- if (ext_modules[i].used) {
- dep->dep = ext_modules[i].addr;
- obj_symbol_patch(f, sec->idx,
- (char *) &dep->ref - sec->contents, tm);
- dep->next_ref = 0;
- ++dep;
- }
- }
-
- if (flag_export && !obj_find_section(f, "__ksymtab")) {
- size_t nsyms;
- int *loaded;
-
- sec =
- obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p,
- 0);
-
- /* We don't want to export symbols residing in sections that
- aren't loaded. There are a number of these created so that
- we make sure certain module options don't appear twice. */
-
- loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
- while (--i >= 0)
- loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
-
- for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (ELFW(ST_BIND) (sym->info) != STB_LOCAL
- && sym->secidx <= SHN_HIRESERVE
- && (sym->secidx >= SHN_LORESERVE
- || loaded[sym->secidx])) {
- ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
-
- obj_symbol_patch(f, sec->idx, ofs, sym);
- obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p,
- sym->name);
-
- nsyms++;
- }
- }
-
- obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
- }
-
- return 1;
-}
-
-
-static int
-new_init_module(const char *m_name, struct obj_file *f,
- unsigned long m_size)
-{
- struct new_module *module;
- struct obj_section *sec;
- void *image;
- int ret;
- tgt_long m_addr;
-
- sec = obj_find_section(f, ".this");
- module = (struct new_module *) sec->contents;
- m_addr = sec->header.sh_addr;
-
- module->size_of_struct = sizeof(*module);
- module->size = m_size;
- module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
-
- sec = obj_find_section(f, "__ksymtab");
- if (sec && sec->header.sh_size) {
- module->syms = sec->header.sh_addr;
- module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
- }
-
- if (n_ext_modules_used) {
- sec = obj_find_section(f, ".kmodtab");
- module->deps = sec->header.sh_addr;
- module->ndeps = n_ext_modules_used;
- }
-
- module->init =
- obj_symbol_final_value(f, obj_find_symbol(f, "init_module"));
- module->cleanup =
- obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module"));
-
- sec = obj_find_section(f, "__ex_table");
- if (sec) {
- module->ex_table_start = sec->header.sh_addr;
- module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
- }
-
- sec = obj_find_section(f, ".text.init");
- if (sec) {
- module->runsize = sec->header.sh_addr - m_addr;
- }
- sec = obj_find_section(f, ".data.init");
- if (sec) {
- if (!module->runsize ||
- module->runsize > sec->header.sh_addr - m_addr)
- module->runsize = sec->header.sh_addr - m_addr;
- }
-
- if (!arch_init_module(f, module))
- return 0;
-
- /* Whew! All of the initialization is complete. Collect the final
- module image and give it to the kernel. */
-
- image = xmalloc(m_size);
- obj_create_image(f, image);
-
- ret = new_sys_init_module(m_name, (struct new_module *) image);
- if (ret)
- errorMsg("init_module: %s: %s", m_name, strerror(errno));
-
- free(image);
-
- return ret == 0;
-}
-
-#else
-
-#define new_init_module(x, y, z) TRUE
-#define new_create_this_module(x, y) 0
-#define new_create_module_ksymtab(x)
-
-#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */
-
-
-/*======================================================================*/
-
-int
-obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
- const char *string)
-{
- struct obj_string_patch *p;
- struct obj_section *strsec;
- size_t len = strlen(string) + 1;
- char *loc;
-
- p = xmalloc(sizeof(*p));
- p->next = f->string_patches;
- p->reloc_secidx = secidx;
- p->reloc_offset = offset;
- f->string_patches = p;
-
- strsec = obj_find_section(f, ".kstrtab");
- if (strsec == NULL) {
- strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
- p->string_offset = 0;
- loc = strsec->contents;
- } else {
- p->string_offset = strsec->header.sh_size;
- loc = obj_extend_section(strsec, len);
- }
- memcpy(loc, string, len);
-
- return 1;
-}
-
-int
-obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
- struct obj_symbol *sym)
-{
- struct obj_symbol_patch *p;
-
- p = xmalloc(sizeof(*p));
- p->next = f->symbol_patches;
- p->reloc_secidx = secidx;
- p->reloc_offset = offset;
- p->sym = sym;
- f->symbol_patches = p;
-
- return 1;
-}
-
-int obj_check_undefineds(struct obj_file *f)
-{
- unsigned long i;
- int ret = 1;
-
- for (i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (sym->secidx == SHN_UNDEF) {
- if (ELFW(ST_BIND) (sym->info) == STB_WEAK) {
- sym->secidx = SHN_ABS;
- sym->value = 0;
- } else {
- errorMsg("unresolved symbol %s", sym->name);
- ret = 0;
- }
- }
- }
-
- return ret;
-}
-
-void obj_allocate_commons(struct obj_file *f)
-{
- struct common_entry {
- struct common_entry *next;
- struct obj_symbol *sym;
- } *common_head = NULL;
-
- unsigned long i;
-
- for (i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (sym->secidx == SHN_COMMON) {
- /* Collect all COMMON symbols and sort them by size so as to
- minimize space wasted by alignment requirements. */
- {
- struct common_entry **p, *n;
- for (p = &common_head; *p; p = &(*p)->next)
- if (sym->size <= (*p)->sym->size)
- break;
-
- n = alloca(sizeof(*n));
- n->next = *p;
- n->sym = sym;
- *p = n;
- }
- }
- }
-
- for (i = 1; i < f->local_symtab_size; ++i) {
- struct obj_symbol *sym = f->local_symtab[i];
- if (sym && sym->secidx == SHN_COMMON) {
- struct common_entry **p, *n;
- for (p = &common_head; *p; p = &(*p)->next)
- if (sym == (*p)->sym)
- break;
- else if (sym->size < (*p)->sym->size) {
- n = alloca(sizeof(*n));
- n->next = *p;
- n->sym = sym;
- *p = n;
- break;
- }
- }
- }
-
- if (common_head) {
- /* Find the bss section. */
- for (i = 0; i < f->header.e_shnum; ++i)
- if (f->sections[i]->header.sh_type == SHT_NOBITS)
- break;
-
- /* If for some reason there hadn't been one, create one. */
- if (i == f->header.e_shnum) {
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec));
- f->sections[i] = sec = arch_new_section();
- f->header.e_shnum = i + 1;
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
- sec->name = ".bss";
- sec->idx = i;
- }
-
- /* Allocate the COMMONS. */
- {
- ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
- ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
- struct common_entry *c;
-
- for (c = common_head; c; c = c->next) {
- ElfW(Addr) align = c->sym->value;
-
- if (align > max_align)
- max_align = align;
- if (bss_size & (align - 1))
- bss_size = (bss_size | (align - 1)) + 1;
-
- c->sym->secidx = i;
- c->sym->value = bss_size;
-
- bss_size += c->sym->size;
- }
-
- f->sections[i]->header.sh_size = bss_size;
- f->sections[i]->header.sh_addralign = max_align;
- }
- }
-
- /* For the sake of patch relocation and parameter initialization,
- allocate zeroed data for NOBITS sections now. Note that after
- this we cannot assume NOBITS are really empty. */
- for (i = 0; i < f->header.e_shnum; ++i) {
- struct obj_section *s = f->sections[i];
- if (s->header.sh_type == SHT_NOBITS) {
- s->contents = memset(xmalloc(s->header.sh_size),
- 0, s->header.sh_size);
- s->header.sh_type = SHT_PROGBITS;
- }
- }
-}
-
-unsigned long obj_load_size(struct obj_file *f)
-{
- unsigned long dot = 0;
- struct obj_section *sec;
-
- /* Finalize the positions of the sections relative to one another. */
-
- for (sec = f->load_order; sec; sec = sec->load_next) {
- ElfW(Addr) align;
-
- align = sec->header.sh_addralign;
- if (align && (dot & (align - 1)))
- dot = (dot | (align - 1)) + 1;
-
- sec->header.sh_addr = dot;
- dot += sec->header.sh_size;
- }
-
- return dot;
-}
-
-int obj_relocate(struct obj_file *f, ElfW(Addr) base)
-{
- int i, n = f->header.e_shnum;
- int ret = 1;
-
- /* Finalize the addresses of the sections. */
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
-
- /* And iterate over all of the relocations. */
-
- for (i = 0; i < n; ++i) {
- struct obj_section *relsec, *symsec, *targsec, *strsec;
- ElfW(RelM) * rel, *relend;
- ElfW(Sym) * symtab;
- const char *strtab;
-
- relsec = f->sections[i];
- if (relsec->header.sh_type != SHT_RELM)
- continue;
-
- symsec = f->sections[relsec->header.sh_link];
- targsec = f->sections[relsec->header.sh_info];
- strsec = f->sections[symsec->header.sh_link];
-
- rel = (ElfW(RelM) *) relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
- symtab = (ElfW(Sym) *) symsec->contents;
- strtab = (const char *) strsec->contents;
-
- for (; rel < relend; ++rel) {
- ElfW(Addr) value = 0;
- struct obj_symbol *intsym = NULL;
- unsigned long symndx;
- ElfW(Sym) * extsym = 0;
- const char *errmsg;
-
- /* Attempt to find a value to use for this relocation. */
-
- symndx = ELFW(R_SYM) (rel->r_info);
- if (symndx) {
- /* Note we've already checked for undefined symbols. */
-
- extsym = &symtab[symndx];
- if (ELFW(ST_BIND) (extsym->st_info) == STB_LOCAL) {
- /* Local symbols we look up in the local table to be sure
- we get the one that is really intended. */
- intsym = f->local_symtab[symndx];
- } else {
- /* Others we look up in the hash table. */
- const char *name;
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = obj_find_symbol(f, name);
- }
-
- value = obj_symbol_final_value(f, intsym);
- intsym->referenced = 1;
- }
-#if SHT_RELM == SHT_RELA
-#if defined(__alpha__) && defined(AXP_BROKEN_GAS)
- /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
- if (!extsym || !extsym->st_name ||
- ELFW(ST_BIND) (extsym->st_info) != STB_LOCAL)
-#endif
- value += rel->r_addend;
-#endif
-
- /* Do it! */
- switch (arch_apply_relocation
- (f, targsec, symsec, intsym, rel, value)) {
- case obj_reloc_ok:
- break;
-
- case obj_reloc_overflow:
- errmsg = "Relocation overflow";
- goto bad_reloc;
- case obj_reloc_dangerous:
- errmsg = "Dangerous relocation";
- goto bad_reloc;
- case obj_reloc_unhandled:
- errmsg = "Unhandled relocation";
- bad_reloc:
- if (extsym) {
- errorMsg("%s of type %ld for %s", errmsg,
- (long) ELFW(R_TYPE) (rel->r_info),
- strtab + extsym->st_name);
- } else {
- errorMsg("%s of type %ld", errmsg,
- (long) ELFW(R_TYPE) (rel->r_info));
- }
- ret = 0;
- break;
- }
- }
- }
-
- /* Finally, take care of the patches. */
-
- if (f->string_patches) {
- struct obj_string_patch *p;
- struct obj_section *strsec;
- ElfW(Addr) strsec_base;
- strsec = obj_find_section(f, ".kstrtab");
- strsec_base = strsec->header.sh_addr;
-
- for (p = f->string_patches; p; p = p->next) {
- struct obj_section *targsec = f->sections[p->reloc_secidx];
- *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
- = strsec_base + p->string_offset;
- }
- }
-
- if (f->symbol_patches) {
- struct obj_symbol_patch *p;
-
- for (p = f->symbol_patches; p; p = p->next) {
- struct obj_section *targsec = f->sections[p->reloc_secidx];
- *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
- = obj_symbol_final_value(f, p->sym);
- }
- }
-
- return ret;
-}
-
-int obj_create_image(struct obj_file *f, char *image)
-{
- struct obj_section *sec;
- ElfW(Addr) base = f->baseaddr;
-
- for (sec = f->load_order; sec; sec = sec->load_next) {
- char *secimg;
-
- if (sec->header.sh_size == 0)
- continue;
-
- secimg = image + (sec->header.sh_addr - base);
-
- /* Note that we allocated data for NOBITS sections earlier. */
- memcpy(secimg, sec->contents, sec->header.sh_size);
- }
-
- return 1;
-}
-
-/*======================================================================*/
-
-struct obj_file *obj_load(FILE * fp)
-{
- struct obj_file *f;
- ElfW(Shdr) * section_headers;
- int shnum, i;
- char *shstrtab;
-
- /* Read the file header. */
-
- f = arch_new_file();
- memset(f, 0, sizeof(*f));
- f->symbol_cmp = strcmp;
- f->symbol_hash = obj_elf_hash;
- f->load_order_search_start = &f->load_order;
-
- fseek(fp, 0, SEEK_SET);
- if (fread(&f->header, sizeof(f->header), 1, fp) != 1) {
- errorMsg("error reading ELF header: %s", strerror(errno));
- return NULL;
- }
-
- if (f->header.e_ident[EI_MAG0] != ELFMAG0
- || f->header.e_ident[EI_MAG1] != ELFMAG1
- || f->header.e_ident[EI_MAG2] != ELFMAG2
- || f->header.e_ident[EI_MAG3] != ELFMAG3) {
- errorMsg("not an ELF file");
- return NULL;
- }
- if (f->header.e_ident[EI_CLASS] != ELFCLASSM
- || f->header.e_ident[EI_DATA] != ELFDATAM
- || f->header.e_ident[EI_VERSION] != EV_CURRENT
- || !MATCH_MACHINE(f->header.e_machine)) {
- errorMsg("ELF file not for this architecture");
- return NULL;
- }
- if (f->header.e_type != ET_REL) {
- errorMsg("ELF file not a relocatable object");
- return NULL;
- }
-
- /* Read the section headers. */
-
- if (f->header.e_shentsize != sizeof(ElfW(Shdr))) {
- errorMsg("section header size mismatch: %lu != %lu",
- (unsigned long) f->header.e_shentsize,
- (unsigned long) sizeof(ElfW(Shdr)));
- return NULL;
- }
-
- shnum = f->header.e_shnum;
- f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
- memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
-
- section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
- fseek(fp, f->header.e_shoff, SEEK_SET);
- if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) {
- errorMsg("error reading ELF section headers: %s", strerror(errno));
- return NULL;
- }
-
- /* Read the section data. */
-
- for (i = 0; i < shnum; ++i) {
- struct obj_section *sec;
-
- f->sections[i] = sec = arch_new_section();
- memset(sec, 0, sizeof(*sec));
-
- sec->header = section_headers[i];
- sec->idx = i;
-
- switch (sec->header.sh_type) {
- case SHT_NULL:
- case SHT_NOTE:
- case SHT_NOBITS:
- /* ignore */
- break;
-
- case SHT_PROGBITS:
- case SHT_SYMTAB:
- case SHT_STRTAB:
- case SHT_RELM:
- if (sec->header.sh_size > 0) {
- sec->contents = xmalloc(sec->header.sh_size);
- fseek(fp, sec->header.sh_offset, SEEK_SET);
- if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
- errorMsg("error reading ELF section data: %s", strerror(errno));
- return NULL;
- }
- } else {
- sec->contents = NULL;
- }
- break;
-
-#if SHT_RELM == SHT_REL
- case SHT_RELA:
- errorMsg("RELA relocations not supported on this architecture");
- return NULL;
-#else
- case SHT_REL:
- errorMsg("REL relocations not supported on this architecture");
- return NULL;
-#endif
-
- default:
- if (sec->header.sh_type >= SHT_LOPROC) {
- /* Assume processor specific section types are debug
- info and can safely be ignored. If this is ever not
- the case (Hello MIPS?), don't put ifdefs here but
- create an arch_load_proc_section(). */
- break;
- }
-
- errorMsg("can't handle sections of type %ld",
- (long) sec->header.sh_type);
- return NULL;
- }
- }
-
- /* Do what sort of interpretation as needed by each section. */
-
- shstrtab = f->sections[f->header.e_shstrndx]->contents;
-
- for (i = 0; i < shnum; ++i) {
- struct obj_section *sec = f->sections[i];
- sec->name = shstrtab + sec->header.sh_name;
- }
-
- for (i = 0; i < shnum; ++i) {
- struct obj_section *sec = f->sections[i];
-
- if (sec->header.sh_flags & SHF_ALLOC)
- obj_insert_section_load_order(f, sec);
-
- switch (sec->header.sh_type) {
- case SHT_SYMTAB:
- {
- unsigned long nsym, j;
- char *strtab;
- ElfW(Sym) * sym;
-
- if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
- errorMsg("symbol size mismatch: %lu != %lu",
- (unsigned long) sec->header.sh_entsize,
- (unsigned long) sizeof(ElfW(Sym)));
- return NULL;
- }
-
- nsym = sec->header.sh_size / sizeof(ElfW(Sym));
- strtab = f->sections[sec->header.sh_link]->contents;
- sym = (ElfW(Sym) *) sec->contents;
-
- /* Allocate space for a table of local symbols. */
- j = f->local_symtab_size = sec->header.sh_info;
- f->local_symtab = xmalloc(j *=
- sizeof(struct obj_symbol *));
- memset(f->local_symtab, 0, j);
-
- /* Insert all symbols into the hash table. */
- for (j = 1, ++sym; j < nsym; ++j, ++sym) {
- const char *name;
- if (sym->st_name)
- name = strtab + sym->st_name;
- else
- name = f->sections[sym->st_shndx]->name;
-
- obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
- sym->st_value, sym->st_size);
- }
- }
- break;
-
- case SHT_RELM:
- if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
- errorMsg("relocation entry size mismatch: %lu != %lu",
- (unsigned long) sec->header.sh_entsize,
- (unsigned long) sizeof(ElfW(RelM)));
- return NULL;
- }
- break;
- }
- }
-
- return f;
-}
-
-static void hide_special_symbols(struct obj_file *f)
-{
- static const char *const specials[] = {
- "cleanup_module",
- "init_module",
- "kernel_version",
- NULL
- };
-
- struct obj_symbol *sym;
- const char *const *p;
-
- for (p = specials; *p; ++p)
- if ((sym = obj_find_symbol(f, *p)) != NULL)
- sym->info =
- ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info));
-}
-
-
-void my_usage(void)
-{
- printf("Usage.");
- exit(0);
-}
-
-extern int insmod_main( int argc, char **argv)
-{
- int k_crcs;
- int k_new_syscalls;
- int len;
- char *tmp;
- unsigned long m_size;
- ElfW(Addr) m_addr;
- FILE *fp;
- struct obj_file *f;
- char m_name[BUFSIZ + 1] = "\0";
- int exit_status = FALSE;
- int m_has_modinfo;
-#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
- int k_version;
- char k_strversion[STRVERSIONLEN];
- char m_strversion[STRVERSIONLEN];
- int m_version;
- int m_crcs;
-#endif
-
-
- if (argc <= 1)
- my_usage();
-
- argv++; argc--;
-
- /* Grab the module name */
- if ((tmp = strrchr(*argv, '/')) != NULL) {
- tmp++;
- } else {
- tmp = *argv;
- }
- len = strlen(tmp);
-
- if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o')
- len -= 2;
- memcpy(m_name, tmp, len);
- strcpy(m_fullName, m_name);
- strcat(m_fullName, ".o");
-
- /* Get a filedesc for the module */
- if ((fp = fopen(*argv, "r")) == NULL) {
- errorMsg("Module %s not found", *argv);
- return -1;
- } else
- memcpy(m_filename, *argv, strlen(*argv));
-
-
- if ((f = obj_load(fp)) == NULL) {
- logperror("Could not load the module");
- goto out;
- }
-
- if (get_modinfo_value(f, "kernel_version") == NULL)
- m_has_modinfo = 0;
- else
- m_has_modinfo = 1;
-
-#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
- /* Version correspondence? */
-
- k_version = get_kernel_version(k_strversion);
- if (m_has_modinfo) {
- m_version = new_get_module_version(f, m_strversion);
- } else {
- m_version = old_get_module_version(f, m_strversion);
- if (m_version == -1) {
- errorMsg("couldn't find the kernel version the module was "
- "compiled for");
- goto out;
- }
- }
-
- if (strncmp(k_strversion, m_strversion, STRVERSIONLEN) != 0) {
- if (flag_force_load) {
- errorMsg("Warning: kernel-module version mismatch\n"
- "\t%s was compiled for kernel version %s\n"
- "\twhile this kernel is version %s",
- m_filename, m_strversion, k_strversion);
- } else {
- errorMsg("kernel-module version mismatch\n"
- "\t%s was compiled for kernel version %s\n"
- "\twhile this kernel is version %s.",
- m_filename, m_strversion, k_strversion);
- goto out;
- }
- }
- k_crcs = 0;
-#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
-
- k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL);
-
- if (k_new_syscalls) {
-#ifdef BB_FEATURE_INSMOD_NEW_KERNEL
- if (!new_get_kernel_symbols())
- goto out;
- k_crcs = new_is_kernel_checksummed();
-#else
- errorMsg("Not configured to support new kernels");
- goto out;
-#endif
- } else {
-#ifdef BB_FEATURE_INSMOD_OLD_KERNEL
- if (!old_get_kernel_symbols(m_name))
- goto out;
- k_crcs = old_is_kernel_checksummed();
-#else
- errorMsg("Not configured to support old kernels");
- goto out;
-#endif
- }
-
-#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
- if (m_has_modinfo)
- m_crcs = new_is_module_checksummed(f);
- else
- m_crcs = old_is_module_checksummed(f);
-
- if (m_crcs != k_crcs)
- obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash);
-#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
-
- /* Let the module know about the kernel symbols. */
- add_kernel_symbols(f);
-
- /* Allocate common symbols, symbol tables, and string tables. */
-
- if (k_new_syscalls
- ? !new_create_this_module(f, m_name)
- : !old_create_mod_use_count(f))
- {
- goto out;
- }
-
- if (!obj_check_undefineds(f)) {
- goto out;
- }
- obj_allocate_commons(f);
-
- if (m_has_modinfo
- ? !new_process_module_arguments(f, argc-1, argv+1)
- : !old_process_module_arguments(f, argc-1, argv+1))
- {
- goto out;
- }
-
- arch_create_got(f);
- hide_special_symbols(f);
-
- if (k_new_syscalls)
- new_create_module_ksymtab(f);
-
- /* Find current size of the module */
- m_size = obj_load_size(f);
-
-
- errno = 0;
- m_addr = create_module(m_name, m_size);
- switch (errno) {
- case 0:
- break;
- case EEXIST:
- errorMsg("A module named %s already exists", m_name);
- /* Considered as a success in stage1 */
- fclose(fp);
- return(TRUE);
- case ENOMEM:
- errorMsg("Can't allocate kernel memory for module; needed %lu bytes",
- m_size);
- goto out;
- default:
- errorMsg("create_module: %s: %s", m_name, strerror(errno));
- goto out;
- }
-
- if (!obj_relocate(f, m_addr)) {
- delete_module(m_name);
- goto out;
- }
-
- if (k_new_syscalls
- ? !new_init_module(m_name, f, m_size)
- : !old_init_module(m_name, f, m_size))
- {
- delete_module(m_name);
- goto out;
- }
-
- exit_status = TRUE;
-
-out:
- fclose(fp);
- return(exit_status);
-}
-
-
-int insmod_call(char * full_filename, char * params)
-{
- int argc = 2;
- char *argv[50];
- char * ptr = params;
- argv[0] = "stage1";
- argv[1] = full_filename;
-
- while (ptr != NULL) {
- argv[argc] = ptr;
- argc++;
- ptr = strchr(ptr, ' ');
- if (ptr) {
- ptr[0] = '\0';
- ptr++;
- }
- }
-
- return insmod_main(argc, argv);
-}
diff --git a/mdk-stage1/insmod-busybox/loop.h b/mdk-stage1/insmod-busybox/loop.h
deleted file mode 100644
index cba8c6b2b..000000000
--- a/mdk-stage1/insmod-busybox/loop.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <linux/posix_types.h>
-#undef dev_t
-#define dev_t __kernel_dev_t
-#include <linux/loop.h>
-#undef dev_t
diff --git a/mdk-stage1/insmod-busybox/messages.c b/mdk-stage1/insmod-busybox/messages.c
deleted file mode 100644
index 81fd9c75c..000000000
--- a/mdk-stage1/insmod-busybox/messages.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Copyright (C) 2000 by BitterSweet Enterprises, LLC.
- * Written by Karl M. Hegbloom <karlheg@debian.org>
- *
- * 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
- *
- */
-
-/*
- * Let's put all of these messages in one place, and link this in as
- * a separate object module, so that there are not going to be
- * multiple non-unique but very similar strings in the binary.
- * Perhaps this will make it simpler to internationalize also, and
- * may make the binary slightly smaller.
- */
-
-// To use this header file, include something like this:
-//
-//#define BB_DECLARE_EXTERN
-//#define bb_need_memory_exhausted
-//#include "messages.c"
-//
-//Then just use the string memory_exhausted when it is needed.
-//
-
-#include "busybox.h"
-#ifndef _BB_MESSAGES_C
-#define _BB_MESSAGES_C
-
-#ifdef BB_DECLARE_EXTERN
-# define BB_DEF_MESSAGE(symbol, string_const) extern const char *symbol;
-#else
-# define BB_DEF_MESSAGE(symbol, string_const) const char *symbol = string_const;
-#endif
-
-
-#if defined bb_need_full_version || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(full_version,
- "BusyBox v" BB_VER " (" BB_BT ") multi-call binary -- GPL2")
-#endif
-#if defined bb_need_name_too_long || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(name_too_long, "file name too long\n")
-#endif
-#if defined bb_need_omitting_directory || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(omitting_directory, "%s: omitting directory\n")
-#endif
-#if defined bb_need_not_a_directory || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(not_a_directory, "%s: not a directory\n")
-#endif
-#if defined bb_need_memory_exhausted || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(memory_exhausted, "memory exhausted\n")
-#endif
-#if defined bb_need_invalid_date || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(invalid_date, "invalid date `%s'\n")
-#endif
-#if defined bb_need_invalid_option || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(invalid_option, "invalid option -- %c\n")
-#endif
-#if defined bb_need_io_error || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(io_error, "%s: input/output error -- %s\n")
-#endif
-#if defined bb_need_help || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(dash_dash_help, "--help")
-#endif
-#if defined bb_need_write_error || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(write_error, "Write Error\n")
-#endif
-#if defined bb_need_too_few_args || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(too_few_args, "too few arguments\n")
-#endif
-#if defined bb_need_name_longer_then_foo || ! defined BB_DECLARE_EXTERN
- BB_DEF_MESSAGE(name_longer_then_foo, "Names longer then %d chars not supported.\n")
-#endif
-
-
-#endif /* _BB_MESSAGES_C */
-
diff --git a/mdk-stage1/insmod-busybox/utility.c b/mdk-stage1/insmod-busybox/utility.c
deleted file mode 100644
index b9a115c72..000000000
--- a/mdk-stage1/insmod-busybox/utility.c
+++ /dev/null
@@ -1,1756 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Utility routines.
- *
- * Copyright (C) tons of folks. Tracking down who wrote what
- * isn't something I'm going to worry about... If you wrote something
- * here, please feel free to acknowledge your work.
- *
- * 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
- *
- * Based in part on code from sash, Copyright (c) 1999 by David I. Bell
- * Permission has been granted to redistribute this code under the GPL.
- *
- */
-
-#include "busybox.h"
-#if defined (BB_CHMOD_CHOWN_CHGRP) \
- || defined (BB_CP_MV) \
- || defined (BB_FIND) \
- || defined (BB_INSMOD) \
- || defined (BB_LS) \
- || defined (BB_RM) \
- || defined (BB_TAR)
-/* same conditions as recursiveAction */
-#define bb_need_name_too_long
-#endif
-#define bb_need_memory_exhausted
-#define bb_need_full_version
-#define BB_DECLARE_EXTERN
-#include "messages.c"
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <time.h>
-#include <utime.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <sys/ioctl.h>
-#include <sys/utsname.h> /* for uname(2) */
-
-/* Busybox mount uses either /proc/filesystems or /dev/mtab to get the
- * list of available filesystems used for the -t auto option */
-#if defined BB_FEATURE_USE_PROCFS && defined BB_FEATURE_USE_DEVPS_PATCH
-//#error Sorry, but busybox can't use both /proc and /dev/ps at the same time -- Pick one and try again.
-#error "Sorry, but busybox can't use both /proc and /dev/ps at the same time -- Pick one and try again."
-#endif
-
-
-#if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF
-# if defined BB_MTAB
-const char mtab_file[] = "/etc/mtab";
-# else
-# if defined BB_FEATURE_USE_PROCFS
-const char mtab_file[] = "/proc/mounts";
-# else
-# if defined BB_FEATURE_USE_DEVPS_PATCH
-const char mtab_file[] = "/dev/mtab";
-# else
-# error With (BB_MOUNT||BB_UMOUNT||BB_DF) defined, you must define either BB_MTAB or ( BB_FEATURE_USE_PROCFS | BB_FEATURE_USE_DEVPS_PATCH)
-# endif
-# endif
-# endif
-#endif
-
-#ifdef _STANDALONE_
-void errorMsg(const char *s, ...)
-{
- va_list p;
-
- fflush(stdout);
- printf("busybox: ");
- va_start(p, s);
- vprintf(s, p);
- va_end(p);
- printf("\n");
- fflush(stdout);
-}
-
-extern void logperror(char *s)
-{
- perror(s);
-}
-
-void fatalError(const char *s, ...)
-{
- va_list p;
-
- fflush(stdout);
- fprintf(stdout, "busybox: ");
- va_start(p, s);
- vfprintf(stdout, s, p);
- va_end(p);
- fprintf(stdout, "\n");
- fflush(stdout);
- exit(FALSE);
-}
-#else /* _STANDALONE_ */
-#include "../log.h"
-extern void errorMsg(const char *s, ...)
-{
- va_list p;
-
- va_start(p, s);
- vlog_message(s, p);
- va_end(p);
-}
-
-extern void logperror(char *s)
-{
- log_perror(s);
-}
-
-extern void fatalError(const char *s, ...)
-{
- va_list p;
-
- va_start(p, s);
- vlog_message(s, p);
- va_end(p);
- while (1);
-}
-#endif /* _STANDALONE_ */
-
-
-#if defined BB_INIT
-/* Returns kernel version encoded as major*65536 + minor*256 + patch,
- * so, for example, to check if the kernel is greater than 2.2.11:
- * if (get_kernel_revision() <= 2*65536+2*256+11) { <stuff> }
- */
-extern int get_kernel_revision(void)
-{
- struct utsname name;
- int major = 0, minor = 0, patch = 0;
-
- if (uname(&name) == -1) {
- perror("cannot get system information");
- return (0);
- }
- sscanf(name.version, "%d.%d.%d", &major, &minor, &patch);
- return major * 65536 + minor * 256 + patch;
-}
-#endif /* BB_INIT */
-
-
-
-#if defined BB_FREE || defined BB_INIT || defined BB_UNAME || defined BB_UPTIME
-_syscall1(int, sysinfo, struct sysinfo *, info);
-#endif /* BB_INIT */
-
-#if defined BB_MOUNT || defined BB_UMOUNT
-
-#ifndef __NR_umount2
-#define __NR_umount2 52
-#endif
-
-/* Include our own version of <sys/mount.h>, since libc5 doesn't
- * know about umount2 */
-extern _syscall1(int, umount, const char *, special_file);
-extern _syscall2(int, umount2, const char *, special_file, int, flags);
-extern _syscall5(int, mount, const char *, special_file, const char *, dir,
- const char *, fstype, unsigned long int, rwflag, const void *, data);
-#endif
-
-#if defined BB_INSMOD || defined BB_LSMOD
-#ifndef __NR_query_module
-#define __NR_query_module 167
-#endif
-_syscall5(int, query_module, const char *, name, int, which,
- void *, buf, size_t, bufsize, size_t*, ret);
-#endif
-
-
-#if defined (BB_CP_MV) || defined (BB_DU)
-
-#define HASH_SIZE 311 /* Should be prime */
-#define hash_inode(i) ((i) % HASH_SIZE)
-
-static ino_dev_hashtable_bucket_t *ino_dev_hashtable[HASH_SIZE];
-
-/*
- * Return 1 if statbuf->st_ino && statbuf->st_dev are recorded in
- * `ino_dev_hashtable', else return 0
- *
- * If NAME is a non-NULL pointer to a character pointer, and there is
- * a match, then set *NAME to the value of the name slot in that
- * bucket.
- */
-int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name)
-{
- ino_dev_hashtable_bucket_t *bucket;
-
- bucket = ino_dev_hashtable[hash_inode(statbuf->st_ino)];
- while (bucket != NULL) {
- if ((bucket->ino == statbuf->st_ino) &&
- (bucket->dev == statbuf->st_dev))
- {
- if (name) *name = bucket->name;
- return 1;
- }
- bucket = bucket->next;
- }
- return 0;
-}
-
-/* Add statbuf to statbuf hash table */
-void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name)
-{
- int i;
- size_t s;
- ino_dev_hashtable_bucket_t *bucket;
-
- i = hash_inode(statbuf->st_ino);
- s = name ? strlen(name) : 0;
- bucket = xmalloc(sizeof(ino_dev_hashtable_bucket_t) + s);
- bucket->ino = statbuf->st_ino;
- bucket->dev = statbuf->st_dev;
- if (name)
- strcpy(bucket->name, name);
- else
- bucket->name[0] = '\0';
- bucket->next = ino_dev_hashtable[i];
- ino_dev_hashtable[i] = bucket;
-}
-
-/* Clear statbuf hash table */
-void reset_ino_dev_hashtable(void)
-{
- int i;
- ino_dev_hashtable_bucket_t *bucket;
-
- for (i = 0; i < HASH_SIZE; i++) {
- while (ino_dev_hashtable[i] != NULL) {
- bucket = ino_dev_hashtable[i]->next;
- free(ino_dev_hashtable[i]);
- ino_dev_hashtable[i] = bucket;
- }
- }
-}
-
-#endif /* BB_CP_MV || BB_DU */
-
-#if defined (BB_CP_MV) || defined (BB_DU) || defined (BB_LN) || defined (BB_AR)
-/*
- * Return TRUE if a fileName is a directory.
- * Nonexistant files return FALSE.
- */
-int isDirectory(const char *fileName, const int followLinks, struct stat *statBuf)
-{
- int status;
- int didMalloc = 0;
-
- if (statBuf == NULL) {
- statBuf = (struct stat *)xmalloc(sizeof(struct stat));
- ++didMalloc;
- }
-
- if (followLinks == TRUE)
- status = stat(fileName, statBuf);
- else
- status = lstat(fileName, statBuf);
-
- if (status < 0 || !(S_ISDIR(statBuf->st_mode))) {
- status = FALSE;
- }
- else status = TRUE;
-
- if (didMalloc) {
- free(statBuf);
- statBuf = NULL;
- }
- return status;
-}
-#endif
-
-#if defined (BB_AR) || defined BB_CP_MV
-/*
- * Copy readSize bytes between two file descriptors
- */
-int copySubFile(int srcFd, int dstFd, size_t remaining)
-{
- size_t size;
- char buffer[BUFSIZ];
-
- while (remaining > 0) {
- if (remaining > BUFSIZ)
- size = BUFSIZ;
- else
- size = remaining;
- if (fullWrite(dstFd, buffer, fullRead(srcFd, buffer, size)) < size)
- return(FALSE);
- remaining -= size;
- }
- return (TRUE);
-}
-#endif
-
-
-#if defined (BB_CP_MV)
-/*
- * Copy one file to another, while possibly preserving its modes, times, and
- * modes. Returns TRUE if successful, or FALSE on a failure with an error
- * message output. (Failure is not indicated if attributes cannot be set.)
- * -Erik Andersen
- */
-int
-copyFile(const char *srcName, const char *destName,
- int setModes, int followLinks, int forceFlag)
-{
- int rfd;
- int wfd;
- int status;
- struct stat srcStatBuf;
- struct stat dstStatBuf;
- struct utimbuf times;
-
- if (followLinks == TRUE)
- status = stat(srcName, &srcStatBuf);
- else
- status = lstat(srcName, &srcStatBuf);
-
- if (status < 0) {
- perror(srcName);
- return FALSE;
- }
-
- if (followLinks == TRUE)
- status = stat(destName, &dstStatBuf);
- else
- status = lstat(destName, &dstStatBuf);
-
- if (status < 0 || forceFlag==TRUE) {
- unlink(destName);
- dstStatBuf.st_ino = -1;
- dstStatBuf.st_dev = -1;
- }
-
- if ((srcStatBuf.st_dev == dstStatBuf.st_dev) &&
- (srcStatBuf.st_ino == dstStatBuf.st_ino)) {
- errorMsg("Copying file \"%s\" to itself\n", srcName);
- return FALSE;
- }
-
- if (S_ISDIR(srcStatBuf.st_mode)) {
- //fprintf(stderr, "copying directory %s to %s\n", srcName, destName);
- /* Make sure the directory is writable */
- status = mkdir(destName, 0777777 ^ umask(0));
- if (status < 0 && errno != EEXIST) {
- perror(destName);
- return FALSE;
- }
- } else if (S_ISLNK(srcStatBuf.st_mode)) {
- char link_val[BUFSIZ + 1];
- int link_size;
-
- //fprintf(stderr, "copying link %s to %s\n", srcName, destName);
- /* Warning: This could possibly truncate silently, to BUFSIZ chars */
- link_size = readlink(srcName, &link_val[0], BUFSIZ);
- if (link_size < 0) {
- perror(srcName);
- return FALSE;
- }
- link_val[link_size] = '\0';
- status = symlink(link_val, destName);
- if (status < 0) {
- perror(destName);
- return FALSE;
- }
-#if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)
- if (setModes == TRUE) {
- /* Try to set owner, but fail silently like GNU cp */
- lchown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid);
- }
-#endif
- return TRUE;
- } else if (S_ISFIFO(srcStatBuf.st_mode)) {
- //fprintf(stderr, "copying fifo %s to %s\n", srcName, destName);
- if (mkfifo(destName, 0644) < 0) {
- perror(destName);
- return FALSE;
- }
- } else if (S_ISBLK(srcStatBuf.st_mode) || S_ISCHR(srcStatBuf.st_mode)
- || S_ISSOCK(srcStatBuf.st_mode)) {
- //fprintf(stderr, "copying soc, blk, or chr %s to %s\n", srcName, destName);
- if (mknod(destName, srcStatBuf.st_mode, srcStatBuf.st_rdev) < 0) {
- perror(destName);
- return FALSE;
- }
- } else if (S_ISREG(srcStatBuf.st_mode)) {
- //fprintf(stderr, "copying regular file %s to %s\n", srcName, destName);
- rfd = open(srcName, O_RDONLY);
- if (rfd < 0) {
- perror(srcName);
- return FALSE;
- }
-
- wfd = open(destName, O_WRONLY | O_CREAT | O_TRUNC,
- srcStatBuf.st_mode);
- if (wfd < 0) {
- perror(destName);
- close(rfd);
- return FALSE;
- }
-
- if (copySubFile(rfd, wfd, srcStatBuf.st_size)==FALSE)
- goto error_exit;
-
- close(rfd);
- if (close(wfd) < 0) {
- return FALSE;
- }
- }
-
- if (setModes == TRUE) {
- /* This is fine, since symlinks never get here */
- if (chown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid) < 0) {
- perror(destName);
- exit FALSE;
- }
- if (chmod(destName, srcStatBuf.st_mode) < 0) {
- perror(destName);
- exit FALSE;
- }
- times.actime = srcStatBuf.st_atime;
- times.modtime = srcStatBuf.st_mtime;
- if (utime(destName, &times) < 0) {
- perror(destName);
- exit FALSE;
- }
- }
-
- return TRUE;
-
- error_exit:
- perror(destName);
- close(rfd);
- close(wfd);
-
- return FALSE;
-}
-#endif /* BB_CP_MV */
-
-
-
-#if defined BB_TAR || defined BB_LS ||defined BB_AR
-
-#define TYPEINDEX(mode) (((mode) >> 12) & 0x0f)
-#define TYPECHAR(mode) ("0pcCd?bB-?l?s???" [TYPEINDEX(mode)])
-
-/* The special bits. If set, display SMODE0/1 instead of MODE0/1 */
-static const mode_t SBIT[] = {
- 0, 0, S_ISUID,
- 0, 0, S_ISGID,
- 0, 0, S_ISVTX
-};
-
-/* The 9 mode bits to test */
-static const mode_t MBIT[] = {
- S_IRUSR, S_IWUSR, S_IXUSR,
- S_IRGRP, S_IWGRP, S_IXGRP,
- S_IROTH, S_IWOTH, S_IXOTH
-};
-
-#define MODE1 "rwxrwxrwx"
-#define MODE0 "---------"
-#define SMODE1 "..s..s..t"
-#define SMODE0 "..S..S..T"
-
-/*
- * Return the standard ls-like mode string from a file mode.
- * This is static and so is overwritten on each call.
- */
-const char *modeString(int mode)
-{
- static char buf[12];
-
- int i;
-
- buf[0] = TYPECHAR(mode);
- for (i = 0; i < 9; i++) {
- if (mode & SBIT[i])
- buf[i + 1] = (mode & MBIT[i]) ? SMODE1[i] : SMODE0[i];
- else
- buf[i + 1] = (mode & MBIT[i]) ? MODE1[i] : MODE0[i];
- }
- return buf;
-}
-#endif /* BB_TAR || BB_LS */
-
-
-#if defined BB_TAR || defined BB_AR
-/*
- * Return the standard ls-like time string from a time_t
- * This is static and so is overwritten on each call.
- */
-const char *timeString(time_t timeVal)
-{
- time_t now;
- char *str;
- static char buf[26];
-
- time(&now);
-
- str = ctime(&timeVal);
-
- strcpy(buf, &str[4]);
- buf[12] = '\0';
-
- if ((timeVal > now) || (timeVal < now - 365 * 24 * 60 * 60L)) {
- strcpy(&buf[7], &str[20]);
- buf[11] = '\0';
- }
-
- return buf;
-}
-#endif /* BB_TAR || BB_AR */
-
-#if defined BB_TAR || defined BB_CP_MV || defined BB_AR
-/*
- * Write all of the supplied buffer out to a file.
- * This does multiple writes as necessary.
- * Returns the amount written, or -1 on an error.
- */
-int fullWrite(int fd, const char *buf, int len)
-{
- int cc;
- int total;
-
- total = 0;
-
- while (len > 0) {
- cc = write(fd, buf, len);
-
- if (cc < 0)
- return -1;
-
- buf += cc;
- total += cc;
- len -= cc;
- }
-
- return total;
-}
-#endif /* BB_TAR || BB_CP_MV || BB_AR */
-
-
-#if defined BB_TAR || defined BB_TAIL || defined BB_AR || defined BB_SH || defined BB_CP_MV
-/*
- * Read all of the supplied buffer from a file.
- * This does multiple reads as necessary.
- * Returns the amount read, or -1 on an error.
- * A short read is returned on an end of file.
- */
-int fullRead(int fd, char *buf, int len)
-{
- int cc;
- int total;
-
- total = 0;
-
- while (len > 0) {
- cc = read(fd, buf, len);
-
- if (cc < 0)
- return -1;
-
- if (cc == 0)
- break;
-
- buf += cc;
- total += cc;
- len -= cc;
- }
-
- return total;
-}
-#endif /* BB_TAR || BB_TAIL || BB_AR || BB_SH */
-
-
-#if defined (BB_CHMOD_CHOWN_CHGRP) \
- || defined (BB_CP_MV) \
- || defined (BB_FIND) \
- || defined (BB_INSMOD) \
- || defined (BB_LS) \
- || defined (BB_RM) \
- || defined (BB_TAR)
-
-/*
- * Walk down all the directories under the specified
- * location, and do something (something specified
- * by the fileAction and dirAction function pointers).
- *
- * Unfortunatly, while nftw(3) could replace this and reduce
- * code size a bit, nftw() wasn't supported before GNU libc 2.1,
- * and so isn't sufficiently portable to take over since glibc2.1
- * is so stinking huge.
- */
-int recursiveAction(const char *fileName,
- int recurse, int followLinks, int depthFirst,
- int (*fileAction) (const char *fileName,
- struct stat * statbuf,
- void* userData),
- int (*dirAction) (const char *fileName,
- struct stat * statbuf,
- void* userData),
- void* userData)
-{
- int status;
- struct stat statbuf;
- struct dirent *next;
-
- if (followLinks == TRUE)
- status = stat(fileName, &statbuf);
- else
- status = lstat(fileName, &statbuf);
-
- if (status < 0) {
-#ifdef BB_DEBUG_PRINT_SCAFFOLD
- fprintf(stderr,
- "status=%d followLinks=%d TRUE=%d\n",
- status, followLinks, TRUE);
-#endif
- perror(fileName);
- return FALSE;
- }
-
- if ((followLinks == FALSE) && (S_ISLNK(statbuf.st_mode))) {
- if (fileAction == NULL)
- return TRUE;
- else
- return fileAction(fileName, &statbuf, userData);
- }
-
- if (recurse == FALSE) {
- if (S_ISDIR(statbuf.st_mode)) {
- if (dirAction != NULL)
- return (dirAction(fileName, &statbuf, userData));
- else
- return TRUE;
- }
- }
-
- if (S_ISDIR(statbuf.st_mode)) {
- DIR *dir;
-
- dir = opendir(fileName);
- if (!dir) {
- perror(fileName);
- return FALSE;
- }
- if (dirAction != NULL && depthFirst == FALSE) {
- status = dirAction(fileName, &statbuf, userData);
- if (status == FALSE) {
- perror(fileName);
- return FALSE;
- }
- }
- while ((next = readdir(dir)) != NULL) {
- char nextFile[BUFSIZ + 1];
-
- if ((strcmp(next->d_name, "..") == 0)
- || (strcmp(next->d_name, ".") == 0)) {
- continue;
- }
- if (strlen(fileName) + strlen(next->d_name) + 1 > BUFSIZ) {
- errorMsg("name_too_long");
- return FALSE;
- }
- memset(nextFile, 0, sizeof(nextFile));
- sprintf(nextFile, "%s/%s", fileName, next->d_name);
- status =
- recursiveAction(nextFile, TRUE, followLinks, depthFirst,
- fileAction, dirAction, userData);
- if (status == FALSE) {
- closedir(dir);
- return FALSE;
- }
- }
- status = closedir(dir);
- if (status < 0) {
- perror(fileName);
- return FALSE;
- }
- if (dirAction != NULL && depthFirst == TRUE) {
- status = dirAction(fileName, &statbuf, userData);
- if (status == FALSE) {
- perror(fileName);
- return FALSE;
- }
- }
- } else {
- if (fileAction == NULL)
- return TRUE;
- else
- return fileAction(fileName, &statbuf, userData);
- }
- return TRUE;
-}
-
-#endif /* BB_CHMOD_CHOWN_CHGRP || BB_CP_MV || BB_FIND || BB_LS || BB_INSMOD */
-
-
-
-#if defined (BB_TAR) || defined (BB_MKDIR) || defined (BB_AR)
-/*
- * Attempt to create the directories along the specified path, except for
- * the final component. The mode is given for the final directory only,
- * while all previous ones get default protections. Errors are not reported
- * here, as failures to restore files can be reported later.
- */
-extern int createPath(const char *name, int mode)
-{
- char *cp;
- char *cpOld;
- char buf[BUFSIZ + 1];
- int retVal = 0;
-
- strcpy(buf, name);
- for (cp = buf; *cp == '/'; cp++);
- cp = strchr(cp, '/');
- while (cp) {
- cpOld = cp;
- cp = strchr(cp + 1, '/');
- *cpOld = '\0';
- retVal = mkdir(buf, cp ? 0777 : mode);
- if (retVal != 0 && errno != EEXIST) {
- perror(buf);
- return FALSE;
- }
- *cpOld = '/';
- }
- return TRUE;
-}
-#endif /* BB_TAR || BB_MKDIR */
-
-
-
-#if defined (BB_CHMOD_CHOWN_CHGRP) || defined (BB_MKDIR) \
- || defined (BB_MKFIFO) || defined (BB_MKNOD) || defined (BB_AR)
-/* [ugoa]{+|-|=}[rwxst] */
-
-
-
-extern int parse_mode(const char *s, mode_t * theMode)
-{
- mode_t andMode =
-
- S_ISVTX | S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO;
- mode_t orMode = 0;
- mode_t mode = 0;
- mode_t groups = 0;
- char type;
- char c;
-
- if (s==NULL)
- return (FALSE);
-
- do {
- for (;;) {
- switch (c = *s++) {
- case '\0':
- return -1;
- case 'u':
- groups |= S_ISUID | S_IRWXU;
- continue;
- case 'g':
- groups |= S_ISGID | S_IRWXG;
- continue;
- case 'o':
- groups |= S_IRWXO;
- continue;
- case 'a':
- groups |= S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO;
- continue;
- case '+':
- case '=':
- case '-':
- type = c;
- if (groups == 0) /* The default is "all" */
- groups |=
- S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO;
- break;
- default:
- if (isdigit(c) && c >= '0' && c <= '7' &&
- mode == 0 && groups == 0) {
- *theMode = strtol(--s, NULL, 8);
- return (TRUE);
- } else
- return (FALSE);
- }
- break;
- }
-
- while ((c = *s++) != '\0') {
- switch (c) {
- case ',':
- break;
- case 'r':
- mode |= S_IRUSR | S_IRGRP | S_IROTH;
- continue;
- case 'w':
- mode |= S_IWUSR | S_IWGRP | S_IWOTH;
- continue;
- case 'x':
- mode |= S_IXUSR | S_IXGRP | S_IXOTH;
- continue;
- case 's':
- mode |= S_IXGRP | S_ISUID | S_ISGID;
- continue;
- case 't':
- mode |= 0;
- continue;
- default:
- *theMode &= andMode;
- *theMode |= orMode;
- return (TRUE);
- }
- break;
- }
- switch (type) {
- case '=':
- andMode &= ~(groups);
- /* fall through */
- case '+':
- orMode |= mode & groups;
- break;
- case '-':
- andMode &= ~(mode & groups);
- orMode &= andMode;
- break;
- }
- } while (c == ',');
- *theMode &= andMode;
- *theMode |= orMode;
- return (TRUE);
-}
-
-
-#endif
-/* BB_CHMOD_CHOWN_CHGRP || BB_MKDIR || BB_MKFIFO || BB_MKNOD */
-
-
-
-
-
-#if defined BB_CHMOD_CHOWN_CHGRP || defined BB_PS || defined BB_LS \
- || defined BB_TAR || defined BB_ID || defined BB_LOGGER \
- || defined BB_LOGNAME || defined BB_WHOAMI
-
-/* This parses entries in /etc/passwd and /etc/group. This is desirable
- * for BusyBox, since we want to avoid using the glibc NSS stuff, which
- * increases target size and is often not needed or wanted for embedded
- * systems.
- *
- * /etc/passwd entries look like this:
- * root:x:0:0:root:/root:/bin/bash
- * and /etc/group entries look like this:
- * root:x:0:
- *
- * This uses buf as storage to hold things.
- *
- */
-unsigned long my_getid(const char *filename, char *name, long id, long *gid)
-{
- FILE *file;
- char *rname, *start, *end, buf[128];
- long rid;
- long rgid = 0;
-
- file = fopen(filename, "r");
- if (file == NULL) {
- /* Do not complain. It is ok for /etc/passwd and
- * friends to be missing... */
- return (-1);
- }
-
- while (fgets(buf, 128, file) != NULL) {
- if (buf[0] == '#')
- continue;
-
- /* username/group name */
- start = buf;
- end = strchr(start, ':');
- if (end == NULL)
- continue;
- *end = '\0';
- rname = start;
-
- /* password */
- start = end + 1;
- end = strchr(start, ':');
- if (end == NULL)
- continue;
-
- /* uid in passwd, gid in group */
- start = end + 1;
- rid = (unsigned long) strtol(start, &end, 10);
- if (end == start)
- continue;
-
- /* gid in passwd */
- start = end + 1;
- rgid = (unsigned long) strtol(start, &end, 10);
-
- if (name) {
- if (0 == strcmp(rname, name)) {
- if (gid) *gid = rgid;
- fclose(file);
- return (rid);
- }
- }
- if (id != -1 && id == rid) {
- strncpy(name, rname, 8);
- if (gid) *gid = rgid;
- fclose(file);
- return (TRUE);
- }
- }
- fclose(file);
- return (-1);
-}
-
-/* returns a uid given a username */
-long my_getpwnam(char *name)
-{
- return my_getid("/etc/passwd", name, -1, NULL);
-}
-
-/* returns a gid given a group name */
-long my_getgrnam(char *name)
-{
- return my_getid("/etc/group", name, -1, NULL);
-}
-
-/* gets a username given a uid */
-void my_getpwuid(char *name, long uid)
-{
- my_getid("/etc/passwd", name, uid, NULL);
-}
-
-/* gets a groupname given a gid */
-void my_getgrgid(char *group, long gid)
-{
- my_getid("/etc/group", group, gid, NULL);
-}
-
-/* gets a gid given a user name */
-long my_getpwnamegid(char *name)
-{
- long gid;
- my_getid("/etc/passwd", name, -1, &gid);
- return gid;
-}
-
-#endif
- /* BB_CHMOD_CHOWN_CHGRP || BB_PS || BB_LS || BB_TAR \
- || BB_ID || BB_LOGGER || BB_LOGNAME || BB_WHOAMI */
-
-
-#if (defined BB_CHVT) || (defined BB_DEALLOCVT) || (defined BB_SETKEYCODES)
-
-/* From <linux/kd.h> */
-#define KDGKBTYPE 0x4B33 /* get keyboard type */
-#define KB_84 0x01
-#define KB_101 0x02 /* this is what we always answer */
-
-int is_a_console(int fd)
-{
- char arg;
-
- arg = 0;
- return (ioctl(fd, KDGKBTYPE, &arg) == 0
- && ((arg == KB_101) || (arg == KB_84)));
-}
-
-static int open_a_console(char *fnam)
-{
- int fd;
-
- /* try read-only */
- fd = open(fnam, O_RDWR);
-
- /* if failed, try read-only */
- if (fd < 0 && errno == EACCES)
- fd = open(fnam, O_RDONLY);
-
- /* if failed, try write-only */
- if (fd < 0 && errno == EACCES)
- fd = open(fnam, O_WRONLY);
-
- /* if failed, fail */
- if (fd < 0)
- return -1;
-
- /* if not a console, fail */
- if (!is_a_console(fd)) {
- close(fd);
- return -1;
- }
-
- /* success */
- return fd;
-}
-
-/*
- * Get an fd for use with kbd/console ioctls.
- * We try several things because opening /dev/console will fail
- * if someone else used X (which does a chown on /dev/console).
- *
- * if tty_name is non-NULL, try this one instead.
- */
-
-int get_console_fd(char *tty_name)
-{
- int fd;
-
- if (tty_name) {
- if (-1 == (fd = open_a_console(tty_name)))
- return -1;
- else
- return fd;
- }
-
- fd = open_a_console("/dev/tty");
- if (fd >= 0)
- return fd;
-
- fd = open_a_console("/dev/tty0");
- if (fd >= 0)
- return fd;
-
- fd = open_a_console("/dev/console");
- if (fd >= 0)
- return fd;
-
- for (fd = 0; fd < 3; fd++)
- if (is_a_console(fd))
- return fd;
-
- errorMsg("Couldnt get a file descriptor referring to the console\n");
- return -1; /* total failure */
-}
-
-
-#endif /* BB_CHVT || BB_DEALLOCVT || BB_SETKEYCODES */
-
-
-#if defined BB_FIND || defined BB_INSMOD
-/*
- * Routine to see if a text string is matched by a wildcard pattern.
- * Returns TRUE if the text is matched, or FALSE if it is not matched
- * or if the pattern is invalid.
- * * matches zero or more characters
- * ? matches a single character
- * [abc] matches 'a', 'b' or 'c'
- * \c quotes character c
- * Adapted from code written by Ingo Wilken, and
- * then taken from sash, Copyright (c) 1999 by David I. Bell
- * Permission is granted to use, distribute, or modify this source,
- * provided that this copyright notice remains intact.
- * Permission to distribute this code under the GPL has been granted.
- */
-extern int check_wildcard_match(const char *text, const char *pattern)
-{
- const char *retryPat;
- const char *retryText;
- int ch;
- int found;
- int len;
-
- retryPat = NULL;
- retryText = NULL;
-
- while (*text || *pattern) {
- ch = *pattern++;
-
- switch (ch) {
- case '*':
- retryPat = pattern;
- retryText = text;
- break;
-
- case '[':
- found = FALSE;
-
- while ((ch = *pattern++) != ']') {
- if (ch == '\\')
- ch = *pattern++;
-
- if (ch == '\0')
- return FALSE;
-
- if (*text == ch)
- found = TRUE;
- }
- len=strlen(text);
- if (found == FALSE && len!=0) {
- return FALSE;
- }
- if (found == TRUE) {
- if (strlen(pattern)==0 && len==1) {
- return TRUE;
- }
- if (len!=0) {
- text++;
- continue;
- }
- }
-
- /* fall into next case */
-
- case '?':
- if (*text++ == '\0')
- return FALSE;
-
- break;
-
- case '\\':
- ch = *pattern++;
-
- if (ch == '\0')
- return FALSE;
-
- /* fall into next case */
-
- default:
- if (*text == ch) {
- if (*text)
- text++;
- break;
- }
-
- if (*text) {
- pattern = retryPat;
- text = ++retryText;
- break;
- }
-
- return FALSE;
- }
-
- if (pattern == NULL)
- return FALSE;
- }
-
- return TRUE;
-}
-#endif /* BB_FIND || BB_INSMOD */
-
-
-
-
-#if defined BB_DF || defined BB_MTAB
-/*
- * Given a block device, find the mount table entry if that block device
- * is mounted.
- *
- * Given any other file (or directory), find the mount table entry for its
- * filesystem.
- */
-extern struct mntent *findMountPoint(const char *name, const char *table)
-{
- struct stat s;
- dev_t mountDevice;
- FILE *mountTable;
- struct mntent *mountEntry;
-
- if (stat(name, &s) != 0)
- return 0;
-
- if ((s.st_mode & S_IFMT) == S_IFBLK)
- mountDevice = s.st_rdev;
- else
- mountDevice = s.st_dev;
-
-
- if ((mountTable = setmntent(table, "r")) == 0)
- return 0;
-
- while ((mountEntry = getmntent(mountTable)) != 0) {
- if (strcmp(name, mountEntry->mnt_dir) == 0
- || strcmp(name, mountEntry->mnt_fsname) == 0) /* String match. */
- break;
- if (stat(mountEntry->mnt_fsname, &s) == 0 && s.st_rdev == mountDevice) /* Match the device. */
- break;
- if (stat(mountEntry->mnt_dir, &s) == 0 && s.st_dev == mountDevice) /* Match the directory's mount point. */
- break;
- }
- endmntent(mountTable);
- return mountEntry;
-}
-#endif /* BB_DF || BB_MTAB */
-
-
-
-#if defined BB_DD || defined BB_TAIL
-/*
- * Read a number with a possible multiplier.
- * Returns -1 if the number format is illegal.
- */
-extern long getNum(const char *cp)
-{
- long value;
-
- if (!isDecimal(*cp))
- return -1;
-
- value = 0;
-
- while (isDecimal(*cp))
- value = value * 10 + *cp++ - '0';
-
- switch (*cp++) {
- case 'M':
- case 'm': /* `tail' uses it traditionally */
- value *= 1048576;
- break;
-
- case 'k':
- value *= 1024;
- break;
-
- case 'b':
- value *= 512;
- break;
-
- case 'w':
- value *= 2;
- break;
-
- case '\0':
- return value;
-
- default:
- return -1;
- }
-
- if (*cp)
- return -1;
-
- return value;
-}
-#endif /* BB_DD || BB_TAIL */
-
-
-#if defined BB_INIT || defined BB_SYSLOGD
-/* try to open up the specified device */
-extern int device_open(char *device, int mode)
-{
- int m, f, fd = -1;
-
- m = mode | O_NONBLOCK;
-
- /* Retry up to 5 times */
- for (f = 0; f < 5; f++)
- if ((fd = open(device, m, 0600)) >= 0)
- break;
- if (fd < 0)
- return fd;
- /* Reset original flags. */
- if (m != mode)
- fcntl(fd, F_SETFL, mode);
- return fd;
-}
-#endif /* BB_INIT BB_SYSLOGD */
-
-
-#if defined BB_KILLALL || ( defined BB_FEATURE_LINUXRC && ( defined BB_HALT || defined BB_REBOOT || defined BB_POWEROFF ))
-#ifdef BB_FEATURE_USE_DEVPS_PATCH
-#include <linux/devps.h> /* For Erik's nifty devps device driver */
-#endif
-
-#if defined BB_FEATURE_USE_DEVPS_PATCH
-/* findPidByName()
- *
- * This finds the pid of the specified process,
- * by using the /dev/ps device driver.
- *
- * Returns a list of all matching PIDs
- */
-extern pid_t* findPidByName( char* pidName)
-{
- int fd, i, j;
- char device[] = "/dev/ps";
- pid_t num_pids;
- pid_t* pid_array = NULL;
- pid_t* pidList=NULL;
-
- /* open device */
- fd = open(device, O_RDONLY);
- if (fd < 0)
- fatalError( "open failed for `%s': %s\n", device, strerror (errno));
-
- /* Find out how many processes there are */
- if (ioctl (fd, DEVPS_GET_NUM_PIDS, &num_pids)<0)
- fatalError( "\nDEVPS_GET_PID_LIST: %s\n", strerror (errno));
-
- /* Allocate some memory -- grab a few extras just in case
- * some new processes start up while we wait. The kernel will
- * just ignore any extras if we give it too many, and will trunc.
- * the list if we give it too few. */
- pid_array = (pid_t*) xcalloc( num_pids+10, sizeof(pid_t));
- pid_array[0] = num_pids+10;
-
- /* Now grab the pid list */
- if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0)
- fatalError( "\nDEVPS_GET_PID_LIST: %s\n", strerror (errno));
-
- /* Now search for a match */
- for (i=1, j=0; i<pid_array[0] ; i++) {
- char* p;
- struct pid_info info;
-
- info.pid = pid_array[i];
- if (ioctl (fd, DEVPS_GET_PID_INFO, &info)<0)
- fatalError( "\nDEVPS_GET_PID_INFO: %s\n", strerror (errno));
-
- /* Make sure we only match on the process name */
- p=info.command_line+1;
- while ((*p != 0) && !isspace(*(p)) && (*(p-1) != '\\')) {
- (p)++;
- }
- if (isspace(*(p)))
- *p='\0';
-
- if ((strstr(info.command_line, pidName) != NULL)
- && (strlen(pidName) == strlen(info.command_line))) {
- pidList=xrealloc( pidList, sizeof(pid_t) * (j+2));
- pidList[j++]=info.pid;
- }
- }
- if (pidList)
- pidList[j]=0;
-
- /* Free memory */
- free( pid_array);
-
- /* close device */
- if (close (fd) != 0)
- fatalError( "close failed for `%s': %s\n",device, strerror (errno));
-
- return pidList;
-}
-#else /* BB_FEATURE_USE_DEVPS_PATCH */
-#if ! defined BB_FEATURE_USE_PROCFS
-#error Sorry, I depend on the /proc filesystem right now.
-#endif
-
-/* findPidByName()
- *
- * This finds the pid of the specified process.
- * Currently, it's implemented by rummaging through
- * the proc filesystem.
- *
- * Returns a list of all matching PIDs
- */
-extern pid_t* findPidByName( char* pidName)
-{
- DIR *dir;
- struct dirent *next;
- pid_t* pidList=NULL;
- int i=0;
-
- dir = opendir("/proc");
- if (!dir)
- fatalError( "Cannot open /proc: %s\n", strerror (errno));
-
- while ((next = readdir(dir)) != NULL) {
- FILE *status;
- char filename[256];
- char buffer[256];
-
- /* If it isn't a number, we don't want it */
- if (!isdigit(*next->d_name))
- continue;
-
- sprintf(filename, "/proc/%s/cmdline", next->d_name);
- status = fopen(filename, "r");
- if (!status) {
- continue;
- }
- fgets(buffer, 256, status);
- fclose(status);
-
- if (strstr(get_last_path_component(buffer), pidName) != NULL) {
- pidList=xrealloc( pidList, sizeof(pid_t) * (i+2));
- pidList[i++]=strtol(next->d_name, NULL, 0);
- }
- }
-
- if (pidList)
- pidList[i]=0;
- return pidList;
-}
-#endif /* BB_FEATURE_USE_DEVPS_PATCH */
-#endif /* BB_KILLALL || ( BB_FEATURE_LINUXRC && ( BB_HALT || BB_REBOOT || BB_POWEROFF )) */
-
-#ifndef DMALLOC
-/* this should really be farmed out to libbusybox.a */
-extern void *xmalloc(size_t size)
-{
- void *ptr = malloc(size);
-
- if (!ptr)
- fatalError("memory_exhausted");
- return ptr;
-}
-
-extern void *xrealloc(void *old, size_t size)
-{
- void *ptr = realloc(old, size);
- if (!ptr)
- fatalError("memory_exhausted");
- return ptr;
-}
-
-extern void *xcalloc(size_t nmemb, size_t size)
-{
- void *ptr = calloc(nmemb, size);
- if (!ptr)
- fatalError("memory_exhausted");
- return ptr;
-}
-#endif
-
-#if defined BB_FEATURE_NFSMOUNT || defined BB_SH || defined BB_LS
-# ifndef DMALLOC
-extern char * xstrdup (const char *s) {
- char *t;
-
- if (s == NULL)
- return NULL;
-
- t = strdup (s);
-
- if (t == NULL)
- fatalError("memory_exhausted");
-
- return t;
-}
-# endif
-#endif
-
-#if defined BB_FEATURE_NFSMOUNT
-extern char * xstrndup (const char *s, int n) {
- char *t;
-
- if (s == NULL)
- fatalError("xstrndup bug");
-
- t = xmalloc(n+1);
- strncpy(t,s,n);
- t[n] = 0;
-
- return t;
-}
-#endif
-
-
-#if (__GLIBC__ < 2) && (defined BB_SYSLOGD || defined BB_INIT)
-extern int vdprintf(int d, const char *format, va_list ap)
-{
- char buf[BUF_SIZE];
- int len;
-
- len = vsprintf(buf, format, ap);
- return write(d, buf, len);
-}
-#endif /* BB_SYSLOGD */
-
-
-#if defined BB_FEATURE_MOUNT_LOOP
-#include <fcntl.h>
-#include "loop.h" /* Pull in loop device support */
-
-extern int del_loop(const char *device)
-{
- int fd;
-
- if ((fd = open(device, O_RDONLY)) < 0) {
- perror(device);
- return (FALSE);
- }
- if (ioctl(fd, LOOP_CLR_FD, 0) < 0) {
- perror("ioctl: LOOP_CLR_FD");
- return (FALSE);
- }
- close(fd);
- return (TRUE);
-}
-
-extern int set_loop(const char *device, const char *file, int offset,
- int *loopro)
-{
- struct loop_info loopinfo;
- int fd, ffd, mode;
-
- mode = *loopro ? O_RDONLY : O_RDWR;
- if ((ffd = open(file, mode)) < 0 && !*loopro
- && (errno != EROFS || (ffd = open(file, mode = O_RDONLY)) < 0)) {
- perror(file);
- return 1;
- }
- if ((fd = open(device, mode)) < 0) {
- close(ffd);
- perror(device);
- return 1;
- }
- *loopro = (mode == O_RDONLY);
-
- memset(&loopinfo, 0, sizeof(loopinfo));
- strncpy(loopinfo.lo_name, file, LO_NAME_SIZE);
- loopinfo.lo_name[LO_NAME_SIZE - 1] = 0;
-
- loopinfo.lo_offset = offset;
-
- loopinfo.lo_encrypt_key_size = 0;
- if (ioctl(fd, LOOP_SET_FD, ffd) < 0) {
- perror("ioctl: LOOP_SET_FD");
- close(fd);
- close(ffd);
- return 1;
- }
- if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) {
- (void) ioctl(fd, LOOP_CLR_FD, 0);
- perror("ioctl: LOOP_SET_STATUS");
- close(fd);
- close(ffd);
- return 1;
- }
- close(fd);
- close(ffd);
- return 0;
-}
-
-extern char *find_unused_loop_device(void)
-{
- char dev[20];
- int i, fd;
- struct stat statbuf;
- struct loop_info loopinfo;
-
- for (i = 0; i <= 7; i++) {
- sprintf(dev, "/dev/loop%d", i);
- if (stat(dev, &statbuf) == 0 && S_ISBLK(statbuf.st_mode)) {
- if ((fd = open(dev, O_RDONLY)) >= 0) {
- if (ioctl(fd, LOOP_GET_STATUS, &loopinfo) == -1) {
- if (errno == ENXIO) { /* probably free */
- close(fd);
- return strdup(dev);
- }
- }
- close(fd);
- }
- }
- }
- return NULL;
-}
-#endif /* BB_FEATURE_MOUNT_LOOP */
-
-#if defined BB_MOUNT || defined BB_DF || ( defined BB_UMOUNT && ! defined BB_MTAB)
-extern int find_real_root_device_name(char* name)
-{
- DIR *dir;
- struct dirent *entry;
- struct stat statBuf, rootStat;
- char fileName[BUFSIZ];
-
- if (stat("/", &rootStat) != 0) {
- errorMsg("could not stat '/'\n");
- return( FALSE);
- }
-
- dir = opendir("/dev");
- if (!dir) {
- errorMsg("could not open '/dev'\n");
- return( FALSE);
- }
-
- while((entry = readdir(dir)) != NULL) {
-
- /* Must skip ".." since that is "/", and so we
- * would get a false positive on ".." */
- if (strcmp(entry->d_name, "..") == 0)
- continue;
-
- snprintf( fileName, strlen(name)+1, "/dev/%s", entry->d_name);
-
- if (stat(fileName, &statBuf) != 0)
- continue;
- /* Some char devices have the same dev_t as block
- * devices, so make sure this is a block device */
- if (! S_ISBLK(statBuf.st_mode))
- continue;
- if (statBuf.st_rdev == rootStat.st_rdev) {
- strcpy(name, fileName);
- return ( TRUE);
- }
- }
-
- return( FALSE);
-}
-#endif
-
-
-/* get_line_from_file() - This function reads an entire line from a text file
- * up to a newline. It returns a malloc'ed char * which must be stored and
- * free'ed by the caller. */
-extern char *get_line_from_file(FILE *file)
-{
- static const int GROWBY = 80; /* how large we will grow strings by */
-
- int ch;
- int idx = 0;
- char *linebuf = NULL;
- int linebufsz = 0;
-
- while (1) {
- ch = fgetc(file);
- if (ch == EOF)
- break;
- /* grow the line buffer as necessary */
- while (idx > linebufsz-2)
- linebuf = xrealloc(linebuf, linebufsz += GROWBY);
- linebuf[idx++] = (char)ch;
- if ((char)ch == '\n')
- break;
- }
-
- if (idx == 0)
- return NULL;
-
- linebuf[idx] = 0;
- return linebuf;
-}
-
-#if defined BB_CAT
-extern void print_file(FILE *file)
-{
- int c;
-
- while ((c = getc(file)) != EOF)
- putc(c, stdout);
- fclose(file);
- fflush(stdout);
-}
-
-extern int print_file_by_name(char *filename)
-{
- FILE *file;
- file = fopen(filename, "r");
- if (file == NULL) {
- return FALSE;
- }
- print_file(file);
- return TRUE;
-}
-#endif /* BB_CAT || BB_LSMOD */
-
-#if defined BB_ECHO || defined BB_TR
-char process_escape_sequence(char **ptr)
-{
- char c;
-
- switch (c = *(*ptr)++) {
- case 'a':
- c = '\a';
- break;
- case 'b':
- c = '\b';
- break;
- case 'f':
- c = '\f';
- break;
- case 'n':
- c = '\n';
- break;
- case 't':
- c = '\t';
- break;
- case 'v':
- c = '\v';
- break;
- case '\\':
- c = '\\';
- break;
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- c -= '0';
- if ('0' <= **ptr && **ptr <= '7') {
- c = c * 8 + (*(*ptr)++ - '0');
- if ('0' <= **ptr && **ptr <= '7')
- c = c * 8 + (*(*ptr)++ - '0');
- }
- break;
- default:
- (*ptr)--;
- c = '\\';
- break;
- }
- return c;
-}
-#endif
-
-#if defined BB_BASENAME || defined BB_LN || defined BB_SH
-char *get_last_path_component(char *path)
-{
- char *s=path+strlen(path)-1;
-
- /* strip trailing slashes */
- while (s && *s == '/') {
- *s-- = '\0';
- }
-
- /* find last component */
- s = strrchr(path, '/');
- if (s==NULL) return path;
- else return s+1;
-}
-#endif
-
-#if defined BB_GREP || defined BB_SED
-void xregcomp(regex_t *preg, const char *regex, int cflags)
-{
- int ret;
- if ((ret = regcomp(preg, regex, cflags)) != 0) {
- int errmsgsz = regerror(ret, preg, NULL, 0);
- char *errmsg = xmalloc(errmsgsz);
- regerror(ret, preg, errmsg, errmsgsz);
- fatalError("bb_regcomp: %s\n", errmsg);
- }
-}
-#endif
-
-/* END CODE */
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/
diff --git a/mdk-stage1/insmod-modutils/Makefile b/mdk-stage1/insmod-modutils/Makefile
deleted file mode 100644
index 74ebdeafb..000000000
--- a/mdk-stage1/insmod-modutils/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
- #******************************************************************************
- #
- # insmod from modutils (generic)
- #
- # $Id$
- #
- # Copyright 1996, 1997 Linux International.
- #
- #*****************************************************************************
-
-top_dir = ..
-
-include $(top_dir)/Makefile.common
-
-
-FLAGS = -c -Wall -Os -fomit-frame-pointer -I./include -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH)
-
-
-DIRS = util obj
-
-all: dirs insmod libinsmod.a #libinsmod-DIET.a
-
-dirs:
- @for n in . $(DIRS); do \
- [ "$$n" = "." ] || make -C $$n ;\
- done
-
-clean:
- @for n in $(DIRS); do \
- (cd $$n; make clean) \
- done
- rm -rf t *.o insmod libinsmod.a libinsmod-DIET.a
-
-
-insmod: insmod-frontend.o insmod.o ./util/libutil-STANDALONE.a ./obj/libobj.a
- gcc -o $@ $^
- $(STRIPCMD) $@
-
-t/.create_stuff: util/libutil.a obj/libobj.a
- rm -rf t
- mkdir t
- cd t && for e in $^; do ar -x ../$$e; done
- touch t/.create_stuff
-
-libinsmod.a: insmod.o t/.create_stuff
- ar cru $@ insmod.o t/*
- ranlib $@
-
-libinsmod-DIET.a: insmod-DIET.o ./util/libutil-DIET.a ./obj/libobj-DIET.a
- ar cru $@ $^
- ranlib $@
-
-insmod-frontend.o: insmod-frontend.c insmod.c
- gcc $(FLAGS) $(GLIBC_INCLUDES) insmod-frontend.c
-
-insmod.o: insmod.c
- gcc $(FLAGS) $(GLIBC_INCLUDES) insmod.c
-
-insmod-DIET.o: insmod.c
- gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ insmod.c
-
diff --git a/mdk-stage1/insmod-modutils/include/config.h b/mdk-stage1/insmod-modutils/include/config.h
deleted file mode 100644
index 11da6a523..000000000
--- a/mdk-stage1/insmod-modutils/include/config.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Configuration file management
- *
- * Copyright 1994, 1995, 1996, 1997:
- * Jacques Gelinas <jack@solucorp.qc.ca>
- * Björn Ekwall <bj0rn@blox.se> February, March 1999
- *
- * This file is part of the Linux modutils.
- *
- * 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.
- */
-
-#ifndef _CONFIG_H
-#define _CONFIG_H
-
-#include <stdio.h>
-#include <sys/utsname.h>
-
-#define ETC_MODULES_CONF "/etc/modules.conf"
-
-#define EXEC_PRE_INSTALL 0
-#define EXEC_POST_INSTALL 1
-#define EXEC_PRE_REMOVE 2
-#define EXEC_POST_REMOVE 3
-#define EXEC_INSTALL 4
-#define EXEC_REMOVE 5
-
-struct PATH_TYPE {
- char *type;
- char *path;
-};
-
-struct EXEC_TYPE {
- int when;
- char *module;
- char *cmd;
-};
-
-typedef struct {
- char *name;
- GLOB_LIST *opts;
- int autoclean;
-} OPT_LIST;
-
-/* config.c */
-extern int flag_autoclean;
-extern struct utsname uts_info;
-extern char *aliaslist[];
-extern struct PATH_TYPE *modpath;
-extern int nmodpath;
-extern struct EXEC_TYPE *execs;
-extern int nexecs;
-extern char *insmod_opt;
-extern char *config_file;
-extern char *optlist[];
-extern char *prune[];
-extern OPT_LIST *opt_list;
-extern OPT_LIST *abovelist;
-extern OPT_LIST *belowlist;
-extern OPT_LIST *prunelist;
-extern OPT_LIST *probe_list;
-extern OPT_LIST *probeall_list;
-extern OPT_LIST *aliases;
-extern time_t config_mtime;
-extern int root_check_off; /* Check modules are owned by root? */
-
-/* Information about generated files */
-struct gen_files {
- char *base; /* xxx in /lib/modules/`uname -r`/modules.xxx */
- char *name; /* name actually used */
- time_t mtime;
-};
-
-extern struct gen_files gen_file[];
-extern const int gen_file_count;
-/* The enum order must match the gen_file initialization order in config.c */
-enum gen_file_enum {
- GEN_GENERIC_STRINGFILE,
- GEN_PCIMAPFILE,
- GEN_ISAPNPMAPFILE,
- GEN_USBMAPFILE,
- GEN_PARPORTMAPFILE,
- GEN_DEPFILE,
-};
-
-extern char *persistdir;
-
-char *fgets_strip(char *buf, int sizebuf, FILE * fin, int *lineno);
-int config_read(int all, char *force_ver, char *base_dir, char *conf_file);
-GLOB_LIST *config_lstmod(const char *match, const char *type, int first_only);
-char *search_module_path(const char *base);
-
-#endif /* _CONFIG_H */
diff --git a/mdk-stage1/insmod-modutils/include/elf_alpha.h b/mdk-stage1/insmod-modutils/include/elf_alpha.h
deleted file mode 100644
index f1ec66f1c..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_alpha.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Machine-specific elf macros for the Alpha. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS64
-#define ELFDATAM ELFDATA2LSB
-
-#define MATCH_MACHINE(x) (x == EM_ALPHA)
-
-#define SHT_RELM SHT_RELA
-#define Elf64_RelM Elf64_Rela
diff --git a/mdk-stage1/insmod-modutils/include/elf_arm.h b/mdk-stage1/insmod-modutils/include/elf_arm.h
deleted file mode 100644
index f6b531e88..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_arm.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Machine-specific elf macros for ARM. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS32
-#define ELFDATAM ELFDATA2LSB
-
-#define MATCH_MACHINE(x) (x == EM_ARM)
-
-#define SHT_RELM SHT_REL
-#define Elf32_RelM Elf32_Rel
diff --git a/mdk-stage1/insmod-modutils/include/elf_hppa.h b/mdk-stage1/insmod-modutils/include/elf_hppa.h
deleted file mode 100644
index 9a1bd34ce..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_hppa.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Machine-specific elf macros for HP-PA. */
-
-#define ELFCLASSM ELFCLASS32
-#define ELFDATAM ELFDATA2MSB
-
-#define MATCH_MACHINE(x) (x == EM_PARISC)
-
-#define SHT_RELM SHT_RELA
-#define Elf32_RelM Elf32_Rela
diff --git a/mdk-stage1/insmod-modutils/include/elf_hppa64.h b/mdk-stage1/insmod-modutils/include/elf_hppa64.h
deleted file mode 100644
index 05b201aef..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_hppa64.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Machine-specific elf macros for HP-PA64. */
-
-#define ELFCLASSM ELFCLASS64
-#define ELFDATAM ELFDATA2MSB
-
-#define MATCH_MACHINE(x) (x == EM_PARISC)
-
-#define SHT_RELM SHT_RELA
-#define Elf64_RelM Elf64_Rela
diff --git a/mdk-stage1/insmod-modutils/include/elf_i386.h b/mdk-stage1/insmod-modutils/include/elf_i386.h
deleted file mode 100644
index c6c2d326e..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_i386.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Machine-specific elf macros for i386 et al. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS32
-#define ELFDATAM ELFDATA2LSB
-
-#define MATCH_MACHINE(x) (x == EM_386)
-
-#define SHT_RELM SHT_REL
-#define Elf32_RelM Elf32_Rel
diff --git a/mdk-stage1/insmod-modutils/include/elf_ia64.h b/mdk-stage1/insmod-modutils/include/elf_ia64.h
deleted file mode 100644
index b4d902956..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_ia64.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Machine-specific elf macros for ia64. */
-
-#define ELFCLASSM ELFCLASS64
-#define ELFDATAM ELFDATA2LSB
-
-#define MATCH_MACHINE(x) (x == EM_IA_64)
-
-#define SHT_RELM SHT_RELA
-#define Elf64_RelM Elf64_Rela
diff --git a/mdk-stage1/insmod-modutils/include/elf_m68k.h b/mdk-stage1/insmod-modutils/include/elf_m68k.h
deleted file mode 100644
index 817fc8f2c..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_m68k.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Machine-specific elf macros for m68k. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS32
-#define ELFDATAM ELFDATA2MSB
-
-#define MATCH_MACHINE(x) (x == EM_68K)
-
-#define SHT_RELM SHT_RELA
-#define Elf32_RelM Elf32_Rela
diff --git a/mdk-stage1/insmod-modutils/include/elf_mips.h b/mdk-stage1/insmod-modutils/include/elf_mips.h
deleted file mode 100644
index 8a0430216..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_mips.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Machine-specific elf macros for MIPS. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS32
-#ifdef __MIPSEB__
-#define ELFDATAM ELFDATA2MSB
-#endif
-#ifdef __MIPSEL__
-#define ELFDATAM ELFDATA2LSB
-#endif
-
-/* Account for ELF spec changes. */
-#ifndef EM_MIPS_RS3_LE
-#ifdef EM_MIPS_RS4_BE
-#define EM_MIPS_RS3_LE EM_MIPS_RS4_BE
-#else
-#define EM_MIPS_RS3_LE 10
-#endif
-#endif /* !EM_MIPS_RS3_LE */
-
-#define MATCH_MACHINE(x) (x == EM_MIPS || x == EM_MIPS_RS3_LE)
-
-#define SHT_RELM SHT_REL
-#define Elf32_RelM Elf32_Rel
diff --git a/mdk-stage1/insmod-modutils/include/elf_ppc.h b/mdk-stage1/insmod-modutils/include/elf_ppc.h
deleted file mode 100644
index 71596de8c..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_ppc.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Machine-specific elf macros for the PowerPC. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS32
-#define ELFDATAM ELFDATA2MSB
-
-#define MATCH_MACHINE(x) (x == EM_PPC)
-
-#define SHT_RELM SHT_RELA
-#define Elf32_RelM Elf32_Rela
diff --git a/mdk-stage1/insmod-modutils/include/elf_s390.h b/mdk-stage1/insmod-modutils/include/elf_s390.h
deleted file mode 100644
index 547d66b83..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_s390.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Machine-specific elf macros for i386 et al. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS32
-#define ELFDATAM ELFDATA2MSB
-
-#define MATCH_MACHINE(x) (x == EM_S390)
-
-#define SHT_RELM SHT_RELA
-#define Elf32_RelM Elf32_Rela
diff --git a/mdk-stage1/insmod-modutils/include/elf_sparc.h b/mdk-stage1/insmod-modutils/include/elf_sparc.h
deleted file mode 100644
index 9b5c348d9..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_sparc.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Machine-specific elf macros for the Sparc. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS32
-#define ELFDATAM ELFDATA2MSB
-
-#define MATCH_MACHINE(x) (x == EM_SPARC)
-
-#define SHT_RELM SHT_RELA
-#define Elf32_RelM Elf32_Rela
diff --git a/mdk-stage1/insmod-modutils/include/elf_sparc64.h b/mdk-stage1/insmod-modutils/include/elf_sparc64.h
deleted file mode 100644
index 158edd7e1..000000000
--- a/mdk-stage1/insmod-modutils/include/elf_sparc64.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Machine-specific elf macros for the Sparc. */
-#ident "$Id$"
-
-#define ELFCLASSM ELFCLASS64
-#define ELFDATAM ELFDATA2MSB
-
-#ifndef EM_SPARCV9
-#define EM_SPARCV9 43
-#endif
-#ifndef EM_SPARC64
-#define EM_SPARC64 11
-#endif
-#define MATCH_MACHINE(x) ((x) == EM_SPARCV9 || (x) == EM_SPARC64)
-
-#define SHT_RELM SHT_RELA
-#define Elf64_RelM Elf64_Rela
-
-#ifndef ELF64_R_SYM
-#define ELF64_R_SYM(x) ((x) >> 32)
-#define ELF64_R_TYPE(x) ((unsigned)(x))
-#endif
-
-#ifndef ELF64_ST_BIND
-#define ELF64_ST_BIND(x) ((x) >> 4)
-#define ELF64_ST_TYPE(x) ((x) & 0xf)
-#endif
-
diff --git a/mdk-stage1/insmod-modutils/include/kallsyms.h b/mdk-stage1/insmod-modutils/include/kallsyms.h
deleted file mode 100644
index 9748873cf..000000000
--- a/mdk-stage1/insmod-modutils/include/kallsyms.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/* kallsyms headers
- Copyright 2000 Keith Owens <kaos@ocs.com.au>
-
- This file is part of the Linux modutils. It is exported to kernel
- space so debuggers can access the kallsyms data.
-
- The kallsyms data contains all the non-stack symbols from a kernel
- or a module. The kernel symbols are held between __start___kallsyms
- and __stop___kallsyms. The symbols for a module are accessed via
- the struct module chain which is based at module_list.
-
- 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.
- */
-
-#ident "$Id$"
-
-#ifndef MODUTILS_KALLSYMS_H
-#define MODUTILS_KALLSYMS_H 1
-
-/* Have to (re)define these ElfW entries here because external kallsyms
- * code does not have access to modutils/include/obj.h. This code is
- * included from user spaces tools (modutils) and kernel, they need
- * different includes.
- */
-
-#ifndef ELFCLASS32
-#ifdef __KERNEL__
-#include <linux/elf.h>
-#else /* __KERNEL__ */
-#include <elf.h>
-#endif /* __KERNEL__ */
-#endif /* ELFCLASS32 */
-
-#ifndef ELFCLASSM
-#define ELFCLASSM ELF_CLASS
-#endif
-
-#ifndef ElfW
-# if ELFCLASSM == ELFCLASS32
-# define ElfW(x) Elf32_ ## x
-# define ELFW(x) ELF32_ ## x
-# else
-# define ElfW(x) Elf64_ ## x
-# define ELFW(x) ELF64_ ## x
-# endif
-#endif
-
-/* Format of data in the kallsyms section.
- * Most of the fields are small numbers but the total size and all
- * offsets can be large so use the 32/64 bit types for these fields.
- *
- * Do not use sizeof() on these structures, modutils may be using extra
- * fields. Instead use the size fields in the header to access the
- * other bits of data.
- */
-
-struct kallsyms_header {
- int size; /* Size of this header */
- ElfW(Word) total_size; /* Total size of kallsyms data */
- int sections; /* Number of section entries */
- ElfW(Off) section_off; /* Offset to first section entry */
- int section_size; /* Size of one section entry */
- int symbols; /* Number of symbol entries */
- ElfW(Off) symbol_off; /* Offset to first symbol entry */
- int symbol_size; /* Size of one symbol entry */
- ElfW(Off) string_off; /* Offset to first string */
- ElfW(Addr) start; /* Start address of first section */
- ElfW(Addr) end; /* End address of last section */
-};
-
-struct kallsyms_section {
- ElfW(Addr) start; /* Start address of section */
- ElfW(Word) size; /* Size of this section */
- ElfW(Off) name_off; /* Offset to section name */
- ElfW(Word) flags; /* Flags from section */
-};
-
-struct kallsyms_symbol {
- ElfW(Off) section_off; /* Offset to section that owns this symbol */
- ElfW(Addr) symbol_addr; /* Address of symbol */
- ElfW(Off) name_off; /* Offset to symbol name */
-};
-
-#define KALLSYMS_SEC_NAME "__kallsyms"
-#define KALLSYMS_IDX 2 /* obj_kallsyms creates kallsyms as section 2 */
-
-#define kallsyms_next_sec(h,s) \
- ((s) = (struct kallsyms_section *)((char *)(s) + (h)->section_size))
-#define kallsyms_next_sym(h,s) \
- ((s) = (struct kallsyms_symbol *)((char *)(s) + (h)->symbol_size))
-
-int kallsyms_symbol_to_address(
- const char *name, /* Name to lookup */
- unsigned long *token, /* Which module to start with */
- const char **mod_name, /* Set to module name or "kernel" */
- unsigned long *mod_start, /* Set to start address of module */
- unsigned long *mod_end, /* Set to end address of module */
- const char **sec_name, /* Set to section name */
- unsigned long *sec_start, /* Set to start address of section */
- unsigned long *sec_end, /* Set to end address of section */
- const char **sym_name, /* Set to full symbol name */
- unsigned long *sym_start, /* Set to start address of symbol */
- unsigned long *sym_end /* Set to end address of symbol */
- );
-
-int kallsyms_address_to_symbol(
- unsigned long address, /* Address to lookup */
- const char **mod_name, /* Set to module name */
- unsigned long *mod_start, /* Set to start address of module */
- unsigned long *mod_end, /* Set to end address of module */
- const char **sec_name, /* Set to section name */
- unsigned long *sec_start, /* Set to start address of section */
- unsigned long *sec_end, /* Set to end address of section */
- const char **sym_name, /* Set to full symbol name */
- unsigned long *sym_start, /* Set to start address of symbol */
- unsigned long *sym_end /* Set to end address of symbol */
- );
-
-#endif /* kallsyms.h */
diff --git a/mdk-stage1/insmod-modutils/include/kerneld.h b/mdk-stage1/insmod-modutils/include/kerneld.h
deleted file mode 100644
index 3bc2c9d42..000000000
--- a/mdk-stage1/insmod-modutils/include/kerneld.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Definitions for the Linux kerneld SYSV IPC interface.
- This file was part of the Linux kernel, and so is covered by the GPL. */
-
-#ifndef MODUTILS_KERNELD_H
-#define MODUTILS_KERNELD_H
-
-#ident "$Id$"
-
-#define KERNELD_SYSTEM 1
-#define KERNELD_REQUEST_MODULE 2 /* "insmod" */
-#define KERNELD_RELEASE_MODULE 3 /* "rmmod" */
-#define KERNELD_DELAYED_RELEASE_MODULE 4 /* "rmmod" */
-#define KERNELD_CANCEL_RELEASE_MODULE 5 /* "rmmod" */
-#define KERNELD_REQUEST_ROUTE 6 /* net/ipv4/route.c */
-#define KERNELD_BLANKER 7 /* drivers/char/console.c */
-#define KERNELD_PNP 8 /* drivers/pnp/kerneld.c */
-#define KERNELD_ARP 256 /* net/ipv4/arp.c */
-
-#ifdef NEW_KERNELD_PROTOCOL
-# define OLDIPC_KERNELD 00040000 /* old kerneld message channel */
-# define IPC_KERNELD 00140000 /* new kerneld message channel */
-# define KDHDR (sizeof(long) + sizeof(short) + sizeof(short))
-# define NULL_KDHDR 0, 2, 0
-#else /* NEW_KERNELD_PROTOCOL */
-# define IPC_KERNELD 00040000
-# define KDHDR (sizeof(long))
-# define NULL_KDHDR 0
-#endif /* NEW_KERNELD_PROTOCOL */
-
-#define KERNELD_MAXCMD 0x7ffeffff
-#define KERNELD_MINSEQ 0x7fff0000 /* "commands" legal up to 0x7ffeffff */
-#define KERNELD_WAIT 0x80000000
-#define KERNELD_NOWAIT 0
-
-struct kerneld_msg
- {
- long mtype;
- long id;
-#ifdef NEW_KERNELD_PROTOCOL
- short version;
- short pid;
-#endif /* NEW_KERNELD_PROTOCOL */
- char text[1];
- };
-
-#endif /* kerneld.h */
diff --git a/mdk-stage1/insmod-modutils/include/modstat.h b/mdk-stage1/insmod-modutils/include/modstat.h
deleted file mode 100644
index b8a58eeae..000000000
--- a/mdk-stage1/insmod-modutils/include/modstat.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * For kernel module status and information
- *
- * Add module_name_list and l_module_name_list.
- * Keith Owens <kaos@ocs.com.au> November 1999.
- * Björn Ekwall <bj0rn@blox.se> February 1999.
- *
- * This file is part of the Linux modutils.
- *
- * 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.
- */
-#ifndef _KERNEL_H
-#define _KERNEL_H
-
-#define K_SYMBOLS 1 /* Want info about symbols */
-#define K_INFO 2 /* Want extended module info */
-#define K_REFS 4 /* Want info about references */
-
-struct module_stat {
- char *name;
- unsigned long addr;
- unsigned long modstruct; /* COMPAT_2_0! *//* depends on architecture? */
- unsigned long size;
- unsigned long flags;
- long usecount;
- size_t nsyms;
- struct module_symbol *syms;
- size_t nrefs;
- struct module_stat **refs;
- unsigned long status;
-};
-
-extern struct module_stat *module_stat;
-extern size_t n_module_stat;
-extern char *module_name_list;
-extern size_t l_module_name_list;
-extern struct module_symbol *ksyms;
-extern size_t nksyms;
-extern int k_new_syscalls;
-
-int get_kernel_info(int type);
-
-#endif /* _KERNEL_H */
diff --git a/mdk-stage1/insmod-modutils/include/module.h b/mdk-stage1/insmod-modutils/include/module.h
deleted file mode 100644
index db49ab2b2..000000000
--- a/mdk-stage1/insmod-modutils/include/module.h
+++ /dev/null
@@ -1,210 +0,0 @@
-/* Definitions for the Linux module syscall interface.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-
-#ifndef MODUTILS_MODULE_H
-#define MODUTILS_MODULE_H 1
-
-#ident "$Id$"
-
-/* This file contains the structures used by the 2.0 and 2.1 kernels.
- We do not use the kernel headers directly because we do not wish
- to be dependant on a particular kernel version to compile insmod. */
-
-
-/*======================================================================*/
-/* The structures used by Linux 2.0. */
-
-/* The symbol format used by get_kernel_syms(2). */
-struct old_kernel_sym
-{
- unsigned long value;
- char name[60];
-};
-
-struct old_module_ref
-{
- unsigned long module; /* kernel addresses */
- unsigned long next;
-};
-
-struct old_module_symbol
-{
- unsigned long addr;
- unsigned long name;
-};
-
-struct old_symbol_table
-{
- int size; /* total, including string table!!! */
- int n_symbols;
- int n_refs;
- struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */
- struct old_module_ref ref[0]; /* actual size defined by n_refs */
-};
-
-struct old_mod_routines
-{
- unsigned long init;
- unsigned long cleanup;
-};
-
-struct old_module
-{
- unsigned long next;
- unsigned long ref; /* the list of modules that refer to me */
- unsigned long symtab;
- unsigned long name;
- int size; /* size of module in pages */
- unsigned long addr; /* address of module */
- int state;
- unsigned long cleanup; /* cleanup routine */
-};
-
-/* Sent to init_module(2) or'ed into the code size parameter. */
-#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */
-
-int get_kernel_syms(struct old_kernel_sym *);
-int old_sys_init_module(const char *name, char *code, unsigned codesize,
- struct old_mod_routines *, struct old_symbol_table *);
-
-/*======================================================================*/
-/* For sizeof() which are related to the module platform and not to the
- environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */
-
-#define tgt_sizeof_char sizeof(char)
-#define tgt_sizeof_short sizeof(short)
-#define tgt_sizeof_int sizeof(int)
-#define tgt_sizeof_long sizeof(long)
-#define tgt_sizeof_char_p sizeof(char *)
-#define tgt_sizeof_void_p sizeof(void *)
-#define tgt_long long
-#define tgt_long_fmt "l"
-
-/* This assumes that long long on a 32 bit system is equivalent to long on the
- * equivalent 64 bit system. Also that void and char pointers are 8 bytes on
- * all 64 bit systems. Add per system tweaks if it ever becomes necessary.
- */
-#if defined(COMMON_3264) && defined(ONLY_64)
-#undef tgt_long
-#undef tgt_long_fmt
-#undef tgt_sizeof_long
-#undef tgt_sizeof_char_p
-#undef tgt_sizeof_void_p
-#define tgt_long long long
-#define tgt_long_fmt "ll"
-#define tgt_sizeof_long 8
-#define tgt_sizeof_char_p 8
-#define tgt_sizeof_void_p 8
-#endif
-
-/*======================================================================*/
-/* The structures used in Linux 2.1 onwards. */
-
-/* Note: module_symbol does not use tgt_long intentionally */
-struct module_symbol
-{
- unsigned long value;
- unsigned long name;
-};
-
-struct module_ref
-{
- unsigned tgt_long dep; /* kernel addresses */
- unsigned tgt_long ref;
- unsigned tgt_long next_ref;
-};
-
-struct module
-{
- unsigned tgt_long size_of_struct; /* == sizeof(module) */
- unsigned tgt_long next;
- unsigned tgt_long name;
- unsigned tgt_long size;
-
- tgt_long usecount;
- unsigned tgt_long flags; /* AUTOCLEAN et al */
-
- unsigned nsyms;
- unsigned ndeps;
-
- unsigned tgt_long syms;
- unsigned tgt_long deps;
- unsigned tgt_long refs;
- unsigned tgt_long init;
- unsigned tgt_long cleanup;
- unsigned tgt_long ex_table_start;
- unsigned tgt_long ex_table_end;
-#ifdef __alpha__
- unsigned tgt_long gp;
-#endif
- /* Everything after here is extension. */
- unsigned tgt_long read_start; /* Read data from existing module */
- unsigned tgt_long read_end;
- unsigned tgt_long can_unload;
- unsigned tgt_long runsize;
- unsigned tgt_long kallsyms_start;
- unsigned tgt_long kallsyms_end;
- unsigned tgt_long archdata_start;
- unsigned tgt_long archdata_end;
- unsigned tgt_long kernel_data;
-};
-
-struct module_info
-{
- unsigned long addr;
- unsigned long size;
- unsigned long flags;
- long usecount;
-};
-
-/* Bits of module.flags. */
-#define NEW_MOD_RUNNING 1
-#define NEW_MOD_DELETED 2
-#define NEW_MOD_AUTOCLEAN 4
-#define NEW_MOD_VISITED 8
-#define NEW_MOD_USED_ONCE 16
-#define NEW_MOD_INITIALIZING 64
-
-int sys_init_module(const char *name, const struct module *);
-int query_module(const char *name, int which, void *buf, size_t bufsize,
- size_t *ret);
-
-/* Values for query_module's which. */
-
-#define QM_MODULES 1
-#define QM_DEPS 2
-#define QM_REFS 3
-#define QM_SYMBOLS 4
-#define QM_INFO 5
-
-/*======================================================================*/
-/* The system calls unchanged between 2.0 and 2.1. */
-
-unsigned long create_module(const char *, size_t);
-int delete_module(const char *);
-
-/* In safe mode the last parameter is forced to be a module name and meta
- * expansion is not allowed on that name.
- */
-extern unsigned int safemode;
-
-#endif /* module.h */
diff --git a/mdk-stage1/insmod-modutils/include/obj.h b/mdk-stage1/insmod-modutils/include/obj.h
deleted file mode 100644
index b140c65c3..000000000
--- a/mdk-stage1/insmod-modutils/include/obj.h
+++ /dev/null
@@ -1,275 +0,0 @@
-/* Elf object file loading and relocation routines.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
- obj_free() added by Björn Ekwall <bj0rn@blox.se> March 1999
-
- This file is part of the Linux modutils.
-
- 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. */
-
-
-#ifndef MODUTILS_OBJ_H
-#define MODUTILS_OBJ_H 1
-
-#ident "$Id$"
-
-/* The relocatable object is manipulated using elfin types. */
-
-#include <stdio.h>
-#include <elf.h>
-#include ELF_MACHINE_H
-
-#ifndef ElfW
-# if ELFCLASSM == ELFCLASS32
-# define ElfW(x) Elf32_ ## x
-# define ELFW(x) ELF32_ ## x
-# else
-# define ElfW(x) Elf64_ ## x
-# define ELFW(x) ELF64_ ## x
-# endif
-#endif
-
-#if defined(COMMON_3264) && defined(ONLY_32)
-# define ObjW(x) obj32_ ## x
-#else
-# if defined(COMMON_3264) && defined(ONLY_64)
-# define ObjW(x) obj64_ ## x
-# else
-# define ObjW(x) obj_ ## x
-# endif
-#endif
-
-/* For some reason this is missing from lib5. */
-#ifndef ELF32_ST_INFO
-# define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
-#endif
-
-#ifndef ELF64_ST_INFO
-# define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
-#endif
-
-struct obj_string_patch_struct;
-struct obj_symbol_patch_struct;
-
-struct obj_section
-{
- ElfW(Shdr) header;
- const char *name;
- char *contents;
- struct obj_section *load_next;
- int idx;
-};
-
-struct obj_symbol
-{
- struct obj_symbol *next; /* hash table link */
- const char *name;
- unsigned long value;
- unsigned long size;
- int secidx; /* the defining section index/module */
- int info;
- int ksymidx; /* for export to the kernel symtab */
- int r_type; /* relocation type */
-};
-
-/* Hardcode the hash table size. We shouldn't be needing so many
- symbols that we begin to degrade performance, and we get a big win
- by giving the compiler a constant divisor. */
-
-#define HASH_BUCKETS 521
-
-struct obj_file
-{
- ElfW(Ehdr) header;
- ElfW(Addr) baseaddr;
- struct obj_section **sections;
- struct obj_section *load_order;
- struct obj_section **load_order_search_start;
- struct obj_string_patch_struct *string_patches;
- struct obj_symbol_patch_struct *symbol_patches;
- int (*symbol_cmp)(const char *, const char *);
- unsigned long (*symbol_hash)(const char *);
- unsigned long local_symtab_size;
- struct obj_symbol **local_symtab;
- struct obj_symbol *symtab[HASH_BUCKETS];
- const char *filename;
- char *persist;
-};
-
-enum obj_reloc
-{
- obj_reloc_ok,
- obj_reloc_overflow,
- obj_reloc_dangerous,
- obj_reloc_unhandled,
- obj_reloc_constant_gp
-};
-
-struct obj_string_patch_struct
-{
- struct obj_string_patch_struct *next;
- int reloc_secidx;
- ElfW(Addr) reloc_offset;
- ElfW(Addr) string_offset;
-};
-
-struct obj_symbol_patch_struct
-{
- struct obj_symbol_patch_struct *next;
- int reloc_secidx;
- ElfW(Addr) reloc_offset;
- struct obj_symbol *sym;
-};
-
-
-/* Generic object manipulation routines. */
-
-#define obj_elf_hash ObjW(elf_hash)
-#define obj_elf_hash_n ObjW(elf_hash_n)
-#define obj_add_symbol ObjW(add_symbol)
-#define obj_find_symbol ObjW(find_symbol)
-#define obj_symbol_final_value ObjW(symbol_final_value)
-#define obj_set_symbol_compare ObjW(set_symbol_compare)
-#define obj_find_section ObjW(find_section)
-#define obj_insert_section_load_order ObjW(insert_section_load_order)
-#define obj_create_alloced_section ObjW(create_alloced_section)
-#define obj_create_alloced_section_first \
- ObjW(create_alloced_section_first)
-#define obj_extend_section ObjW(extend_section)
-#define obj_string_patch ObjW(string_patch)
-#define obj_symbol_patch ObjW(symbol_patch)
-#define obj_check_undefineds ObjW(check_undefineds)
-#define obj_clear_undefineds ObjW(clear_undefineds)
-#define obj_allocate_commons ObjW(allocate_commons)
-#define obj_load_size ObjW(load_size)
-#define obj_relocate ObjW(relocate)
-#define obj_load ObjW(load)
-#define obj_free ObjW(free)
-#define obj_create_image ObjW(create_image)
-#define obj_addr_to_native_ptr ObjW(addr_to_native_ptr)
-#define obj_native_ptr_to_addr ObjW(native_ptr_to_addr)
-#define arch_new_file ObjW(arch_new_file)
-#define arch_new_section ObjW(arch_new_section)
-#define arch_new_symbol ObjW(arch_new_symbol)
-#define arch_apply_relocation ObjW(arch_apply_relocation)
-#define arch_create_got ObjW(arch_create_got)
-#define arch_init_module ObjW(arch_init_module)
-#define arch_load_proc_section ObjW(arch_load_proc_section)
-#define arch_finalize_section_address ObjW(arch_finalize_section_address)
-#define arch_archdata ObjW(arch_archdata)
-
-unsigned long obj_elf_hash (const char *);
-
-unsigned long obj_elf_hash_n (const char *, unsigned long len);
-
-struct obj_symbol *obj_add_symbol (struct obj_file *f, const char *name,
- unsigned long symidx, int info, int secidx,
- ElfW(Addr) value, unsigned long size);
-
-struct obj_symbol *obj_find_symbol (struct obj_file *f,
- const char *name);
-
-ElfW(Addr) obj_symbol_final_value (struct obj_file *f,
- struct obj_symbol *sym);
-
-void obj_set_symbol_compare (struct obj_file *f,
- int (*cmp)(const char *, const char *),
- unsigned long (*hash)(const char *));
-
-struct obj_section *obj_find_section (struct obj_file *f,
- const char *name);
-
-void obj_insert_section_load_order (struct obj_file *f,
- struct obj_section *sec);
-
-struct obj_section *obj_create_alloced_section (struct obj_file *f,
- const char *name,
- unsigned long align,
- unsigned long size);
-
-struct obj_section *obj_create_alloced_section_first (struct obj_file *f,
- const char *name,
- unsigned long align,
- unsigned long size);
-
-void *obj_extend_section (struct obj_section *sec, unsigned long more);
-
-int obj_string_patch (struct obj_file *f, int secidx, ElfW(Addr) offset,
- const char *string);
-
-int obj_symbol_patch (struct obj_file *f, int secidx, ElfW(Addr) offset,
- struct obj_symbol *sym);
-
-int obj_check_undefineds (struct obj_file *f, int quiet);
-
-void obj_clear_undefineds (struct obj_file *f);
-
-void obj_allocate_commons (struct obj_file *f);
-
-unsigned long obj_load_size (struct obj_file *f);
-
-int obj_relocate (struct obj_file *f, ElfW(Addr) base);
-
-struct obj_file *obj_load (int f, Elf32_Half e_type, const char *filename);
-
-void obj_free (struct obj_file *f);
-
-int obj_create_image (struct obj_file *f, char *image);
-
-int obj_kallsyms (struct obj_file *fin, struct obj_file **fout);
-
-/* Architecture specific manipulation routines. */
-
-struct obj_file *arch_new_file (void);
-
-struct obj_section *arch_new_section (void);
-
-struct obj_symbol *arch_new_symbol (void);
-
-enum obj_reloc arch_apply_relocation (struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- ElfW(RelM) *rel, ElfW(Addr) value);
-
-int arch_create_got (struct obj_file *f);
-
-struct module;
-int arch_init_module (struct obj_file *f, struct module *);
-
-int arch_load_proc_section (struct obj_section *sec, int fp);
-
-int arch_finalize_section_address (struct obj_file *f, ElfW(Addr) base);
-
-int arch_archdata (struct obj_file *fin, struct obj_section *sec);
-
-#define ARCHDATA_SEC_NAME "__archdata"
-
-/* Pointers in objects can be 32 or 64 bit */
-union obj_ptr_4 {
- Elf32_Word addr;
- void *ptr;
-};
-union obj_ptr_8 {
- Elf64_Xword addr;
- void *ptr;
-};
-
-void *obj_addr_to_native_ptr(ElfW(Addr));
-
-ElfW(Addr) obj_native_ptr_to_addr(void *);
-
-#endif /* obj.h */
diff --git a/mdk-stage1/insmod-modutils/include/util.h b/mdk-stage1/insmod-modutils/include/util.h
deleted file mode 100644
index b2e4a67c3..000000000
--- a/mdk-stage1/insmod-modutils/include/util.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Miscelaneous utility functions.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-
-#ifndef MODUTILS_UTIL_H
-#define MODUTILS_UTIL_H 1
-
-#ident "$Id$"
-
-#include <stdio.h>
-#include <sys/stat.h>
-
-#define SHELL_META "&();|<>$`\"'\\!{}[]~=+:?*" /* Sum of bj0rn and Debian */
-
-void *xmalloc(size_t);
-void *xrealloc(void *, size_t);
-char *xstrdup(const char *);
-char *xstrcat(char *, const char *, size_t);
-int xsystem(const char *, char *const[]);
-int arch64(void);
-
-typedef int (*xftw_func_t)(const char *, const struct stat *);
-extern int xftw(const char *directory, xftw_func_t);
-
-/* Error logging */
-extern int log;
-extern int errors;
-extern const char *error_file;
-
-extern int flag_verbose;
-extern void verbose(const char *ctl,...);
-
-void error(const char *fmt, ...)
-#ifdef __GNUC__
- __attribute__((format(printf, 1, 2)))
-#endif
- ;
-
-void lprintf(const char *fmt, ...)
-#ifdef __GNUC__
- __attribute__((format(printf, 1, 2)))
-#endif
- ;
-
-void setsyslog(const char *program);
-
-/*
- * Generic globlist <bj0rn@blox.se>
- */
-typedef struct {
- int pathc; /* Count of paths matched so far */
- char **pathv; /* List of matched pathnames. */
-} GLOB_LIST;
-int meta_expand(char *pt, GLOB_LIST *g, char *base_dir, char *version, int type);
-#define ME_BUILTIN_COMMAND 1
-#define ME_SHELL_COMMAND 2
-#define ME_GLOB 4
-#define ME_ALL (ME_GLOB|ME_SHELL_COMMAND|ME_BUILTIN_COMMAND)
-
-extern void snap_shot(const char *module_name, int number);
-extern void snap_shot_log(const char *fmt,...);
-
-#ifdef CONFIG_USE_ZLIB
-int gzf_open(const char *name, int mode);
-int gzf_read(int fd, void *buf, size_t count);
-off_t gzf_lseek(int fd, off_t offset, int whence);
-void gzf_close(int fd);
-
-#else /* ! CONFIG_USE_ZLIB */
-
-#include <unistd.h>
-
-#define gzf_open open
-#define gzf_read read
-#define gzf_lseek lseek
-#define gzf_close close
-
-#endif /* CONFIG_USE_ZLIB */
-
-#define SYMPREFIX "__insmod_";
-extern const char symprefix[10]; /* Must be sizeof(SYMPREFIX), including nul */
-
-#endif /* util.h */
diff --git a/mdk-stage1/insmod-modutils/include/version.h b/mdk-stage1/insmod-modutils/include/version.h
deleted file mode 100644
index 51ca0eb29..000000000
--- a/mdk-stage1/insmod-modutils/include/version.h
+++ /dev/null
@@ -1 +0,0 @@
-#define MODUTILS_VERSION "2.4.2"
diff --git a/mdk-stage1/insmod-modutils/insmod.c b/mdk-stage1/insmod-modutils/insmod.c
deleted file mode 100644
index 359b28837..000000000
--- a/mdk-stage1/insmod-modutils/insmod.c
+++ /dev/null
@@ -1,1964 +0,0 @@
-/* Insert a module into a running kernel.
- Copyright 1996, 1997 Linux International.
-
- New implementation contributed by Richard Henderson <rth@tamu.edu>
- Based on original work by Bjorn Ekwall <bj0rn@blox.se>
- Restructured (and partly rewritten) by:
- Björn Ekwall <bj0rn@blox.se> February 1999
-
- This file is part of the Linux modutils.
-
- 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.
- */
-
- /*
- Fixes:
-
- Adjust module size for mod_use_count in old_init_module:
- B. James Phillippe <bryan@terran.org>
-
- Merged modprobe + many fixes: Björn Ekwall <bj0rn@blox.se> February 1999
- SMP "friendliness" (and -P): Bill Zumach <zumach+@transarc.com>
-
- Ksymoops support: Keith Owens <kaos@ocs.com.au> August 1999.
-
- Add -r flag: Keith Owens <kaos@ocs.com.au> October 1999.
-
- More flexible recognition of the way the utility was called.
- Suggested by Stepan Kasal, implemented in a different way by Keith
- Owens <kaos@ocs.com.au> December 1999.
-
- Rationalize common code for 32/64 bit architectures.
- Keith Owens <kaos@ocs.com.au> December 1999.
- Add arch64().
- Keith Owens <kaos@ocs.com.au> December 1999.
- kallsyms support
- Keith Owens <kaos@ocs.com.au> April 2000.
- archdata support
- Keith Owens <kaos@ocs.com.au> August 2000.
- Add insmod -O, move print map before sys_init_module.
- Keith Owens <kaos@ocs.com.au> October 2000.
- Add insmod -S.
- Keith Owens <kaos@ocs.com.au> November 2000.
- Add persistent data support.
- Keith Owens <kaos@ocs.com.au> November 2000.
- */
-
-#ident "$Id$"
-
-#include "../insmod.h"
-#include <sys/types.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-//#include <alloca.h> provided by stdlib
-#include <limits.h>
-#include <ctype.h>
-#include <errno.h>
-#include <stddef.h>
-#include <getopt.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-
-#include "module.h"
-#include "obj.h"
-#include "kallsyms.h"
-#include "util.h"
-#include "version.h"
-
-#include "modstat.h"
-#include "config.h"
-
-#define STRVERSIONLEN 32
-
-/*======================================================================*/
-
-static int flag_force_load = 0;
-static int flag_silent_probe = 0;
-static int flag_export = 1;
-static int flag_load_map = 0;
-static int flag_ksymoops = 1;
-
-static int n_ext_modules_used;
-static int m_has_modinfo;
-
-extern int insmod_main(int argc, char **argv);
-extern int insmod_main_32(int argc, char **argv);
-extern int insmod_main_64(int argc, char **argv);
-extern int modprobe_main(int argc, char **argv);
-extern int rmmod_main(int argc, char **argv);
-extern int ksyms_main(int argc, char **argv);
-extern int lsmod_main(int argc, char **argv);
-extern int kallsyms_main(int argc, char **argv);
-
-/*======================================================================*/
-
-/* Get the kernel version in the canonical integer form. */
-
-static int get_kernel_version(char str[STRVERSIONLEN])
-{
- char *p, *q;
- int a, b, c;
-
- strncpy(str, uts_info.release, STRVERSIONLEN);
- p = uts_info.release;
-
- a = strtoul(p, &p, 10);
- if (*p != '.')
- return -1;
- b = strtoul(p + 1, &p, 10);
- if (*p != '.')
- return -1;
- c = strtoul(p + 1, &q, 10);
- if (p + 1 == q)
- return -1;
-
- return a << 16 | b << 8 | c;
-}
-
-/* String comparison for non-co-versioned kernel and module.
- * prefix should be the same as used by genksyms for this kernel.
- */
-static char *ncv_prefix = NULL; /* Overridden by --prefix option */
-static int ncv_plen = 0;
-
-/* Only set prefix once. If set by the user, use it. If not set by the
- * user, look for a well known kernel symbol and derive the prefix from
- * there. Otherwise set the prefix depending on whether uts_info
- * includes SMP or not for backwards compatibility.
- */
-static void set_ncv_prefix(char *prefix)
-{
- static char derived_prefix[256];
- static const char *well_known_symbol[] = { "get_module_symbol_R",
- "inter_module_get_R",
- };
- struct module_symbol *s;
- int i, j, l, m, pl;
- const char *name;
- char *p;
-
- if (ncv_prefix)
- return;
-
- if (prefix)
- ncv_prefix = prefix;
- else {
- /* Extract the prefix (if any) from well known symbols */
- for (i = 0, s = ksyms; i < nksyms; ++i, ++s) {
- name = (char *) s->name;
- l = strlen(name);
- for (j = 0; j < sizeof(well_known_symbol)/sizeof(well_known_symbol[0]); ++j) {
- m = strlen(well_known_symbol[j]);
- if (m + 8 > l ||
- strncmp(name, well_known_symbol[j], m))
- continue;
- pl = l - m - 8;
- if (pl > sizeof(derived_prefix)-1)
- continue; /* Prefix is wrong length */
- /* Must end with 8 hex digits */
- (void) strtoul(name+l-8, &p, 16);
- if (*p == 0) {
- strncpy(derived_prefix, name+m, pl);
- *(derived_prefix+pl) = '\0';
- ncv_prefix = derived_prefix;
- break;
- }
- }
- }
- }
- if (!ncv_prefix) {
- p = strchr(uts_info.version, ' ');
- if (p && *(++p) && !strncmp(p, "SMP ", 4))
- ncv_prefix = "smp_";
- else
- ncv_prefix = "";
- }
- ncv_plen = strlen(ncv_prefix);
- if (flag_verbose)
- lprintf("Symbol version prefix '%s'", ncv_prefix);
-}
-
-static int ncv_strcmp(const char *a, const char *b)
-{
- size_t alen = strlen(a), blen = strlen(b);
-
- if (blen == alen + 10 + ncv_plen &&
- b[alen] == '_' &&
- b[alen + 1] == 'R' &&
- !(ncv_plen && strncmp(b + alen + 2, ncv_prefix, ncv_plen))) {
- return strncmp(a, b, alen);
- } else if (alen == blen + 10 + ncv_plen &&
- a[blen] == '_' && a[blen + 1] == 'R' &&
- !(ncv_plen && strncmp(a + blen + 2, ncv_prefix, ncv_plen))) {
- return strncmp(a, b, blen);
- } else
- return strcmp(a, b);
-}
-
-/*
- * String hashing for non-co-versioned kernel and module.
- * Here we are simply forced to drop the crc from the hash.
- */
-static unsigned long ncv_symbol_hash(const char *str)
-{
- size_t len = strlen(str);
-
- if (len > 10 + ncv_plen &&
- str[len - 10 - ncv_plen] == '_' &&
- str[len - 9 - ncv_plen] == 'R' &&
- !(
- ncv_plen &&
- strncmp(str + len - (8 + ncv_plen), ncv_prefix, ncv_plen)
- ))
- len -= 10 + ncv_plen;
- return obj_elf_hash_n(str, len);
-}
-
-/*
- * Conditionally add the symbols from the given symbol set
- * to the new module.
- */
-static int add_symbols_from(struct obj_file *f, int idx,
- struct module_symbol *syms, size_t nsyms)
-{
- struct module_symbol *s;
- size_t i;
- int used = 0;
-
- for (i = 0, s = syms; i < nsyms; ++i, ++s) {
- /*
- * Only add symbols that are already marked external.
- * If we override locals we may cause problems for
- * argument initialization.
- * We will also create a false dependency on the module.
- */
- struct obj_symbol *sym;
-
- sym = obj_find_symbol(f, (char *) s->name);
- if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) {
- sym = obj_add_symbol(f, (char *) s->name, -1,
- ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE),
- idx, s->value, 0);
- /*
- * Did our symbol just get installed?
- * If so, mark the module as "used".
- */
- if (sym->secidx == idx)
- used = 1;
- }
- }
-
- return used;
-}
-
-static void add_kernel_symbols(struct obj_file *f)
-{
- struct module_stat *m;
- size_t i, nused = 0;
-
- /* Add module symbols first. */
- for (i = 0, m = module_stat; i < n_module_stat; ++i, ++m)
- if (m->nsyms &&
- add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, m->nsyms))
- m->status = 1 /* used */, ++nused;
- n_ext_modules_used = nused;
-
- /* And finally the symbols from the kernel proper. */
- if (nksyms)
- add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
-}
-
-static void hide_special_symbols(struct obj_file *f)
-{
- struct obj_symbol *sym;
- const char *const *p;
- static const char *const specials[] =
- {
- "cleanup_module",
- "init_module",
- "kernel_version",
- NULL
- };
-
- for (p = specials; *p; ++p)
- if ((sym = obj_find_symbol(f, *p)) != NULL)
- sym->info = ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info));
-}
-
-static void print_load_map(struct obj_file *f)
-{
- struct obj_symbol *sym;
- struct obj_symbol **all, **p;
- struct obj_section *sec;
- int load_map_cmp(const void *a, const void *b) {
- struct obj_symbol **as = (struct obj_symbol **) a;
- struct obj_symbol **bs = (struct obj_symbol **) b;
- unsigned long aa = obj_symbol_final_value(f, *as);
- unsigned long ba = obj_symbol_final_value(f, *bs);
- return aa < ba ? -1 : aa > ba ? 1 : 0;
- }
- int i, nsyms, *loaded;
-
- /* Report on the section layout. */
-
- lprintf("Sections: Size %-*s Align",
- (int) (2 * sizeof(void *)), "Address");
-
- for (sec = f->load_order; sec; sec = sec->load_next) {
- int a;
- unsigned long tmp;
-
- for (a = -1, tmp = sec->header.sh_addralign; tmp; ++a)
- tmp >>= 1;
- if (a == -1)
- a = 0;
-
- lprintf("%-16s%08lx %0*lx 2**%d",
- sec->name,
- (long)sec->header.sh_size,
- (int) (2 * sizeof(void *)),
- (long)sec->header.sh_addr,
- a);
- }
-
- /* Quick reference which section indicies are loaded. */
-
- loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
- while (--i >= 0)
- loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
-
- /* Collect the symbols we'll be listing. */
-
- for (nsyms = i = 0; i < HASH_BUCKETS; ++i)
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (sym->secidx <= SHN_HIRESERVE
- && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
- ++nsyms;
-
- all = alloca(nsyms * sizeof(struct obj_symbol *));
-
- for (i = 0, p = all; i < HASH_BUCKETS; ++i)
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (sym->secidx <= SHN_HIRESERVE
- && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
- *p++ = sym;
-
- /* Sort them by final value. */
- qsort(all, nsyms, sizeof(struct obj_file *), load_map_cmp);
-
- /* And list them. */
- lprintf("\nSymbols:");
- for (p = all; p < all + nsyms; ++p) {
- char type = '?';
- unsigned long value;
-
- sym = *p;
- if (sym->secidx == SHN_ABS) {
- type = 'A';
- value = sym->value;
- } else if (sym->secidx == SHN_UNDEF) {
- type = 'U';
- value = 0;
- } else {
- struct obj_section *sec = f->sections[sym->secidx];
-
- if (sec->header.sh_type == SHT_NOBITS)
- type = 'B';
- else if (sec->header.sh_flags & SHF_ALLOC) {
- if (sec->header.sh_flags & SHF_EXECINSTR)
- type = 'T';
- else if (sec->header.sh_flags & SHF_WRITE)
- type = 'D';
- else
- type = 'R';
- }
- value = sym->value + sec->header.sh_addr;
- }
-
- if (ELFW(ST_BIND) (sym->info) == STB_LOCAL)
- type = tolower(type);
-
- lprintf("%0*lx %c %s", (int) (2 * sizeof(void *)), value,
- type, sym->name);
- }
-}
-
-/************************************************************************/
-/* begin compat */
-
-static char * get_modinfo_value(struct obj_file *f, const char *key)
-{
- struct obj_section *sec;
- char *p, *v, *n, *ep;
- size_t klen = strlen(key);
-
- sec = obj_find_section(f, ".modinfo");
- if (sec == NULL)
- return NULL;
-
- p = sec->contents;
- ep = p + sec->header.sh_size;
- while (p < ep) {
- v = strchr(p, '=');
- n = strchr(p, '\0');
- if (v) {
- if (v - p == klen && strncmp(p, key, klen) == 0)
- return v + 1;
- } else {
- if (n - p == klen && strcmp(p, key) == 0)
- return n;
- }
- p = n + 1;
- }
-
- return NULL;
-}
-
-static int create_this_module(struct obj_file *f, const char *m_name)
-{
- struct obj_section *sec;
-
- sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
- sizeof(struct module));
- memset(sec->contents, 0, sizeof(struct module));
-
- obj_add_symbol(f, "__this_module", -1, ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT),
- sec->idx, 0, sizeof(struct module));
-
- obj_string_patch(f, sec->idx, offsetof(struct module, name), m_name);
-
- return 1;
-}
-
-#ifdef COMPAT_2_0
-static int old_create_mod_use_count(struct obj_file *f)
-{
- struct obj_section *sec;
- struct obj_symbol *got;
-
- sec = obj_create_alloced_section_first(f, ".moduse",
- sizeof(long), sizeof(long));
-
- obj_add_symbol(f, "mod_use_count_",
- -1, ELFW(ST_INFO)(STB_LOCAL, STT_OBJECT),
- sec->idx, 0, sizeof(long));
-
- /*
- * patb: if there is a _GLOBAL_OFFSET_TABLE_,
- * add .got section for PIC type modules;
- * we have to do this here, because obj_* calls are not made until
- * after obj_check_undefined
- * is there a better place for this exception?
- */
- got = obj_find_symbol(f, "_GLOBAL_OFFSET_TABLE_");
- if (got)
-{
- sec = obj_create_alloced_section(f, ".got",
- sizeof(long), sizeof(long));
- got->secidx = sec->idx; /* mark the symbol as defined */
- }
- return 1;
-}
-#endif
-
-/* add an entry to the __ksymtab section, creating it if necessary */
-static void add_ksymtab(struct obj_file *f, struct obj_symbol *sym)
-{
- struct obj_section *sec;
- ElfW(Addr) ofs;
-
- /* ensure __ksymtab is allocated, EXPORT_NOSYMBOLS creates a non-alloc section.
- * If __ksymtab is defined but not marked alloc, x out the first character
- * (no obj_delete routine) and create a new __ksymtab with the correct
- * characteristics.
- */
- sec = obj_find_section(f, "__ksymtab");
- if (sec && !(sec->header.sh_flags & SHF_ALLOC)) {
- *((char *)(sec->name)) = 'x'; /* override const */
- sec = NULL;
- }
- if (!sec)
- sec = obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, 0);
- if (!sec)
- return;
- sec->header.sh_flags |= SHF_ALLOC;
-
- ofs = sec->header.sh_size;
- obj_symbol_patch(f, sec->idx, ofs, sym);
- obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, sym->name);
- obj_extend_section(sec, 2 * tgt_sizeof_char_p);
-}
-
-static int create_module_ksymtab(struct obj_file *f)
-{
- struct obj_section *sec;
- int i;
-
- /* We must always add the module references. */
-
- if (n_ext_modules_used) {
- struct module_ref *dep;
- struct obj_symbol *tm;
-
- sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
- (sizeof(struct module_ref)
- * n_ext_modules_used));
- if (!sec)
- return 0;
-
- tm = obj_find_symbol(f, "__this_module");
- dep = (struct module_ref *) sec->contents;
- for (i = 0; i < n_module_stat; ++i)
- if (module_stat[i].status /* used */) {
- dep->dep = module_stat[i].addr;
- obj_symbol_patch(f, sec->idx, (char *) &dep->ref - sec->contents, tm);
- dep->next_ref = 0;
- ++dep;
- }
- }
- if (flag_export && !obj_find_section(f, "__ksymtab")) {
- int *loaded;
-
- /* We don't want to export symbols residing in sections that
- aren't loaded. There are a number of these created so that
- we make sure certain module options don't appear twice. */
-
- loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
- while (--i >= 0)
- loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
-
- for (i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym; sym = sym->next) {
- if (ELFW(ST_BIND) (sym->info) != STB_LOCAL
- && sym->secidx <= SHN_HIRESERVE
- && (sym->secidx >= SHN_LORESERVE
- || loaded[sym->secidx])) {
- add_ksymtab(f, sym);
- }
- }
- }
- }
- return 1;
-}
-
-/* Get the module's kernel version in the canonical integer form. */
-static int get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
-{
- int a, b, c;
- char *p, *q;
-
- if ((p = get_modinfo_value(f, "kernel_version")) == NULL) {
- struct obj_symbol *sym;
-
- m_has_modinfo = 0;
- if ((sym = obj_find_symbol(f, "kernel_version")) == NULL)
- sym = obj_find_symbol(f, "__module_kernel_version");
- if (sym == NULL)
- return -1;
- p = f->sections[sym->secidx]->contents + sym->value;
- } else
- m_has_modinfo = 1;
-
- strncpy(str, p, STRVERSIONLEN);
-
- a = strtoul(p, &p, 10);
- if (*p != '.')
- return -1;
- b = strtoul(p + 1, &p, 10);
- if (*p != '.')
- return -1;
- c = strtoul(p + 1, &q, 10);
- if (p + 1 == q)
- return -1;
-
- return a << 16 | b << 8 | c;
-}
-
-/* Return the kernel symbol checksum version, or zero if not used. */
-static int is_kernel_checksummed(void)
-{
- struct module_symbol *s;
- size_t i;
-
- /*
- * Using_Versions might not be the first symbol,
- * but it should be in there.
- */
- for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
- if (strcmp((char *) s->name, "Using_Versions") == 0)
- return s->value;
-
- return 0;
-}
-
-static int is_module_checksummed(struct obj_file *f)
-{
- if (m_has_modinfo) {
- const char *p = get_modinfo_value(f, "using_checksums");
- if (p)
- return atoi(p);
- else
- return 0;
- } else
- return obj_find_symbol(f, "Using_Versions") != NULL;
-}
-
-/* add module source, timestamp, kernel version and a symbol for the
- * start of some sections. this info is used by ksymoops to do better
- * debugging.
- */
-static void add_ksymoops_symbols(struct obj_file *f, const char *filename,
- const char *m_name)
-{
- struct obj_section *sec;
- struct obj_symbol *sym;
- char *name, *absolute_filename;
- char str[STRVERSIONLEN], real[PATH_MAX];
- int i, l, lm_name, lfilename, use_ksymtab, version;
- struct stat statbuf;
-
- static const char *section_names[] = {
- ".text",
- ".rodata",
- ".data",
- ".bss"
- };
-
- if (realpath(filename, real)) {
- absolute_filename = xstrdup(real);
- }
- else {
- int save_errno = errno;
- error("cannot get realpath for %s", filename);
- errno = save_errno;
- absolute_filename = xstrdup(filename);
- }
-
- lm_name = strlen(m_name);
- lfilename = strlen(absolute_filename);
-
- /* add to ksymtab if it already exists or there is no ksymtab and other symbols
- * are not to be exported. otherwise leave ksymtab alone for now, the
- * "export all symbols" compatibility code will export these symbols later.
- */
-
- use_ksymtab = obj_find_section(f, "__ksymtab") || !flag_export;
-
- if ((sec = obj_find_section(f, ".this"))) {
- /* tag the module header with the object name, last modified
- * timestamp and module version. worst case for module version
- * is 0xffffff, decimal 16777215. putting all three fields in
- * one symbol is less readable but saves kernel space.
- */
- l = sizeof(symprefix)+ /* "__insmod_" */
- lm_name+ /* module name */
- 2+ /* "_O" */
- lfilename+ /* object filename */
- 2+ /* "_M" */
- 2*sizeof(statbuf.st_mtime)+ /* mtime in hex */
- 2+ /* "_V" */
- 8+ /* version in dec */
- 1; /* nul */
- name = xmalloc(l);
- if (stat(absolute_filename, &statbuf) != 0)
- statbuf.st_mtime = 0;
- version = get_module_version(f, str); /* -1 if not found */
- snprintf(name, l, "%s%s_O%s_M%0*lX_V%d",
- symprefix, m_name, absolute_filename,
- 2*sizeof(statbuf.st_mtime), statbuf.st_mtime,
- version);
- sym = obj_add_symbol(f, name, -1,
- ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE),
- sec->idx, sec->header.sh_addr, 0);
- if (use_ksymtab)
- add_ksymtab(f, sym);
- }
- free(absolute_filename);
-
- /* record where the persistent data is going, same address as previous symbol */
-
- if (f->persist) {
- l = sizeof(symprefix)+ /* "__insmod_" */
- lm_name+ /* module name */
- 2+ /* "_P" */
- strlen(f->persist)+ /* data store */
- 1; /* nul */
- name = xmalloc(l);
- snprintf(name, l, "%s%s_P%s",
- symprefix, m_name, f->persist);
- sym = obj_add_symbol(f, name, -1, ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE),
- sec->idx, sec->header.sh_addr, 0);
- if (use_ksymtab)
- add_ksymtab(f, sym);
- }
-
- /* tag the desired sections if size is non-zero */
-
- for (i = 0; i < sizeof(section_names)/sizeof(section_names[0]); ++i) {
- if ((sec = obj_find_section(f, section_names[i])) &&
- sec->header.sh_size) {
- l = sizeof(symprefix)+ /* "__insmod_" */
- lm_name+ /* module name */
- 2+ /* "_S" */
- strlen(sec->name)+ /* section name */
- 2+ /* "_L" */
- 8+ /* length in dec */
- 1; /* nul */
- name = xmalloc(l);
- snprintf(name, l, "%s%s_S%s_L%ld",
- symprefix, m_name, sec->name,
- (long)sec->header.sh_size);
- sym = obj_add_symbol(f, name, -1, ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE),
- sec->idx, sec->header.sh_addr, 0);
- if (use_ksymtab)
- add_ksymtab(f, sym);
- }
- }
-}
-
-static int process_module_arguments(struct obj_file *f, int argc, char **argv, int required)
-{
- for (; argc > 0; ++argv, --argc) {
- struct obj_symbol *sym;
- int c;
- int min, max;
- int n;
- char *contents;
- char *input;
- char *fmt;
- char *key;
- char *loc;
-
- if ((input = strchr(*argv, '=')) == NULL)
- continue;
-
- n = input - *argv;
- input += 1; /* skip '=' */
-
- key = alloca(n + 6);
-
- if (m_has_modinfo) {
- memcpy(key, "parm_", 5);
- memcpy(key + 5, *argv, n);
- key[n + 5] = '\0';
- if ((fmt = get_modinfo_value(f, key)) == NULL) {
- if (required) {
- error("invalid parameter %s", key);
- return 0;
- }
- else {
- if (flag_verbose)
- lprintf("ignoring %s", *argv);
- continue; /* silently ignore optional parameters */
- }
- }
- key += 5;
-
- if (isdigit(*fmt)) {
- min = strtoul(fmt, &fmt, 10);
- if (*fmt == '-')
- max = strtoul(fmt + 1, &fmt, 10);
- else
- max = min;
- } else
- min = max = 1;
- } else { /* not m_has_modinfo */
- memcpy(key, *argv, n);
- key[n] = '\0';
-
- if (isdigit(*input))
- fmt = "i";
- else
- fmt = "s";
- min = max = 0;
- }
-
- sym = obj_find_symbol(f, key);
-
- /*
- * Also check that the parameter was not
- * resolved from the kernel.
- */
- if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
- error("symbol for parameter %s not found", key);
- return 0;
- }
-
- contents = f->sections[sym->secidx]->contents;
- loc = contents + sym->value;
- n = 1;
-
- while (*input) {
- char *str;
-
- switch (*fmt) {
- case 's':
- case 'c':
- /*
- * Do C quoting if we begin with a ",
- * else slurp the lot.
- */
- if (*input == '"') {
- char *r;
-
- str = alloca(strlen(input));
- for (r = str, input++; *input != '"'; ++input, ++r) {
- if (*input == '\0') {
- error("improperly terminated string argument for %s", key);
- return 0;
- }
- /* else */
- if (*input != '\\') {
- *r = *input;
- continue;
- }
- /* else handle \ */
- switch (*++input) {
- case 'a': *r = '\a'; break;
- case 'b': *r = '\b'; break;
- case 'e': *r = '\033'; break;
- case 'f': *r = '\f'; break;
- case 'n': *r = '\n'; break;
- case 'r': *r = '\r'; break;
- case 't': *r = '\t'; break;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- c = *input - '0';
- if ('0' <= input[1] && input[1] <= '7') {
- c = (c * 8) + *++input - '0';
- if ('0' <= input[1] && input[1] <= '7')
- c = (c * 8) + *++input - '0';
- }
- *r = c;
- break;
-
- default: *r = *input; break;
- }
- }
- *r = '\0';
- ++input;
- } else {
- /*
- * The string is not quoted.
- * We will break it using the comma
- * (like for ints).
- * If the user wants to include commas
- * in a string, he just has to quote it
- */
- char *r;
-
- /* Search the next comma */
- if ((r = strchr(input, ',')) != NULL) {
- /*
- * Found a comma
- * Recopy the current field
- */
- str = alloca(r - input + 1);
- memcpy(str, input, r - input);
- str[r - input] = '\0';
- /* Keep next fields */
- input = r;
- } else {
- /* last string */
- str = input;
- input = "";
- }
- }
-
- if (*fmt == 's') {
- /* Normal string */
- obj_string_patch(f, sym->secidx, loc - contents, str);
- loc += tgt_sizeof_char_p;
- } else {
- /* Array of chars (in fact, matrix !) */
- long charssize; /* size of each member */
-
- /* Get the size of each member */
- /* Probably we should do that outside the loop ? */
- if (!isdigit(*(fmt + 1))) {
- error("parameter type 'c' for %s must be followed by"
- " the maximum size", key);
- return 0;
- }
- charssize = strtoul(fmt + 1, (char **) NULL, 10);
-
- /* Check length */
- if (strlen(str) >= charssize-1) {
- error("string too long for %s (max %ld)",
- key, charssize - 1);
- return 0;
- }
- /* Copy to location */
- strcpy((char *) loc, str); /* safe, see check above */
- loc += charssize;
- }
- /*
- * End of 's' and 'c'
- */
- break;
-
- case 'b':
- *loc++ = strtoul(input, &input, 0);
- break;
-
- case 'h':
- *(short *) loc = strtoul(input, &input, 0);
- loc += tgt_sizeof_short;
- break;
-
- case 'i':
- *(int *) loc = strtoul(input, &input, 0);
- loc += tgt_sizeof_int;
- break;
-
- case 'l':
- *(long *) loc = strtoul(input, &input, 0);
- loc += tgt_sizeof_long;
- break;
-
- default:
- error("unknown parameter type '%c' for %s",
- *fmt, key);
- return 0;
- }
- /*
- * end of switch (*fmt)
- */
-
- while (*input && isspace(*input))
- ++input;
- if (*input == '\0')
- break; /* while (*input) */
- /* else */
-
- if (*input == ',') {
- if (max && (++n > max)) {
- error("too many values for %s (max %d)", key, max);
- return 0;
- }
- ++input;
- /* continue with while (*input) */
- } else {
- error("invalid argument syntax for %s: '%c'",
- key, *input);
- return 0;
- }
- } /* end of while (*input) */
-
- if (min && (n < min)) {
- error("too few values for %s (min %d)", key, min);
- return 0;
- }
- } /* end of for (;argc > 0;) */
-
- return 1;
-}
-
-
-/* Add a kallsyms section if the kernel supports all symbols. */
-static int add_kallsyms(struct obj_file *f,
- struct obj_section **module_kallsyms, int force_kallsyms)
-{
- struct module_symbol *s;
- struct obj_file *f_kallsyms;
- struct obj_section *sec_kallsyms;
- size_t i;
- int l;
- const char *p, *pt_R;
- unsigned long start = 0, stop = 0;
-
- for (i = 0, s = ksyms; i < nksyms; ++i, ++s) {
- p = (char *)s->name;
- pt_R = strstr(p, "_R");
- if (pt_R)
- l = pt_R - p;
- else
- l = strlen(p);
- if (strncmp(p, "__start_" KALLSYMS_SEC_NAME, l) == 0)
- start = s->value;
- else if (strncmp(p, "__stop_" KALLSYMS_SEC_NAME, l) == 0)
- stop = s->value;
- }
-
- if (start >= stop && !force_kallsyms)
- return(0);
-
- /* The kernel contains all symbols, do the same for this module. */
-
- /* Add an empty kallsyms section to the module if necessary */
- for (i = 0; i < f->header.e_shnum; ++i) {
- if (strcmp(f->sections[i]->name, KALLSYMS_SEC_NAME) == 0) {
- *module_kallsyms = f->sections[i];
- break;
- }
- }
- if (!*module_kallsyms)
- *module_kallsyms = obj_create_alloced_section(f, KALLSYMS_SEC_NAME, 0, 0);
-
- /* Size and populate kallsyms */
- if (obj_kallsyms(f, &f_kallsyms))
- return(1);
- sec_kallsyms = f_kallsyms->sections[KALLSYMS_IDX];
- (*module_kallsyms)->header.sh_addralign = sec_kallsyms->header.sh_addralign;
- (*module_kallsyms)->header.sh_size = sec_kallsyms->header.sh_size;
- free((*module_kallsyms)->contents);
- (*module_kallsyms)->contents = sec_kallsyms->contents;
- sec_kallsyms->contents = NULL;
- obj_free(f_kallsyms);
-
- return 0;
-}
-
-
-/* Add an arch data section if the arch wants it. */
-static int add_archdata(struct obj_file *f,
- struct obj_section **sec)
-{
- size_t i;
-
- *sec = NULL;
- /* Add an empty archdata section to the module if necessary */
- for (i = 0; i < f->header.e_shnum; ++i) {
- if (strcmp(f->sections[i]->name, ARCHDATA_SEC_NAME) == 0) {
- *sec = f->sections[i];
- break;
- }
- }
- if (!*sec)
- *sec = obj_create_alloced_section(f, ARCHDATA_SEC_NAME, 16, 0);
-
- /* Size and populate archdata */
- if (arch_archdata(f, *sec))
- return(1);
- return 0;
-}
-
-
-static int init_module(const char *m_name, struct obj_file *f,
- unsigned long m_size, const char *blob_name,
- unsigned int noload, unsigned int flag_load_map)
-{
- struct module *module;
- struct obj_section *sec;
- void *image;
- int ret = 0;
- tgt_long m_addr;
-
- sec = obj_find_section(f, ".this");
- module = (struct module *) sec->contents;
- m_addr = sec->header.sh_addr;
-
- module->size_of_struct = sizeof(*module);
- module->size = m_size;
- module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
-
- sec = obj_find_section(f, "__ksymtab");
- if (sec && sec->header.sh_size) {
- module->syms = sec->header.sh_addr;
- module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
- }
- if (n_ext_modules_used) {
- sec = obj_find_section(f, ".kmodtab");
- module->deps = sec->header.sh_addr;
- module->ndeps = n_ext_modules_used;
- }
- module->init = obj_symbol_final_value(f, obj_find_symbol(f, "init_module"));
- module->cleanup = obj_symbol_final_value(f,
- obj_find_symbol(f, "cleanup_module"));
-
- sec = obj_find_section(f, "__ex_table");
- if (sec) {
- module->ex_table_start = sec->header.sh_addr;
- module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
- }
- sec = obj_find_section(f, ".text.init");
- if (sec) {
- module->runsize = sec->header.sh_addr - m_addr;
- }
- sec = obj_find_section(f, ".data.init");
- if (sec) {
- if (!module->runsize ||
- module->runsize > sec->header.sh_addr - m_addr)
- module->runsize = sec->header.sh_addr - m_addr;
- }
- sec = obj_find_section(f, ARCHDATA_SEC_NAME);
- if (sec && sec->header.sh_size) {
- module->archdata_start = sec->header.sh_addr;
- module->archdata_end = module->archdata_start + sec->header.sh_size;
- }
- sec = obj_find_section(f, KALLSYMS_SEC_NAME);
- if (sec && sec->header.sh_size) {
- module->kallsyms_start = sec->header.sh_addr;
- module->kallsyms_end = module->kallsyms_start + sec->header.sh_size;
- }
- if (!arch_init_module(f, module))
- return 0;
-
- /*
- * Whew! All of the initialization is complete.
- * Collect the final module image and give it to the kernel.
- */
- image = xmalloc(m_size);
- obj_create_image(f, image);
-
- if (flag_load_map)
- print_load_map(f);
-
- if (blob_name) {
- int fd, l;
- fd = open(blob_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
- if (fd < 0) {
- error("open %s failed %m", blob_name);
- ret = -1;
- }
- else {
- if ((l = write(fd, image, m_size)) != m_size) {
- error("write %s failed %m", blob_name);
- ret = -1;
- }
- close(fd);
- }
- }
-
- if (ret == 0 && !noload) {
- fflush(stdout); /* Flush any debugging output */
- ret = sys_init_module(m_name, (struct module *) image);
- if (ret) {
- error("init_module: %m");
- lprintf("Hint: insmod errors can be caused by incorrect module parameters, "
- "including invalid IO or IRQ parameters");
- }
- }
-
- free(image);
-
- return ret == 0;
-}
-
-#ifdef COMPAT_2_0
-static int old_init_module(const char *m_name, struct obj_file *f,
- unsigned long m_size)
-{
- char *image;
- struct old_mod_routines routines;
- struct old_symbol_table *symtab;
- int ret;
- int nsyms = 0, strsize = 0, total;
-
- /* Create the symbol table */
- /* Size things first... */
- if (flag_export) {
- int i;
- for (i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym;
-
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (ELFW(ST_BIND) (sym->info) != STB_LOCAL &&
- sym->secidx <= SHN_HIRESERVE) {
- sym->ksymidx = nsyms++;
- strsize += strlen(sym->name) + 1;
- }
- }
- }
- total = (sizeof(struct old_symbol_table) +
- nsyms * sizeof(struct old_module_symbol) +
- n_ext_modules_used * sizeof(struct old_module_ref) +
- strsize);
- symtab = xmalloc(total);
- symtab->size = total;
- symtab->n_symbols = nsyms;
- symtab->n_refs = n_ext_modules_used;
-
- if (flag_export && nsyms) {
- struct old_module_symbol *ksym;
- char *str;
- int i;
-
- ksym = symtab->symbol;
- str = ((char *) ksym +
- nsyms * sizeof(struct old_module_symbol) +
- n_ext_modules_used * sizeof(struct old_module_ref));
-
- for (i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym; sym = sym->next)
- if (sym->ksymidx >= 0) {
- ksym->addr = obj_symbol_final_value(f, sym);
- ksym->name = (unsigned long) str - (unsigned long) symtab;
-
- str = stpcpy(str, sym->name) + 1;
- ksym++;
- }
- }
- }
-
- if (n_ext_modules_used) {
- struct old_module_ref *ref;
- int i;
-
- ref = (struct old_module_ref *)
- ((char *) symtab->symbol + nsyms * sizeof(struct old_module_symbol));
-
- for (i = 0; i < n_module_stat; ++i) {
- if (module_stat[i].status /* used */) {
- ref++->module = module_stat[i].modstruct;
- }
- }
- }
-
- /* Fill in routines. */
-
- routines.init = obj_symbol_final_value(f, obj_find_symbol(f, "init_module"));
- routines.cleanup = obj_symbol_final_value(f,
- obj_find_symbol(f, "cleanup_module"));
-
- /*
- * Whew! All of the initialization is complete.
- * Collect the final module image and give it to the kernel.
- */
- image = xmalloc(m_size);
- obj_create_image(f, image);
-
- /*
- * image holds the complete relocated module,
- * accounting correctly for mod_use_count.
- * However the old module kernel support assume that it
- * is receiving something which does not contain mod_use_count.
- */
- ret = old_sys_init_module(m_name, image + sizeof(long),
- (m_size - sizeof(long)) |
- (flag_autoclean ? OLD_MOD_AUTOCLEAN : 0),
- &routines,
- symtab);
- if (ret)
- error("init_module: %m");
-
- free(image);
- free(symtab);
-
- return ret == 0;
-}
-#endif
-/* end compat */
-/************************************************************************/
-
-/* Check that a module parameter has a reasonable definition */
-static int check_module_parameter(struct obj_file *f, char *key, char *value, int *persist_flag)
-{
- struct obj_symbol *sym;
- int min, max;
- char *p = value;
-
- sym = obj_find_symbol(f, key);
- if (sym == NULL) {
- /* FIXME: For 2.2 kernel compatibility, only issue warnings for
- * most error conditions. Make these all errors in 2.5.
- */
- lprintf("Warning: %s symbol for parameter %s not found", error_file, key);
- return(1);
- }
-
- if (isdigit(*p)) {
- min = strtoul(p, &p, 10);
- if (*p == '-')
- max = strtoul(p + 1, &p, 10);
- else
- max = min;
- } else
- min = max = 1;
-
- if (max < min) {
- lprintf("Warning: %s parameter %s has max < min!", error_file, key);
- return(1);
- }
-
- switch (*p) {
- case 'c':
- if (!isdigit(p[1])) {
- lprintf("%s parameter %s has no size after 'c'!", error_file, key);
- return(1);
- }
- while (isdigit(p[1]))
- ++p; /* swallow c array size */
- break;
- case 'b': /* drop through */
- case 'h': /* drop through */
- case 'i': /* drop through */
- case 'l': /* drop through */
- case 's':
- break;
- case '\0':
- lprintf("%s parameter %s has no format character!", error_file, key);
- return(1);
- default:
- lprintf("%s parameter %s has unknown format character '%c'", error_file, key, *p);
- return(1);
- }
- switch (*++p) {
- case 'p':
- if (*(p-1) == 's') {
- error("parameter %s is invalid persistent string", key);
- return(1);
- }
- *persist_flag = 1;
- break;
- case '\0':
- break;
- default:
- lprintf("%s parameter %s has unknown format modifier '%c'", error_file, key, *p);
- return(1);
- }
- return(0);
-}
-
-/* Check that all module parameters have reasonable definitions */
-static void check_module_parameters(struct obj_file *f, int *persist_flag)
-{
- struct obj_section *sec;
- char *ptr, *value, *n, *endptr;
- int namelen, err = 0;
-
- sec = obj_find_section(f, ".modinfo");
- if (sec == NULL) {
- /* module does not support typed parameters */
- return;
- }
-
- ptr = sec->contents;
- endptr = ptr + sec->header.sh_size;
- while (ptr < endptr && !err) {
- value = strchr(ptr, '=');
- n = strchr(ptr, '\0');
- if (value) {
- namelen = value - ptr;
- if (namelen >= 5 && strncmp(ptr, "parm_", 5) == 0
- && !(namelen > 10 && strncmp(ptr, "parm_desc_", 10) == 0)) {
- char *pname = xmalloc(namelen + 1);
- strncpy(pname, ptr + 5, namelen - 5);
- pname[namelen - 5] = '\0';
- err = check_module_parameter(f, pname, value+1, persist_flag);
- free(pname);
- }
- } else {
- if (n - ptr >= 5 && strncmp(ptr, "parm_", 5) == 0) {
- error("parameter %s found with no value", ptr);
- err = 1;
- }
- }
- ptr = n + 1;
- }
-
- if (err)
- *persist_flag = 0;
- return;
-}
-
-
-/* For common 3264 code, only compile the usage message once, in the 64 bit version */
-#if defined(COMMON_3264) && defined(ONLY_32)
-extern void insmod_usage(void); /* Use the copy in the 64 bit version */
-#else /* Common 64 bit version or any non common code - compile usage routine */
-void insmod_usage(void)
-{
- fputs("Usage:\n"
- "insmod [-fhkLmnpqrsSvVxXyY] [-e persist_name] [-o module_name] [-O blob_name] [-P prefix] module [ symbol=value ... ]\n"
- "\n"
- " module Name of a loadable kernel module ('.o' can be omitted)\n"
- " -f, --force Force loading under wrong kernel version\n"
- " -h, --help Print this message\n"
- " -k, --autoclean Make module autoclean-able\n"
- " -L, --lock Prevent simultaneous loads of the same module\n"
- " -m, --map Generate load map (so crashes can be traced)\n"
- " -n, --noload Don't load, just show\n"
- " -p, --probe Probe mode; check if the module matches the kernel\n"
- " -q, --quiet Don't print unresolved symbols\n"
- " -r, --root Allow root to load modules not owned by root\n"
- " -s, --syslog Report errors via syslog\n"
- " -S, --kallsyms Force kallsyms on module\n"
- " -v, --verbose Verbose output\n"
- " -V, --version Show version\n"
- " -x, --noexport Do not export externs\n"
- " -X, --export Do export externs (default)\n"
- " -y, --noksymoops Do not add ksymoops symbols\n"
- " -Y, --ksymoops Do add ksymoops symbols (default)\n"
- " -e persist_name\n"
- " --persist=persist_name Filename to hold any persistent data from the module\n"
- " -o NAME, --name=NAME Set internal module name to NAME\n"
- " -O NAME, --blob=NAME Save the object as a binary blob in NAME\n"
- " -P PREFIX\n"
- " --prefix=PREFIX Prefix for kernel or module symbols\n"
- ,stderr);
- exit(1);
-}
-#endif /* defined(COMMON_3264) && defined(ONLY_32) */
-
-#if defined(COMMON_3264) && defined(ONLY_32)
-#define INSMOD_MAIN insmod_main_32 /* 32 bit version */
-#elif defined(COMMON_3264) && defined(ONLY_64)
-#define INSMOD_MAIN insmod_main_64 /* 64 bit version */
-#else
-#define INSMOD_MAIN insmod_main /* Not common code */
-#endif
-
-int INSMOD_MAIN(int argc, char **argv)
-{
- int k_version;
- int k_crcs;
- char k_strversion[STRVERSIONLEN];
- struct option long_opts[] = {
- {"force", 0, 0, 'f'},
- {"help", 0, 0, 'h'},
- {"autoclean", 0, 0, 'k'},
- {"lock", 0, 0, 'L'},
- {"map", 0, 0, 'm'},
- {"noload", 0, 0, 'n'},
- {"probe", 0, 0, 'p'},
- {"poll", 0, 0, 'p'}, /* poll is deprecated, remove in 2.5 */
- {"quiet", 0, 0, 'q'},
- {"root", 0, 0, 'r'},
- {"syslog", 0, 0, 's'},
- {"kallsyms", 0, 0, 'S'},
- {"verbose", 0, 0, 'v'},
- {"version", 0, 0, 'V'},
- {"noexport", 0, 0, 'x'},
- {"export", 0, 0, 'X'},
- {"noksymoops", 0, 0, 'y'},
- {"ksymoops", 0, 0, 'Y'},
-
- {"persist", 1, 0, 'e'},
- {"name", 1, 0, 'o'},
- {"blob", 1, 0, 'O'},
- {"prefix", 1, 0, 'P'},
- {0, 0, 0, 0}
- };
- char *m_name = NULL;
- char *blob_name = NULL; /* Save object as binary blob */
- int m_version;
- ElfW(Addr) m_addr;
- unsigned long m_size;
- int m_crcs;
- char m_strversion[STRVERSIONLEN];
- char *filename;
- char *persist_name = NULL; /* filename to hold any persistent data */
- int fp;
- struct obj_file *f;
- struct obj_section *kallsyms = NULL, *archdata = NULL;
- int o;
- int noload = 0;
- int dolock = 1; /*Note: was: 0; */
- int quiet = 0;
- int exit_status = 1;
- int force_kallsyms = 0;
- int persist_parms = 0; /* does module have persistent parms? */
- int i;
-
- error_file = "insmod";
-
- /* To handle repeated calls from combined modprobe */
- errors = optind = 0;
-
- /* Process the command line. */
- while ((o = getopt_long(argc, argv, "fhkLmnpqrsSvVxXyYe:o:O:P:R:",
- &long_opts[0], NULL)) != EOF)
- switch (o) {
- case 'f': /* force loading */
- flag_force_load = 1;
- break;
- case 'h': /* Print the usage message. */
- insmod_usage();
- break;
- case 'k': /* module loaded by kerneld, auto-cleanable */
- flag_autoclean = 1;
- break;
- case 'L': /* protect against recursion. */
- dolock = 1;
- break;
- case 'm': /* generate load map */
- flag_load_map = 1;
- break;
- case 'n': /* don't load, just check */
- noload = 1;
- break;
- case 'p': /* silent probe mode */
- flag_silent_probe = 1;
- break;
- case 'q': /* Don't print unresolved symbols */
- quiet = 1;
- break;
- case 'r': /* allow root to load non-root modules */
- root_check_off = !root_check_off;
- break;
- case 's': /* start syslog */
- setsyslog("insmod");
- break;
- case 'S': /* Force kallsyms */
- force_kallsyms = 1;
- break;
- case 'v': /* verbose output */
- flag_verbose = 1;
- break;
- case 'V':
- fputs("insmod version " MODUTILS_VERSION "\n", stderr);
- break;
- case 'x': /* do not export externs */
- flag_export = 0;
- break;
- case 'X': /* do export externs */
- flag_export = 1;
- break;
- case 'y': /* do not define ksymoops symbols */
- flag_ksymoops = 0;
- break;
- case 'Y': /* do define ksymoops symbols */
- flag_ksymoops = 1;
- break;
-
- case 'e': /* persistent data filename */
- free(persist_name);
- persist_name = xstrdup(optarg);
- break;
- case 'o': /* name the output module */
- m_name = optarg;
- break;
- case 'O': /* save the output module object */
- blob_name = optarg;
- break;
- case 'P': /* use prefix on crc */
- set_ncv_prefix(optarg);
- break;
-
- default:
- insmod_usage();
- break;
- }
-
- if (optind >= argc) {
- insmod_usage();
- }
- filename = argv[optind++];
-
- if (config_read(0, NULL, "", NULL) < 0) {
- error("Failed handle configuration");
- }
-
- if (persist_name && !*persist_name &&
- (!persistdir || !*persistdir)) {
- free(persist_name);
- persist_name = NULL;
- if (flag_verbose)
- lprintf("insmod: -e \"\" ignored, no persistdir");
- }
-
- if (m_name == NULL) {
- size_t len;
- char *p;
-
- if ((p = strrchr(filename, '/')) != NULL)
- p++;
- else
- p = filename;
- len = strlen(p);
- if (len > 2 && p[len - 2] == '.' && p[len - 1] == 'o')
- len -= 2;
- else if (len > 4 && p[len - 4] == '.' && p[len - 3] == 'm'
- && p[len - 2] == 'o' && p[len - 1] == 'd')
- len -= 4;
-#ifdef CONFIG_USE_ZLIB
- else if (len > 5 && !strcmp(p + len - 5, ".o.gz"))
- len -= 5;
-#endif
-
- m_name = xmalloc(len + 1);
- memcpy(m_name, p, len);
- m_name[len] = '\0';
- }
-
- /* Locate the file to be loaded. */
- if (!strchr(filename, '/') && !strchr(filename, '.')) {
- char *tmp = search_module_path(filename);
- if (tmp == NULL) {
- error("%s: no module by that name found", filename);
- return 1;
- }
- filename = tmp;
- lprintf("Using %s", filename);
- } else if (flag_verbose)
- lprintf("Using %s", filename);
-
- /* And open it. */
- if ((fp = gzf_open(filename, O_RDONLY)) == -1) {
- error("%s: %m", filename);
- return 1;
- }
- /* Try to prevent multiple simultaneous loads. */
- if (dolock)
- flock(fp, LOCK_EX);
-
- if (!get_kernel_info(K_SYMBOLS))
- goto out;
-
- /*
- * Set the genksyms prefix if this is a versioned kernel
- * and it's not already set.
- */
- set_ncv_prefix(NULL);
-
- for (i = 0; i < n_module_stat; ++i) {
- if (strcmp(module_stat[i].name, m_name) == 0) {
- error("a module named %s already exists", m_name);
- goto out;
- }
- }
-
- error_file = filename;
- if ((f = obj_load(fp, ET_REL, filename)) == NULL)
- goto out;
-
- /* Version correspondence? */
- k_version = get_kernel_version(k_strversion);
- m_version = get_module_version(f, m_strversion);
- if (m_version == -1) {
- error("couldn't find the kernel version the module was compiled for");
- goto out;
- }
-
- k_crcs = is_kernel_checksummed();
- m_crcs = is_module_checksummed(f);
- if ((m_crcs == 0 || k_crcs == 0) &&
- strncmp(k_strversion, m_strversion, STRVERSIONLEN) != 0) {
- if (flag_force_load) {
- lprintf("Warning: kernel-module version mismatch\n"
- "\t%s was compiled for kernel version %s\n"
- "\twhile this kernel is version %s",
- filename, m_strversion, k_strversion);
- } else {
- if (!quiet)
- error("kernel-module version mismatch\n"
- "\t%s was compiled for kernel version %s\n"
- "\twhile this kernel is version %s.",
- filename, m_strversion, k_strversion);
- goto out;
- }
- }
- if (m_crcs != k_crcs)
- obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash);
-
- /* Let the module know about the kernel symbols. */
- add_kernel_symbols(f);
-
- /* Allocate common symbols, symbol tables, and string tables.
- *
- * The calls marked DEPMOD indicate the bits of code that depmod
- * uses to do a pseudo relocation, ignoring undefined symbols.
- * Any changes made to the relocation sequence here should be
- * checked against depmod.
- */
-#ifdef COMPAT_2_0
- if (k_new_syscalls
- ? !create_this_module(f, m_name)
- : !old_create_mod_use_count(f))
- goto out;
-#else
- if (!create_this_module(f, m_name))
- goto out;
-#endif
-
- if (!obj_check_undefineds(f, quiet)) /* DEPMOD, obj_clear_undefineds */
- goto out;
- obj_allocate_commons(f); /* DEPMOD */
-
- check_module_parameters(f, &persist_parms);
-
- if (optind < argc) {
- if (!process_module_arguments(f, argc - optind, argv + optind, 1))
- goto out;
- }
- arch_create_got(f); /* DEPMOD */
- hide_special_symbols(f);
-
- if (persist_parms && persist_name && *persist_name) {
- f->persist = persist_name;
- persist_name = NULL;
- }
-
- if (persist_parms &&
- persist_name && !*persist_name) {
- /* -e "". This is ugly. Take the filename, compare it against
- * each of the module paths until we find a match on the start
- * of the filename, assume the rest is the relative path. Have
- * to do it this way because modprobe uses absolute filenames
- * for module names in modules.dep and the format of modules.dep
- * does not allow for any backwards compatible changes, so there
- * is nowhere to store the relative filename. The only way this
- * should fail to calculate a relative path is "insmod ./xxx", for
- * that case the user has to specify -e filename.
- */
- int j, l = strlen(filename);
- char *relative = NULL;
- char *p;
- for (i = 0; i < nmodpath; ++i) {
- p = modpath[i].path;
- j = strlen(p);
- while (j && p[j] == '/')
- --j;
- if (j < l && strncmp(filename, p, j) == 0 && filename[j] == '/') {
- while (filename[j] == '/')
- ++j;
- relative = xstrdup(filename+j);
- break;
- }
- }
- if (relative) {
- i = strlen(relative);
- if (i > 3 && strcmp(relative+i-3, ".gz") == 0)
- relative[i -= 3] = '\0';
- if (i > 2 && strcmp(relative+i-2, ".o") == 0)
- relative[i -= 2] = '\0';
- else if (i > 4 && strcmp(relative+i-4, ".mod") == 0)
- relative[i -= 4] = '\0';
- f->persist = xmalloc(strlen(persistdir) + 1 + i + 1);
- strcpy(f->persist, persistdir); /* safe, xmalloc */
- strcat(f->persist, "/"); /* safe, xmalloc */
- strcat(f->persist, relative); /* safe, xmalloc */
- free(relative);
- }
- else
- error("Cannot calculate persistent filename");
- }
-
- if (f->persist && *(f->persist) != '/') {
- error("Persistent filenames must be absolute, ignoring '%s'",
- f->persist);
- free(f->persist);
- f->persist = NULL;
- }
-
- if (f->persist && !flag_ksymoops) {
- error("has persistent data but ksymoops symbols are not available");
- free(f->persist);
- f->persist = NULL;
- }
-
- if (f->persist && !k_new_syscalls) {
- error("has persistent data but the kernel is too old to support it");
- free(f->persist);
- f->persist = NULL;
- }
-
- if (persist_parms && flag_verbose) {
- if (f->persist)
- lprintf("Persist filename '%s'", f->persist);
- else
- lprintf("No persistent filename available");
- }
-
- if (f->persist) {
- FILE *fp = fopen(f->persist, "r");
- if (!fp) {
- if (flag_verbose)
- lprintf("Cannot open persist file '%s' %m", f->persist);
- }
- else {
- int pargc = 0;
- char *pargv[1000]; /* hard coded but big enough */
- char line[3000]; /* hard coded but big enough */
- char *p;
- while (fgets(line, sizeof(line), fp)) {
- p = strchr(line, '\n');
- if (!p) {
- error("Persistent data line is too long\n%s", line);
- break;
- }
- *p = '\0';
- p = line;
- while (isspace(*p))
- ++p;
- if (!*p || *p == '#')
- continue;
- if (pargc == sizeof(pargv)/sizeof(pargv[0])) {
- error("More than %d persistent parameters", pargc);
- break;
- }
- pargv[pargc++] = xstrdup(p);
- }
- fclose(fp);
- if (!process_module_arguments(f, pargc, pargv, 0))
- goto out;
- while (pargc--)
- free(pargv[pargc]);
- }
- }
-
- if (flag_ksymoops)
- add_ksymoops_symbols(f, filename, m_name);
-
- if (k_new_syscalls)
- create_module_ksymtab(f);
-
- /* archdata based on relocatable addresses */
- if (add_archdata(f, &archdata))
- goto out;
-
- /* kallsyms based on relocatable addresses */
- if (add_kallsyms(f, &kallsyms, force_kallsyms))
- goto out;
- /**** No symbols or sections to be changed after kallsyms above ***/
-
- if (errors)
- goto out;
-
- /* If we were just checking, we made it. */
- if (flag_silent_probe) {
- exit_status = 0;
- goto out;
- }
- /* Module has now finished growing; find its size and install it. */
- m_size = obj_load_size(f); /* DEPMOD */
-
- if (noload) {
- /* Don't bother actually touching the kernel. */
- m_addr = 0x12340000;
- } else {
- errno = 0;
- m_addr = create_module(m_name, m_size);
- switch (errno) {
- case 0:
- break;
- case EEXIST:
- if (dolock) {
- /*
- * Assume that we were just invoked
- * simultaneous with another insmod
- * and return success.
- */
- exit_status = 0;
- goto out;
- }
- error("a module named %s already exists", m_name);
- goto out;
- case ENOMEM:
- error("can't allocate kernel memory for module; needed %lu bytes",
- m_size);
- goto out;
- default:
- error("create_module: %m");
- goto out;
- }
- }
-
- /* module is already built, complete with ksymoops symbols for the
- * persistent filename. If the kernel does not support persistent data
- * then give an error but continue. It is too difficult to clean up at
- * this stage and this error will only occur on backported modules.
- * rmmod will also get an error so warn the user now.
- */
- if (f->persist && !noload) {
- struct {
- struct module m;
- int data;
- } test_read;
- memset(&test_read, 0, sizeof(test_read));
- test_read.m.size_of_struct = -sizeof(test_read.m); /* -ve size => read, not write */
- test_read.m.read_start = m_addr + sizeof(struct module);
- test_read.m.read_end = test_read.m.read_start + sizeof(test_read.data);
- if (sys_init_module(m_name, (struct module *) &test_read)) {
- int old_errors = errors;
- error("has persistent data but the kernel is too old to support it."
- " Expect errors during rmmod as well");
- errors = old_errors;
- }
- }
-
- if (!obj_relocate(f, m_addr)) { /* DEPMOD */
- if (!noload)
- delete_module(m_name);
- goto out;
- }
-
- /* Do archdata again, this time we have the final addresses */
- if (add_archdata(f, &archdata))
- goto out;
-
- /* Do kallsyms again, this time we have the final addresses */
- if (add_kallsyms(f, &kallsyms, force_kallsyms))
- goto out;
-
-#ifdef COMPAT_2_0
- if (k_new_syscalls)
- init_module(m_name, f, m_size, blob_name, noload, flag_load_map);
- else if (!noload)
- old_init_module(m_name, f, m_size);
-#else
- init_module(m_name, f, m_size, blob_name, noload, flag_load_map);
-#endif
- if (errors) {
- if (!noload)
- delete_module(m_name);
- goto out;
- }
- exit_status = 0;
-
- out:
- if (dolock)
- flock(fp, LOCK_UN);
- close(fp);
- if (!noload)
- snap_shot(NULL, 0);
-
- return exit_status;
-}
-
-/* For common 3264 code, add an overall insmod_main, in the 64 bit version. */
-#if defined(COMMON_3264) && defined(ONLY_64)
-int insmod_main(int argc, char **argv)
-{
- if (arch64())
- return insmod_main_64(argc, argv);
- else
- return insmod_main_32(argc, argv);
-}
-#endif /* defined(COMMON_3264) && defined(ONLY_64) */
-
-
-
-int insmod_call(char * full_filename, char * params)
-{
- int argc = 2;
- char *argv[50];
- char * ptr = params;
- argv[0] = "stage1";
- argv[1] = full_filename;
-
- while (ptr != NULL) {
- argv[argc] = ptr;
- argc++;
- ptr = strchr(ptr, ' ');
- if (ptr) {
- ptr[0] = '\0';
- ptr++;
- }
- }
-
- return insmod_main(argc, argv);
-}
diff --git a/mdk-stage1/insmod-modutils/obj/Makefile b/mdk-stage1/insmod-modutils/obj/Makefile
deleted file mode 100644
index 9bcf8bac8..000000000
--- a/mdk-stage1/insmod-modutils/obj/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
- #******************************************************************************
- #
- # insmod from modutils (generic)
- #
- # $Id$
- #
- # Copyright 1996, 1997 Linux International.
- #
- #*****************************************************************************
-
-top_dir = ../..
-
-include $(top_dir)/Makefile.common
-
-
-all: libobj.a
-
-clean:
- rm -f *.o *.a
-
-
-FLAGS = -c -Wall -Os -fomit-frame-pointer -I./../include -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) -DCONFIG_ROOT_CHECK_OFF=0
-
-OBJS = obj_kallsyms.o obj_common.o obj_load.o obj_reloc.o obj_$(ARCH).o
-
-libobj.a: $(OBJS)
- ar cru $@ $^
- ranlib $@
-
-.c.o:
- gcc $(FLAGS) $(GLIBC_INCLUDES) -c $<
diff --git a/mdk-stage1/insmod-modutils/obj/obj_alpha.c b/mdk-stage1/insmod-modutils/obj/obj_alpha.c
deleted file mode 100644
index 4006b3442..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_alpha.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/* Alpha specific support for Elf loading and relocation.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <string.h>
-#include <assert.h>
-
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-/*======================================================================*/
-
-struct alpha_got_entry
-{
- struct alpha_got_entry *next;
- ElfW(Addr) addend;
- int offset;
- int reloc_done;
-};
-
-struct alpha_file
-{
- struct obj_file root;
- struct obj_section *got;
-};
-
-struct alpha_symbol
-{
- struct obj_symbol root;
- struct alpha_got_entry *got_entries;
-};
-
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- struct alpha_file *f;
- f = xmalloc(sizeof(*f));
- f->got = NULL;
- return &f->root;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- struct alpha_symbol *sym;
- sym = xmalloc(sizeof(*sym));
- sym->got_entries = NULL;
- return &sym->root;
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf64_Rela *rel,
- Elf64_Addr v)
-{
- struct alpha_file *af = (struct alpha_file *)f;
- struct alpha_symbol *asym = (struct alpha_symbol *)sym;
-
- unsigned long *lloc = (unsigned long *)(targsec->contents + rel->r_offset);
- unsigned int *iloc = (unsigned int *)lloc;
- Elf64_Addr dot = targsec->header.sh_addr + rel->r_offset;
- Elf64_Addr gp = af->got->header.sh_addr + 0x8000;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF64_R_TYPE(rel->r_info))
- {
- case R_ALPHA_NONE:
- case R_ALPHA_LITUSE:
- break;
-
- case R_ALPHA_REFQUAD:
- *lloc += v;
- break;
-
- case R_ALPHA_GPREL32:
- v -= gp;
- if ((Elf64_Sxword)v > 0x7fffffff
- || (Elf64_Sxword)v < -(Elf64_Sxword)0x80000000)
- ret = obj_reloc_overflow;
- *iloc = v;
- break;
-
- case R_ALPHA_LITERAL:
- {
- struct alpha_got_entry *gotent;
-
- assert(asym != NULL);
- gotent = asym->got_entries;
- while (gotent->addend != rel->r_addend)
- gotent = gotent->next;
-
- if (!gotent->reloc_done)
- {
- *(unsigned long *)(af->got->contents + gotent->offset) = v;
- gotent->reloc_done = 1;
- }
-
- *iloc = (*iloc & ~0xffff) | ((gotent->offset - 0x8000) & 0xffff);
- }
- break;
-
- case R_ALPHA_GPDISP:
- {
- unsigned int *p_ldah, *p_lda;
- unsigned int i_ldah, i_lda, hi, lo;
-
- p_ldah = iloc;
- p_lda = (unsigned int *)((char *)iloc + rel->r_addend);
- i_ldah = *p_ldah;
- i_lda = *p_lda;
-
- /* Make sure the instructions are righteous. */
- if ((i_ldah >> 26) != 9 || (i_lda >> 26) != 8)
- ret = obj_reloc_dangerous;
-
- /* Extract the existing addend. */
- v = (i_ldah & 0xffff) << 16 | (i_lda & 0xffff);
- v = (v ^ 0x80008000) - 0x80008000;
-
- v += gp - dot;
-
- if ((Elf64_Sxword)v >= 0x7fff8000
- || (Elf64_Sxword)v < -(Elf64_Sxword)0x80000000)
- ret = obj_reloc_overflow;
-
- /* Modify the instructions and finish up. */
- lo = v & 0xffff;
- hi = ((v >> 16) + ((v >> 15) & 1)) & 0xffff;
-
- *p_ldah = (i_ldah & 0xffff0000) | hi;
- *p_lda = (i_lda & 0xffff0000) | lo;
- }
- break;
-
- case R_ALPHA_BRADDR:
- v -= dot + 4;
- if (v % 4)
- ret = obj_reloc_dangerous;
- else if ((Elf64_Sxword)v > 0x3fffff
- || (Elf64_Sxword)v < -(Elf64_Sxword)0x400000)
- ret = obj_reloc_overflow;
- v /= 4;
-
- *iloc = (*iloc & ~0x1fffff) | (v & 0x1fffff);
- break;
-
- case R_ALPHA_HINT:
- v -= dot + 4;
- if (v % 4)
- ret = obj_reloc_dangerous;
- v /= 4;
-
- *iloc = (*iloc & ~0x3fff) | (v & 0x3fff);
- break;
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *f)
-{
- struct alpha_file *af = (struct alpha_file *)f;
- int i, n, offset = 0;
-
- n = af->root.header.e_shnum;
- for (i = 0; i < n; ++i)
- {
- struct obj_section *relsec, *symsec, *strsec;
- Elf64_Rela *rel, *relend;
- Elf64_Sym *symtab;
- const char *strtab;
-
- relsec = af->root.sections[i];
- if (relsec->header.sh_type != SHT_RELA)
- continue;
-
- symsec = af->root.sections[relsec->header.sh_link];
- strsec = af->root.sections[symsec->header.sh_link];
-
- rel = (Elf64_Rela *)relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela));
- symtab = (Elf64_Sym *)symsec->contents;
- strtab = (const char *)strsec->contents;
-
- for (; rel < relend; ++rel)
- {
- struct alpha_got_entry *ent;
- Elf64_Sym *extsym;
- struct alpha_symbol *intsym;
- const char *name;
-
- if (ELF64_R_TYPE(rel->r_info) != R_ALPHA_LITERAL)
- continue;
-
- extsym = &symtab[ELF64_R_SYM(rel->r_info)];
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = (struct alpha_symbol *)obj_find_symbol(&af->root, name);
-
- for (ent = intsym->got_entries; ent ; ent = ent->next)
- if (ent->addend == rel->r_addend)
- goto found;
-
- ent = xmalloc(sizeof(*ent));
- ent->addend = rel->r_addend;
- ent->offset = offset;
- ent->reloc_done = 0;
- ent->next = intsym->got_entries;
- intsym->got_entries = ent;
- offset += 8;
-
- found:;
- }
- }
-
- if (offset > 0x10000)
- {
- error(".got section overflow: %#x > 0x10000", offset);
- return 0;
- }
-
- /* We always want a .got section so that we always have a GP for
- use with GPDISP and GPREL32 relocs. Besides, if the section
- is empty we don't use up space anyway. */
- af->got = obj_create_alloced_section(&af->root, ".got", 8, offset);
-
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- struct alpha_file *af = (struct alpha_file *)f;
-
- mod->gp = af->got->header.sh_addr + 0x8000;
-
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf64_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_arm.c b/mdk-stage1/insmod-modutils/obj/obj_arm.c
deleted file mode 100644
index 7a843f947..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_arm.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/* ARM specific support for Elf loading and relocation.
- Copyright 1996, 1997, 1998 Linux International.
-
- Contributed by Phil Blundell <philb@gnu.org>
- and wms <woody@corelcomputer.com>
- based on the i386 code by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <string.h>
-#include <assert.h>
-
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-
-/*======================================================================*/
-
-struct arm_plt_entry
-{
- int offset;
- int allocated:1;
- int inited:1; // has been set up
-};
-
-struct arm_got_entry
-{
- int offset;
- int allocated : 1;
- unsigned reloc_done : 1;
-};
-
-struct arm_file
-{
- struct obj_file root;
- struct obj_section *plt;
- struct obj_section *got;
-};
-
-struct arm_symbol
-{
- struct obj_symbol root;
- struct arm_plt_entry pltent;
- struct arm_got_entry gotent;
-};
-
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- struct arm_file *f;
- f = xmalloc(sizeof(*f));
- f->got = NULL;
- return &f->root;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- struct arm_symbol *sym;
- sym = xmalloc(sizeof(*sym));
- memset(&sym->gotent, 0, sizeof(sym->gotent));
- memset(&sym->pltent, 0, sizeof(sym->pltent));
- return &sym->root;
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf32_Rel *rel,
- Elf32_Addr v)
-{
- struct arm_file *afile = (struct arm_file *)f;
- struct arm_symbol *asym = (struct arm_symbol *)sym;
-
- Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset);
- Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
- Elf32_Addr got = afile->got ? afile->got->header.sh_addr : 0;
- Elf32_Addr plt = afile->plt ? afile->plt->header.sh_addr : 0;
-
- struct arm_plt_entry *pe;
- unsigned long *ip;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_ARM_NONE:
- break;
-
- case R_ARM_ABS32:
- *loc += v;
- break;
-
- case R_ARM_GOT32:
- /* needs an entry in the .got: set it, once */
- if (! asym->gotent.reloc_done)
- {
- asym->gotent.reloc_done = 1;
- *(Elf32_Addr *)(afile->got->contents + asym->gotent.offset) = v;
- }
- /* make the reloc with_respect_to_.got */
- *loc += asym->gotent.offset;
- break;
-
- /* relative reloc, always to _GLOBAL_OFFSET_TABLE_ (which is .got)
- similar to branch, but is full 32 bits relative */
- case R_ARM_GOTPC:
- assert(got);
- *loc += got - dot;
- break;
-
- case R_ARM_PC24:
- case R_ARM_PLT32:
- /* find the plt entry and initialize it if necessary */
- assert(asym != NULL);
- pe = (struct arm_plt_entry*) &asym->pltent;
- if (! pe->inited)
- {
- ip = (unsigned long *) (afile->plt->contents + pe->offset);
- ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */
- ip[1] = v; /* sym@ */
- pe->inited = 1;
- }
-
- /* relative distance to target */
- v -= dot;
- /* if the target is too far away.... */
- if ((int)v < -0x02000000 || (int)v >= 0x02000000)
- {
- /* go via the plt */
- v = plt + pe->offset - dot;
- }
- if (v & 3)
- ret = obj_reloc_dangerous;
-
- /* Convert to words. */
- v >>= 2;
-
- /* merge the offset into the instruction. */
- *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff);
- break;
-
- /* address relative to the got */
- case R_ARM_GOTOFF:
- assert(got);
- *loc += v - got;
- break;
-
- default:
- printf("Warning: unhandled reloc %d\n",ELF32_R_TYPE(rel->r_info));
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *f)
-{
- struct arm_file *afile = (struct arm_file *) f;
- int i;
- struct obj_section *sec, *syms, *strs;
- ElfW(Rel) *rel, *relend;
- ElfW(Sym) *symtab, *extsym;
- const char *strtab, *name;
- struct arm_symbol *intsym;
- struct arm_plt_entry *pe;
- struct arm_got_entry *ge;
- int got_offset = 0, plt_offset = 0;
-
- for (i = 0; i < f->header.e_shnum; ++i)
- {
- sec = f->sections[i];
- if (sec->header.sh_type != SHT_RELM)
- continue;
- syms = f->sections[sec->header.sh_link];
- strs = f->sections[syms->header.sh_link];
-
- rel = (ElfW(RelM) *) sec->contents;
- relend = rel + (sec->header.sh_size / sizeof(ElfW(RelM)));
- symtab = (ElfW(Sym) *) syms->contents;
- strtab = (const char *) strs->contents;
-
- for (; rel < relend; ++rel)
- {
- extsym = &symtab[ELF32_R_SYM(rel->r_info)];
-
- switch(ELF32_R_TYPE(rel->r_info)) {
- case R_ARM_PC24:
- case R_ARM_PLT32:
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = (struct arm_symbol *) obj_find_symbol(f, name);
-
- pe = &intsym->pltent;
-
- if (! pe->allocated)
- {
- pe->allocated = 1;
- pe->offset = plt_offset;
- plt_offset += 8;
- pe->inited = 0;
- }
- break;
-
- /* these two don_t need got entries, but they need
- the .got to exist */
- case R_ARM_GOTOFF:
- case R_ARM_GOTPC:
- if (got_offset==0) got_offset = 4;
- break;
-
- case R_ARM_GOT32:
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = (struct arm_symbol *) obj_find_symbol(f, name);
-
- ge = (struct arm_got_entry *) &intsym->gotent;
- if (! ge->allocated)
- {
- ge->allocated = 1;
- ge->offset = got_offset;
- got_offset += sizeof(void*);
- }
- break;
-
- default:
- continue;
- }
- }
- }
-
- /* if there was a _GLOBAL_OFFSET_TABLE_, then the .got section
- exists already; find it and use it */
- if (got_offset)
- {
- struct obj_section* sec = obj_find_section(f, ".got");
- if (sec)
- obj_extend_section(sec, got_offset);
- else
- {
- sec = obj_create_alloced_section(f, ".got", 8, got_offset);
- assert(sec);
- }
- afile->got = sec;
- }
-
- if (plt_offset)
- afile->plt = obj_create_alloced_section(f, ".plt", 8, plt_offset);
-
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf32_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_common.c b/mdk-stage1/insmod-modutils/obj/obj_common.c
deleted file mode 100644
index 2a6606c94..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_common.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/* Elf file, section, and symbol manipulation routines.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#include <obj.h>
-#include <util.h>
-#include <module.h>
-
-/*======================================================================*/
-
-/* Standard ELF hash function. */
-inline unsigned long
-obj_elf_hash_n(const char *name, unsigned long n)
-{
- unsigned long h = 0;
- unsigned long g;
- unsigned char ch;
-
- while (n > 0)
- {
- ch = *name++;
- h = (h << 4) + ch;
- if ((g = (h & 0xf0000000)) != 0)
- {
- h ^= g >> 24;
- h &= ~g;
- }
- n--;
- }
- return h;
-}
-
-unsigned long
-obj_elf_hash (const char *name)
-{
- return obj_elf_hash_n(name, strlen(name));
-}
-
-void
-obj_set_symbol_compare (struct obj_file *f,
- int (*cmp)(const char *, const char *),
- unsigned long (*hash)(const char *))
-{
- if (cmp)
- f->symbol_cmp = cmp;
- if (hash)
- {
- struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
- int i;
-
- f->symbol_hash = hash;
-
- memcpy(tmptab, f->symtab, sizeof(tmptab));
- memset(f->symtab, 0, sizeof(f->symtab));
-
- for (i = 0; i < HASH_BUCKETS; ++i)
- for (sym = tmptab[i]; sym ; sym = next)
- {
- unsigned long h = hash(sym->name) % HASH_BUCKETS;
- next = sym->next;
- sym->next = f->symtab[h];
- f->symtab[h] = sym;
- }
- }
-}
-
-struct obj_symbol *
-obj_add_symbol (struct obj_file *f, const char *name, unsigned long symidx,
- int info, int secidx, ElfW(Addr) value, unsigned long size)
-{
- struct obj_symbol *sym;
- unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
- int n_type = ELFW(ST_TYPE)(info);
- int n_binding = ELFW(ST_BIND)(info);
-
- for (sym = f->symtab[hash]; sym; sym = sym->next)
- if (f->symbol_cmp(sym->name, name) == 0)
- {
- int o_secidx = sym->secidx;
- int o_info = sym->info;
- int o_type = ELFW(ST_TYPE)(o_info);
- int o_binding = ELFW(ST_BIND)(o_info);
-
- /* A redefinition! Is it legal? */
-
- if (secidx == SHN_UNDEF)
- return sym;
- else if (o_secidx == SHN_UNDEF)
- goto found;
- else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL)
- {
- /* Cope with local and global symbols of the same name
- in the same object file, as might have been created
- by ld -r. The only reason locals are now seen at this
- level at all is so that we can do semi-sensible things
- with parameters. */
-
- struct obj_symbol *nsym, **p;
-
- nsym = arch_new_symbol();
- nsym->next = sym->next;
- nsym->ksymidx = -1;
-
- /* Excise the old (local) symbol from the hash chain. */
- for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
- continue;
- *p = sym = nsym;
- goto found;
- }
- else if (n_binding == STB_LOCAL)
- {
- /* Another symbol of the same name has already been defined.
- Just add this to the local table. */
- sym = arch_new_symbol();
- sym->next = NULL;
- sym->ksymidx = -1;
- f->local_symtab[symidx] = sym;
- goto found;
- }
- else if (n_binding == STB_WEAK)
- return sym;
- else if (o_binding == STB_WEAK)
- goto found;
- /* Don't unify COMMON symbols with object types the programmer
- doesn't expect. */
- else if (secidx == SHN_COMMON
- && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
- return sym;
- else if (o_secidx == SHN_COMMON
- && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
- goto found;
- else
- {
- /* Don't report an error if the symbol is coming from
- the kernel or some external module. */
- if (secidx <= SHN_HIRESERVE)
- error("%s multiply defined", name);
- return sym;
- }
- }
-
- /* Completely new symbol. */
- sym = arch_new_symbol();
- sym->next = f->symtab[hash];
- f->symtab[hash] = sym;
- sym->ksymidx = -1;
-
- if (ELFW(ST_BIND)(info) == STB_LOCAL && symidx != -1) {
- if (symidx >= f->local_symtab_size)
- error("local symbol %s with index %ld exceeds local_symtab_size %ld",
- name, (long) symidx, (long) f->local_symtab_size);
- else
- f->local_symtab[symidx] = sym;
- }
-
-found:
- sym->name = name;
- sym->value = value;
- sym->size = size;
- sym->secidx = secidx;
- sym->info = info;
- sym->r_type = 0; /* should be R_arch_NONE for all arch */
-
- return sym;
-}
-
-struct obj_symbol *
-obj_find_symbol (struct obj_file *f, const char *name)
-{
- struct obj_symbol *sym;
- unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
-
- for (sym = f->symtab[hash]; sym; sym = sym->next)
- if (f->symbol_cmp(sym->name, name) == 0)
- return sym;
-
- return NULL;
-}
-
-ElfW(Addr)
-obj_symbol_final_value (struct obj_file *f, struct obj_symbol *sym)
-{
- if (sym)
- {
- if (sym->secidx >= SHN_LORESERVE)
- return sym->value;
-
- return sym->value + f->sections[sym->secidx]->header.sh_addr;
- }
- else
- {
- /* As a special case, a NULL sym has value zero. */
- return 0;
- }
-}
-
-struct obj_section *
-obj_find_section (struct obj_file *f, const char *name)
-{
- int i, n = f->header.e_shnum;
-
- for (i = 0; i < n; ++i)
- if (strcmp(f->sections[i]->name, name) == 0)
- return f->sections[i];
-
- return NULL;
-}
-
-static int
-obj_load_order_prio(struct obj_section *a)
-{
- unsigned long af, ac;
-
- af = a->header.sh_flags;
-
- ac = 0;
- if (a->name[0] != '.' || strlen(a->name) != 10 ||
- strcmp(a->name + 5, ".init")) ac |= 32;
- if (af & SHF_ALLOC) ac |= 16;
- if (!(af & SHF_WRITE)) ac |= 8;
- if (af & SHF_EXECINSTR) ac |= 4;
- if (a->header.sh_type != SHT_NOBITS) ac |= 2;
-#if defined(ARCH_ia64)
- if (af & SHF_IA_64_SHORT) ac -= 1;
-#endif
-
- return ac;
-}
-
-void
-obj_insert_section_load_order (struct obj_file *f, struct obj_section *sec)
-{
- struct obj_section **p;
- int prio = obj_load_order_prio(sec);
- for (p = f->load_order_search_start; *p ; p = &(*p)->load_next)
- if (obj_load_order_prio(*p) < prio)
- break;
- sec->load_next = *p;
- *p = sec;
-}
-
-struct obj_section *
-obj_create_alloced_section (struct obj_file *f, const char *name,
- unsigned long align, unsigned long size)
-{
- int newidx = f->header.e_shnum++;
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec));
- f->sections[newidx] = sec = arch_new_section();
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = SHF_WRITE|SHF_ALLOC;
- sec->header.sh_size = size;
- sec->header.sh_addralign = align;
- sec->name = name;
- sec->idx = newidx;
- if (size)
- sec->contents = xmalloc(size);
-
- obj_insert_section_load_order(f, sec);
-
- return sec;
-}
-
-struct obj_section *
-obj_create_alloced_section_first (struct obj_file *f, const char *name,
- unsigned long align, unsigned long size)
-{
- int newidx = f->header.e_shnum++;
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec));
- f->sections[newidx] = sec = arch_new_section();
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = SHF_WRITE|SHF_ALLOC;
- sec->header.sh_size = size;
- sec->header.sh_addralign = align;
- sec->name = name;
- sec->idx = newidx;
- if (size)
- sec->contents = xmalloc(size);
-
- sec->load_next = f->load_order;
- f->load_order = sec;
- if (f->load_order_search_start == &f->load_order)
- f->load_order_search_start = &sec->load_next;
-
- return sec;
-}
-
-void *
-obj_extend_section (struct obj_section *sec, unsigned long more)
-{
- unsigned long oldsize = sec->header.sh_size;
- sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
- return sec->contents + oldsize;
-}
-
-/* Convert an object pointer (address) to a native pointer and vice versa.
- * It gets interesting when the object has 64 bit pointers but modutils
- * is running 32 bit. This is nasty code but it stops the compiler giving
- * spurious warning messages. "I know what I am doing" ...
- */
-
-void *
-obj_addr_to_native_ptr (ElfW(Addr) addr)
-{
- unsigned int convert = (sizeof(void *) << 8) + sizeof(addr); /* to, from */
- union obj_ptr_4 p4;
- union obj_ptr_8 p8;
- switch (convert) {
- case 0x0404:
- p4.addr = addr;
- return(p4.ptr);
- break;
- case 0x0408:
- p4.addr = addr;
- if (p4.addr != addr) {
- error("obj_addr_to_native_ptr truncation %" tgt_long_fmt "x",
- (tgt_long) addr);
- exit(1);
- }
- return(p4.ptr);
- break;
- case 0x0804:
- p8.addr = addr;
- return(p8.ptr);
- break;
- case 0x0808:
- p8.addr = addr;
- return(p8.ptr);
- break;
- default:
- error("obj_addr_to_native_ptr unknown conversion 0x%04x", convert);
- exit(1);
- }
-}
-
-ElfW(Addr)
-obj_native_ptr_to_addr (void *ptr)
-{
- unsigned int convert = (sizeof(ElfW(Addr)) << 8) + sizeof(ptr); /* to, from */
- union obj_ptr_4 p4;
- union obj_ptr_8 p8;
- switch (convert) {
- case 0x0404:
- p4.ptr = ptr;
- return(p4.addr);
- break;
- case 0x0408:
- p8.ptr = ptr;
- p4.addr = p8.addr;
- if (p4.addr != p8.addr) {
- error("obj_native_ptr_to_addr truncation %" tgt_long_fmt "x",
- (tgt_long) p8.addr);
- exit(1);
- }
- return(p4.addr);
- break;
- case 0x0804:
- p4.ptr = ptr;
- return(p4.addr); /* compiler expands to 8 */
- break;
- case 0x0808:
- p8.ptr = ptr;
- return(p8.addr);
- break;
- default:
- error("obj_native_ptr_to_addr unknown conversion 0x%04x", convert);
- exit(1);
- }
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_hppa.c b/mdk-stage1/insmod-modutils/obj/obj_hppa.c
deleted file mode 100644
index 4207e692e..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_hppa.c
+++ /dev/null
@@ -1,668 +0,0 @@
-/*
- * PA-RISC specific support for Elf loading and relocation.
- * Copyright 2000 David Huggins-Daines <dhd@linuxcare.com>, Linuxcare Inc.
- * Copyright 2000 Richard Hirst <rhirst@linuxcare.com>, Linuxcare Inc.
- *
- * Based on the IA-64 support, which is:
- * Copyright 2000 Mike Stephens <mike.stephens@intel.com>
- *
- * This file is part of the Linux modutils.
- *
- * 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 <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-#include <modstat.h> /* For ksyms */
-
-
-typedef struct _hppa_stub_t
-{
- struct _hppa_stub_t *next;
- int offset;
- int reloc_done;
-} hppa_stub_t;
-
-typedef struct _hppa_symbol_t
-{
- struct obj_symbol root;
- hppa_stub_t *stub;
-} hppa_symbol_t;
-
-typedef struct _hppa_file_t
-{
- struct obj_file root;
- struct obj_section *stub;
- Elf32_Addr dp;
-} hppa_file_t;
-
-/* The ABI defines various more esoteric types, but these are the only
- ones we actually need. */
-enum hppa_fsel
-{
- e_fsel,
- e_lsel,
- e_rsel,
- e_lrsel,
- e_rrsel
-};
-
-/* This could be a call to obj_create_alloced_section() followed
- * by an overwrite of sec->header.sh_flags.
- */
-
-struct obj_section *
-obj_hppa_create_alloced_section (struct obj_file *f, const char *name,
- unsigned long align, unsigned long size,
- unsigned long sh_flags)
-{
- int newidx = f->header.e_shnum++;
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec));
- f->sections[newidx] = sec = arch_new_section();
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = sh_flags;
- sec->header.sh_size = size;
- sec->header.sh_addralign = align;
- sec->name = name;
- sec->idx = newidx;
- if (size)
- sec->contents = xmalloc(size);
-
- obj_insert_section_load_order(f, sec);
-
- return sec;
-}
-
-struct obj_file *
-arch_new_file (void)
-{
- hppa_file_t *f;
- f = xmalloc(sizeof(*f));
- f->stub = NULL;
- return &f->root;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- hppa_symbol_t *sym;
- sym = xmalloc(sizeof(*sym));
- sym->stub = NULL;
- return &sym->root;
-}
-
-/* This is called for architecture specific sections we might need to
- do special things to. */
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-/* =================================================================
-
- These functions are from libhppa.h in the GNU BFD library.
- (c) 1990, 91, 92, 93, 94, 95, 96, 98, 99, 2000
- Free Software Foundation, Inc.
-
- ================================================================= */
-
-/* The *sign_extend functions are used to assemble various bitfields
- taken from an instruction and return the resulting immediate
- value. */
-
-static inline int
-sign_extend (x, len)
- int x, len;
-{
- int signbit = (1 << (len - 1));
- int mask = (signbit << 1) - 1;
- return ((x & mask) ^ signbit) - signbit;
-}
-
-static inline int
-low_sign_extend (x, len)
- int x, len;
-{
- return (x >> 1) - ((x & 1) << (len - 1));
-}
-
-
-/* The re_assemble_* functions prepare an immediate value for
- insertion into an opcode. pa-risc uses all sorts of weird bitfields
- in the instruction to hold the value. */
-
-static inline int
-sign_unext (x, len)
- int x, len;
-{
- int len_ones;
-
- len_ones = (1 << len) - 1;
-
- return x & len_ones;
-}
-
-static inline int
-low_sign_unext (x, len)
- int x, len;
-{
- int temp;
- int sign;
-
- sign = (x >> (len-1)) & 1;
-
- temp = sign_unext (x, len-1);
-
- return (temp << 1) | sign;
-}
-
-static inline int
-re_assemble_3 (as3)
- int as3;
-{
- return (( (as3 & 4) << (13-2))
- | ((as3 & 3) << (13+1)));
-}
-
-static inline int
-re_assemble_12 (as12)
- int as12;
-{
- return (( (as12 & 0x800) >> 11)
- | ((as12 & 0x400) >> (10 - 2))
- | ((as12 & 0x3ff) << (1 + 2)));
-}
-
-static inline int
-re_assemble_14 (as14)
- int as14;
-{
- return (( (as14 & 0x1fff) << 1)
- | ((as14 & 0x2000) >> 13));
-}
-
-static inline int
-re_assemble_16 (as16)
- int as16;
-{
- int s, t;
-
- /* Unusual 16-bit encoding, for wide mode only. */
- t = (as16 << 1) & 0xffff;
- s = (as16 & 0x8000);
- return (t ^ s ^ (s >> 1)) | (s >> 15);
-}
-
-static inline int
-re_assemble_17 (as17)
- int as17;
-{
- return (( (as17 & 0x10000) >> 16)
- | ((as17 & 0x0f800) << (16 - 11))
- | ((as17 & 0x00400) >> (10 - 2))
- | ((as17 & 0x003ff) << (1 + 2)));
-}
-
-static inline int
-re_assemble_21 (as21)
- int as21;
-{
- return (( (as21 & 0x100000) >> 20)
- | ((as21 & 0x0ffe00) >> 8)
- | ((as21 & 0x000180) << 7)
- | ((as21 & 0x00007c) << 14)
- | ((as21 & 0x000003) << 12));
-}
-
-static inline int
-re_assemble_22 (as22)
- int as22;
-{
- return (( (as22 & 0x200000) >> 21)
- | ((as22 & 0x1f0000) << (21 - 16))
- | ((as22 & 0x00f800) << (16 - 11))
- | ((as22 & 0x000400) >> (10 - 2))
- | ((as22 & 0x0003ff) << (1 + 2)));
-}
-
-
-/* Handle field selectors for PA instructions.
- The L and R (and LS, RS etc.) selectors are used in pairs to form a
- full 32 bit address. eg.
-
- LDIL L'start,%r1 ; put left part into r1
- LDW R'start(%r1),%r2 ; add r1 and right part to form address
-
- This function returns sign extended values in all cases.
-*/
-
-static inline unsigned int
-hppa_field_adjust (value, addend, r_field)
- unsigned int value;
- int addend;
- enum hppa_fsel r_field;
-{
- unsigned int sym_val;
-
- sym_val = value - addend;
- switch (r_field)
- {
- case e_fsel:
- /* F: No change. */
- break;
-
- case e_lsel:
- /* L: Select top 21 bits. */
- value = value >> 11;
- break;
-
- case e_rsel:
- /* R: Select bottom 11 bits. */
- value = value & 0x7ff;
- break;
-
- case e_lrsel:
- /* LR: L with rounding of the addend to nearest 8k. */
- value = sym_val + ((addend + 0x1000) & -0x2000);
- value = value >> 11;
- break;
-
- case e_rrsel:
- /* RR: R with rounding of the addend to nearest 8k.
- We need to return a value such that 2048 * LR'x + RR'x == x
- ie. RR'x = s+a - (s + (((a + 0x1000) & -0x2000) & -0x800))
- . = s+a - ((s & -0x800) + ((a + 0x1000) & -0x2000))
- . = (s & 0x7ff) + a - ((a + 0x1000) & -0x2000) */
- value = (sym_val & 0x7ff) + (((addend & 0x1fff) ^ 0x1000) - 0x1000);
- break;
-
- default:
- abort();
- }
- return value;
-}
-
-/* Insert VALUE into INSN using R_FORMAT to determine exactly what
- bits to change. */
-
-static inline int
-hppa_rebuild_insn (insn, value, r_format)
- int insn;
- int value;
- int r_format;
-{
- switch (r_format)
- {
- case 11:
- return (insn & ~ 0x7ff) | low_sign_unext (value, 11);
-
- case 12:
- return (insn & ~ 0x1ffd) | re_assemble_12 (value);
-
-
- case 10:
- return (insn & ~ 0x3ff1) | re_assemble_14 (value & -8);
-
- case -11:
- return (insn & ~ 0x3ff9) | re_assemble_14 (value & -4);
-
- case 14:
- return (insn & ~ 0x3fff) | re_assemble_14 (value);
-
-
- case -10:
- return (insn & ~ 0xfff1) | re_assemble_16 (value & -8);
-
- case -16:
- return (insn & ~ 0xfff9) | re_assemble_16 (value & -4);
-
- case 16:
- return (insn & ~ 0xffff) | re_assemble_16 (value);
-
-
- case 17:
- return (insn & ~ 0x1f1ffd) | re_assemble_17 (value);
-
- case 21:
- return (insn & ~ 0x1fffff) | re_assemble_21 (value);
-
- case 22:
- return (insn & ~ 0x3ff1ffd) | re_assemble_22 (value);
-
- case 32:
- return value;
-
- default:
- abort ();
- }
- return insn;
-}
-
-/* ====================================================================
-
- End of functions from GNU BFD.
-
- ==================================================================== */
-
-/* This is where we get the opportunity to create any extra dynamic
- sections we might need. In our case we do not need a GOT because
- our code is not PIC, but we do need to create a stub section.
-
- This is significantly less complex than what we do for shared
- libraries because, obviously, modules are not shared. Also we have
- no issues related to symbol visibility, lazy linking, etc.
- The kernels dp is fixed (at symbol data_start), and we can fix up any
- DPREL refs in the module to use that same dp value.
- All PCREL17F refs result in a stub with the following format:
-
- ldil L'func_addr,%r1
- be,n R'func_addr(%sr4,%r1)
-
- Note, all PCREL17F get a stub, regardless of whether they are
- local or external. With local ones, and external ones to other
- modules, there is a good chance we could manage without the stub.
- I'll leave that for a future optimisation.
- */
-
-#define LDIL_R1 0x20200000 /* ldil L'XXX,%r1 */
-#define BE_N_SR4_R1 0xe0202002 /* be,n R'XXX(%sr4,%r1) */
-
-#define STUB_SIZE 8
-
-int
-arch_create_got(struct obj_file *f)
-{
- hppa_file_t *hfile = (hppa_file_t *)f;
- int i, n;
- int stub_offset = 0;
-
- /* Create stub section.
- * XXX set flags, see obj_ia64.c
- */
- hfile->stub = obj_create_alloced_section(f, ".stub", STUB_SIZE, 0);
-
- /* Actually this is a lot like check_relocs() in a BFD backend. We
- walk all sections and all their relocations and look for ones
- that need special treatment. */
- n = hfile->root.header.e_shnum;
- for (i = 0; i < n; ++i)
- {
- struct obj_section *relsec, *symsec, *strsec;
- Elf32_Rela *rel, *relend;
- Elf32_Sym *symtab;
- char const *strtab;
-
- relsec = hfile->root.sections[i];
- if (relsec->header.sh_type != SHT_RELA)
- continue;
-
- symsec = hfile->root.sections[relsec->header.sh_link];
- strsec = hfile->root.sections[symsec->header.sh_link];
-
- rel = (Elf32_Rela *)relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rela));
- symtab = (Elf32_Sym *)symsec->contents;
- strtab = (char const *)strsec->contents;
-
- for (; rel < relend; rel++)
- {
- int need_stub = 0;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- default:
- continue;
-
- case R_PARISC_PCREL17F:
- need_stub = 1;
- break;
- }
-
- if (need_stub)
- {
- Elf32_Sym *extsym;
- hppa_symbol_t *hsym;
- char const *name;
- int local;
- unsigned long symndx;
-
- symndx = ELF32_R_SYM(rel->r_info);
- extsym = symtab + symndx;
- if (ELF32_ST_BIND(extsym->st_info) == STB_LOCAL)
- hsym = (hppa_symbol_t *) f->local_symtab[symndx];
- else
- {
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- hsym = (hppa_symbol_t *)obj_find_symbol(f, name);
- }
- local = hsym->root.secidx <= SHN_HIRESERVE;
-
- if (need_stub)
- {
- hppa_stub_t *stub;
-
- if (hsym->stub == NULL)
- {
- stub = (hppa_stub_t *) xmalloc(sizeof(hppa_stub_t));
- stub->offset = stub_offset;
- stub->reloc_done = 0;
- hsym->stub = stub;
- stub_offset += STUB_SIZE;
- need_stub = 0;
- }
- }
- }
- }
- }
- if (stub_offset)
- {
- hfile->stub->contents = xmalloc(stub_offset);
- hfile->stub->header.sh_size = stub_offset;
- }
- return 1;
-}
-
-
-enum obj_reloc
-arch_apply_relocation(struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf32_Rela *rel,
- Elf32_Addr v)
-{
- hppa_file_t *hfile = (hppa_file_t *) f;
- hppa_symbol_t *hsym = (hppa_symbol_t *) sym;
-
- Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset);
- Elf32_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03;
- Elf32_Addr dp = hfile->dp;
- Elf32_Word r_info = ELF32_R_TYPE(rel->r_info);
-
- enum obj_reloc ret = obj_reloc_ok;
- enum hppa_fsel fsel = e_fsel; /* Avoid compiler warning */
- unsigned int r_format;
-
- /* Fix up the value, and determine whether we can handle this
- relocation. */
- switch (r_info)
- {
- case R_PARISC_PLABEL32:
- case R_PARISC_DIR32:
- case R_PARISC_DIR21L:
- case R_PARISC_DIR14R:
- /* Easy. */
- break;
-
- case R_PARISC_DPREL21L:
- case R_PARISC_DPREL14R:
- v -= dp;
- break;
-
- case R_PARISC_PCREL17F:
- /* Find an import stub. */
- assert(hsym->stub != NULL);
- assert(hfile->stub != NULL);
- /* XXX Optimise. We may not need a stub for short branches */
- if (!hsym->stub->reloc_done) {
- /* Need to create the .stub entry */
- Elf32_Addr *pstub, stubv;
-
- pstub = (Elf32_Addr *)(hfile->stub->contents + hsym->stub->offset);
- pstub[0] = LDIL_R1;
- pstub[1] = BE_N_SR4_R1;
- stubv = hppa_field_adjust(v, rel->r_addend, e_lrsel);
- pstub[0] = hppa_rebuild_insn(pstub[0], stubv, 21);
- stubv = hppa_field_adjust(v, rel->r_addend, e_rrsel);
- stubv >>= 2; /* Branch; divide by 4 */
- pstub[1] = hppa_rebuild_insn(pstub[1], stubv, 17);
- hsym->stub->reloc_done = 1;
- }
- v = hsym->stub->offset + hfile->stub->header.sh_addr;
- break;
-
- default:
- return obj_reloc_unhandled;
- }
-
- /* Find the field selector. */
- switch (r_info)
- {
- case R_PARISC_DIR32:
- case R_PARISC_PLABEL32:
- case R_PARISC_PCREL17F:
- fsel = e_fsel;
- break;
-
- case R_PARISC_DPREL21L:
- case R_PARISC_DIR21L:
- fsel = e_lrsel;
- break;
-
- case R_PARISC_DPREL14R:
- case R_PARISC_DIR14R:
- fsel = e_rrsel;
- break;
- }
-
- v = hppa_field_adjust(v, rel->r_addend, fsel);
-
- switch (r_info)
- {
- case R_PARISC_PCREL17F:
- case R_PARISC_PCREL17R:
- case R_PARISC_PCREL22F:
- v = v - dot - 8;
- case R_PARISC_DIR17F:
- case R_PARISC_DIR17R:
- /* This is a branch. Divide the offset by four. */
- v >>= 2;
- break;
- default:
- break;
- }
-
- /* Find the format. */
- switch (r_info)
- {
- case R_PARISC_DIR32:
- case R_PARISC_PLABEL32:
- r_format = 32;
- break;
-
- case R_PARISC_DPREL21L:
- case R_PARISC_DIR21L:
- r_format = 21;
- break;
-
- case R_PARISC_PCREL17F:
- r_format = 17;
- break;
-
- case R_PARISC_DPREL14R:
- case R_PARISC_DIR14R:
- r_format = 14;
- break;
-
- default:
- abort();
- }
-
- *loc = hppa_rebuild_insn(*loc, v, r_format);
-
- return ret;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf32_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *f, struct obj_section *sec)
-{
- struct module_symbol *s;
- int i;
- hppa_file_t *hfile = (hppa_file_t *)f;
-
- /* Initialise dp to the kernels dp (symbol data_start)
- */
- for (i = 0, s = ksyms; i < nksyms; i++, s++)
- if (!strcmp((char *)s->name, "data_start"))
- break;
- if (i >= nksyms) {
- error("Cannot initialise dp, 'data_start' not found\n");
- return 1;
- }
- hfile->dp = s->value;
-
- return 0;
-}
-
diff --git a/mdk-stage1/insmod-modutils/obj/obj_hppa64.c b/mdk-stage1/insmod-modutils/obj/obj_hppa64.c
deleted file mode 100644
index fe32911ff..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_hppa64.c
+++ /dev/null
@@ -1,686 +0,0 @@
-/*
- * hppa parisc64 specific support for Elf loading and relocation.
- * Copyright 2000 Richard Hirst <rhirst@linuxcare.com>, Linuxcare Inc.
- *
- * Based on ia64 specific support which was
- * Copyright 2000 Mike Stephens <mike.stephens@intel.com>
- *
- * This file is part of the Linux modutils.
- *
- * 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.
- */
-
-#ident "$Id$"
-
-#include <string.h>
-#include <assert.h>
-#include <stdlib.h>
-
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-#ifndef TRUE
-#define TRUE ~FALSE
-#endif
-
-/*======================================================================*/
-
-typedef struct _hppa64_opd_t
-{
- int offset;
- int reloc_done;
-} hppa64_opd_t;
-
-typedef struct _hppa64_stub_t
-{
- struct _hppa64_stub_t *next;
- Elf64_Addr addend;
- int offset;
- int reloc_done;
-} hppa64_stub_t;
-
-typedef struct _hppa64_got_t
-{
- struct _hppa64_got_t *next;
- Elf64_Addr addend;
- int offset;
- int reloc_done;
-} hppa64_got_t;
-
-typedef struct _hppa64_symbol_t
-{
- struct obj_symbol root;
- hppa64_got_t *gotent;
- hppa64_opd_t *opdent;
- hppa64_stub_t *stubent;
-} hppa64_symbol_t;
-
-typedef struct _hppa64_file_t
-{
- struct obj_file root;
- struct obj_section *got;
- struct obj_section *opd;
- struct obj_section *stub;
- Elf64_Addr gp;
- Elf64_Addr text;
- Elf64_Addr data;
- Elf64_Addr bss;
-} hppa64_file_t;
-
-/*
- * XXX This stub assumes it can reach the .got entry with a +/- 8K offset
- * from dp. Perhaps we should use a .plt for these entries to give a
- * greater chance of that being true.
- *
- * 53 7b 00 00 ldd 0(dp),dp
- * R_PARISC_LTOFF14R <.got entry offset from dp>
- * 53 61 00 20 ldd 10(dp),r1
- * e8 20 d0 00 bve (r1)
- * 53 7b 00 30 ldd 18(dp),dp
- *
- * We need a different stub for millicode calls, which doesn't screw
- * dp:
- *
- * 53 61 00 00 ldd 0(dp),r1
- * R_PARISC_LTOFF14R <.got entry offset from dp>
- * 50 21 00 20 ldd 10(r1),r1
- * e8 20 d0 00 bve (r1)
- * 08 00 02 40 nop
- *
- */
-
-/* NOTE: to keep the code cleaner we make all stubs the same size.
- */
-
-#define SIZEOF_STUB 16
-
-unsigned char hppa64_stub_extern[] =
-{
- 0x53, 0x7b, 0x00, 0x00,
- 0x53, 0x61, 0x00, 0x20,
- 0xe8, 0x20, 0xd0, 0x00,
- 0x53, 0x7b, 0x00, 0x30,
-};
-
-unsigned char hppa64_stub_millicode[] =
-{
- 0x53, 0x61, 0x00, 0x00,
- 0x50, 0x21, 0x00, 0x20,
- 0xe8, 0x20, 0xd0, 0x00,
- 0x08, 0x00, 0x02, 0x40,
-};
-
-/*======================================================================*/
-
-enum obj_reloc
-patch_14r(Elf64_Xword v64, Elf64_Word *p)
-{
- Elf64_Word i = *p;
- Elf64_Word v = (Elf64_Word)v64;
-
- if (v & 0x80000000)
- v |= ~0x7ff;
- else
- v &= 0x7ff;
- i &= ~ 0x3fff;
- i |= (v & 0x1fff) << 1 |
- (v & 0x2000) >> 13;
- *p = i;
-
- return obj_reloc_ok;
-}
-
-enum obj_reloc
-patch_21l(Elf64_Xword v64, Elf64_Word *p)
-{
- Elf64_Word i = *p;
- Elf64_Word v = (Elf64_Word)v64;
-
- v &= 0xfffff800;
- if (v & 0x80000000)
- v += 0x800;
- i &= ~ 0x1fffff;
- i |= (v & 0x80000000) >> 31 |
- (v & 0x7ff00000) >> 19 |
- (v & 0x000c0000) >> 4 |
- (v & 0x0003e000) << 3 |
- (v & 0x00001800) << 1;
- *p = i;
-
- return obj_reloc_ok;
-}
-
-
-/* All 14 bits this time... This is used to patch the .got offset in
- * a stub for PCREL22F.
- */
-
-enum obj_reloc
-patch_14r2(Elf64_Xword v64, Elf64_Word *p)
-{
- Elf64_Word i = *p;
- Elf64_Word v = (Elf64_Word)v64;
-
- if ((Elf64_Sxword)v64 > 0x1fffL ||
- (Elf64_Sxword)v64 < -0x2000L)
- return obj_reloc_overflow;
- i &= ~ 0x3fff;
- i |= (v & 0x2000) >> 13 |
- (v & 0x1fff) << 1;
- *p = i;
-
- return obj_reloc_ok;
-}
-
-
-enum obj_reloc
-patch_22f(Elf64_Xword v64, Elf64_Word *p)
-{
- Elf64_Word i = *p;
- Elf64_Word v = (Elf64_Word)v64;
-
- if ((Elf64_Sxword)v64 > 0x800000-1 ||
- (Elf64_Sxword)v64 < -0x800000)
- return obj_reloc_overflow;
-
- i &= ~ 0x03ff1ffd;
- i |= (v & 0x00800000) >> 23 |
- (v & 0x007c0000) << 3 |
- (v & 0x0003e000) << 3 |
- (v & 0x00001000) >> 10 |
- (v & 0x00000ffc) << 1;
- *p = i;
-
- return obj_reloc_ok;
-}
-
-
-struct obj_section *
-obj_hppa64_create_alloced_section (struct obj_file *f, const char *name,
- unsigned long align, unsigned long size, unsigned long sh_flags)
-{
- int newidx = f->header.e_shnum++;
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec));
- f->sections[newidx] = sec = arch_new_section();
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = sh_flags;
- sec->header.sh_size = size;
- sec->header.sh_addralign = align;
- sec->name = name;
- sec->idx = newidx;
- if (size)
- sec->contents = xmalloc(size);
-
- obj_insert_section_load_order(f, sec);
-
- return sec;
-}
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- hppa64_file_t *f;
- f = xmalloc(sizeof(*f));
- f->got = NULL;
- f->opd = NULL;
- f->stub = NULL;
- return &f->root;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- hppa64_symbol_t *sym;
- sym = xmalloc(sizeof(*sym));
- sym->gotent = NULL;
- sym->opdent = NULL;
- sym->stubent = NULL;
- return &sym->root;
-}
-
-/* This may not be needed, but does no harm (copied from ia64).
- */
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- switch (sec->header.sh_type)
- {
- case SHT_PARISC_EXT :
- sec->contents = NULL;
- break;
-
- case SHT_PARISC_UNWIND :
- if (sec->header.sh_size > 0)
- {
- sec->contents = xmalloc(sec->header.sh_size);
- gzf_lseek(fp, sec->header.sh_offset, SEEK_SET);
- if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size)
- {
- error("error reading ELF section data: %m");
- return -1;
- }
- }
- else
- sec->contents = NULL;
- break;
- default:
- error("Unknown section header type: %08x", sec->header.sh_type);
- return -1;
- }
- return 0;
-}
-
-int
-arch_create_got(struct obj_file *f)
-{
- hppa64_file_t *hfile = (hppa64_file_t *)f;
- int i;
- int n;
- int got_offset = 0;
- int opd_offset = 64;
- int stub_offset = 0;
-
- n = hfile->root.header.e_shnum;
- for (i = 0; i < n; ++i)
- {
- struct obj_section *relsec, *symsec, *strsec;
- Elf64_Rela *rel, *relend;
- Elf64_Sym *symtab;
- const char *strtab;
-
- relsec = hfile->root.sections[i];
- if (relsec->header.sh_type != SHT_RELA)
- continue;
-
- symsec = hfile->root.sections[relsec->header.sh_link];
- strsec = hfile->root.sections[symsec->header.sh_link];
-
- rel = (Elf64_Rela *)relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela));
- symtab = (Elf64_Sym *)symsec->contents;
- strtab = (const char *)strsec->contents;
-
- for (; rel < relend; ++rel)
- {
- int need_got = FALSE;
- int need_opd = FALSE;
- int need_stub = FALSE;
-
- switch (ELF64_R_TYPE(rel->r_info))
- {
- default:
- {
- unsigned r_info = ELF64_R_TYPE(rel->r_info);
- printf("r_info 0x%x not handled\n", r_info);
- }
- continue;
- case R_PARISC_LTOFF14R:
- case R_PARISC_LTOFF21L:
- /* These are simple indirect references to symbols through the
- * DLT. We need to create a DLT entry for any symbols which
- * appears in a DLTIND relocation.
- */
- need_got = TRUE;
- break;
- case R_PARISC_PCREL22F:
- /* These are function calls. Depending on their precise
- * target we may need to make a stub for them. The stub
- * uses the dlt, so we need to create dlt entries for
- * these symbols too.
- */
- need_got = TRUE;
- need_stub = TRUE;
- break;
- case R_PARISC_DIR64:
- break;
- case R_PARISC_FPTR64:
- /* This is a simple OPD entry (only created for local symbols,
- * see below).
- */
- need_opd = TRUE;
- break;
- }
-
- if (need_got || need_opd || need_stub)
- {
- Elf64_Sym *extsym;
- hppa64_symbol_t *isym;
- const char *name;
- int local;
- unsigned long symndx;
-
- symndx = ELF64_R_SYM(rel->r_info);
- extsym = &symtab[symndx];
- if (ELF64_ST_BIND(extsym->st_info) == STB_LOCAL)
- {
- isym = (hppa64_symbol_t *) f->local_symtab[symndx];
- }
- else
- {
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- isym = (hppa64_symbol_t *)obj_find_symbol(f, name);
- }
- local = isym->root.secidx <= SHN_HIRESERVE;
-
- if (need_stub)
- {
- hppa64_stub_t *stub;
-
- for (stub = isym->stubent; stub != NULL; stub = stub->next)
- if (stub->addend == rel->r_addend)
- break;
- if (stub == NULL)
- {
- stub = (hppa64_stub_t *) xmalloc(sizeof(hppa64_stub_t));
- stub->next = isym->stubent;
- stub->addend = rel->r_addend;
- stub->offset = stub_offset;
- stub->reloc_done = FALSE;
- isym->stubent = stub;
- {
- stub_offset += SIZEOF_STUB;
- }
- need_stub = FALSE;
- }
- }
- if (need_got)
- {
- hppa64_got_t *got;
-
- for (got = isym->gotent; got != NULL; got = got->next)
- if (got->addend == rel->r_addend)
- break;
- if (got == NULL)
- {
- got = (hppa64_got_t *) xmalloc(sizeof(hppa64_got_t));
- got->next = isym->gotent;
- got->addend = rel->r_addend;
- got->offset = got_offset;
- got->reloc_done = FALSE;
- isym->gotent = got;
- got_offset += 8;
- need_got = FALSE;
- }
- }
- if (need_opd && local)
- {
- hppa64_opd_t *opd;
-
- if (isym->opdent == NULL)
- {
- opd = (hppa64_opd_t *) xmalloc(sizeof(hppa64_opd_t));
- opd->offset = opd_offset;
- opd->reloc_done = FALSE;
- isym->opdent = opd;
- opd_offset += 32;
- need_opd = FALSE;
- }
- }
- }
- }
- }
-
- hfile->got = obj_hppa64_create_alloced_section(f, ".got", 8, got_offset,
- (SHF_ALLOC | SHF_WRITE | SHF_PARISC_SHORT));
- assert(hfile->got != NULL);
-
- hfile->opd = obj_hppa64_create_alloced_section(f, ".opd", 16, opd_offset,
- (SHF_ALLOC | SHF_WRITE | SHF_PARISC_SHORT));
- assert(hfile->opd != NULL);
-
- if (stub_offset > 0)
- {
- hfile->stub = obj_hppa64_create_alloced_section(f, ".stub", 16,
- stub_offset, (SHF_ALLOC | SHF_EXECINSTR | SHF_PARISC_SHORT));
- assert(hfile->stub != NULL);
- }
-
- return 1;
-}
-
-
-/* This is a small simple version which seems to work fine. ia64 has
- * a much more complex algorithm. We point dp at the end of the .got,
- * which is the start of the .opd.
- */
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf64_Addr base)
-{
- hppa64_file_t *hfile = (hppa64_file_t *)f;
- int n = f->header.e_shnum;
- int i;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
-
- /* Pick a sensible value for gp */
- hfile->gp = hfile->got->header.sh_addr + hfile->got->header.sh_size;
-
- return 1;
-}
-
-
-enum obj_reloc
-arch_apply_relocation(struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf64_Rela *rel,
- Elf64_Addr v)
-{
- hppa64_file_t *hfile = (hppa64_file_t *) f;
- hppa64_symbol_t *isym = (hppa64_symbol_t *) sym;
-
- Elf64_Word *loc = (Elf64_Word *)(targsec->contents + rel->r_offset);
- Elf64_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03;
-
- Elf64_Addr got = hfile->got->header.sh_addr;
- Elf64_Addr gp = hfile->gp;
-
- Elf64_Xword r_info = ELF64_R_TYPE(rel->r_info);
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (r_info)
- {
- default:
- ret = obj_reloc_unhandled;
- break;
- case R_PARISC_LTOFF14R:
- case R_PARISC_LTOFF21L:
- {
- hppa64_got_t *ge;
-
- assert(isym != NULL);
- for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; )
- ge = ge->next;
- assert(ge != NULL);
- if (!ge->reloc_done)
- {
- ge->reloc_done = TRUE;
- *(Elf64_Addr *)(hfile->got->contents + ge->offset) = v;
- }
- v = got + ge->offset - gp;
- if (r_info == R_PARISC_LTOFF14R)
- ret = patch_14r(v, loc);
- else
- ret = patch_21l(v, loc);
- }
- break;
- case R_PARISC_PCREL22F:
- {
- hppa64_got_t *ge;
-
- assert(isym != NULL);
- for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; )
- ge = ge->next;
- assert(ge != NULL);
- if (!ge->reloc_done)
- {
- ge->reloc_done = TRUE;
- *(Elf64_Addr *)(hfile->got->contents + ge->offset) = v;
- }
- if ((isym->root.secidx > SHN_HIRESERVE) ||
- ((Elf64_Sxword) (v - dot - 8) > 0x800000-1) ||
- ((Elf64_Sxword) (v - dot - 8) < -0x800000))
- {
- hppa64_stub_t *se;
-
- for (se = isym->stubent; se != NULL && se->addend != rel->r_addend; )
- se = se->next;
- assert(se != NULL);
- if (!se->reloc_done)
- {
- /* This requires that we can get from dp to the entry in +/- 8K,
- * or +/- 1000 entries. patch_14r2() will check that.
- * Only need these dlt entries for calls to external/far
- * functions, so should probably put them in a seperate section
- * before dlt and point dp at the section. Change to that
- * scheme if we hit problems with big modules.
- */
- unsigned char *stub;
-
- if (!strncmp(isym->root.name, "$$", 2))
- stub = hppa64_stub_millicode;
- else
- stub = hppa64_stub_extern;
- se->reloc_done = TRUE;
- memcpy((Elf64_Addr *)(hfile->stub->contents + se->offset),
- stub, SIZEOF_STUB);
- v = (Elf64_Addr)(hfile->got->header.sh_addr + ge->offset) - gp;
- ret = patch_14r2(v, (Elf64_Word *)(hfile->stub->contents + se->offset));
- }
- v = hfile->stub->header.sh_addr + se->offset;
- }
- v = v - dot - 8;
- if (ret == obj_reloc_ok)
- ret = patch_22f(v, loc);
- }
- break;
- case R_PARISC_DIR64:
- {
- loc[0] = v >> 32;
- loc[1] = v;
- }
- break;
- case R_PARISC_FPTR64:
- {
- assert(isym != NULL);
- if (isym->root.secidx <= SHN_HIRESERVE) /* local */
- {
- assert(isym->opdent != NULL);
- if (!isym->opdent->reloc_done)
- {
- isym->opdent->reloc_done = TRUE;
- *(Elf64_Addr *)(hfile->opd->contents + isym->opdent->offset + 16) = v;
- *(Elf64_Addr *)(hfile->opd->contents + isym->opdent->offset + 24) = gp;
- }
- v = hfile->opd->header.sh_addr + isym->opdent->offset;
- }
- loc[0] = v >> 32;
- loc[1] = v;
- }
- break;
- }
- return ret;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- hppa64_file_t *hfile = (hppa64_file_t *)f;
- Elf64_Addr *opd = (Elf64_Addr *)(hfile->opd->contents);
-
- opd[0] = 0;
- opd[1] = 0;
- if ((opd[2] = mod->init) != 0)
- {
- opd[3] = hfile->gp;
- mod->init = hfile->opd->header.sh_addr;
- }
-
- opd[4] = 0;
- opd[5] = 0;
- if ((opd[6] = mod->cleanup) != 0)
- {
- opd[7] = hfile->gp;
- mod->cleanup = hfile->opd->header.sh_addr + 32;
- }
-
- return 1;
-}
-
-/* XXX Is this relevant to parisc? */
-
-int
-arch_archdata (struct obj_file *f, struct obj_section *archdata_sec)
-{
- hppa64_file_t *hfile = (hppa64_file_t *)f;
- struct archdata {
- unsigned tgt_long unw_table;
- unsigned tgt_long segment_base;
- unsigned tgt_long unw_start;
- unsigned tgt_long unw_end;
- unsigned tgt_long gp;
- } *ad;
- int i;
- struct obj_section *sec;
-
- free(archdata_sec->contents);
- archdata_sec->contents = xmalloc(sizeof(struct archdata));
- memset(archdata_sec->contents, 0, sizeof(struct archdata));
- archdata_sec->header.sh_size = sizeof(struct archdata);
-
- ad = (struct archdata *)(archdata_sec->contents);
- ad->gp = hfile->gp;
- ad->unw_start = 0;
- ad->unw_end = 0;
- ad->unw_table = 0;
- ad->segment_base = f->sections[1]->header.sh_addr;
- for (i = 0; i < f->header.e_shnum; ++i)
- {
- sec = f->sections[i];
- if (sec->header.sh_type == SHT_PARISC_UNWIND)
- {
- ad->unw_start = sec->header.sh_addr;
- ad->unw_end = sec->header.sh_addr + sec->header.sh_size;
- break;
- }
- }
-
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_i386.c b/mdk-stage1/insmod-modutils/obj/obj_i386.c
deleted file mode 100644
index 28df3448c..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_i386.c
+++ /dev/null
@@ -1,245 +0,0 @@
-/* i386 specific support for Elf loading and relocation.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <string.h>
-#include <assert.h>
-
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-
-/*======================================================================*/
-
-struct i386_got_entry
-{
- int offset;
- unsigned offset_done : 1;
- unsigned reloc_done : 1;
-};
-
-struct i386_file
-{
- struct obj_file root;
- struct obj_section *got;
-};
-
-struct i386_symbol
-{
- struct obj_symbol root;
- struct i386_got_entry gotent;
-};
-
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- struct i386_file *f;
- f = xmalloc(sizeof(*f));
- f->got = NULL;
- return &f->root;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- struct i386_symbol *sym;
- sym = xmalloc(sizeof(*sym));
- memset(&sym->gotent, 0, sizeof(sym->gotent));
- return &sym->root;
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf32_Rel *rel,
- Elf32_Addr v)
-{
- struct i386_file *ifile = (struct i386_file *)f;
- struct i386_symbol *isym = (struct i386_symbol *)sym;
-
- Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset);
- Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
- Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_386_NONE:
- break;
-
- case R_386_32:
- *loc += v;
- break;
-
- case R_386_PLT32:
- case R_386_PC32:
- *loc += v - dot;
- break;
-
- case R_386_GLOB_DAT:
- case R_386_JMP_SLOT:
- *loc = v;
- break;
-
- case R_386_RELATIVE:
- *loc += f->baseaddr;
- break;
-
- case R_386_GOTPC:
- assert(got != 0);
- *loc += got - dot;
- break;
-
- case R_386_GOT32:
- assert(isym != NULL);
- if (!isym->gotent.reloc_done)
- {
- isym->gotent.reloc_done = 1;
- *(Elf32_Addr *)(ifile->got->contents + isym->gotent.offset) = v;
- }
- *loc += isym->gotent.offset;
- break;
-
- case R_386_GOTOFF:
- assert(got != 0);
- *loc += v - got;
- break;
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *f)
-{
- struct i386_file *ifile = (struct i386_file *)f;
- int i, n, offset = 0, gotneeded = 0;
-
- n = ifile->root.header.e_shnum;
- for (i = 0; i < n; ++i)
- {
- struct obj_section *relsec, *symsec, *strsec;
- Elf32_Rel *rel, *relend;
- Elf32_Sym *symtab;
- const char *strtab;
-
- relsec = ifile->root.sections[i];
- if (relsec->header.sh_type != SHT_REL)
- continue;
-
- symsec = ifile->root.sections[relsec->header.sh_link];
- strsec = ifile->root.sections[symsec->header.sh_link];
-
- rel = (Elf32_Rel *)relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel));
- symtab = (Elf32_Sym *)symsec->contents;
- strtab = (const char *)strsec->contents;
-
- for (; rel < relend; ++rel)
- {
- Elf32_Sym *extsym;
- struct i386_symbol *intsym;
- const char *name;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_386_GOTPC:
- case R_386_GOTOFF:
- gotneeded = 1;
- default:
- continue;
-
- case R_386_GOT32:
- break;
- }
-
- extsym = &symtab[ELF32_R_SYM(rel->r_info)];
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = (struct i386_symbol *)obj_find_symbol(&ifile->root, name);
-
- if (!intsym->gotent.offset_done)
- {
- intsym->gotent.offset_done = 1;
- intsym->gotent.offset = offset;
- offset += 4;
- }
- }
- }
-
- if (offset > 0 || gotneeded)
- ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset);
-
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf32_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_ia64.c b/mdk-stage1/insmod-modutils/obj/obj_ia64.c
deleted file mode 100644
index 4f92c5d27..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_ia64.c
+++ /dev/null
@@ -1,1065 +0,0 @@
-/*
- * ia64 specific support for Elf loading and relocation.
- * Copyright 2000 Mike Stephens <mike.stephens@intel.com>
- *
- * This file is part of the Linux modutils.
- *
- * 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.
- */
-
-#ident "$Id$"
-
-#include <string.h>
-#include <assert.h>
-#include <stdlib.h>
-
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-#ifndef TRUE
-#define TRUE ~FALSE
-#endif
-
-/*======================================================================*/
-
-typedef struct _ia64_opd_t
-{
- int offset;
- int reloc_done;
-} ia64_opd_t;
-
-typedef struct _ia64_plt_t
-{
- struct _ia64_plt_t *next;
- Elf64_Addr addend;
- int text_offset;
- int data_offset;
- int reloc_done;
-} ia64_plt_t;
-
-typedef struct _ia64_got_t
-{
- struct _ia64_got_t *next;
- Elf64_Addr addend;
- int offset;
- int reloc_done;
-} ia64_got_t;
-
-typedef struct _ia64_symbol_t
-{
- struct obj_symbol root;
- ia64_got_t *gotent;
- ia64_opd_t *opdent;
- ia64_plt_t *pltent;
-} ia64_symbol_t;
-
-typedef struct _ia64_file_t
-{
- struct obj_file root;
- struct obj_section *got;
- struct obj_section *opd;
- struct obj_section *pltt;
- struct obj_section *pltd;
- Elf64_Addr gp;
- Elf64_Addr text;
- Elf64_Addr data;
- Elf64_Addr bss;
-} ia64_file_t;
-
-/*
- * aa=gp rel address of the function descriptor in the .IA_64.pltoff section
- */
-unsigned char ia64_plt_local[] =
-{
- 0x0b, 0x78, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r15=aa,gp;; */
- 0x00, 0x41, 0x3c, 0x30, 0x28, 0xc0, /* ld8 r16=[r15],8 */
- 0x01, 0x08, 0x00, 0x84, /* mov r14=gp;; */
- 0x11, 0x08, 0x00, 0x1e, 0x18, 0x10, /* [MIB] ld8 gp=[r15] */
- 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */
- 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */
-};
-
-unsigned char ia64_plt_extern[] =
-{
- 0x0b, 0x80, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r16=aa,gp;; */
- 0xf0, 0x00, 0x40, 0x30, 0x20, 0x00, /* ld8 r15=[r16] */
- 0x00, 0x00, 0x04, 0x00, /* nop.i 0x0;; */
- 0x0b, 0x80, 0x20, 0x1e, 0x18, 0x14, /* [MMI] ld8 r16=[r15],8;; */
- 0x10, 0x00, 0x3c, 0x30, 0x20, 0xc0, /* ld8 gp=[r15] */
- 0x00, 0x09, 0x00, 0x07, /* mov b6=r16;; */
- 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MIB] nop.m 0x0 */
- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* nop.i 0x0 */
- 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */
-};
-
-/*======================================================================*/
-
-/*
- * return the instruction at slot in bundle
- */
-Elf64_Xword
-obj_ia64_ins_extract_from_bundle(Elf64_Addr *bundle, Elf64_Xword slot)
-{
- switch (slot)
- {
- case 0 :
- return (*bundle >> 5) & 0x1ffffffffff;
-
- case 1 :
- return (((*bundle >> 46) & 0x3ffff) |
- (*(bundle + 1) << 18)) & 0x1ffffffffff;
-
- case 2 :
- return (*(bundle + 1) >> 23) & 0x1ffffffffff;
-
- default:
- }
- return (-1);
-}
-
-/*
- * insert a instruction at slot in bundle
- */
-void
-obj_ia64_ins_insert_in_bundle(Elf64_Addr *bundle, Elf64_Xword slot, Elf64_Xword ins)
-{
- Elf64_Xword i;
- Elf64_Xword in = ins & 0x1ffffffffff;
-
- switch (slot)
- {
- case 0 :
- i = *bundle & 0xffffc0000000001f;
- *bundle = i | (in << 5);
- break;
-
- case 1 :
- i = *bundle & 0x00003fffffffffff;
- *bundle = i | (in << 46);
-
- ++bundle;
- i = *bundle & 0xffffffffff800000;
- *bundle = i | (in >> 18);
- break;
-
- case 2 :
- ++bundle;
- i = *bundle & 0x00000000007fffff;
- *bundle = i | (in << 23);
- break;
- }
-}
-
-/*
- * add a immediate 14 value to the instruction at slot in bundle
- */
-enum obj_reloc
-obj_ia64_ins_imm14(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot)
-{
- Elf64_Xword ins;
-
- ins = obj_ia64_ins_extract_from_bundle(bundle, slot);
- ins &= 0xffffffee07f01fff;
- ins |= ((v & 0x2000) << 23) | ((v & 0x1f80) << 20) | ((v & 0x007f) << 13);
- obj_ia64_ins_insert_in_bundle(bundle, slot, ins);
- if (((Elf64_Sxword) v > 8191) || ((Elf64_Sxword) v < -8192))
- return obj_reloc_overflow;
- return obj_reloc_ok;
-}
-
-/*
- * add a immediate 22 value to the instruction at slot in bundle
- */
-enum obj_reloc
-obj_ia64_ins_imm22(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot)
-{
- Elf64_Xword ins;
-
- ins = obj_ia64_ins_extract_from_bundle(bundle, slot);
- ins &= 0xffffffe000301fff;
- ins |= ((v & 0x200000) << 15) | ((v & 0x1f0000) << 6) |
- ((v & 0x00ff80) << 20) | ((v & 0x00007f) << 13);
- obj_ia64_ins_insert_in_bundle(bundle, slot, ins);
- if (((Elf64_Sxword) v > 2097151) || ((Elf64_Sxword) v < -2097152))
- return obj_reloc_overflow;
- return obj_reloc_ok;
-}
-
-/*
- * add a immediate 21 value (form 1) to the instruction at slot in bundle
- */
-enum obj_reloc
-obj_ia64_ins_pcrel21b(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot)
-{
- Elf64_Xword ins;
-
- ins = obj_ia64_ins_extract_from_bundle(bundle, slot);
- ins &= 0xffffffee00001fff;
- ins |= ((v & 0x1000000) << 12) | ((v & 0x0fffff0) << 9);
- obj_ia64_ins_insert_in_bundle(bundle, slot, ins);
- return obj_reloc_ok;
-}
-
-/*
- * add a immediate 21 value (form 2) to the instruction at slot in bundle
- */
-enum obj_reloc
-obj_ia64_ins_pcrel21m(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot)
-{
- Elf64_Xword ins;
-
- ins = obj_ia64_ins_extract_from_bundle(bundle, slot);
- ins &= 0xffffffee000fe03f;
- ins |= ((v & 0x1000000) << 12) | ((v & 0x0fff800) << 9) |
- ((v & 0x00007f0) << 2);
- obj_ia64_ins_insert_in_bundle(bundle, slot, ins);
- return obj_reloc_ok;
-}
-
-/*
- * add a immediate 21 value (form 3) to the instruction at slot in bundle
- */
-enum obj_reloc
-obj_ia64_ins_pcrel21f(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot)
-{
- Elf64_Xword ins;
-
- ins = obj_ia64_ins_extract_from_bundle(bundle, slot);
- ins &= 0xffffffeffc00003f;
- ins |= ((v & 0x1000000) << 12) | ((v & 0x0fffff0) << 2);
- obj_ia64_ins_insert_in_bundle(bundle, slot, ins);
- return obj_reloc_ok;
-}
-
-/*
- * add a immediate 64 value to the instruction at slot in bundle
- */
-enum obj_reloc
-obj_ia64_ins_imm64(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot)
-{
- Elf64_Xword ins;
-
- assert(slot == 1);
- ins = obj_ia64_ins_extract_from_bundle(bundle, slot);
- ins &= 0xffffffee000101ff;
- ins |= ((v & 0x8000000000000000) >> 28) | ((v & 0x0000000000200000)) |
- ((v & 0x00000000001f0000) << 6) | ((v & 0x000000000000ff80) << 20) |
- ((v & 0x000000000000007f) << 13);
- obj_ia64_ins_insert_in_bundle(bundle, slot, ins);
- obj_ia64_ins_insert_in_bundle(bundle, ++slot, ((v & 0x7fffffffffc00000) >> 22));
- return obj_reloc_ok;
-}
-
-/*
- * create a plt entry
- */
-enum obj_reloc
-obj_ia64_generate_plt(Elf64_Addr v,
- Elf64_Addr gp,
- ia64_file_t *ifile,
- ia64_symbol_t *isym,
- ia64_plt_t *pltent)
-{
- *(Elf64_Addr *)(ifile->pltd->contents + pltent->data_offset) = v;
- if (isym->root.secidx <= SHN_HIRESERVE)
- {
- /* local entry */
- *(Elf64_Addr *)(ifile->pltd->contents + pltent->data_offset + 8) = gp;
- memcpy((Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset),
- ia64_plt_local, sizeof(ia64_plt_local));
- }
- else
- {
- /* external entry */
- memcpy((Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset),
- ia64_plt_extern, sizeof(ia64_plt_extern));
- }
- return obj_ia64_ins_imm22(
- (ifile->pltd->header.sh_addr + pltent->data_offset - gp),
- (Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset), 0);
-}
-
-struct obj_section *
-obj_ia64_create_alloced_section (struct obj_file *f, const char *name,
- unsigned long align, unsigned long size, unsigned long sh_flags)
-{
- int newidx = f->header.e_shnum++;
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec));
- f->sections[newidx] = sec = arch_new_section();
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = sh_flags;
- sec->header.sh_size = size;
- sec->header.sh_addralign = align;
- sec->name = name;
- sec->idx = newidx;
- if (size)
- sec->contents = xmalloc(size);
-
- obj_insert_section_load_order(f, sec);
-
- return sec;
-}
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- ia64_file_t *f;
- f = xmalloc(sizeof(*f));
- f->got = NULL;
- f->opd = NULL;
- f->pltt = NULL;
- f->pltd = NULL;
- return &f->root;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- ia64_symbol_t *sym;
- sym = xmalloc(sizeof(*sym));
- sym->gotent = NULL;
- sym->opdent = NULL;
- sym->pltent = NULL;
- return &sym->root;
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- switch (sec->header.sh_type)
- {
- case SHT_IA_64_EXT :
- sec->contents = NULL;
- break;
-
- case SHT_IA_64_UNWIND :
- if (sec->header.sh_size > 0)
- {
- sec->contents = xmalloc(sec->header.sh_size);
- gzf_lseek(fp, sec->header.sh_offset, SEEK_SET);
- if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size)
- {
- error("error reading ELF section data: %m");
- return -1;
- }
- }
- else
- sec->contents = NULL;
- break;
-
- default:
- error("Unknown section header type: %08x", sec->header.sh_type);
- return -1;
- }
- return 0;
-}
-
-int
-arch_create_got(struct obj_file *f)
-{
- ia64_file_t *ifile = (ia64_file_t *)f;
- int i;
- int n;
- int got_offset = 0;
- int opd_offset = 32;
- int plt_text_offset = 0;
- int plt_data_offset = 0;
-
- n = ifile->root.header.e_shnum;
- for (i = 0; i < n; ++i)
- {
- struct obj_section *relsec, *symsec, *strsec;
- Elf64_Rela *rel, *relend;
- Elf64_Sym *symtab;
- const char *strtab;
-
- relsec = ifile->root.sections[i];
- if (relsec->header.sh_type != SHT_RELA)
- continue;
-
- symsec = ifile->root.sections[relsec->header.sh_link];
- strsec = ifile->root.sections[symsec->header.sh_link];
-
- rel = (Elf64_Rela *)relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela));
- symtab = (Elf64_Sym *)symsec->contents;
- strtab = (const char *)strsec->contents;
-
- for (; rel < relend; ++rel)
- {
- int need_got = FALSE;
- int need_opd = FALSE;
- int need_plt = FALSE;
-
- switch (ELF64_R_TYPE(rel->r_info))
- {
- default:
- continue;
-
- case R_IA64_FPTR64I : /* @fptr(sym + add), mov imm64 */
- case R_IA64_FPTR32LSB : /* @fptr(sym + add), data4 LSB */
- case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */
- need_opd = TRUE;
- break;
-
- case R_IA64_LTOFF22 : /* @ltoff(sym + add), add imm22 */
- case R_IA64_LTOFF22X :
- case R_IA64_LTOFF64I : /* @ltoff(sym + add), mov imm64 */
- need_got = TRUE;
- break;
-
- case R_IA64_LTOFF_FPTR22 : /* @ltoff(@fptr(s+a)), imm22 */
- case R_IA64_LTOFF_FPTR64I : /* @ltoff(@fptr(s+a)), imm64 */
- case R_IA64_LTOFF_FPTR32LSB :
- case R_IA64_LTOFF_FPTR64LSB :
- need_got = TRUE;
- need_opd = TRUE;
- break;
-
- case R_IA64_PLTOFF22 : /* @pltoff(sym + add), add imm22 */
- case R_IA64_PLTOFF64I : /* @pltoff(sym + add), mov imm64 */
- case R_IA64_PLTOFF64LSB : /* @pltoff(sym + add), data8 LSB */
-
- case R_IA64_PCREL21B : /* @pcrel(sym + add), ptb, call */
- case R_IA64_PCREL21M : /* @pcrel(sym + add), chk.s */
- case R_IA64_PCREL21F : /* @pcrel(sym + add), fchkf */
- need_plt = TRUE;
- break;
- }
-
- if (need_got || need_opd || need_plt)
- {
- Elf64_Sym *extsym;
- ia64_symbol_t *isym;
- const char *name;
- int local;
- unsigned long symndx;
-
- symndx = ELF64_R_SYM(rel->r_info);
- extsym = &symtab[symndx];
- if (ELF64_ST_BIND(extsym->st_info) == STB_LOCAL)
- {
- isym = (ia64_symbol_t *) f->local_symtab[symndx];
- }
- else
- {
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- isym = (ia64_symbol_t *)obj_find_symbol(f, name);
- }
- local = isym->root.secidx <= SHN_HIRESERVE;
-
- if (need_plt)
- {
- ia64_plt_t *plt;
-
- for (plt = isym->pltent; plt != NULL; plt = plt->next)
- if (plt->addend == rel->r_addend)
- break;
- if (plt == NULL)
- {
- plt = (ia64_plt_t *) xmalloc(sizeof(ia64_plt_t));
- plt->next = isym->pltent;
- plt->addend = rel->r_addend;
- plt->text_offset = plt_text_offset;
- plt->data_offset = plt_data_offset;
- plt->reloc_done = FALSE;
- isym->pltent = plt;
- if (local)
- {
- plt_text_offset += sizeof(ia64_plt_local);
- plt_data_offset += 16;
- }
- else
- {
- plt_text_offset += sizeof(ia64_plt_extern);
- plt_data_offset += 8;
- }
- need_plt = FALSE;
- }
- }
- if (need_got)
- {
- ia64_got_t *got;
-
- for (got = isym->gotent; got != NULL; got = got->next)
- if (got->addend == rel->r_addend)
- break;
- if (got == NULL)
- {
- got = (ia64_got_t *) xmalloc(sizeof(ia64_got_t));
- got->next = isym->gotent;
- got->addend = rel->r_addend;
- got->offset = got_offset;
- got->reloc_done = FALSE;
- isym->gotent = got;
- got_offset += 8;
- need_got = FALSE;
- }
- }
- if (need_opd && local)
- {
- ia64_opd_t *opd;
-
- if (isym->opdent == NULL)
- {
- opd = (ia64_opd_t *) xmalloc(sizeof(ia64_opd_t));
- opd->offset = opd_offset;
- opd->reloc_done = FALSE;
- isym->opdent = opd;
- opd_offset += 16;
- need_opd = FALSE;
- }
- }
- }
- }
- }
-
- ifile->got = obj_ia64_create_alloced_section(f, ".got", 8, got_offset,
- (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT));
- assert(ifile->got != NULL);
-
- ifile->opd = obj_ia64_create_alloced_section(f, ".opd", 16, opd_offset,
- (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT));
- assert(ifile->opd != NULL);
-
- if (plt_text_offset > 0)
- {
- ifile->pltt = obj_ia64_create_alloced_section(f, ".plt", 16,
- plt_text_offset, (SHF_ALLOC | SHF_EXECINSTR | SHF_IA_64_SHORT));
- ifile->pltd = obj_ia64_create_alloced_section(f, ".IA_64.pltoff",
- 16, plt_data_offset, (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT));
- assert(ifile->pltt != NULL);
- assert(ifile->pltd != NULL);
- }
-
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf64_Addr base)
-{
- ia64_file_t *ifile = (ia64_file_t *)f;
- Elf64_Addr min_addr = (Elf64_Addr) -1;
- Elf64_Addr max_addr = 0;
- Elf64_Addr min_short_addr = (Elf64_Addr) -1;
- Elf64_Addr max_short_addr = 0;
- Elf64_Addr gp;
- Elf64_Addr text = (Elf64_Addr) -1;
- Elf64_Addr data = (Elf64_Addr) -1;
- Elf64_Addr bss = (Elf64_Addr) -1;
- int n = f->header.e_shnum;
- int i;
-
- /*
- * Finalize the addresses of the sections, find the min and max
- * address of all sections marked short, and collect min and max
- * address of any type, for use in selecting a nice gp.
- *
- * The algorithm used for selecting set the GP value was taken from
- * the ld/bfd code contributed by David Mosberger-Tang <davidm@hpl.hp.com>
- */
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- {
- Elf64_Shdr *header = &f->sections[i]->header;
- Elf64_Addr lo;
- Elf64_Addr hi;
-
- header->sh_addr += base;
- if (header->sh_flags & SHF_ALLOC)
- {
- lo = header->sh_addr;
- hi = header->sh_addr + header->sh_size;
- if (hi < lo)
- hi = (Elf64_Addr) -1;
-
- if (min_addr > lo)
- min_addr = lo;
- if (max_addr < hi)
- max_addr = hi;
- if (header->sh_flags & SHF_IA_64_SHORT)
- {
- if (min_short_addr > lo)
- min_short_addr = lo;
- if (max_short_addr < hi)
- max_short_addr = hi;
- }
- if ((header->sh_type & SHT_NOBITS) && (lo < bss))
- bss = lo;
- else if ((header->sh_flags & SHF_EXECINSTR) && (lo < text))
- text = lo;
- else if (lo < data)
- data = lo;
- }
- }
- /* Pick a sensible value for gp */
-
- /* Start with just the address of the .got */
- gp = ifile->got->header.sh_addr;
-
- /*
- * If it is possible to address the entire image, but we
- * don't with the choice above, adjust.
- */
- if ((max_addr - min_addr < 0x400000) && (max_addr - gp <= 0x200000) &&
- (gp - min_addr > 0x200000))
- {
- gp = min_addr + 0x200000;
- }
- else if (max_short_addr != 0)
- {
- /* If we don't cover all the short data, adjust */
- if (max_short_addr - gp >= 0x200000)
- gp = min_short_addr + 0x200000;
-
- /* If we're addressing stuff past the end, adjust back */
- if (gp > max_addr)
- gp = max_addr - 0x200000 + 8;
- }
-
- /*
- * Validate whether all SHF_IA_64_SHORT sections are within
- * range of the chosen GP.
- */
- if (max_short_addr != 0)
- {
- if (max_short_addr - min_short_addr >= 0x400000)
- {
- error("short data segment overflowed (0x%lx >= 0x400000)",
- (unsigned long)(max_short_addr - min_short_addr));
- return 0;
- }
- else if (((gp > min_short_addr) && (gp - min_short_addr > 0x200000)) ||
- ((gp < max_short_addr) && (max_short_addr - gp >= 0x200000)))
- {
- error("GP does not cover short data segment");
- return 0;
- }
- }
- ifile->gp = gp;
- ifile->text = text;
- ifile->data = data;
- ifile->bss = bss;
- return 1;
-}
-
-/* Targets can be unaligned, use memcpy instead of assignment */
-#define COPY_64LSB(loc, v) \
- do { \
- Elf64_Xword reloc = (v); \
- memcpy((void *)(loc), &reloc, 8); \
- } while(0)
-#define COPY_32LSB(loc, v) \
- do { \
- Elf32_Xword reloc = (v); \
- memcpy((void *)(loc), &reloc, 4); \
- if ((v) != reloc) \
- ret = obj_reloc_overflow; \
- } while(0)
-
-enum obj_reloc
-arch_apply_relocation(struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf64_Rela *rel,
- Elf64_Addr v)
-{
- ia64_file_t *ifile = (ia64_file_t *) f;
- ia64_symbol_t *isym = (ia64_symbol_t *) sym;
-
- Elf64_Addr loc = (Elf64_Addr)(targsec->contents + rel->r_offset);
- Elf64_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03;
-
- Elf64_Addr got = ifile->got->header.sh_addr;
- Elf64_Addr gp = ifile->gp;
-
- Elf64_Addr *bundle = (Elf64_Addr *)(loc & ~0x03);
- Elf64_Xword slot = loc & 0x03;
-
- Elf64_Xword r_info = ELF64_R_TYPE(rel->r_info);
-
- enum obj_reloc ret = obj_reloc_ok;
-
- /* We cannot load modules compiled with -mconstant-gp */
-#ifndef EF_IA_64_CONS_GP
-#define EF_IA_64_CONS_GP 0x00000040
-#endif
-#ifndef EF_IA_64_NOFUNCDESC_CONS_GP
-#define EF_IA_64_NOFUNCDESC_CONS_GP 0x00000080
-#endif
- if (f->header.e_flags & (EF_IA_64_CONS_GP | EF_IA_64_NOFUNCDESC_CONS_GP))
- return obj_reloc_constant_gp;
-
- switch (r_info)
- {
- case R_IA64_NONE : /* none */
- case R_IA64_LDXMOV : /* Use of LTOFF22X. */
- break;
-
- case R_IA64_IMM14 : /* symbol + addend, add imm14 */
- ret = obj_ia64_ins_imm14(v, bundle, slot);
- break;
-
- case R_IA64_IMM22 : /* symbol + addend, add imm22 */
- ret = obj_ia64_ins_imm22(v, bundle, slot);
- break;
-
- case R_IA64_IMM64 : /* symbol + addend, movl imm64 */
- ret = obj_ia64_ins_imm64(v, bundle, slot);
- break;
-
- case R_IA64_DIR32LSB : /* symbol + addend, data4 LSB */
- COPY_32LSB(loc, v);
- break;
-
- case R_IA64_DIR64LSB : /* symbol + addend, data8 LSB */
- COPY_64LSB(loc, v);
- break;
-
- case R_IA64_GPREL22 : /* @gprel(sym + add), add imm22 */
- v -= gp;
- ret = obj_ia64_ins_imm22(v, bundle, slot);
- break;
-
- case R_IA64_GPREL64I : /* @gprel(sym + add), mov imm64 */
- v -= gp;
- ret = obj_ia64_ins_imm64(v, bundle, slot);
- break;
-
- case R_IA64_GPREL32LSB : /* @gprel(sym + add), data4 LSB */
- COPY_32LSB(loc, v-gp);
- break;
-
- case R_IA64_GPREL64LSB : /* @gprel(sym + add), data8 LSB */
- COPY_64LSB(loc, v-gp);
- break;
-
- case R_IA64_LTOFF22 : /* @ltoff(sym + add), add imm22 */
- case R_IA64_LTOFF22X : /* LTOFF22, relaxable. */
- case R_IA64_LTOFF64I : /* @ltoff(sym + add), mov imm64 */
- {
- ia64_got_t *ge;
-
- assert(isym != NULL);
- for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; )
- ge = ge->next;
- assert(ge != NULL);
- if (!ge->reloc_done)
- {
- ge->reloc_done = TRUE;
- *(Elf64_Addr *)(ifile->got->contents + ge->offset) = v;
- }
- v = got + ge->offset - gp;
- if (r_info == R_IA64_LTOFF64I)
- ret = obj_ia64_ins_imm64(v, bundle, slot);
- else
- ret = obj_ia64_ins_imm22(v, bundle, slot);
- }
- break;
-
- case R_IA64_PLTOFF22 : /* @pltoff(sym + add), add imm22 */
- case R_IA64_PLTOFF64I : /* @pltoff(sym + add), mov imm64 */
- case R_IA64_PLTOFF64LSB : /* @pltoff(sym + add), data8 LSB */
- {
- ia64_plt_t *pe;
-
- assert(isym != NULL);
- for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend; )
- pe = pe->next;
- assert(pe != NULL);
- if (!pe->reloc_done)
- {
- pe->reloc_done = TRUE;
- ret = obj_ia64_generate_plt(v, gp, ifile, isym, pe);
- }
- v = ifile->pltt->header.sh_addr + pe->text_offset - gp;
- switch (r_info)
- {
- case R_IA64_PLTOFF22 :
- ret = obj_ia64_ins_imm22(v, bundle, slot);
- break;
-
- case R_IA64_PLTOFF64I :
- ret = obj_ia64_ins_imm64(v, bundle, slot);
- break;
-
- case R_IA64_PLTOFF64LSB :
- COPY_64LSB(loc, v);
- break;
- }
- }
- break;
-
- case R_IA64_FPTR64I : /* @fptr(sym + add), mov imm64 */
- case R_IA64_FPTR32LSB : /* @fptr(sym + add), data4 LSB */
- case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */
- assert(isym != NULL);
- if (isym->root.secidx <= SHN_HIRESERVE)
- {
- assert(isym->opdent != NULL);
- if (!isym->opdent->reloc_done)
- {
- isym->opdent->reloc_done = TRUE;
- *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset) = v;
- *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset + 8) = gp;
- }
- v = ifile->opd->header.sh_addr + isym->opdent->offset;
- }
- switch (r_info)
- {
- case R_IA64_FPTR64I :
- ret = obj_ia64_ins_imm64(v, bundle, slot);
- break;
-
- case R_IA64_FPTR32LSB :
- COPY_32LSB(loc, v);
- break;
-
- case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */
- /* Target can be unaligned */
- COPY_64LSB(loc, v);
- break;
- }
- break;
-
- case R_IA64_PCREL21B : /* @pcrel(sym + add), ptb, call */
- case R_IA64_PCREL21M : /* @pcrel(sym + add), chk.s */
- case R_IA64_PCREL21F : /* @pcrel(sym + add), fchkf */
- assert(isym != NULL);
- if ((isym->root.secidx > SHN_HIRESERVE) ||
- ((Elf64_Sxword) (v - dot) > 16777215) ||
- ((Elf64_Sxword) (v - dot) < -16777216))
- {
- ia64_plt_t *pe;
-
- for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend; )
- pe = pe->next;
- assert(pe != NULL);
- if (!pe->reloc_done)
- {
- pe->reloc_done = TRUE;
- ret = obj_ia64_generate_plt(v, gp, ifile, isym, pe);
- }
- v = ifile->pltt->header.sh_addr + pe->text_offset;
- }
- v -= dot;
- switch (r_info)
- {
- case R_IA64_PCREL21B :
- ret = obj_ia64_ins_pcrel21b(v, bundle, slot);
- break;
-
- case R_IA64_PCREL21M :
- ret = obj_ia64_ins_pcrel21m(v, bundle, slot);
- break;
-
- case R_IA64_PCREL21F :
- ret = obj_ia64_ins_pcrel21f(v, bundle, slot);
- break;
- }
- break;
-
- case R_IA64_PCREL32LSB : /* @pcrel(sym + add), data4 LSB */
- COPY_32LSB(loc, v-dot);
- break;
-
- case R_IA64_PCREL64LSB : /* @pcrel(sym + add), data8 LSB */
- COPY_64LSB(loc, v-dot);
- break;
-
- case R_IA64_LTOFF_FPTR22 : /* @ltoff(@fptr(s+a)), imm22 */
- case R_IA64_LTOFF_FPTR64I : /* @ltoff(@fptr(s+a)), imm64 */
- case R_IA64_LTOFF_FPTR32LSB : /* @ltoff(@fptr(s+a)), data4 */
- case R_IA64_LTOFF_FPTR64LSB : /* @ltoff(@fptr(s+a)), data8 */
- {
- ia64_got_t *ge;
-
- assert(isym != NULL);
- if (isym->root.secidx <= SHN_HIRESERVE)
- {
- assert(isym->opdent != NULL);
- if (!isym->opdent->reloc_done)
- {
- isym->opdent->reloc_done = TRUE;
- *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset) = v;
- *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset + 8) = gp;
- }
- v = ifile->opd->header.sh_addr + isym->opdent->offset;
- }
- for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; )
- ge = ge->next;
- assert(ge != NULL);
- if (!ge->reloc_done)
- {
- ge->reloc_done = TRUE;
- *(Elf64_Addr *)(ifile->got->contents + ge->offset) = v;
- }
- v = got + ge->offset - gp;
- switch (r_info)
- {
- case R_IA64_LTOFF_FPTR22 :
- ret = obj_ia64_ins_imm22(v, bundle, slot);
- break;
-
- case R_IA64_LTOFF_FPTR64I :
- ret = obj_ia64_ins_imm64(v, bundle, slot);
- break;
-
- case R_IA64_LTOFF_FPTR32LSB :
- COPY_32LSB(loc, v);
- break;
-
- case R_IA64_LTOFF_FPTR64LSB :
- COPY_64LSB(loc, v);
- break;
- }
- }
- break;
-
- case R_IA64_SEGREL32LSB : /* @segrel(sym + add), data4 LSB */
- case R_IA64_SEGREL64LSB : /* @segrel(sym + add), data8 LSB */
- if (targsec->header.sh_type & SHT_NOBITS)
- v = ifile->bss - v;
- else if (targsec->header.sh_flags & SHF_EXECINSTR)
- v = ifile->text - v;
- else
- v = ifile->data - v;
- if (r_info == R_IA64_SEGREL32LSB)
- COPY_32LSB(loc, v);
- else
- COPY_64LSB(loc, v);
- break;
-
- case R_IA64_SECREL32LSB : /* @secrel(sym + add), data4 LSB */
- COPY_32LSB(loc, targsec->header.sh_addr - v);
- break;
-
- case R_IA64_SECREL64LSB : /* @secrel(sym + add), data8 LSB */
- COPY_64LSB(loc, targsec->header.sh_addr - v);
- break;
-
- /*
- * We don't handle the big-endian relocates
- *
- * R_IA64_DIR32MSB symbol + addend, data4 MSB
- * R_IA64_DIR64MSB symbol + addend, data8 MSB
- * R_IA64_GPREL32MSB @gprel(sym + add), data4 MSB
- * R_IA64_GPREL64MSB @gprel(sym + add), data8 MSB
- * R_IA64_PLTOFF64MSB @pltoff(sym + add), data8 MSB
- * R_IA64_FPTR32MSB @fptr(sym + add), data4 MSB
- * R_IA64_FPTR64MSB @fptr(sym + add), data8 MSB
- * R_IA64_PCREL32MSB @pcrel(sym + add), data4 MSB
- * R_IA64_PCREL64MSB @pcrel(sym + add), data8 MSB
- * R_IA64_SEGREL32MSB @segrel(sym + add), data4 MSB
- * R_IA64_SEGREL64MSB @segrel(sym + add), data8 MSB
- * R_IA64_SECREL32MSB @secrel(sym + add), data4 MSB
- * R_IA64_SECREL64MSB @secrel(sym + add), data8 MSB
- * R_IA64_REL32MSB data 4 + REL
- * R_IA64_REL64MSB data 8 + REL
- * R_IA64_LTV32MSB symbol + addend, data4 MSB
- * R_IA64_LTV64MSB symbol + addend, data8 MSB
- * R_IA64_IPLTMSB dynamic reloc, imported PLT, MSB
- */
- default:
- case R_IA64_REL32LSB : /* data 4 + REL */
- case R_IA64_REL64LSB : /* data 8 + REL */
- case R_IA64_LTV32LSB : /* symbol + addend, data4 LSB */
- case R_IA64_LTV64LSB : /* symbol + addend, data8 LSB */
- case R_IA64_IPLTLSB : /* dynamic reloc, imported PLT, LSB */
- ret = obj_reloc_unhandled;
- break;
- }
- return ret;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- ia64_file_t *ifile = (ia64_file_t *)f;
- Elf64_Addr *opd = (Elf64_Addr *)(ifile->opd->contents);
-
- if ((opd[0] = mod->init) != 0)
- {
- opd[1] = ifile->gp;
- mod->init = ifile->opd->header.sh_addr;
- }
-
- if ((opd[2] = mod->cleanup) != 0)
- {
- opd[3] = ifile->gp;
- mod->cleanup = ifile->opd->header.sh_addr + 16;
- }
-
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *f, struct obj_section *archdata_sec)
-{
- ia64_file_t *ifile = (ia64_file_t *)f;
- struct archdata {
- unsigned tgt_long unw_table;
- unsigned tgt_long segment_base;
- unsigned tgt_long unw_start;
- unsigned tgt_long unw_end;
- unsigned tgt_long gp;
- } *ad;
- int i;
- struct obj_section *sec;
-
- free(archdata_sec->contents);
- archdata_sec->contents = xmalloc(sizeof(struct archdata));
- memset(archdata_sec->contents, 0, sizeof(struct archdata));
- archdata_sec->header.sh_size = sizeof(struct archdata);
-
- ad = (struct archdata *)(archdata_sec->contents);
- ad->gp = ifile->gp;
- ad->unw_start = 0;
- ad->unw_end = 0;
- ad->unw_table = 0;
- ad->segment_base = f->sections[1]->header.sh_addr;
- for (i = 0; i < f->header.e_shnum; ++i)
- {
- sec = f->sections[i];
- if (sec->header.sh_type == SHT_IA_64_UNWIND)
- {
- ad->unw_start = sec->header.sh_addr;
- ad->unw_end = sec->header.sh_addr + sec->header.sh_size;
- break;
- }
- }
-
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c b/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c
deleted file mode 100644
index 8385fb892..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/* Build a section containing all non-stack symbols.
- Copyright 2000 Keith Owens <kaos@ocs.com.au>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <string.h>
-#include <malloc.h>
-
-#include "obj.h"
-#include "kallsyms.h"
-#include "util.h"
-
-/*======================================================================*/
-
-#define EXPAND_BY 4096 /* Arbitrary */
-
-/* Append a string to the big list of strings */
-
-static void
-append_string (const char *s, char **strings,
- ElfW(Word) *strings_size, ElfW(Word) *strings_left)
-{
- int l = strlen(s) + 1;
- while (l > *strings_left) {
- *strings = xrealloc(*strings, *strings_size += EXPAND_BY);
- *strings_left += EXPAND_BY;
- }
- memcpy((char *)*strings+*strings_size-*strings_left, s, l);
- *strings_left -= l;
-}
-
-
-/* Append a symbol to the big list of symbols */
-
-static void
-append_symbol (const struct kallsyms_symbol *s,
- struct kallsyms_symbol **symbols,
- ElfW(Word) *symbols_size, ElfW(Word) *symbols_left)
-{
- int l = sizeof(*s);
- while (l > *symbols_left) {
- *symbols = xrealloc(*symbols, *symbols_size += EXPAND_BY);
- *symbols_left += EXPAND_BY;
- }
- memcpy((char *)*symbols+*symbols_size-*symbols_left, s, l);
- *symbols_left -= l;
-}
-
-/* qsort compare routine to sort symbols */
-
-static const char *sym_strings;
-
-static int
-symbol_compare (const void *a, const void *b)
-{
- struct kallsyms_symbol *c = (struct kallsyms_symbol *) a;
- struct kallsyms_symbol *d = (struct kallsyms_symbol *) b;
-
- if (c->symbol_addr > d->symbol_addr)
- return(1);
- if (c->symbol_addr < d->symbol_addr)
- return(-1);
- return(strcmp(sym_strings+c->name_off, sym_strings+d->name_off));
-}
-
-
-/* Extract all symbols from the input obj_file, ignore ones that are
- * no use for debugging, build an output obj_file containing only the
- * kallsyms section.
- *
- * The kallsyms section is a bit unusual. It deliberately has no
- * relocatable data, all "pointers" are represented as byte offsets
- * into the the section. This means it can be stored anywhere without
- * relocation problems. In particular it can be stored within a kernel
- * image, it can be stored separately from the kernel image, it can be
- * appended to a module just before loading, it can be stored in a
- * separate area etc.
- *
- * Format of the kallsyms section.
- *
- * Header:
- * Size of header.
- * Total size of kallsyms data, including strings.
- * Number of loaded sections.
- * Offset to first section entry from start of header.
- * Size of each section entry, excluding the name string.
- * Number of symbols.
- * Offset to first symbol entry from start of header.
- * Size of each symbol entry, excluding the name string.
- *
- * Section entry - one per loaded section.
- * Start of section[1].
- * Size of section.
- * Offset to name of section, from start of strings.
- * Section flags.
- *
- * Symbol entry - one per symbol in the input file[2].
- * Offset of section that owns this symbol, from start of section data.
- * Address of symbol within the real section[1].
- * Offset to name of symbol, from start of strings.
- *
- * Notes: [1] This is an exception to the "represent pointers as
- * offsets" rule, it is a value, not an offset. The start
- * address of a section or a symbol is extracted from the
- * obj_file data which may contain absolute or relocatable
- * addresses. If the addresses are relocatable then the
- * caller must adjust the section and/or symbol entries in
- * kallsyms after relocation.
- * [2] Only symbols that fall within loaded sections are stored.
- */
-
-int
-obj_kallsyms (struct obj_file *fin, struct obj_file **fout_result)
-{
- struct obj_file *fout;
- int i, loaded = 0, *fin_to_allsym_map;
- struct obj_section *isec, *osec;
- struct kallsyms_header *a_hdr;
- struct kallsyms_section *a_sec;
- ElfW(Off) sec_off;
- struct kallsyms_symbol *symbols = NULL, a_sym;
- ElfW(Word) symbols_size = 0, symbols_left = 0;
- char *strings = NULL, *p;
- ElfW(Word) strings_size = 0, strings_left = 0;
- ElfW(Off) file_offset;
- static char strtab[] = "\000" KALLSYMS_SEC_NAME;
-
- /* Create the kallsyms section. */
- fout = arch_new_file();
- memset(fout, 0, sizeof(*fout));
- fout->symbol_cmp = strcmp;
- fout->symbol_hash = obj_elf_hash;
- fout->load_order_search_start = &fout->load_order;
-
- /* Copy file characteristics from input file and modify to suit */
- memcpy(&fout->header, &fin->header, sizeof(fout->header));
- fout->header.e_type = ET_REL; /* Output is relocatable */
- fout->header.e_entry = 0; /* No entry point */
- fout->header.e_phoff = 0; /* No program header */
- file_offset = sizeof(fout->header); /* Step over Elf header */
- fout->header.e_shoff = file_offset; /* Section headers next */
- fout->header.e_phentsize = 0; /* No program header */
- fout->header.e_phnum = 0; /* No program header */
- fout->header.e_shnum = KALLSYMS_IDX+1; /* Initial, strtab, kallsyms */
- fout->header.e_shstrndx = KALLSYMS_IDX-1; /* strtab */
- file_offset += fout->header.e_shentsize * fout->header.e_shnum;
-
- /* Populate the section data for kallsyms itself */
- fout->sections = xmalloc(sizeof(*(fout->sections))*fout->header.e_shnum);
- memset(fout->sections, 0, sizeof(*(fout->sections))*fout->header.e_shnum);
-
- fout->sections[0] = osec = arch_new_section();
- memset(osec, 0, sizeof(*osec));
- osec->header.sh_type = SHT_NULL;
- osec->header.sh_link = SHN_UNDEF;
-
- fout->sections[KALLSYMS_IDX-1] = osec = arch_new_section();
- memset(osec, 0, sizeof(*osec));
- osec->name = ".strtab";
- osec->header.sh_type = SHT_STRTAB;
- osec->header.sh_link = SHN_UNDEF;
- osec->header.sh_offset = file_offset;
- osec->header.sh_size = sizeof(strtab);
- osec->contents = xmalloc(sizeof(strtab));
- memcpy(osec->contents, strtab, sizeof(strtab));
- file_offset += osec->header.sh_size;
-
- fout->sections[KALLSYMS_IDX] = osec = arch_new_section();
- memset(osec, 0, sizeof(*osec));
- osec->name = KALLSYMS_SEC_NAME;
- osec->header.sh_name = 1; /* Offset in strtab */
- osec->header.sh_type = SHT_PROGBITS; /* Load it */
- osec->header.sh_flags = SHF_ALLOC; /* Read only data */
- osec->header.sh_link = SHN_UNDEF;
- osec->header.sh_addralign = sizeof(ElfW(Word));
- file_offset = (file_offset + osec->header.sh_addralign - 1)
- & -(osec->header.sh_addralign);
- osec->header.sh_offset = file_offset;
-
- /* How many loaded sections are there? */
- for (i = 0; i < fin->header.e_shnum; ++i) {
- if (fin->sections[i]->header.sh_flags & SHF_ALLOC)
- ++loaded;
- }
-
- /* Initial contents, header + one entry per input section. No strings. */
- osec->header.sh_size = sizeof(*a_hdr) + loaded*sizeof(*a_sec);
- a_hdr = (struct kallsyms_header *) osec->contents =
- xmalloc(osec->header.sh_size);
- memset(osec->contents, 0, osec->header.sh_size);
- a_hdr->size = sizeof(*a_hdr);
- a_hdr->sections = loaded;
- a_hdr->section_off = a_hdr->size;
- a_hdr->section_size = sizeof(*a_sec);
- a_hdr->symbol_off = osec->header.sh_size;
- a_hdr->symbol_size = sizeof(a_sym);
- a_hdr->start = (ElfW(Addr))(~0);
-
- /* Map input section numbers to kallsyms section offsets. */
- sec_off = 0; /* Offset to first kallsyms section entry */
- fin_to_allsym_map = xmalloc(sizeof(*fin_to_allsym_map)*fin->header.e_shnum);
- for (i = 0; i < fin->header.e_shnum; ++i) {
- isec = fin->sections[i];
- if (isec->header.sh_flags & SHF_ALLOC) {
- fin_to_allsym_map[isec->idx] = sec_off;
- sec_off += a_hdr->section_size;
- }
- else
- fin_to_allsym_map[isec->idx] = -1; /* Ignore this section */
- }
-
- /* Copy the loaded section data. */
- a_sec = (struct kallsyms_section *) ((char *) a_hdr + a_hdr->section_off);
- for (i = 0; i < fin->header.e_shnum; ++i) {
- isec = fin->sections[i];
- if (!(isec->header.sh_flags & SHF_ALLOC))
- continue;
- a_sec->start = isec->header.sh_addr;
- a_sec->size = isec->header.sh_size;
- a_sec->flags = isec->header.sh_flags;
- a_sec->name_off = strings_size - strings_left;
- append_string(isec->name, &strings, &strings_size, &strings_left);
- if (a_sec->start < a_hdr->start)
- a_hdr->start = a_sec->start;
- if (a_sec->start+a_sec->size > a_hdr->end)
- a_hdr->end = a_sec->start+a_sec->size;
- ++a_sec;
- }
-
- /* Build the kallsyms symbol table from the symbol hashes. */
- for (i = 0; i < HASH_BUCKETS; ++i) {
- struct obj_symbol *sym = fin->symtab[i];
- for (sym = fin->symtab[i]; sym ; sym = sym->next) {
- if (!sym || sym->secidx >= fin->header.e_shnum)
- continue;
- if ((a_sym.section_off = fin_to_allsym_map[sym->secidx]) == -1)
- continue;
- if (strcmp(sym->name, "gcc2_compiled.") == 0 ||
- strncmp(sym->name, "__insmod_", 9) == 0)
- continue;
- a_sym.symbol_addr = sym->value;
- if (fin->header.e_type == ET_REL)
- a_sym.symbol_addr += fin->sections[sym->secidx]->header.sh_addr;
- a_sym.name_off = strings_size - strings_left;
- append_symbol(&a_sym, &symbols, &symbols_size, &symbols_left);
- append_string(sym->name, &strings, &strings_size, &strings_left);
- ++a_hdr->symbols;
- }
- }
- free(fin_to_allsym_map);
-
- /* Sort the symbols into ascending order by address and name */
- sym_strings = strings; /* For symbol_compare */
- qsort((char *) symbols, (unsigned) a_hdr->symbols,
- sizeof(* symbols), symbol_compare);
- sym_strings = NULL;
-
- /* Put the lot together */
- osec->header.sh_size = a_hdr->total_size =
- a_hdr->symbol_off +
- a_hdr->symbols*a_hdr->symbol_size +
- strings_size - strings_left;
- a_hdr = (struct kallsyms_header *) osec->contents =
- xrealloc(a_hdr, a_hdr->total_size);
- p = (char *)a_hdr + a_hdr->symbol_off;
- memcpy(p, symbols, a_hdr->symbols*a_hdr->symbol_size);
- free(symbols);
- p += a_hdr->symbols*a_hdr->symbol_size;
- a_hdr->string_off = p - (char *)a_hdr;
- memcpy(p, strings, strings_size - strings_left);
- free(strings);
-
- *fout_result = fout;
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_load.c b/mdk-stage1/insmod-modutils/obj/obj_load.c
deleted file mode 100644
index 4db20a998..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_load.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/* Elf file reader.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
- obj_free() added by Björn Ekwall <bj0rn@blox.se> March 1999
- Support for kallsyms Keith Owens <kaos@ocs.com.au> April 2000
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <alloca.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "obj.h"
-#include "util.h"
-
-/*======================================================================*/
-
-struct obj_file *
-obj_load (int fp, Elf32_Half e_type, const char *filename)
-{
- struct obj_file *f;
- ElfW(Shdr) *section_headers;
- int shnum, i;
- char *shstrtab;
-
- /* Read the file header. */
-
- f = arch_new_file();
- memset(f, 0, sizeof(*f));
- f->symbol_cmp = strcmp;
- f->symbol_hash = obj_elf_hash;
- f->load_order_search_start = &f->load_order;
-
- gzf_lseek(fp, 0, SEEK_SET);
- if (gzf_read(fp, &f->header, sizeof(f->header)) != sizeof(f->header))
- {
- error("error reading ELF header %s: %m", filename);
- return NULL;
- }
-
- if (f->header.e_ident[EI_MAG0] != ELFMAG0
- || f->header.e_ident[EI_MAG1] != ELFMAG1
- || f->header.e_ident[EI_MAG2] != ELFMAG2
- || f->header.e_ident[EI_MAG3] != ELFMAG3)
- {
- error("%s is not an ELF file", filename);
- return NULL;
- }
- if (f->header.e_ident[EI_CLASS] != ELFCLASSM
- || f->header.e_ident[EI_DATA] != ELFDATAM
- || f->header.e_ident[EI_VERSION] != EV_CURRENT
- || !MATCH_MACHINE(f->header.e_machine))
- {
- error("ELF file %s not for this architecture", filename);
- return NULL;
- }
- if (f->header.e_type != e_type && e_type != ET_NONE)
- {
- switch (e_type) {
- case ET_REL:
- error("ELF file %s not a relocatable object", filename);
- break;
- case ET_EXEC:
- error("ELF file %s not an executable object", filename);
- break;
- default:
- error("ELF file %s has wrong type, expecting %d got %d",
- filename, e_type, f->header.e_type);
- break;
- }
- return NULL;
- }
-
- /* Read the section headers. */
-
- if (f->header.e_shentsize != sizeof(ElfW(Shdr)))
- {
- error("section header size mismatch %s: %lu != %lu",
- filename,
- (unsigned long)f->header.e_shentsize,
- (unsigned long)sizeof(ElfW(Shdr)));
- return NULL;
- }
-
- shnum = f->header.e_shnum;
- f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
- memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
-
- section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
- gzf_lseek(fp, f->header.e_shoff, SEEK_SET);
- if (gzf_read(fp, section_headers, sizeof(ElfW(Shdr))*shnum) != sizeof(ElfW(Shdr))*shnum)
- {
- error("error reading ELF section headers %s: %m", filename);
- return NULL;
- }
-
- /* Read the section data. */
-
- for (i = 0; i < shnum; ++i)
- {
- struct obj_section *sec;
-
- f->sections[i] = sec = arch_new_section();
- memset(sec, 0, sizeof(*sec));
-
- sec->header = section_headers[i];
- sec->idx = i;
-
- switch (sec->header.sh_type)
- {
- case SHT_NULL:
- case SHT_NOTE:
- case SHT_NOBITS:
- /* ignore */
- break;
-
- case SHT_PROGBITS:
- case SHT_SYMTAB:
- case SHT_STRTAB:
- case SHT_RELM:
- if (sec->header.sh_size > 0)
- {
- sec->contents = xmalloc(sec->header.sh_size);
- gzf_lseek(fp, sec->header.sh_offset, SEEK_SET);
- if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size)
- {
- error("error reading ELF section data %s: %m", filename);
- return NULL;
- }
- }
- else
- sec->contents = NULL;
- break;
-
-#if SHT_RELM == SHT_REL
- case SHT_RELA:
- if (sec->header.sh_size) {
- error("RELA relocations not supported on this architecture %s", filename);
- return NULL;
- }
- break;
-#else
- case SHT_REL:
- if (sec->header.sh_size) {
- error("REL relocations not supported on this architecture %s", filename);
- return NULL;
- }
- break;
-#endif
-
- default:
- if (sec->header.sh_type >= SHT_LOPROC)
- {
- if (arch_load_proc_section(sec, fp) < 0)
- return NULL;
- break;
- }
-
- error("can't handle sections of type %ld %s",
- (long)sec->header.sh_type, filename);
- return NULL;
- }
- }
-
- /* Do what sort of interpretation as needed by each section. */
-
- shstrtab = f->sections[f->header.e_shstrndx]->contents;
-
- for (i = 0; i < shnum; ++i)
- {
- struct obj_section *sec = f->sections[i];
- sec->name = shstrtab + sec->header.sh_name;
- }
-
- for (i = 0; i < shnum; ++i)
- {
- struct obj_section *sec = f->sections[i];
-
- /* .modinfo and .modstring should be contents only but gcc has no
- * attribute for that. The kernel may have marked these sections as
- * ALLOC, ignore the allocate bit.
- */
- if (strcmp(sec->name, ".modinfo") == 0 ||
- strcmp(sec->name, ".modstring") == 0)
- sec->header.sh_flags &= ~SHF_ALLOC;
-
- if (sec->header.sh_flags & SHF_ALLOC)
- obj_insert_section_load_order(f, sec);
-
- switch (sec->header.sh_type)
- {
- case SHT_SYMTAB:
- {
- unsigned long nsym, j;
- char *strtab;
- ElfW(Sym) *sym;
-
- if (sec->header.sh_entsize != sizeof(ElfW(Sym)))
- {
- error("symbol size mismatch %s: %lu != %lu",
- filename,
- (unsigned long)sec->header.sh_entsize,
- (unsigned long)sizeof(ElfW(Sym)));
- return NULL;
- }
-
- nsym = sec->header.sh_size / sizeof(ElfW(Sym));
- strtab = f->sections[sec->header.sh_link]->contents;
- sym = (ElfW(Sym) *) sec->contents;
-
- /* Allocate space for a table of local symbols. */
- j = f->local_symtab_size = sec->header.sh_info;
- f->local_symtab = xmalloc(j *= sizeof(struct obj_symbol *));
- memset(f->local_symtab, 0, j);
-
- /* Insert all symbols into the hash table. */
- for (j = 1, ++sym; j < nsym; ++j, ++sym)
- {
- const char *name;
- if (sym->st_name)
- name = strtab+sym->st_name;
- else
- name = f->sections[sym->st_shndx]->name;
-
- obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
- sym->st_value, sym->st_size);
-
- }
- }
- break;
- }
- }
-
- /* second pass to add relocation data to symbols */
- for (i = 0; i < shnum; ++i)
- {
- struct obj_section *sec = f->sections[i];
- switch (sec->header.sh_type)
- {
- case SHT_RELM:
- {
- unsigned long nrel, j;
- ElfW(RelM) *rel;
- struct obj_section *symtab;
- char *strtab;
- if (sec->header.sh_entsize != sizeof(ElfW(RelM)))
- {
- error("relocation entry size mismatch %s: %lu != %lu",
- filename,
- (unsigned long)sec->header.sh_entsize,
- (unsigned long)sizeof(ElfW(RelM)));
- return NULL;
- }
-
- nrel = sec->header.sh_size / sizeof(ElfW(RelM));
- rel = (ElfW(RelM) *) sec->contents;
- symtab = f->sections[sec->header.sh_link];
- strtab = f->sections[symtab->header.sh_link]->contents;
-
- /* Save the relocate type in each symbol entry. */
- for (j = 0; j < nrel; ++j, ++rel)
- {
- ElfW(Sym) *extsym;
- struct obj_symbol *intsym;
- unsigned long symndx;
- symndx = ELFW(R_SYM)(rel->r_info);
- if (symndx)
- {
- extsym = ((ElfW(Sym) *) symtab->contents) + symndx;
- if (ELFW(ST_BIND)(extsym->st_info) == STB_LOCAL)
- {
- /* Local symbols we look up in the local table to be sure
- we get the one that is really intended. */
- intsym = f->local_symtab[symndx];
- }
- else
- {
- /* Others we look up in the hash table. */
- const char *name;
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = obj_find_symbol(f, name);
- }
- intsym->r_type = ELFW(R_TYPE)(rel->r_info);
- }
- }
- }
- break;
- }
- }
-
- f->filename = xstrdup(filename);
-
- return f;
-}
-
-void obj_free(struct obj_file *f)
-{
- struct obj_section *sec;
- struct obj_symbol *sym;
- struct obj_symbol *next;
- int i;
- int n;
-
- if (f->sections) {
- n = f->header.e_shnum;
- for (i = 0; i < n; ++i) {
- if ((sec = f->sections[i]) != NULL) {
- if (sec->contents)
- free(sec->contents);
- free(sec);
- }
- }
- free(f->sections);
- }
-
- for (i = 0; i < HASH_BUCKETS; ++i) {
- for (sym = f->symtab[i]; sym; sym = next) {
- next = sym->next;
- free(sym);
- }
- }
-
- if (f->local_symtab)
- free(f->local_symtab);
-
- if (f->filename)
- free((char *)(f->filename));
-
- if (f->persist)
- free((char *)(f->persist));
-
- free(f);
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_m68k.c b/mdk-stage1/insmod-modutils/obj/obj_m68k.c
deleted file mode 100644
index cb485aed7..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_m68k.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/* m68k specific support for Elf loading and relocation.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stddef.h>
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- return xmalloc(sizeof(struct obj_file));
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- return xmalloc(sizeof(struct obj_symbol));
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *ef,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf32_Rela *rel,
- Elf32_Addr v)
-{
- char *loc = targsec->contents + rel->r_offset;
- Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_68K_NONE:
- break;
-
- case R_68K_8:
- if (v > 0xff)
- ret = obj_reloc_overflow;
- *(char *)loc = v;
- break;
- case R_68K_16:
- if (v > 0xffff)
- ret = obj_reloc_overflow;
- *(short *)loc = v;
- break;
- case R_68K_32:
- *(int *)loc = v;
- break;
-
- case R_68K_PC8:
- v -= dot;
- if ((Elf32_Sword)v > 0x7f || (Elf32_Sword)v < -(Elf32_Sword)0x80)
- ret = obj_reloc_overflow;
- *(char *)loc = v;
- break;
- case R_68K_PC16:
- v -= dot;
- if ((Elf32_Sword)v > 0x7fff || (Elf32_Sword)v < -(Elf32_Sword)0x8000)
- ret = obj_reloc_overflow;
- *(short *)loc = v;
- break;
- case R_68K_PC32:
- *(int *)loc = v - dot;
- break;
-
- case R_68K_RELATIVE:
- *(int *)loc += ef->baseaddr;
- break;
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *ef)
-{
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf32_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_mips.c b/mdk-stage1/insmod-modutils/obj/obj_mips.c
deleted file mode 100644
index c2315b659..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_mips.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/* MIPS specific support for Elf loading and relocation.
- Copyright 1997, 1998 Linux International.
- Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <string.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-
-/*======================================================================*/
-
-struct mips_hi16
-{
- struct mips_hi16 *next;
- Elf32_Addr *addr;
- Elf32_Addr value;
-};
-
-struct mips_file
-{
- struct obj_file root;
- struct mips_hi16 *mips_hi16_list;
-};
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- struct mips_file *mf;
-
- mf = xmalloc(sizeof(*mf));
- mf->mips_hi16_list = NULL;
-
- return (struct obj_file *) mf;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- return xmalloc(sizeof(struct obj_symbol));
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- switch (sec->header.sh_type)
- {
- case SHT_MIPS_DEBUG:
- case SHT_MIPS_REGINFO:
- /* Actually these two sections are as useless as something can be ... */
- sec->contents = NULL;
- break;
-
- case SHT_MIPS_LIBLIST:
- case SHT_MIPS_CONFLICT:
- case SHT_MIPS_GPTAB:
- case SHT_MIPS_UCODE:
- case SHT_MIPS_OPTIONS:
- case SHT_MIPS_DWARF:
- case SHT_MIPS_EVENTS:
- /* These shouldn't ever be in a module file. */
- error("Unhandled section header type: %08x", sec->header.sh_type);
-
- default:
- /* We don't even know the type. This time it might as well be a
- supernova. */
- error("Unknown section header type: %08x", sec->header.sh_type);
- return -1;
- }
-
- return 0;
-}
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf32_Rel *rel,
- Elf32_Addr v)
-{
- struct mips_file *mf = (struct mips_file *)f;
- Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset);
- Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
- enum obj_reloc ret = obj_reloc_ok;
-
- /* _gp_disp is a magic symbol for PIC which is not supported for
- the kernel and loadable modules. */
- if (strcmp(sym->name, "_gp_disp") == 0)
- ret = obj_reloc_unhandled;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_MIPS_NONE:
- break;
-
- case R_MIPS_32:
- *loc += v;
- break;
-
- case R_MIPS_26:
- if (v % 4)
- ret = obj_reloc_dangerous;
- if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000))
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) & 0x03ffffff);
- break;
-
- case R_MIPS_HI16:
- {
- struct mips_hi16 *n;
-
- /* We cannot relocate this one now because we don't know the value
- of the carry we need to add. Save the information, and let LO16
- do the actual relocation. */
- n = (struct mips_hi16 *) xmalloc (sizeof *n);
- n->addr = loc;
- n->value = v;
- n->next = mf->mips_hi16_list;
- mf->mips_hi16_list = n;
- break;
- }
-
- case R_MIPS_LO16:
- {
- unsigned long insnlo = *loc;
- Elf32_Addr val, vallo;
-
- /* Sign extend the addend we extract from the lo insn. */
- vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
-
- if (mf->mips_hi16_list != NULL)
- {
- struct mips_hi16 *l;
-
- l = mf->mips_hi16_list;
- while (l != NULL)
- {
- struct mips_hi16 *next;
- unsigned long insn;
-
- /* The value for the HI16 had best be the same. */
- assert(v == l->value);
-
- /* Do the HI16 relocation. Note that we actually don't
- need to know anything about the LO16 itself, except where
- to find the low 16 bits of the addend needed by the LO16. */
- insn = *l->addr;
- val = ((insn & 0xffff) << 16) + vallo;
- val += v;
-
- /* Account for the sign extension that will happen in the
- low bits. */
- val = ((val >> 16) + ((val & 0x8000) != 0)) & 0xffff;
-
- insn = (insn &~ 0xffff) | val;
- *l->addr = insn;
-
- next = l->next;
- free(l);
- l = next;
- }
-
- mf->mips_hi16_list = NULL;
- }
-
- /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */
- val = v + vallo;
- insnlo = (insnlo & ~0xffff) | (val & 0xffff);
- *loc = insnlo;
- break;
- }
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *f)
-{
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf32_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_ppc.c b/mdk-stage1/insmod-modutils/obj/obj_ppc.c
deleted file mode 100644
index 89bb8e46b..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_ppc.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/* PowerPC specific support for Elf loading and relocation.
- Copyright 1996, 1997 Linux International.
-
- Adapted by Paul Mackerras <paulus@cs.anu.edu.au> from the
- obj-sparc.c and obj-alpha.c files.
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stddef.h>
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-#include <assert.h>
-
-
-/*======================================================================*/
-
-/*
- * Unfortunately, the bl (branch-and-link) instruction used for
- * procedure calls on the PowerPC can only reach +/- 32MB from the
- * current instruction. If the module is loaded far enough away from
- * the main kernel text (or other modules) that this limit is
- * exceeded, we have to redirect procedure calls via a procedure
- * linkage table (PLT). Each entry in the PLT contains instructions
- * to put the address of the procedure in a register and jump to it.
- */
-
-typedef unsigned int instruction; /* a powerpc instruction (4 bytes) */
-
-struct ppc_plt_entry
-{
- struct ppc_plt_entry *next;
- ElfW(Addr) addend;
- int offset;
- int inited;
-};
-
-struct ppc_file
-{
- struct obj_file file;
- struct obj_section *plt;
-};
-
-struct ppc_symbol
-{
- struct obj_symbol sym;
- struct ppc_plt_entry *plt_entries;
-};
-
-struct obj_file *
-arch_new_file (void)
-{
- struct ppc_file *f;
-
- f = xmalloc(sizeof(struct ppc_file));
- f->plt = NULL;
- return &f->file;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- struct ppc_symbol *p;
-
- p = xmalloc(sizeof(struct ppc_symbol));
- p->plt_entries = NULL;
- return &p->sym;
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *ef,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf32_Rela *rel,
- Elf32_Addr v)
-{
- Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset);
- Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
- struct ppc_file *pf = (struct ppc_file *) ef;
- struct ppc_symbol *psym = (struct ppc_symbol *) sym;
- struct ppc_plt_entry *pe;
- instruction *ip;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_PPC_ADDR16_HA:
- *(unsigned short *)loc = (v + 0x8000) >> 16;
- break;
-
- case R_PPC_ADDR16_HI:
- *(unsigned short *)loc = v >> 16;
- break;
-
- case R_PPC_ADDR16_LO:
- *(unsigned short *)loc = v;
- break;
-
- case R_PPC_REL24:
- /* find the plt entry and initialize it if necessary */
- assert(psym != NULL);
- for (pe = psym->plt_entries; pe != NULL && pe->addend != rel->r_addend; )
- pe = pe->next;
- assert(pe != NULL);
- if (!pe->inited)
- {
- ip = (instruction *) (pf->plt->contents + pe->offset);
- ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */
- ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */
- ip[2] = 0x7d6903a6; /* mtctr r11 */
- ip[3] = 0x4e800420; /* bctr */
- pe->inited = 1;
- }
-
- v -= dot;
- if ((int)v < -0x02000000 || (int)v >= 0x02000000)
- {
- /* go via the plt */
- v = pf->plt->header.sh_addr + pe->offset - dot;
- }
- if (v & 3)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc);
- break;
-
- case R_PPC_REL32:
- *loc = v - dot;
- break;
-
- case R_PPC_ADDR32:
- *loc = v;
- break;
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *f)
-{
- struct ppc_file *pf = (struct ppc_file *) f;
- int i, offset;
- struct obj_section *sec, *syms, *strs;
- ElfW(Rela) *rel, *relend;
- ElfW(Sym) *symtab, *extsym;
- const char *strtab, *name;
- struct ppc_symbol *intsym;
- struct ppc_plt_entry *pe;
-
- offset = 0;
- for (i = 0; i < f->header.e_shnum; ++i)
- {
- sec = f->sections[i];
- if (sec->header.sh_type != SHT_RELM)
- continue;
- syms = f->sections[sec->header.sh_link];
- strs = f->sections[syms->header.sh_link];
-
- rel = (ElfW(RelM) *) sec->contents;
- relend = rel + (sec->header.sh_size / sizeof(ElfW(RelM)));
- symtab = (ElfW(Sym) *) syms->contents;
- strtab = (const char *) strs->contents;
-
- for (; rel < relend; ++rel)
- {
- if (ELF32_R_TYPE(rel->r_info) != R_PPC_REL24)
- continue;
- extsym = &symtab[ELF32_R_SYM(rel->r_info)];
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = (struct ppc_symbol *) obj_find_symbol(f, name);
-
- for (pe = intsym->plt_entries; pe != NULL; pe = pe->next)
- if (pe->addend == rel->r_addend)
- break;
- if (pe == NULL)
- {
- pe = xmalloc(sizeof(struct ppc_plt_entry));
- pe->next = intsym->plt_entries;
- pe->addend = rel->r_addend;
- pe->offset = offset;
- pe->inited = 0;
- intsym->plt_entries = pe;
- offset += 16;
- }
- }
- }
-
- pf->plt = obj_create_alloced_section(f, ".plt", 16, offset);
-
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf32_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_reloc.c b/mdk-stage1/insmod-modutils/obj/obj_reloc.c
deleted file mode 100644
index f5f2de90d..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_reloc.c
+++ /dev/null
@@ -1,435 +0,0 @@
-/* Elf relocation routines.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <string.h>
-#include <assert.h>
-#include <alloca.h>
-
-#include <obj.h>
-#include <util.h>
-
-/*======================================================================*/
-
-int
-obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
- const char *string)
-{
- struct obj_string_patch_struct *p;
- struct obj_section *strsec;
- size_t len = strlen(string)+1;
- char *loc;
-
- p = xmalloc(sizeof(*p));
- p->next = f->string_patches;
- p->reloc_secidx = secidx;
- p->reloc_offset = offset;
- f->string_patches = p;
-
- strsec = obj_find_section(f, ".kstrtab");
- if (strsec == NULL)
- {
- strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
- p->string_offset = 0;
- loc = strsec->contents;
- }
- else
- {
- p->string_offset = strsec->header.sh_size;
- loc = obj_extend_section(strsec, len);
- }
- memcpy(loc, string, len);
-
- return 1;
-}
-
-int
-obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
- struct obj_symbol *sym)
-{
- struct obj_symbol_patch_struct *p;
-
- p = xmalloc(sizeof(*p));
- p->next = f->symbol_patches;
- p->reloc_secidx = secidx;
- p->reloc_offset = offset;
- p->sym = sym;
- f->symbol_patches = p;
-
- return 1;
-}
-
-int
-obj_check_undefineds(struct obj_file *f, int quiet)
-{
- unsigned long i;
- int ret = 1;
-
- for (i = 0; i < HASH_BUCKETS; ++i)
- {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym ; sym = sym->next)
- if (sym->secidx == SHN_UNDEF)
- {
- if (ELFW(ST_BIND)(sym->info) == STB_WEAK)
- {
- sym->secidx = SHN_ABS;
- sym->value = 0;
- }
- else if (sym->r_type) /* assumes R_arch_NONE is 0 on all arch */
- {
- if (!quiet)
- error("unresolved symbol %s", sym->name);
- ret = 0;
- }
- }
- }
-
- return ret;
-}
-
-void
-obj_clear_undefineds(struct obj_file *f)
-{
- unsigned long i;
- struct obj_symbol *sym;
- for (i = 0; i < HASH_BUCKETS; ++i)
- {
- for (sym = f->symtab[i]; sym ; sym = sym->next)
- if (sym->secidx == SHN_UNDEF)
- {
- sym->secidx = SHN_ABS;
- sym->value = 0;
- }
- }
-}
-
-void
-obj_allocate_commons(struct obj_file *f)
-{
- struct common_entry
- {
- struct common_entry *next;
- struct obj_symbol *sym;
- } *common_head = NULL;
-
- unsigned long i;
-
- for (i = 0; i < HASH_BUCKETS; ++i)
- {
- struct obj_symbol *sym;
- for (sym = f->symtab[i]; sym ; sym = sym->next)
- if (sym->secidx == SHN_COMMON)
- {
- /* Collect all COMMON symbols and sort them by size so as to
- minimize space wasted by alignment requirements. */
- {
- struct common_entry **p, *n;
- for (p = &common_head; *p ; p = &(*p)->next)
- if (sym->size <= (*p)->sym->size)
- break;
-
- n = alloca(sizeof(*n));
- n->next = *p;
- n->sym = sym;
- *p = n;
- }
- }
- }
-
- for (i = 1; i < f->local_symtab_size; ++i)
- {
- struct obj_symbol *sym = f->local_symtab[i];
- if (sym && sym->secidx == SHN_COMMON)
- {
- struct common_entry **p, *n;
- for (p = &common_head; *p ; p = &(*p)->next)
- if (sym == (*p)->sym)
- break;
- else if (sym->size < (*p)->sym->size)
- {
- n = alloca(sizeof(*n));
- n->next = *p;
- n->sym = sym;
- *p = n;
- break;
- }
- }
- }
-
- if (common_head)
- {
- /* Find the bss section. */
- for (i = 0; i < f->header.e_shnum; ++i)
- if (f->sections[i]->header.sh_type == SHT_NOBITS)
- break;
-
- /* If for some reason there hadn't been one, create one. */
- if (i == f->header.e_shnum)
- {
- struct obj_section *sec;
-
- f->sections = xrealloc(f->sections, (i+1) * sizeof(sec));
- f->sections[i] = sec = arch_new_section();
- f->header.e_shnum = i+1;
-
- memset(sec, 0, sizeof(*sec));
- sec->header.sh_type = SHT_PROGBITS;
- sec->header.sh_flags = SHF_WRITE|SHF_ALLOC;
- sec->name = ".bss";
- sec->idx = i;
- }
-
- /* Allocate the COMMONS. */
- {
- ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
- ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
- struct common_entry *c;
-
- for (c = common_head; c ; c = c->next)
- {
- ElfW(Addr) align = c->sym->value;
-
- if (align > max_align)
- max_align = align;
- if (bss_size & (align - 1))
- bss_size = (bss_size | (align - 1)) + 1;
-
- c->sym->secidx = i;
- c->sym->value = bss_size;
-
- bss_size += c->sym->size;
- }
-
- f->sections[i]->header.sh_size = bss_size;
- f->sections[i]->header.sh_addralign = max_align;
- }
- }
-
- /* For the sake of patch relocation and parameter initialization,
- allocate zeroed data for NOBITS sections now. Note that after
- this we cannot assume NOBITS are really empty. */
- for (i = 0; i < f->header.e_shnum; ++i)
- {
- struct obj_section *s = f->sections[i];
- if (s->header.sh_type == SHT_NOBITS)
- {
- if (s->header.sh_size)
- s->contents = memset(xmalloc(s->header.sh_size),
- 0, s->header.sh_size);
- else
- s->contents = NULL;
- s->header.sh_type = SHT_PROGBITS;
- }
- }
-}
-
-unsigned long
-obj_load_size (struct obj_file *f)
-{
- unsigned long dot = 0;
- struct obj_section *sec;
-
- /* Finalize the positions of the sections relative to one another. */
-
- for (sec = f->load_order; sec ; sec = sec->load_next)
- {
- ElfW(Addr) align;
-
- align = sec->header.sh_addralign;
- if (align && (dot & (align - 1)))
- dot = (dot | (align - 1)) + 1;
-
- sec->header.sh_addr = dot;
- dot += sec->header.sh_size;
- }
-
- return dot;
-}
-
-int
-obj_relocate (struct obj_file *f, ElfW(Addr) base)
-{
- int i, n = f->header.e_shnum;
- int ret = 1;
-
- /* Finalize the addresses of the sections. */
-
- arch_finalize_section_address(f, base);
-
- /* And iterate over all of the relocations. */
-
- for (i = 0; i < n; ++i)
- {
- struct obj_section *relsec, *symsec, *targsec, *strsec;
- ElfW(RelM) *rel, *relend;
- ElfW(Sym) *symtab;
- const char *strtab;
-
- relsec = f->sections[i];
- if (relsec->header.sh_type != SHT_RELM)
- continue;
-
- symsec = f->sections[relsec->header.sh_link];
- targsec = f->sections[relsec->header.sh_info];
- strsec = f->sections[symsec->header.sh_link];
-
- rel = (ElfW(RelM) *)relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
- symtab = (ElfW(Sym) *)symsec->contents;
- strtab = (const char *)strsec->contents;
-
- for (; rel < relend; ++rel)
- {
- ElfW(Addr) value = 0;
- struct obj_symbol *intsym = NULL;
- unsigned long symndx;
- ElfW(Sym) *extsym = 0;
- const char *errmsg;
-
- /* Attempt to find a value to use for this relocation. */
-
- symndx = ELFW(R_SYM)(rel->r_info);
- if (symndx)
- {
- /* Note we've already checked for undefined symbols. */
-
- extsym = &symtab[symndx];
- if (ELFW(ST_BIND)(extsym->st_info) == STB_LOCAL)
- {
- /* Local symbols we look up in the local table to be sure
- we get the one that is really intended. */
- intsym = f->local_symtab[symndx];
- }
- else
- {
- /* Others we look up in the hash table. */
- const char *name;
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = obj_find_symbol(f, name);
- }
-
- value = obj_symbol_final_value(f, intsym);
- }
-
-#if SHT_RELM == SHT_RELA
-#if defined(__alpha__) && defined(AXP_BROKEN_GAS)
- /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
- if (!extsym || !extsym->st_name ||
- ELFW(ST_BIND)(extsym->st_info) != STB_LOCAL)
-#endif
- value += rel->r_addend;
-#endif
-
- /* Do it! */
- switch (arch_apply_relocation(f,targsec,symsec,intsym,rel,value))
- {
- case obj_reloc_ok:
- break;
-
- case obj_reloc_overflow:
- errmsg = "Relocation overflow";
- goto bad_reloc;
- case obj_reloc_dangerous:
- errmsg = "Dangerous relocation";
- goto bad_reloc;
- case obj_reloc_unhandled:
- errmsg = "Unhandled relocation";
- goto bad_reloc;
- case obj_reloc_constant_gp:
- errmsg = "Modules compiled with -mconstant-gp cannot be loaded";
- goto bad_reloc;
- bad_reloc:
- if (extsym)
- {
- error("%s of type %ld for %s", errmsg,
- (long)ELFW(R_TYPE)(rel->r_info),
- strtab + extsym->st_name);
- }
- else
- {
- error("%s of type %ld", errmsg,
- (long)ELFW(R_TYPE)(rel->r_info));
- }
- ret = 0;
- break;
- }
- }
- }
-
- /* Finally, take care of the patches. */
-
- if (f->string_patches)
- {
- struct obj_string_patch_struct *p;
- struct obj_section *strsec;
- ElfW(Addr) strsec_base;
- strsec = obj_find_section(f, ".kstrtab");
- strsec_base = strsec->header.sh_addr;
-
- for (p = f->string_patches; p ; p = p->next)
- {
- struct obj_section *targsec = f->sections[p->reloc_secidx];
- *(ElfW(Addr) *)(targsec->contents + p->reloc_offset)
- = strsec_base + p->string_offset;
- }
- }
-
- if (f->symbol_patches)
- {
- struct obj_symbol_patch_struct *p;
-
- for (p = f->symbol_patches; p; p = p->next)
- {
- struct obj_section *targsec = f->sections[p->reloc_secidx];
- *(ElfW(Addr) *)(targsec->contents + p->reloc_offset)
- = obj_symbol_final_value(f, p->sym);
- }
- }
-
- return ret;
-}
-
-int
-obj_create_image (struct obj_file *f, char *image)
-{
- struct obj_section *sec;
- ElfW(Addr) base = f->baseaddr;
-
- for (sec = f->load_order; sec ; sec = sec->load_next)
- {
- char *secimg;
-
- if (sec->contents == 0)
- continue;
-
- secimg = image + (sec->header.sh_addr - base);
-
- /* Note that we allocated data for NOBITS sections earlier. */
- memcpy(secimg, sec->contents, sec->header.sh_size);
- }
-
- return 1;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_s390.c b/mdk-stage1/insmod-modutils/obj/obj_s390.c
deleted file mode 100644
index 3da72e771..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_s390.c
+++ /dev/null
@@ -1,245 +0,0 @@
-/* S/390 specific support for Elf loading and relocation.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <string.h>
-#include <assert.h>
-
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-
-/*======================================================================*/
-
-struct s390_got_entry
-{
- int offset;
- unsigned offset_done : 1;
- unsigned reloc_done : 1;
-};
-
-struct s390_file
-{
- struct obj_file root;
- struct obj_section *got;
-};
-
-struct s390_symbol
-{
- struct obj_symbol root;
- struct s390_got_entry gotent;
-};
-
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- struct s390_file *f;
- f = xmalloc(sizeof(*f));
- f->got = NULL;
- return &f->root;
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- struct s390_symbol *sym;
- sym = xmalloc(sizeof(*sym));
- memset(&sym->gotent, 0, sizeof(sym->gotent));
- return &sym->root;
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *f,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf32_Rela *rel,
- Elf32_Addr v)
-{
- struct s390_file *ifile = (struct s390_file *)f;
- struct s390_symbol *isym = (struct s390_symbol *)sym;
-
- Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset);
- Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
- Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_390_NONE:
- break;
-
- case R_390_32:
- *loc += v;
- break;
-
- case R_390_PLT32:
- case R_390_PC32:
- *loc += v - dot;
- break;
-
- case R_390_GLOB_DAT:
- case R_390_JMP_SLOT:
- *loc = v;
- break;
-
- case R_390_RELATIVE:
- *loc += f->baseaddr;
- break;
-
- case R_390_GOTPC:
- assert(got != 0);
- *loc += got - dot;
- break;
-
- case R_390_GOT32:
- assert(isym != NULL);
- if (!isym->gotent.reloc_done)
- {
- isym->gotent.reloc_done = 1;
- *(Elf32_Addr *)(ifile->got->contents + isym->gotent.offset) = v;
- }
- *loc += isym->gotent.offset;
- break;
-
- case R_390_GOTOFF:
- assert(got != 0);
- *loc += v - got;
- break;
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *f)
-{
- struct s390_file *ifile = (struct s390_file *)f;
- int i, n, offset = 0, gotneeded = 0;
-
- n = ifile->root.header.e_shnum;
- for (i = 0; i < n; ++i)
- {
- struct obj_section *relsec, *symsec, *strsec;
- Elf32_Rel *rel, *relend;
- Elf32_Sym *symtab;
- const char *strtab;
-
- relsec = ifile->root.sections[i];
- if (relsec->header.sh_type != SHT_REL)
- continue;
-
- symsec = ifile->root.sections[relsec->header.sh_link];
- strsec = ifile->root.sections[symsec->header.sh_link];
-
- rel = (Elf32_Rel *)relsec->contents;
- relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel));
- symtab = (Elf32_Sym *)symsec->contents;
- strtab = (const char *)strsec->contents;
-
- for (; rel < relend; ++rel)
- {
- Elf32_Sym *extsym;
- struct s390_symbol *intsym;
- const char *name;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_390_GOTPC:
- case R_390_GOTOFF:
- gotneeded = 1;
- default:
- continue;
-
- case R_390_GOT32:
- break;
- }
-
- extsym = &symtab[ELF32_R_SYM(rel->r_info)];
- if (extsym->st_name)
- name = strtab + extsym->st_name;
- else
- name = f->sections[extsym->st_shndx]->name;
- intsym = (struct s390_symbol *)obj_find_symbol(&ifile->root, name);
-
- if (!intsym->gotent.offset_done)
- {
- intsym->gotent.offset_done = 1;
- intsym->gotent.offset = offset;
- offset += 4;
- }
- }
- }
-
- if (offset > 0 || gotneeded)
- ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset);
-
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *m)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf32_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_sparc.c b/mdk-stage1/insmod-modutils/obj/obj_sparc.c
deleted file mode 100644
index 1a03c9090..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_sparc.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* Sparc specific support for Elf loading and relocation.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stddef.h>
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- return xmalloc(sizeof(struct obj_file));
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- return xmalloc(sizeof(struct obj_symbol));
-}
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *ef,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf32_Rela *rel,
- Elf32_Addr v)
-{
- Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset);
- Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF32_R_TYPE(rel->r_info))
- {
- case R_SPARC_NONE:
- break;
- case R_SPARC_8:
- if (v > 0xff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0xff) | (v & 0xff);
- break;
- case R_SPARC_16:
- if (v > 0xffff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0xffff) | (v & 0xffff);
- break;
- case R_SPARC_32:
- *loc = v;
- break;
- case R_SPARC_DISP8:
- v -= dot;
- if (v > 0xff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0xff) | (v & 0xff);
- break;
- case R_SPARC_DISP16:
- v -= dot;
- if (v > 0xffff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0xffff) | (v & 0xffff);
- break;
- case R_SPARC_DISP32:
- v -= dot;
- *loc = v;
- break;
- case R_SPARC_WDISP30:
- v -= dot;
- if (v % 4)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x3fffffff) | (v >> 2);
- break;
- case R_SPARC_WDISP22:
- v -= dot;
- if (v % 4)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x3fffff) | ((v >> 2) & 0x3fffff);
- break;
- case R_SPARC_HI22:
- *loc = (*loc & ~0x3fffff) | (v >> 10);
- break;
- case R_SPARC_22:
- if (v > 0x3fffff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x3fffff) | (v & 0x3fffff);
- break;
- case R_SPARC_13:
- if (v > 0x1fff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x1fff) | (v & 0x1fff);
- break;
- case R_SPARC_LO10:
- *loc = (*loc & ~0x3ff) | (v & 0x3ff);
- break;
-
- case R_SPARC_PC10:
- v -= dot;
- *loc = (*loc & ~0x3ff) | (v & 0x3ff);
- break;
- case R_SPARC_PC22:
- v -= dot;
- *loc = (*loc & ~0x3fffff) | (v >> 10);
- break;
-
- case R_SPARC_UA32:
- *(((char *)loc) + 0) = (char)(v >> 24);
- *(((char *)loc) + 1) = (char)(v >> 16);
- *(((char *)loc) + 2) = (char)(v >> 8);
- *(((char *)loc) + 3) = (char)v;
- break;
-
-#ifdef R_SPARC_10
- case R_SPARC_10:
- if (v > 0x3ff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x3ff) | (v & 0x3ff);
- break;
- case R_SPARC_11:
- if (v > 0x7ff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x7ff) | (v & 0x7ff);
- break;
- case R_SPARC_WDISP16:
- v -= dot;
- if (v % 4)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x303fff) | ((v << 4) & 0x300000) | ((v >> 2) & 0x3fff);
- break;
- case R_SPARC_WDISP19:
- v -= dot;
- if (v % 4)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x7ffff) | ((v >> 2) & 0x7ffff);
- break;
- case R_SPARC_7:
- if (v > 0x7f)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x7f) | (v & 0x7f);
- break;
- case R_SPARC_5:
- if (v > 0x1f)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x1f) | (v & 0x1f);
- break;
- case R_SPARC_6:
- if (v > 0x3f)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x3f) | (v & 0x3f);
- break;
-#endif /* R_SPARC_10 */
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *ef)
-{
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf32_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/obj/obj_sparc64.c b/mdk-stage1/insmod-modutils/obj/obj_sparc64.c
deleted file mode 100644
index 84e8d18a0..000000000
--- a/mdk-stage1/insmod-modutils/obj/obj_sparc64.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/* Sparc64 specific support for Elf loading and relocation.
- Copyright 1997 Linux International.
-
- Contributed by Jakub Jelinek <jj@sunsite.mff.cuni.cz>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stddef.h>
-#include <module.h>
-#include <obj.h>
-#include <util.h>
-
-
-/*======================================================================*/
-
-struct obj_file *
-arch_new_file (void)
-{
- return xmalloc(sizeof(struct obj_file));
-}
-
-struct obj_section *
-arch_new_section (void)
-{
- return xmalloc(sizeof(struct obj_section));
-}
-
-struct obj_symbol *
-arch_new_symbol (void)
-{
- return xmalloc(sizeof(struct obj_symbol));
-}
-
-#ifdef BROKEN_SPARC64_RELOCS
-
-#undef R_SPARC_PLT32
-#undef R_SPARC_HIPLT22
-#undef R_SPARC_LOPLT10
-#undef R_SPARC_PCPLT32
-#undef R_SPARC_PCPLT22
-#undef R_SPARC_PCPLT10
-#undef R_SPARC_10
-#undef R_SPARC_11
-#undef R_SPARC_64
-#undef R_SPARC_OLO10
-#undef R_SPARC_HH22
-#undef R_SPARC_HM10
-#undef R_SPARC_LM22
-#undef R_SPARC_PC_HH22
-#undef R_SPARC_PC_HM10
-#undef R_SPARC_PC_LM22
-#undef R_SPARC_WDISP16
-#undef R_SPARC_WDISP19
-#undef R_SPARC_GLOB_JMP
-#undef R_SPARC_7
-#undef R_SPARC_5
-#undef R_SPARC_6
-
-#define R_SPARC_10 24
-#define R_SPARC_11 25
-#define R_SPARC_64 26
-#define R_SPARC_OLO10 27
-#define R_SPARC_HH22 28
-#define R_SPARC_HM10 29
-#define R_SPARC_LM22 30
-#define R_SPARC_PC_HH22 31
-#define R_SPARC_PC_HM10 32
-#define R_SPARC_PC_LM22 33
-#define R_SPARC_WDISP16 34
-#define R_SPARC_WDISP19 35
-#define R_SPARC_GLOB_JMP 36
-#define R_SPARC_7 37
-#define R_SPARC_5 38
-#define R_SPARC_6 39
-
-#else
-
-#ifndef R_SPARC_64
-
-#define R_SPARC_64 32
-#define R_SPARC_OLO10 33
-#define R_SPARC_HH22 34
-#define R_SPARC_HM10 35
-#define R_SPARC_LM22 36
-#define R_SPARC_PC_HH22 37
-#define R_SPARC_PC_HM10 38
-#define R_SPARC_PC_LM22 39
-
-#endif
-
-#endif
-
-int
-arch_load_proc_section(struct obj_section *sec, int fp)
-{
- /* Assume it's just a debugging section that we can safely
- ignore ... */
- sec->contents = NULL;
-
- return 0;
-}
-
-#define ELF64_R_TYPE_ID(info) ((info) & 0xff)
-#define ELF64_R_TYPE_DATA(info) ((info) >> 8)
-
-enum obj_reloc
-arch_apply_relocation (struct obj_file *ef,
- struct obj_section *targsec,
- struct obj_section *symsec,
- struct obj_symbol *sym,
- Elf64_Rela *rel,
- Elf64_Addr v)
-{
- unsigned int *loc = (unsigned int *)(targsec->contents + rel->r_offset);
- unsigned int dot = targsec->header.sh_addr + rel->r_offset;
-
- enum obj_reloc ret = obj_reloc_ok;
-
- switch (ELF64_R_TYPE_ID(rel->r_info))
- {
- case R_SPARC_NONE:
- break;
-
- case R_SPARC_64:
- case R_SPARC_UA64:
- if (! ((long) loc & 3)) {
- /* Common in .eh_frame */
- ((unsigned int *) loc) [0] = v >> 32;
- ((unsigned int *) loc) [1] = v;
- break;
- }
- ((unsigned char *) loc) [0] = v >> 56;
- ((unsigned char *) loc) [1] = v >> 48;
- ((unsigned char *) loc) [2] = v >> 40;
- ((unsigned char *) loc) [3] = v >> 32;
- ((unsigned char *) loc) [4] = v >> 24;
- ((unsigned char *) loc) [5] = v >> 16;
- ((unsigned char *) loc) [6] = v >> 8;
- ((unsigned char *) loc) [7] = v;
- break;
- case R_SPARC_32:
- case R_SPARC_UA32:
- if (! ((long) loc & 3)) {
- *loc = v;
- break;
- }
- ((unsigned char *) loc) [0] = v >> 24;
- ((unsigned char *) loc) [1] = v >> 16;
- ((unsigned char *) loc) [2] = v >> 8;
- ((unsigned char *) loc) [3] = v;
- break;
- case R_SPARC_16:
- if (v > 0xffff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0xffff) | (v & 0xffff);
- break;
- case R_SPARC_8:
- if (v > 0xff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0xff) | (v & 0xff);
- break;
-
- case R_SPARC_DISP32:
- v -= dot;
- *loc = v;
- break;
- case R_SPARC_DISP16:
- v -= dot;
- if (v > 0xffff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0xffff) | (v & 0xffff);
- break;
- case R_SPARC_DISP8:
- v -= dot;
- if (v > 0xff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0xff) | (v & 0xff);
- break;
- case R_SPARC_WDISP30:
- v -= dot;
- if (v % 4)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x3fffffff) | ((v >> 2) & 0x3fffffff);
- break;
-
- /* MEDLOW code model relocs */
- case R_SPARC_LO10:
- *loc = (*loc & ~0x3ff) | (v & 0x3ff);
- break;
- case R_SPARC_HI22:
- *loc = (*loc & ~0x3fffff) | (v >> 10);
- break;
- case R_SPARC_OLO10:
- *loc = (*loc & ~0x1fff) | (((v & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info)) & 0x1fff);
- break;
-
- /* MEDMID code model relocs */
- case R_SPARC_H44:
- *loc = (*loc & ~0x3fffff) | (v >> 22);
- break;
- case R_SPARC_M44:
- *loc = (*loc & ~0x3ff) | ((v >> 12) & 0x3ff);
- break;
- case R_SPARC_L44:
- *loc = (*loc & ~0xfff) | (v & 0xfff);
- break;
-
- /* MEDANY code model relocs */
- case R_SPARC_HH22:
- *loc = (*loc & ~0x3fffff) | (v >> 42);
- break;
- case R_SPARC_HM10:
- *loc = (*loc & ~0x3ff) | ((v >> 32) & 0x3ff);
- break;
- case R_SPARC_LM22:
- *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff);
- break;
-
- case R_SPARC_WDISP22:
- v -= dot;
- if (v % 4)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x3fffff) | ((v >> 2) & 0x3fffff);
- break;
- case R_SPARC_22:
- if (v > 0x3fffff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x3fffff) | (v & 0x3fffff);
- break;
- case R_SPARC_13:
- if (v > 0x1fff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x1fff) | (v & 0x1fff);
- break;
-
- case R_SPARC_PC10:
- v -= dot;
- *loc = (*loc & ~0x3ff) | (v & 0x3ff);
- break;
- case R_SPARC_PC22:
- v -= dot;
- *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff);
- break;
-
-#ifdef R_SPARC_10
- case R_SPARC_10:
- if (v > 0x3ff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x3ff) | (v & 0x3ff);
- break;
- case R_SPARC_11:
- if (v > 0x7ff)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x7ff) | (v & 0x7ff);
- break;
-
-#ifdef R_SPARC_64
- case R_SPARC_PC_HH22:
- v -= dot;
- *loc = (*loc & ~0x3fffff) | (v >> 42);
- break;
- case R_SPARC_PC_HM10:
- v -= dot;
- *loc = (*loc & ~0x3ff) | ((v >> 32) & 0x3ff);
- break;
- case R_SPARC_PC_LM22:
- v -= dot;
- *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff);
- break;
-#endif
-
- case R_SPARC_WDISP16:
- v -= dot;
- if (v % 4)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x303fff) | ((v << 4) & 0x300000) | ((v >> 2) & 0x3fff);
- break;
- case R_SPARC_WDISP19:
- v -= dot;
- if (v % 4)
- ret = obj_reloc_dangerous;
- *loc = (*loc & ~0x7ffff) | ((v >> 2) & 0x7ffff);
- break;
- case R_SPARC_7:
- if (v > 0x7f)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x7f) | (v & 0x7f);
- break;
- case R_SPARC_5:
- if (v > 0x1f)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x1f) | (v & 0x1f);
- break;
- case R_SPARC_6:
- if (v > 0x3f)
- ret = obj_reloc_overflow;
- *loc = (*loc & ~0x3f) | (v & 0x3f);
- break;
-#endif /* R_SPARC_10 */
-
- default:
- ret = obj_reloc_unhandled;
- break;
- }
-
- return ret;
-}
-
-int
-arch_create_got (struct obj_file *ef)
-{
- return 1;
-}
-
-int
-arch_init_module (struct obj_file *f, struct module *mod)
-{
- return 1;
-}
-
-int
-arch_finalize_section_address(struct obj_file *f, Elf64_Addr base)
-{
- int i, n = f->header.e_shnum;
-
- f->baseaddr = base;
- for (i = 0; i < n; ++i)
- f->sections[i]->header.sh_addr += base;
- return 1;
-}
-
-int
-arch_archdata (struct obj_file *fin, struct obj_section *sec)
-{
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/util/Makefile b/mdk-stage1/insmod-modutils/util/Makefile
deleted file mode 100644
index 844f8c0dc..000000000
--- a/mdk-stage1/insmod-modutils/util/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
- #******************************************************************************
- #
- # insmod from modutils (generic)
- #
- # $Id$
- #
- # Copyright 1996, 1997 Linux International.
- #
- #*****************************************************************************
-
-top_dir = ../..
-
-include $(top_dir)/Makefile.common
-
-
-all: libutil.a libutil-STANDALONE.a #libutil-DIET.a
-
-clean:
- rm -f *.o *.a
-
-
-FLAGS = -c -Wall -Os -fomit-frame-pointer -I./../include -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) -DHAVE_WORDEXP=1 -DHAVE_GLOB=1 -DCONFIG_ROOT_CHECK_OFF=0
-
-OBJS = xmalloc.o xrealloc.o xstrcat.o xstrdup.o xsystem.o xftw.o \
- modstat.o meta_expand.o config.o snap_shot.o arch64.o gzfiles.o sys_nim.o sys_oim.o
-
-libutil.a: $(OBJS) logger.o
- ar cru $@ $^
- ranlib $@
-
-libutil-STANDALONE.a: $(OBJS) logger-standalone.o
- ar cru $@ $^
- ranlib $@
-
-logger-standalone.o: logger.c
- gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ logger.c
-
-.c.o:
- gcc $(FLAGS) $(GLIBC_INCLUDES) -c $<
diff --git a/mdk-stage1/insmod-modutils/util/alias.h b/mdk-stage1/insmod-modutils/util/alias.h
deleted file mode 100644
index c925a04f3..000000000
--- a/mdk-stage1/insmod-modutils/util/alias.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * This file is split out from config.c for easier editing
- */
-
-/*
- * tbpath and tbtype are used to build the complete set of paths for finding
- * modules, but only when we search for individual directories, they are not
- * used for [boot] and [toplevel] searches.
- */
-static char *tbpath[] =
-{
- "/lib/modules",
- NULL /* marks the end of the list! */
-};
-
-char *tbtype[] =
-{
- "kernel", /* as of 2.3.14 this must be first */
- "fs",
- "net",
- "scsi",
- "block",
- "cdrom",
- "ipv4",
- "ipv6",
- "sound",
- "fc4",
- "video",
- "misc",
- "pcmcia",
- "atm",
- "usb",
- "ide",
- "ieee1394",
- "mtd",
- NULL /* marks the end of the list! */
-};
-
-/*
- * This is the list of pre-defined aliases.
- * Each entry can be overridden by an entry in /etc/modules.conf
- */
-char *aliaslist[] =
-{
- "binfmt-204 binfmt_aout",
- "binfmt-263 binfmt_aout",
- "binfmt-264 binfmt_aout",
- "binfmt-267 binfmt_aout",
- "binfmt-387 binfmt_aout",
- "binfmt-332 iBCS",
- "binfmt--310 binfmt_java",
-
- "block-major-1 rd",
- "block-major-2 floppy",
- "block-major-3 ide-probe-mod",
- "block-major-7 loop",
- "block-major-8 sd_mod",
- "block-major-9 md", /* For modular RAID */
- "block-major-11 sr_mod",
- "block-major-13 xd",
- "block-major-15 cdu31a",
- "block-major-16 gscd",
- "block-major-17 optcd",
- "block-major-18 sjcd",
- "block-major-20 mcdx",
- "block-major-22 ide-probe-mod",
- "block-major-23 mcd",
- "block-major-24 sonycd535",
- "block-major-25 sbpcd",
- "block-major-26 sbpcd",
- "block-major-27 sbpcd",
- "block-major-29 aztcd",
- "block-major-32 cm206",
- "block-major-33 ide-probe-mod",
- "block-major-34 ide-probe-mod",
- "block-major-37 ide-tape",
- "block-major-44 ftl", /* from David Woodhouse <dwmw2@infradead.org> */
- "block-major-56 ide-probe-mod",
- "block-major-57 ide-probe-mod",
- "block-major-88 ide-probe-mod",
- "block-major-89 ide-probe-mod",
- "block-major-90 ide-probe-mod",
- "block-major-91 ide-probe-mod",
- "block-major-93 nftl", /* from David Woodhouse <dwmw2@infradead.org> */
-
- "char-major-4 serial",
- "char-major-5 serial",
- "char-major-6 lp",
- "char-major-9 st",
- "char-major-10 off", /* was: mouse, was: misc */
- "char-major-10-0 busmouse", /* /dev/logibm Logitech bus mouse */
- "char-major-10-1 off", /* /dev/psaux PS/2-style mouse port */
- "char-major-10-2 msbusmouse", /* /dev/inportbm Microsoft Inport bus mouse */
- "char-major-10-3 atixlmouse", /* /dev/atibm ATI XL bus mouse */
- /* /dev/jbm J-mouse */
- /* /dev/amigamouse Amiga mouse (68k/Amiga) */
- /* /dev/atarimouse Atari mouse */
- /* /dev/sunmouse Sun mouse */
- /* /dev/beep Fancy beep device */
- /* /dev/modreq Kernel module load request */
- "char-major-10-130 wdt", /* /dev/watchdog Watchdog timer port */
- "char-major-10-131 wdt", /* /dev/temperature Machine internal temperature */
- /* /dev/hwtrap Hardware fault trap */
- /* /dev/exttrp External device trap */
- "char-major-10-135 off", /* rtc cannot be compiled as a module */
- "char-major-10-139 openprom", /* /dev/openprom Linux/Sparc interface */
- "char-major-10-144 nvram", /* from Tigran Aivazian <tigran@sco.COM> */
- "char-major-10-157 applicom", /* from David Woodhouse <dwmw2@infradead.org> */
- "char-major-10-175 agpgart", /* /dev/agpgart GART AGP mapping access */
- "char-major-10-184 microcode", /* Tigran Aivazian <tigran@veritas.com> */
-
- "char-major-14 soundcore",
- "char-major-19 cyclades",
- "char-major-20 cyclades",
- "char-major-21 sg",
- "char-major-22 pcxx", /* ?? */
- "char-major-23 pcxx", /* ?? */
- "char-major-27 ftape",
- "char-major-34 scc",
- "char-major-35 tclmidi",
- "char-major-36 netlink",
- "char-major-37 ide-tape",
- "char-major-48 riscom8",
- "char-major-49 riscom8",
- "char-major-57 esp",
- "char-major-58 esp",
- "char-major-63 kdebug",
- "char-major-90 mtdchar", /* from David Woodhouse <dwmw2@infradead.org> */
- "char-major-99 ppdev",
- "char-major-107 3dfx", /* from Tigran Aivazian <tigran@sco.COM> */
- "char-major-161 ircomm-tty",
-
- "dos msdos",
- "dummy0 dummy",
- "dummy1 dummy",
- "eth0 off",
- "iso9660 isofs",
- "md-personality-1 linear",
- "md-personality-2 raid0",
- "md-personality-3 raid1",
- "md-personality-4 raid5",
-
- "net-pf-1 unix", /* PF_UNIX 1 Unix domain sockets */
- "net-pf-2 ipv4", /* PF_INET 2 Internet IP Protocol */
- "net-pf-3 off", /* PF_AX25 3 Amateur Radio AX.25 */
- "net-pf-4 ipx", /* PF_IPX 4 Novell IPX */
- "net-pf-5 appletalk", /* PF_APPLETALK 5 Appletalk DDP */
- "net-pf-6 off", /* PF_NETROM 6 Amateur radio NetROM */
- /* PF_BRIDGE 7 Multiprotocol bridge */
- /* PF_AAL5 8 Reserved for Werner's ATM */
- /* PF_X25 9 Reserved for X.25 project */
- /* PF_INET6 10 IP version 6 */
-
- /* next two from <dairiki@matthews.dairiki.org> Thanks! */
- "net-pf-17 af_packet",
- "net-pf-19 off", /* acorn econet */
-
- "netalias-2 ip_alias",
- "plip0 plip",
- "plip1 plip",
- "cipcb0 cipcb",
- "cipcb1 cipcb",
- "cipcb2 cipcb",
- "cipcb3 cipcb",
- "ppp0 ppp",
- "ppp1 ppp",
- "scsi_hostadapter off", /* if not in config file */
- "slip0 slip",
- "slip1 slip",
- "tty-ldisc-1 slip",
- "tty-ldisc-3 ppp",
- "ppp-compress-21 bsd_comp",
- "ppp-compress-24 ppp_deflate",
- "ppp-compress-26 ppp_deflate",
-
-#ifndef __sparc__
- "parport_lowlevel parport_pc",
-#else
- "parport_lowlevel parport_ax",
-#endif
-
- "tty-ldisc-11 irtty",
-
- "usbdevfs usbcore",
-
- NULL /* marks the end of the list! */
-};
-
-/*
- * This is the list of pre-defined options.
- * Each entry can be overridden by an entry in /etc/modules.conf
- */
-char *optlist[] =
-{
- "dummy0 -o dummy0",
- "dummy1 -o dummy1",
- "sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330",
- NULL /* marks the end of the list! */
-};
-
-/*
- * This is the list of pre-defined "above"s,
- * used for pull-in of additional modules
- * Each entry can be overridden by an entry in /etc/modules.conf
- */
-char *above[] =
-{
- NULL /* marks the end of the list! */
-};
-
-/*
- * This is the list of pre-defined "below"s,
- * used for push-in of additional modules
- * Each entry can be overridden by an entry in /etc/modules.conf
- */
-char *below[] =
-{
- NULL /* marks the end of the list! */
-};
-
-/*
- * This is the list of pre-defined "prune"s,
- * used to exclude paths from scan of /lib/modules.
- * /etc/modules.conf can add entries but not remove them.
- */
-char *prune[] =
-{
- ".rhkmvtag",
- "modules.dep",
- "modules.generic_string",
- "modules.pcimap",
- "modules.isapnpmap",
- "modules.usbmap",
- "modules.parportmap",
- "System.map",
- ".config",
- "build", /* symlink to source tree */
- "vmlinux",
- "vmlinuz",
- "bzImage",
- "zImage",
- ".rhkmvtag", /* wish RedHat had told me before they did this */
- NULL /* marks the end of the list! */
-};
diff --git a/mdk-stage1/insmod-modutils/util/arch64.c b/mdk-stage1/insmod-modutils/util/arch64.c
deleted file mode 100644
index 4d5ace223..000000000
--- a/mdk-stage1/insmod-modutils/util/arch64.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Misc utility functions.
- Copyright 1996, 1997 Linux International.
- Written by Keith Owens <kaos@ocs.com.au>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <string.h>
-#include <sys/utsname.h>
-#include "util.h"
-
-/*======================================================================*/
-
-/* Indicate if the current machine uses 64 bit architecture */
-int arch64(void)
-{
- struct utsname u;
- return(!uname(&u) && strstr(u.machine, "64"));
-}
diff --git a/mdk-stage1/insmod-modutils/util/config.c b/mdk-stage1/insmod-modutils/util/config.c
deleted file mode 100644
index a860920f6..000000000
--- a/mdk-stage1/insmod-modutils/util/config.c
+++ /dev/null
@@ -1,1591 +0,0 @@
-/*
- * Handle the configuration, including /etc/modules.conf
- *
- * Copyright 1994, 1995, 1996, 1997:
- * Jacques Gelinas <jack@solucorp.qc.ca>
- * Björn Ekwall <bj0rn@blox.se> February 1999
- * Keith Owens <kaos@ocs.com.au> October 1999
- *
- * "kernelversion" idea from the Debian release via:
- * Wichert Akkerman <wakkerma@cs.leidenuniv.nl>
- *
- * Björn, inspired by Richard Henderson <rth@twiddle.net>, cleaned up
- * the wildcard handling and started using ftw in March 1999
- * Cleanup of hardcoded arrays: Björn Ekwall <bj0rn@blox.se> March 1999
- * Many additional keywords: Björn Ekwall <bj0rn@blox.se> (C) March 1999
- * Standardize on /etc/modules.conf Keith Owens <kaos@ocs.com.au> October 1999
- *
- * Alpha typecast:Michal Jaegermann <michal@ellpspace.math.ualberta.ca>
- *
- * This file is part of the Linux modutils.
- *
- * 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.
- */
-
-/*
- * Specification: /etc/modules.conf / format
- * Modules may be located at different places in the filesystem.
- *
- * The file /etc/modules.conf contains different definitions to
- * control the manipulation of modules.
- *
- * Standard Unix style comments and continuation line are supported.
- * Comments begin with a # and continue until the end of the line.
- * A line continues on the next one if the last non-white character
- * is a \.
- */
-/* #Specification: /etc/modules.conf / format / official name */
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <limits.h>
-#include <sys/param.h>
-#include <errno.h>
-
-#include "util.h"
-#include "config.h"
-#include "alias.h"
-
-int flag_autoclean; /* set/used by modprobe and insmod */
-
-struct utsname uts_info;
-
-struct PATH_TYPE *modpath;
-int nmodpath = 0;
-static int maxpath = 0;
-
-struct EXEC_TYPE *execs;
-int nexecs = 0;
-static int maxexecs = 0;
-
-OPT_LIST *opt_list;
-static int n_opt_list;
-
-OPT_LIST *abovelist;
-static int n_abovelist;
-
-OPT_LIST *belowlist;
-static int n_belowlist;
-
-OPT_LIST *prunelist;
-static int n_prunelist;
-
-OPT_LIST *probe_list;
-static int n_probe_list;
-
-OPT_LIST *probeall_list;
-static int n_probeall_list;
-
-OPT_LIST *aliases;
-static int n_aliases;
-
-char *persistdir = "/var/lib/modules/persist";
-
-const char symprefix[] = SYMPREFIX;
-
-char *insmod_opt = NULL;
-char *config_file = NULL; /* Which file was actually used */
-time_t config_mtime;
-int root_check_off = CONFIG_ROOT_CHECK_OFF; /* Default is modules must be owned by root */
-static char *config_version; /* Hack for config_add */
-int quick = 0; /* Option -A */
-
-/* The initialization order must match the gen_file_enum order in config.h */
-struct gen_files gen_file[] = {
- {"generic_string", NULL, 0},
- {"pcimap", NULL, 0},
- {"isapnpmap", NULL, 0},
- {"usbmap", NULL, 0},
- {"parportmap", NULL, 0},
- {"dep", NULL, 0},
-};
-
-const int gen_file_count = sizeof(gen_file)/sizeof(gen_file[0]);
-
-int flag_verbose;
-
-unsigned long safemode;
-
-void verbose(const char *ctl,...)
-{
- if (flag_verbose) {
- va_list list;
- va_start(list, ctl);
- vprintf(ctl, list);
- va_end(list);
- fflush(stdout);
- }
-}
-
-
-/*
- * Check to see if the existing modules.xxx files need updating,
- * based on the timestamps of the modules and the config file.
- */
-static int check_update (const char *file, const struct stat *sb)
-{
- int len = strlen(file);
- int i;
-
- if (!S_ISREG(sb->st_mode))
- return 0;
- for (i = 0; i < gen_file_count; ++i) {
- if (sb->st_mtime > gen_file[i].mtime)
- break;
- }
- if (i == gen_file_count)
- return 0; /* All generated files are up to date */
-
- if (len > 2 && !strcmp(file + len - 2, ".o"))
- return 1;
- else if (len > 4 && !strcmp(file + len - 4, ".mod"))
- return 1;
-#ifdef CONFIG_USE_ZLIB
- else if (len > 5 && !strcmp(file + len - 5, ".o.gz"))
- return 1;
-#endif
- return 0;
-}
-
-static int need_update (const char *force_ver, const char *base_dir)
-{
- struct stat tmp;
- char dep[PATH_MAX];
- int i;
- uname (&uts_info);
- if (!force_ver)
- force_ver = uts_info.release;
-
- if (strlen (force_ver) > 50)
- /* That's just silly. */
- return 1;
-
- for (i = 0; i < gen_file_count; ++i) {
- if (stat(gen_file[i].name, &tmp))
- return 1; /* No dependency file yet, so we need to build it. */
- gen_file[i].mtime = tmp.st_mtime;
- }
-
- if (stat ("/etc/modules.conf", &tmp) &&
- stat ("/etc/conf.modules", &tmp))
- return 1;
-
- for (i = 0; i < gen_file_count; ++i) {
- if (tmp.st_mtime > gen_file[i].mtime)
- return 1; /* Config file is newer. */
- }
-
- snprintf (dep, sizeof(dep), "%s/lib/modules/%s", base_dir, force_ver);
- return xftw (dep, check_update);
-}
-
-
-/*
- * Strip white char at the end of a string.
- * Return the address of the last non white char + 1 (point on the '\0').
- */
-static char *strip_end(char *str)
-{
- int len = strlen(str);
-
- for (str += len - 1; len > 0 && (isspace(*str)); --len, --str)
- *str = '\0';
- return str + 1;
-}
-
-/*
- * Read a line of a configuration file and process continuation lines.
- * Return buf, or NULL if EOF.
- * Blank at the end of line are always stripped.
- * Everything on a line following comchar is a comment.
- *
- * Continuation character is \
- * Comment character is #
- */
-char *fgets_strip(char *buf, int sizebuf, FILE * fin, int *lineno)
-{
- int nocomment = 1; /* No comments found ? */
- int contline = 0;
- char *start = buf;
- char *ret = NULL;
- char comchar = '#';
- char contchar = '\\';
-
- *buf = '\0';
-
- while (fgets(buf, sizebuf, fin) != NULL) {
- char *end = strip_end(buf);
- char *pt = strchr(buf, comchar);
-
- if (pt != NULL) {
- nocomment = 0;
- *pt = '\0';
- end = strip_end(buf);
- }
-
- if (lineno != NULL)
- (*lineno)++;
- ret = start;
- if (contline) {
- char *pt = buf;
-
- while (isspace(*pt))
- pt++;
- if (pt > buf + 1) {
- strcpy(buf + 1, pt); /* safe, backward copy */
- buf[0] = ' ';
- end -= (int) (pt - buf) - 1;
- } else if (pt == buf + 1) {
- buf[0] = ' ';
- }
- }
- if (end > buf && *(end - 1) == contchar) {
- if (end == buf + 1 || *(end - 2) != contchar) {
- /* Continuation */
- contline = 1;
- end--;
- *end = '\0';
- buf = end;
- } else {
- *(end - 1) = '\0';
- break;
- }
- } else {
- break;
- }
- }
-
- return ret;
-}
-
-static char *next_word(char *pt)
-{
- char *match;
- char *pt2;
-
- /* find end of word */
- for (pt2 = pt; *pt2 && !(isspace(*pt2)); ++pt2) {
- if ((match = strchr("\"'`", *pt2)) != NULL) {
- for (++pt2; *pt2 && *pt2 != *match; ++pt2) {
- if (*pt2 == '\\' && *(pt2 + 1) == *match)
- ++pt2;
- }
- }
- }
-
- /* skip leading whitespace before next word */
- if (*pt2) {
- *pt2++ = '\0'; /* terminate last word */
- while (*pt2 && isspace(*pt2))
- ++pt2;
- }
- return pt2;
-}
-
-static GLOB_LIST *addlist(GLOB_LIST *orig, GLOB_LIST *add)
-{
- if (!orig)
- return add;
- /* else */
- orig->pathv = (char **)xrealloc(orig->pathv,
- (orig->pathc + add->pathc + 1) *
- sizeof(char *));
- memcpy(orig->pathv + orig->pathc, add->pathv,
- add->pathc * sizeof(char *));
- orig->pathc += add->pathc;
- orig->pathv[orig->pathc] = NULL;
- /*
- free(add->pathv);
- free(add);
- */
- return orig;
-}
-
-static void decode_list(int *n, OPT_LIST **list, char *arg, int adding,
- char *version, int opts)
-{
- GLOB_LIST *pg;
- GLOB_LIST *prevlist = NULL;
- int i, autoclean = 1;
- int where = *n;
- char *arg2 = next_word(arg);
-
- if (opts && !strcmp (arg, "-k")) {
- if (!*arg2)
- error("Missing module argument after -k\n");
- arg = arg2;
- arg2 = next_word(arg);
- autoclean = 0;
- }
-
- for (i = 0; i < *n; ++i) {
- if (strcmp((*list)[i].name, arg) == 0) {
- if (adding)
- prevlist = (*list)[i].opts;
- else
- free((*list)[i].opts);
- (*list)[i].opts = NULL;
- where = i;
- break;
- }
- }
- if (where == *n) {
- (*list) = (OPT_LIST *)xrealloc((*list),
- (*n + 2) * sizeof(OPT_LIST));
- (*list)[*n].name = xstrdup(arg);
- (*list)[*n].autoclean = autoclean;
- *n += 1;
- memset(&(*list)[*n], 0, sizeof(OPT_LIST));
- } else if (!autoclean)
- (*list)[where].autoclean = 0;
- pg = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST));
- meta_expand(arg2, pg, NULL, version, ME_ALL);
- (*list)[where].opts = addlist(prevlist, pg);
-}
-
-static void decode_exec(char *arg, int type)
-{
- char *arg2;
-
- execs[nexecs].when = type;
- arg2 = next_word(arg);
- execs[nexecs].module = xstrdup(arg);
- execs[nexecs].cmd = xstrdup(arg2);
- if (++nexecs >= maxexecs) {
- maxexecs += 10;
- execs = (struct EXEC_TYPE *)xrealloc(execs,
- maxexecs * sizeof(struct EXEC_TYPE));
- }
-}
-
-static int build_list(char **in, OPT_LIST **out, char *version, int opts)
-{
- GLOB_LIST *pg;
- int i;
-
- for (i = 0; in[i]; ++i) {
- char *p = xstrdup(in[i]);
- char *pt = next_word(p);
- char *pn = p;
-
- *out = (OPT_LIST *)xrealloc(*out, (i + 2) * sizeof(OPT_LIST));
- (*out)[i].autoclean = 1;
- if (opts && !strcmp (p, "-k")) {
- pn = pt;
- pt = next_word(pn);
- (*out)[i].autoclean = 0;
- }
- pg = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST));
- meta_expand(pt, pg, NULL, version, ME_ALL);
- (*out)[i].name = xstrdup(pn);
- (*out)[i].opts = pg;
- free(p);
- }
- memset(&(*out)[i], 0, sizeof(OPT_LIST));
-
- return i;
-}
-
-/* Environment variables can override defaults, testing only */
-static void gen_file_env(struct gen_files *gf)
-{
- if (!safemode) {
- char *e = xmalloc(strlen(gf->base)+5), *p1 = gf->base, *p2 = e;
- while ((*p2++ = toupper(*p1++))) ;
- strcpy(p2-1, "PATH"); /* safe, xmalloc */
- if ((p2 = getenv(e)) != NULL) {
- free(gf->name);
- gf->name = xstrdup(p2);
- }
- free(e);
- }
-}
-
-/* Read a config option for a generated filename */
-static int gen_file_conf(struct gen_files *gf, int assgn, const char *parm, const char *arg)
-{
-
- int l = strlen(gf->base);
- if (assgn &&
- strncmp(parm, gf->base, l) == 0 &&
- strcmp(parm+l, "file") == 0 &&
- !gf->name) {
- gf->name = xstrdup(arg);
- return(0);
- }
- return(1);
-}
-
-/* Check we have a name for a generated file */
-static int gen_file_check(struct gen_files *gf, GLOB_LIST *g,
- char *base_dir, char *version)
-{
- char tmp[PATH_MAX];
- int ret = 0;
- if (!gf->name) {
- /*
- * Specification: config file / no xxxfile parameter
- * The default value for generated filename xxx is:
- *
- * xxxfile=/lib/modules/`uname -r`/modules.xxx
- *
- * If the config file exists but lacks an xxxfile
- * specification, the default value is used since
- * the system can't work without one.
- */
- snprintf(tmp, sizeof(tmp), "%s/lib/modules/%s/modules.%s",
- base_dir, version, gf->base);
- gf->name = xstrdup(tmp);
- } else { /* xxxfile defined in modules.conf */
- /*
- * If we have a xxxfile definition in the configuration file
- * we must resolve any shell meta-chars in its value.
- */
- if (meta_expand(gf->name, g, base_dir, version, ME_ALL))
- ret = -1;
- else if (!g->pathv || g->pathv[0] == NULL)
- ret = -1;
- else {
- free(gf->name);
- gf->name = xstrdup(g->pathv[0]);
- }
- }
- return(ret);
-}
-
-/*
- * Read the configuration file.
- * If parameter "all" == 0 then ignore everything except path info
- * Return -1 if any error.
- * Error messages generated.
- */
-static int do_read(int all, char *force_ver, char *base_dir, char *conf_file, int depth)
-{
- #define MAX_LEVEL 20
- FILE *fin;
- GLOB_LIST g;
- int i;
- int assgn;
- int drop_default_paths = 1;
- int lineno = 0;
- int ret = 0;
- int state[MAX_LEVEL + 1]; /* nested "if" */
- int level = 0;
- char buf[3000];
- char tmpline[100];
- char **pathp;
- char *envpath;
- char *version;
- char *type;
- char **glb;
- char old_name[] = "/etc/conf.modules";
- int conf_file_specified = 0;
-
- /*
- * The configuration file is optional.
- * No error is printed if it is missing.
- * If it is missing the following content is assumed.
- *
- * path[boot]=/lib/modules/boot
- *
- * path[toplevel]=/lib/modules/`uname -r`
- *
- * path[toplevel]=/lib/modules/`kernelversion`
- * (where kernelversion gives the major kernel version: "2.0", "2.2"...)
- *
- * path[toplevel]=/lib/modules/default
- *
- * path[kernel]=/lib/modules/kernel
- * path[fs]=/lib/modules/fs
- * path[net]=/lib/modules/net
- * path[scsi]=/lib/modules/scsi
- * path[block]=/lib/modules/block
- * path[cdrom]=/lib/modules/cdrom
- * path[ipv4]=/lib/modules/ipv4
- * path[ipv6]=/lib/modules/ipv6
- * path[sound]=/lib/modules/sound
- * path[fc4]=/lib/modules/fc4
- * path[video]=/lib/modules/video
- * path[misc]=/lib/modules/misc
- * path[pcmcia]=/lib/modules/pcmcia
- * path[atm]=/lib/modules/atm
- * path[usb]=/lib/modules/usb
- * path[ide]=/lib/modules/ide
- * path[ieee1394]=/lib/modules/ieee1394
- * path[mtd]=/lib/modules/mtd
- *
- * The idea is that modprobe will look first if the
- * modules are compiled for the current release of the kernel.
- * If not found, it will look for modules that fit for the
- * general kernelversion (2.0, 2.2 and so on).
- * If still not found, it will look into the default release.
- * And if still not found, it will look in the other directories.
- *
- * The strategy should be like this:
- * When you install a new linux kernel, the modules should go
- * into a directory related to the release (version) of the kernel.
- * Then you can do a symlink "default" to this directory.
- *
- * Each time you compile a new kernel, the make modules_install
- * will create a new directory, but it won't change thee default.
- *
- * When you get a module unrelated to the kernel distribution
- * you can place it in one of the last three directory types.
- *
- * This is the default strategy. Of course you can overide
- * this in /etc/modules.conf.
- *
- * 2.3.15 added a new file tree walk algorithm which made it possible to
- * point at a top level directory and get the same behaviour as earlier
- * versions of modutils. 2.3.16 takes this one stage further, it
- * removes all the individual directory names from most of the scans,
- * only pointing at the top level directory. The only exception is the
- * last ditch scan, scanning all of /lib/modules would be a bad idea(TM)
- * so the last ditch scan still runs individual directory names under
- * /lib/modules.
- *
- * Additional syntax:
- *
- * [add] above module module1 ...
- * Specify additional modules to pull in on top of a module
- *
- * [add] below module module1 ...
- * Specify additional modules needed to be able to load a module
- *
- * [add] prune filename ...
- *
- * [add] probe name module1 ...
- * When "name" is requested, modprobe tries to install each
- * module in the list until it succeeds.
- *
- * [add] probeall name module1 ...
- * When "name" is requested, modprobe tries to install all
- * modules in the list.
- * If any module is installed, the command has succeeded.
- *
- * [add] options module option_list
- *
- * For all of the above, the optional "add" prefix is used to
- * add to a list instead of replacing the contents.
- *
- * include FILE_TO_INCLUDE
- * This does what you expect. No limitation on include levels.
- *
- * persistdir=persist_directory
- * Name the directory to save persistent data from modules.
- *
- * In the following WORD is a sequence if non-white characters.
- * If ' " or ` is found in the string, all characters up to the
- * matching ' " or ` will also be included, even whitespace.
- * Every WORD will then be expanded w.r.t. meta-characters.
- * If the expanded result gives more than one word, then only
- * the first word of the result will be used.
- *
- *
- * define CODE WORD
- * Do a putenv("CODE=WORD")
- *
- * EXPRESSION below can be:
- * WORD compare_op WORD
- * where compare_op is one of == != < <= >= >
- * The string values of the WORDs are compared
- * or
- * -n WORD compare_op WORD
- * where compare_op is one of == != < <= >= >
- * The numeric values of the WORDs are compared
- * or
- * WORD
- * if the expansion of WORD fails, or if the
- * expansion is "0" (zero), "false" or "" (empty)
- * then the expansion has the value FALSE.
- * Otherwise the expansion has the value TRUE
- * or
- * -f FILENAME
- * Test if the file FILENAME exists
- * or
- * -k
- * Test if "autoclean" (i.e. called from the kernel)
- * or
- * ! EXPRESSION
- * A negated expression is also an expression
- *
- * if EXPRESSION
- * any config line
- * ...
- * elseif EXPRESSION
- * any config line
- * ...
- * else
- * any config line
- * ...
- * endif
- *
- * The else and elseif keywords are optional.
- * "if"-statements nest up to 20 levels.
- */
-
- state[0] = 1;
-
- if (force_ver)
- version = force_ver;
- else
- version = uts_info.release;
-
- config_version = xstrdup(version);
-
- /* Only read the default entries on the first file */
- if (depth == 0) {
- maxpath = 100;
- modpath = (struct PATH_TYPE *)xmalloc(maxpath * sizeof(struct PATH_TYPE));
- nmodpath = 0;
-
- maxexecs = 10;
- execs = (struct EXEC_TYPE *)xmalloc(maxexecs * sizeof(struct EXEC_TYPE));
- nexecs = 0;
-
- /*
- * Build predef options
- */
- if (all && optlist[0])
- n_opt_list = build_list(optlist, &opt_list, version, 1);
-
- /*
- * Build predef above
- */
- if (all && above[0])
- n_abovelist = build_list(above, &abovelist, version, 0);
-
- /*
- * Build predef below
- */
- if (all && below[0])
- n_belowlist = build_list(below, &belowlist, version, 0);
-
- /*
- * Build predef prune list
- */
- if (prune[0])
- n_prunelist = build_list(prune, &prunelist, version, 0);
-
- /*
- * Build predef aliases
- */
- if (all && aliaslist[0])
- n_aliases = build_list(aliaslist, &aliases, version, 0);
-
- /* Order and priority is now: (MODPATH + modules.conf) || (predefs + modules.conf) */
- if ((envpath = getenv("MODPATH")) != NULL && !safemode) {
- size_t len;
- char *p;
- char *path;
-
- /* Make a copy so's we can mung it with strtok. */
- len = strlen(envpath) + 1;
- p = alloca(len);
- memcpy(p, envpath, len);
- path = alloca(PATH_MAX);
-
- for (p = strtok(p, ":"); p != NULL; p = strtok(NULL, ":")) {
- len = snprintf(path, PATH_MAX, p, version);
- modpath[nmodpath].path = xstrdup(path);
- if ((type = strrchr(path, '/')) != NULL)
- type += 1;
- else
- type = "misc";
- modpath[nmodpath].type = xstrdup(type);
- if (++nmodpath >= maxpath) {
- maxpath += 100;
- modpath = (struct PATH_TYPE *)xrealloc(modpath,
- maxpath * sizeof(struct PATH_TYPE));
- }
-
- }
- } else {
- /*
- * Build the default "path[type]" configuration
- */
- int n;
- char *k;
-
- /* The first entry in the path list */
- modpath[nmodpath].type = xstrdup("boot");
- snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/boot", base_dir);
- modpath[nmodpath].path = xstrdup(tmpline);
- ++nmodpath;
-
- /* The second entry in the path list, `uname -r` */
- modpath[nmodpath].type = xstrdup("toplevel");
- snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/%s", base_dir, version);
- modpath[nmodpath].path = xstrdup(tmpline);
- ++nmodpath;
-
- /* The third entry in the path list, `kernelversion` */
- modpath[nmodpath].type = xstrdup("toplevel");
- for (n = 0, k = version; *k; ++k) {
- if (*k == '.' && ++n == 2)
- break;
- }
- snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/%.*s", base_dir,
- (/* typecast for Alpha */ int)(k - version), version);
- modpath[nmodpath].path = xstrdup(tmpline);
- ++nmodpath;
-
- /* The rest of the entries in the path list */
- for (pathp = tbpath; *pathp; ++pathp) {
- char **type;
-
- for (type = tbtype; *type; ++type) {
- char path[PATH_MAX];
-
- snprintf(path, sizeof(path), "%s%s/%s", base_dir, *pathp, *type);
- if (meta_expand(path, &g, NULL, version, ME_ALL))
- return -1;
-
- for (glb = g.pathv; glb && *glb; ++glb) {
- modpath[nmodpath].type = xstrdup(*type);
- modpath[nmodpath].path = *glb;
- if (++nmodpath >= maxpath) {
- maxpath += 100;
- modpath = (struct PATH_TYPE *)xrealloc(modpath,
- maxpath * sizeof(struct PATH_TYPE));
- }
- }
- }
- }
- }
-
- /* Environment overrides for testing only, undocumented */
- for (i = 0; i < gen_file_count; ++i)
- gen_file_env(gen_file+i);
-
- } /* End of depth == 0 */
-
- if (conf_file ||
- ((conf_file = getenv("MODULECONFIG")) != NULL && *conf_file && !safemode)) {
- if (!(fin = fopen(conf_file, "r"))) {
- error("Can't open %s", conf_file);
- return -1;
- }
- conf_file_specified = 1;
- } else {
- if (!(fin = fopen((conf_file = ETC_MODULES_CONF), "r"))) {
- /* Fall back to non-standard name */
- if ((fin = fopen((conf_file = old_name), "r"))) {
- fprintf(stderr,
- "Warning: modutils is reading from %s because\n"
- " %s does not exist. The use of %s is\n"
- " deprecated, please rename %s to %s\n"
- " as soon as possible. Command\n"
- " mv %s %s\n",
- old_name, ETC_MODULES_CONF,
- old_name, old_name, ETC_MODULES_CONF,
- old_name, ETC_MODULES_CONF);
- }
- /* So what... use the default configuration */
- }
- }
-
- if (fin) {
- struct stat statbuf1, statbuf2;
- if (fstat(fileno(fin), &statbuf1) == 0)
- config_mtime = statbuf1.st_mtime;
- config_file = xstrdup(conf_file); /* Save name actually used */
- if (!conf_file_specified &&
- stat(ETC_MODULES_CONF, &statbuf1) == 0 &&
- stat(old_name, &statbuf2) == 0) {
- /* Both /etc files exist */
- if (statbuf1.st_dev == statbuf2.st_dev &&
- statbuf1.st_ino == statbuf2.st_ino) {
- if (lstat(ETC_MODULES_CONF, &statbuf1) == 0 &&
- S_ISLNK(statbuf1.st_mode))
- fprintf(stderr,
- "Warning: You do not need a link from %s to\n"
- " %s. The use of %s is deprecated,\n"
- " please remove %s and rename %s\n"
- " to %s as soon as possible. Commands.\n"
- " rm %s\n"
- " mv %s %s\n",
- ETC_MODULES_CONF, old_name,
- old_name, ETC_MODULES_CONF, old_name, ETC_MODULES_CONF,
- ETC_MODULES_CONF,
- old_name, ETC_MODULES_CONF);
- else {
-#ifndef NO_WARN_ON_OLD_LINK
- fprintf(stderr,
- "Warning: You do not need a link from %s to\n"
- " %s. The use of %s is deprecated,\n"
- " please remove %s as soon as possible. Command\n"
- " rm %s\n",
- old_name, ETC_MODULES_CONF,
- old_name, old_name,
- old_name);
-#endif
- }
- }
- else
- fprintf(stderr,
- "Warning: modutils is reading from %s and\n"
- " ignoring %s. The use of %s is deprecated,\n"
- " please remove %s as soon as possible. Command\n"
- " rm %s\n",
- ETC_MODULES_CONF, old_name,
- old_name, old_name,
- old_name);
- }
- }
-
- /*
- * Finally, decode the file
- */
- while (fin && fgets_strip(buf, sizeof(buf) - 1, fin, &lineno) != NULL) {
- char *arg2;
- char *parm = buf;
- char *arg;
- int one_err = 0;
- int adding;
-
- while (isspace(*parm))
- parm++;
-
- if (strncmp(parm, "add", 3) == 0) {
- adding = 1;
- parm += 3;
- while (isspace(*parm))
- parm++;
- } else
- adding = 0;
-
- arg = parm;
-
- if (*parm == '\0')
- continue;
-
- one_err = 1;
-
- while (*arg > ' ' && *arg != '=')
- arg++;
-
- if (*arg == '=')
- assgn = 1;
- else
- assgn = 0;
- *arg++ = '\0';
- while (isspace(*arg))
- arg++;
-
- /*
- * endif
- */
- if (!assgn && strcmp(parm, "endif") == 0) {
- if (level > 0)
- --level;
- else {
- error("unmatched endif in line %d", lineno);
- return -1;
- }
- continue;
- }
-
- /*
- * else
- */
- if (!assgn && strcmp(parm, "else") == 0) {
- if (level <= 0) {
- error("else without if in line %d", lineno);
- return -1;
- }
- state[level] = !state[level];
- continue;
- }
-
- /*
- * elseif
- */
- if (!assgn && strcmp(parm, "elseif") == 0) {
- if (level <= 0) {
- error("elseif without if in line %d", lineno);
- return -1;
- }
- if (state[level] != 0) {
- /*
- * We have already found a TRUE
- * if statement in this "chain".
- * That's what "2" means.
- */
- state[level] = 2;
- continue;
- }
- /* else: No TRUE if has been found, cheat */
- /*
- * The "if" handling increments level,
- * but this is the _same_ level as before.
- * So, compensate for it.
- */
- --level;
- parm = "if";
- /* Fallthru to "if" */
- }
-
- /*
- * if
- */
- if (strcmp(parm, "if") == 0) {
- char *cmp;
- int not = 0;
- int numeric = 0;
-
- if (level >= MAX_LEVEL) {
- error("Too many nested if's in line %d\n", lineno);
- return -1;
- }
- state[++level] = 0; /* default false */
-
- if (*arg == '!') {
- not = 1;
- arg = next_word(arg);
- }
-
- if (strncmp(arg, "-k", 2) == 0) {
- state[level] = flag_autoclean;
- continue;
- }
-
- if (strncmp(arg, "-f", 2) == 0) {
- char *file = next_word(arg);
- meta_expand(file, &g, NULL, version, ME_ALL);
- if (access(g.pathc ? g.pathv[0] : file, R_OK) == 0)
- state[level] = !not;
- else
- state[level] = not;
- continue;
- }
-
- if (strncmp(arg, "-n", 2) == 0) {
- numeric = 1;
- arg = next_word(arg);
- }
-
-
- cmp = next_word(arg);
- if (*cmp) {
- GLOB_LIST g2;
- long n1 = 0;
- long n2 = 0;
- char *w1 = "";
- char *w2 = "";
-
- arg2 = next_word(cmp);
-
- meta_expand(arg, &g, NULL, version, ME_ALL);
- if (g.pathc && g.pathv[0])
- w1 = g.pathv[0];
-
- meta_expand(arg2, &g2, NULL, version, ME_ALL);
- if (g2.pathc && g2.pathv[0])
- w2 = g2.pathv[0];
-
- if (numeric) {
- n1 = strtol(w1, NULL, 0);
- n2 = strtol(w2, NULL, 0);
- }
-
- if (strcmp(cmp, "==") == 0 ||
- strcmp(cmp, "=") == 0) {
- if (numeric)
- state[level] = (n1 == n2);
- else
- state[level] = strcmp(w1, w2) == 0;
- } else if (strcmp(cmp, "!=") == 0) {
- if (numeric)
- state[level] = (n1 != n2);
- else
- state[level] = strcmp(w1, w2) != 0;
- } else if (strcmp(cmp, ">=") == 0) {
- if (numeric)
- state[level] = (n1 >= n2);
- else
- state[level] = strcmp(w1, w2) >= 0;
- } else if (strcmp(cmp, "<=") == 0) {
- if (numeric)
- state[level] = (n1 <= n2);
- else
- state[level] = strcmp(w1, w2) <= 0;
- } else if (strcmp(cmp, ">") == 0) {
- if (numeric)
- state[level] = (n1 > n2);
- else
- state[level] = strcmp(w1, w2) > 0;
- } else if (strcmp(cmp, "<") == 0) {
- if (numeric)
- state[level] = (n1 < n2);
- else
- state[level] = strcmp(w1, w2) < 0;
- }
- } else { /* Check defined value, if any */
- /* undef or defined as
- * "" or "0" or "false" => false
- * defined => true
- */
- if (!meta_expand(arg, &g, NULL, version, ME_ALL) &&
- g.pathc > 0 &&
- strcmp(g.pathv[0], "0") != 0 &&
- strcmp(g.pathv[0], "false") != 0 &&
- strlen(g.pathv[0]) != 0)
- state[level] = 1; /* true */
- }
- if (not)
- state[level] = !state[level];
-
- continue;
- }
-
- /*
- * Should we bother?
- */
- if (state[level] != 1)
- continue;
-
- /*
- * define
- */
- if (!assgn && strcmp(parm, "define") == 0) {
- char env[PATH_MAX];
-
- arg2 = next_word(arg);
- meta_expand(arg2, &g, NULL, version, ME_ALL);
- snprintf(env, sizeof(env), "%s=%s", arg, (g.pathc ? g.pathv[0] : ""));
- putenv(env);
- one_err = 0;
- }
-
- /*
- * include
- */
- if (!assgn && strcmp(parm, "include") == 0) {
- meta_expand(arg, &g, NULL, version, ME_ALL);
-
- if (!do_read(all, version, base_dir, g.pathc ? g.pathv[0] : arg, depth+1))
- one_err = 0;
- else
- error("include %s failed\n", arg);
- }
-
- /*
- * above
- */
- else if (all && !assgn && strcmp(parm, "above") == 0) {
- decode_list(&n_abovelist, &abovelist, arg, adding, version, 0);
- one_err = 0;
- }
-
- /*
- * below
- */
- else if (all && !assgn && strcmp(parm, "below") == 0) {
- decode_list(&n_belowlist, &belowlist, arg, adding, version, 0);
- one_err = 0;
- }
-
- /*
- * prune
- */
- else if (all && !assgn && strcmp(parm, "prune") == 0) {
- decode_list(&n_prunelist, &prunelist, arg, adding, version, 0);
- one_err = 0;
- }
-
- /*
- * probe
- */
- else if (all && !assgn && strcmp(parm, "probe") == 0) {
- decode_list(&n_probe_list, &probe_list, arg, adding, version, 0);
- one_err = 0;
- }
-
- /*
- * probeall
- */
- else if (all && !assgn && strcmp(parm, "probeall") == 0) {
- decode_list(&n_probeall_list, &probeall_list, arg, adding, version, 0);
- one_err = 0;
- }
-
- /*
- * options
- */
- else if (all && !assgn && strcmp(parm, "options") == 0) {
- decode_list(&n_opt_list, &opt_list, arg, adding, version, 1);
- one_err = 0;
- }
-
- /*
- * alias
- */
- else if (all && !assgn && strcmp(parm, "alias") == 0) {
- /*
- * Replace any previous (default) definitions
- * for the same module
- */
- decode_list(&n_aliases, &aliases, arg, 0, version, 0);
- one_err = 0;
- }
-
- /*
- * Specification: /etc/modules.conf
- * The format of the commands in /etc/modules.conf are:
- *
- * pre-install module command
- * install module command
- * post-install module command
- * pre-remove module command
- * remove module command
- * post-remove module command
- *
- * The different words are separated by tabs or spaces.
- */
- /*
- * pre-install
- */
- else if (all && !assgn && (strcmp(parm, "pre-install") == 0)) {
- decode_exec(arg, EXEC_PRE_INSTALL);
- one_err = 0;
- }
-
- /*
- * install
- */
- else if (all && !assgn && (strcmp(parm, "install") == 0)) {
- decode_exec(arg, EXEC_INSTALL);
- one_err = 0;
- }
-
- /*
- * post-install
- */
- else if (all && !assgn && (strcmp(parm, "post-install") == 0)) {
- decode_exec(arg, EXEC_POST_INSTALL);
- one_err = 0;
- }
-
- /*
- * pre-remove
- */
- else if (all && !assgn && (strcmp(parm, "pre-remove") == 0)) {
- decode_exec(arg, EXEC_PRE_REMOVE);
- one_err = 0;
- }
-
- /*
- * remove
- */
- else if (all && !assgn && (strcmp(parm, "remove") == 0)) {
- decode_exec(arg, EXEC_REMOVE);
- one_err = 0;
- }
-
- /*
- * post-remove
- */
- else if (all && !assgn && (strcmp(parm, "post-remove") == 0)) {
- decode_exec(arg, EXEC_POST_REMOVE);
- one_err = 0;
- }
-
- /*
- * insmod_opt=
- */
- else if (assgn && (strcmp(parm, "insmod_opt") == 0)) {
- insmod_opt = xstrdup(arg);
- one_err = 0;
- }
-
- /*
- * keep
- */
- else if (!assgn && (strcmp(parm, "keep") == 0)) {
- drop_default_paths = 0;
- one_err = 0;
- }
-
- /*
- * path...=
- */
- else if (assgn && strncmp(parm, "path", 4) == 0) {
- /*
- * Specification: config file / path parameter
- * The path parameter specifies a directory to
- * search for modules.
- * This parameter may be repeated multiple times.
- *
- * Note that the actual path may be defined using
- * wildcards and other shell meta-chars, such as "*?`".
- * For example:
- * path[misc]=/lib/modules/1.1.5?/misc
- *
- * Optionally the path keyword carries a tag.
- * This tells us a little more about the purpose of
- * this directory and allows some automated operations.
- * A path is marked with a tag by adding the tag,
- * enclosed in square brackets, to the path keyword:
- * #
- * path[boot]=/lib/modules/boot
- * #
- * This case identifies the path a of directory
- * holding modules loadable a boot time.
- */
-
- if (drop_default_paths) {
- int n;
-
- /*
- * Specification: config file / path / default
- *
- * Whenever there is a path[] specification
- * in the config file, all the default
- * path are reset.
- *
- * If one instead wants to _add_ to the default
- * set of paths, one has to have the option
- * keep
- * before the first path[]-specification line
- * in the configuration file.
- */
- drop_default_paths = 0;
- for (n = 0; n < nmodpath; n++) {
- free(modpath[n].path);
- free(modpath[n].type);
- }
- nmodpath = 0;
- }
-
- /*
- * Get (the optional) tag
- * If the tag is missing, the word "misc"
- * is assumed.
- */
- type = "misc";
-
- if (parm[4] == '[') {
- char *pt_type = parm + 5;
-
- while (*pt_type != '\0' && *pt_type != ']')
- pt_type++;
-
- if (*pt_type == ']' && pt_type[1] == '\0') {
- *pt_type = '\0';
- type = parm + 5;
- } /* else CHECKME */
- }
-
- /*
- * Handle the actual path description
- */
- if (meta_expand(arg, &g, base_dir, version, ME_ALL))
- return -1;
- for (glb = g.pathv; glb && *glb; ++glb) {
- modpath[nmodpath].type = xstrdup(type);
- modpath[nmodpath].path = *glb;
- if (++nmodpath >= maxpath) {
- maxpath += 100;
- modpath = (struct PATH_TYPE *)xrealloc(modpath,
- maxpath * sizeof(struct PATH_TYPE));
- }
- }
- one_err = 0;
- }
-
- /*
- * persistdir
- */
- else if (assgn && strcmp(parm, "persistdir") == 0) {
- meta_expand(arg, &g, NULL, version, ME_ALL);
- persistdir = xstrdup(g.pathc ? g.pathv[0] : arg);
- one_err = 0;
- }
-
- /* Names for generated files in config file */
- for (i = 0; one_err && i < gen_file_count; ++i)
- one_err = gen_file_conf(gen_file+i, assgn, parm, arg);
-
- /*
- * any errors so far?
- */
- if (all == 0)
- one_err = 0;
- else if (one_err) {
- error("Invalid line %d in %s\n\t%s",
- lineno, conf_file, buf);
- ret = -1;
- }
- }
- if (fin)
- fclose(fin);
-
- if (level) {
- error("missing endif at %s EOF", conf_file);
- ret = -1;
- }
-
- if (ret)
- return ret;
- /* else */
-
- /* Check we have names for generated files */
- for (i = 0; !ret && i < gen_file_count; ++i)
- ret = gen_file_check(gen_file+i, &g, base_dir, version);
-
- return ret;
-}
-
-int config_read(int all, char *force_ver, char *base_dir, char *conf_file)
-{
- int r;
- if (modpath != NULL)
- return 0; /* already initialized */
-
- if (uname(&uts_info) < 0) {
- error("Failed to find kernel name information");
- return -1;
- }
-
- r = do_read(all, force_ver, base_dir, conf_file, 0);
-
- if (quick && !r && !need_update (force_ver, base_dir))
- exit (0);
-
- return r;
-}
-
-/****************************************************************************/
-/*
- * FIXME: Far too much global state. KAO.
- */
-static int found;
-static int favail;
-static int one_only;
-static int meta_expand_type;
-char **list;
-static const char *filter_by_file;
-static char *filter_by_dir;
-
-/*
- * Add a file name if it exist
- */
-static int config_add(const char *file, const struct stat *sb)
-{
- int i;
- int npaths = 0;
- char **paths = NULL;
-
- if (meta_expand_type) {
- GLOB_LIST g;
- char **p;
- char full[PATH_MAX];
-
- snprintf(full, sizeof(full), "%s/%s", file, filter_by_file);
-
- if (filter_by_dir && !strstr(full, filter_by_dir))
- return 0;
-
- if (meta_expand(full, &g, NULL, config_version, meta_expand_type))
- return 1;
- for (p = g.pathv; p && *p; ++p) {
- paths = (char **)xrealloc(paths,
- (npaths + 1) * sizeof(char *));
- paths[npaths++] = *p;
- }
- } else { /* normal path match or match with "*" */
- if (!S_ISREG(sb->st_mode))
- return 0;
-
- if (strcmp(filter_by_file, "*")) {
- char *p;
-
- if ((p = strrchr(file, '/')) == NULL)
- p = (char *)file;
- else
- p += 1;
-
- if (strcmp(p, filter_by_file))
- return 0;
- }
- if (filter_by_dir && !strstr(file, filter_by_dir))
- return 0;
- paths = (char **)xmalloc(sizeof(char **));
- *paths = xstrdup(file);
- npaths = 1;
- }
-
- for (i = 0; i < npaths; ++i) {
- struct stat sbuf;
-
- if (S_ISDIR(sb->st_mode)) {
- if (stat(paths[i], &sbuf) == 0)
- sb = &sbuf;
- }
- if (S_ISREG(sb->st_mode) && sb->st_mode & S_IRUSR) {
- int j;
- char **this;
-
- if (!root_check_off) {
- if (sb->st_uid != 0) {
- error("%s is not owned by root", paths[i]);
- continue;
- }
- }
-
- /* avoid duplicates */
- for (j = 0, this = list; j < found; ++j, ++this) {
- if (strcmp(*this, paths[i]) == 0) {
- free(paths[i]);
- goto next;
- }
- }
-
- list[found] = paths[i];
- if (++found >= favail)
- list = (char **)xrealloc(list,
- (favail += 100) * sizeof(char *));
-
- if (one_only) {
- for (j = i + 1; j < npaths; ++j)
- free(paths[j]);
- free(paths);
- return 1; /* finish xftw */
- }
- }
- next:
- }
-
- if (npaths > 0)
- free(paths);
-
- return 0;
-}
-
-/*
- * Find modules matching the name "match" in directory of type "type"
- * (type == NULL matches all)
- *
- * Return a pointer to the list of modules found (or NULL if error).
- * Update the counter (sent as parameter).
- */
-GLOB_LIST *config_lstmod(const char *match, const char *type, int first_only)
-{
- /*
- * Note:
- * There are _no_ wildcards remaining in the path descriptions!
- */
- struct stat sb;
- int i;
- int ret = 0;
- char *path = NULL;
- char this[PATH_MAX];
-
- if (!match)
- match = "*";
- one_only = first_only;
- found = 0;
- filter_by_file = match;
- filter_by_dir = NULL;
- if (type) {
- char tmpdir[PATH_MAX];
- snprintf(tmpdir, sizeof(tmpdir), "/%s/", type);
- filter_by_dir = xstrdup(tmpdir);
- }
- /* In safe mode, the module name is always handled as is, without meta
- * expansion. It might have come from an end user via kmod and must
- * not be trusted. Even in unsafe mode, only apply globbing to the
- * module name, not command expansion. We trust config file input so
- * applying command expansion is safe, we do not trust command line input.
- * This assumes that the only time the user can specify -C config file
- * is when they run under their own authority. In particular all
- * mechanisms that call modprobe as root on behalf of the user must
- * run in safe mode, without letting the user supply a config filename.
- */
- meta_expand_type = 0;
- if (strpbrk(match, SHELL_META) && strcmp(match, "*") && !safemode)
- meta_expand_type = ME_GLOB|ME_BUILTIN_COMMAND;
-
- list = (char **)xmalloc((favail = 100) * sizeof(char *));
-
- for (i = 0; i < nmodpath; i++) {
- path = modpath[i].path;
- /* Special case: insmod: handle single, non-wildcard match */
- if (first_only && strpbrk(match, SHELL_META) == NULL) {
- /* Fix for "2.1.121 syntax */
- snprintf(this, sizeof(this), "%s/%s/%s", path,
- modpath[i].type, match);
- if (stat(this, &sb) == 0 &&
- config_add(this, &sb))
- break;
- /* End fix for "2.1.121 syntax */
-
- snprintf(this, sizeof(this), "%s/%s", path, match);
- if (stat(this, &sb) == 0 &&
- config_add(this, &sb))
- break;
- }
-
- /* Start looking */
- if ((ret = xftw(path, config_add))) {
- break;
- }
- }
- if (ret >= 0) {
- GLOB_LIST *g = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST));
- g->pathc = found;
- g->pathv = list;
- free(filter_by_dir);
- return g;
- }
- free(list);
- free(filter_by_dir);
- return NULL;
-}
-
-/* Given a bare module name, poke through the module path to find the file. */
-char *search_module_path(const char *base)
-{
- GLOB_LIST *g;
-
- if (config_read(0, NULL, "", NULL) < 0)
- return NULL;
- /* else */
- g = config_lstmod(base, NULL, 1);
- if (g == NULL || g->pathc == 0) {
- char base_o[PATH_MAX];
-
- snprintf(base_o, sizeof(base_o), "%s.o", base);
- g = config_lstmod(base_o, NULL, 1);
-#ifdef CONFIG_USE_ZLIB
- if (g == NULL || g->pathc == 0) {
- snprintf(base_o, sizeof(base_o), "%s.o.gz", base);
- g = config_lstmod(base_o, NULL, 1);
- }
-#endif
- }
- if (g == NULL || g->pathc == 0)
- return NULL;
- /* else */
- return g->pathv[0];
-}
diff --git a/mdk-stage1/insmod-modutils/util/gzfiles.c b/mdk-stage1/insmod-modutils/util/gzfiles.c
deleted file mode 100644
index 8d02253bb..000000000
--- a/mdk-stage1/insmod-modutils/util/gzfiles.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * This simple library intends to make it transparent to read gzipped and/or
- * standard files. This is simple enough to fit modutils' needs, but may be
- * easily adapted to anyone's needs. It's completely free, do what you want
- * with it . - Willy Tarreau <willy@meta-x.org> - 2000/05/05 -
- */
-
-#ifdef CONFIG_USE_ZLIB
-
-#include <stdio.h>
-#include <zlib.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-/* redefinition of gz_stream which isn't exported by zlib */
-typedef struct gz_stream {
- z_stream stream;
- int z_err; /* error code for last stream operation */
- int z_eof; /* set if end of input file */
- FILE *file; /* .gz file */
- Byte *inbuf; /* input buffer */
- Byte *outbuf; /* output buffer */
- uLong crc; /* crc32 of uncompressed data */
- char *msg; /* error message */
- char *path; /* path name for debugging only */
- int transparent; /* 1 if input file is not a .gz file */
- char mode; /* 'w' or 'r' */
- long startpos; /* start of compressed data in file (header skipped) */
-} gz_stream;
-
-/* maximum number of simultaneous open files, also greater file descriptor number */
-#define MAXFD 64
-
-/* this static list is assumed to be filled with NULLs at runtime */
-static gzFile gzf_fds[MAXFD];
-
-/* returns the filedesc of the opened file. */
-int gzf_open(const char *name, int mode) {
- int fd;
- gzFile g;
-
- if ((g=gzopen(name, "rb")) != NULL) {
- fd=fileno(((gz_stream*)g)->file);
- gzf_fds[fd]=g;
- }
- else if ((fd=open(name, mode)) != -1) {
- gzf_fds[fd]=NULL; /* NULL means not GZ mode */
- }
- return fd;
-}
-
-off_t gzf_lseek(int fd, off_t offset, int whence) {
- if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL)
- return lseek(fd, offset, whence);
- else
- return gzseek(gzf_fds[fd], offset, whence);
-}
-
-int gzf_read(int fd, void *buf, size_t count) {
- if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL)
- return read(fd, buf, count);
- else
- return gzread(gzf_fds[fd], buf, count);
-}
-
-void gzf_close(int fd) {
- if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL)
- close(fd);
- else
- gzclose(gzf_fds[fd]);
-}
-#endif
-
diff --git a/mdk-stage1/insmod-modutils/util/logger.c b/mdk-stage1/insmod-modutils/util/logger.c
deleted file mode 100644
index 3b790df5a..000000000
--- a/mdk-stage1/insmod-modutils/util/logger.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/* Error logging facilities.
- Copyright 1996, 1997 Linux International.
-
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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
- */
-
-#ident "$Id$"
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <syslog.h>
-
-#include "util.h"
-
-/*======================================================================*/
-
-int errors;
-const char *error_file;
-int log;
-
-#define STOREMSG
-#ifdef STOREMSG
-struct cbuf {
- struct cbuf *next;
- int type;
- char *msg;
-} *head, *tail;
-
-static void savemsg(int type, char *msg)
-{
- struct cbuf *me = (struct cbuf *)xmalloc(sizeof(struct cbuf));
- char *s = xstrdup(msg);
-
- me->next = NULL;
- me->type = type;
- me->msg = s;
-
- if (tail)
- tail->next = me;
- else
- head = me;
- tail = me;
-}
-
-#endif /* STOREMSG */
-
-static void dumpmsg(void)
-{
- for (;head; head = head->next)
- syslog(head->type, "%s", head->msg);
-}
-
-void setsyslog(const char *program)
-{
- openlog(program, LOG_CONS, LOG_DAEMON);
-#ifdef STOREMSG
- atexit(dumpmsg);
-#endif
- log = 1;
-}
-
-
-
-#ifdef _STANDALONE_
-static int silent;
-
-const char *program_name;
-
-void error(const char *fmt,...)
-{
- va_list args;
-
- if (silent)
- ;
- else if (log) {
- char buf[1024];
- int n;
-
- if (error_file)
- n = snprintf(buf, sizeof(buf), "%s: ", error_file);
- else
- n = 0;
- va_start(args, fmt);
- vsnprintf(buf + n, sizeof(buf) - n, fmt, args);
- va_end(args);
-#ifdef STOREMSG
- savemsg(LOG_ERR, buf);
-#else
- syslog(LOG_ERR, "%s", buf);
-#endif
- } else {
- if (error_file)
- fprintf(stderr, "%s: ", error_file);
- va_start(args, fmt);
- vfprintf(stderr, fmt, args);
- va_end(args);
- putc('\n', stderr);
- }
-
- errors++;
-}
-
-void lprintf(const char *fmt,...)
-{
- va_list args;
-
- if (silent);
- else if (log) {
- char buf[1024];
- va_start(args, fmt);
- vsnprintf(buf, sizeof(buf), fmt, args);
- va_end(args);
-#ifdef STOREMSG
- savemsg(LOG_INFO, buf);
-#else
- syslog(LOG_INFO, "%s", buf);
-#endif
- } else {
- va_start(args, fmt);
- vfprintf(stdout, fmt, args);
- va_end(args);
- putchar('\n');
- }
-}
-
-#else /* _STANDALONE_ */
-#include "../../log.h"
-void error(const char *s, ...)
-{
- va_list p;
-
- va_start(p, s);
- vlog_message(s, p);
- va_end(p);
-}
-
-void lprintf(const char *s, ...)
-{
- va_list p;
-
- va_start(p, s);
- vlog_message(s, p);
- va_end(p);
-}
-#endif
diff --git a/mdk-stage1/insmod-modutils/util/meta_expand.c b/mdk-stage1/insmod-modutils/util/meta_expand.c
deleted file mode 100644
index 41fb4024c..000000000
--- a/mdk-stage1/insmod-modutils/util/meta_expand.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Handle expansion of meta charaters
- *
- * Copyright 1999 Björn Ekwall <bj0rn@blox.se>
- *
- * "kernelversion" idea from the Debian release via:
- * Wichert Akkerman <wakkerma@cs.leidenuniv.nl>
- *
- * Use wordexp(): idea from Tim Waugh <tim@cyberelk.demon.co.uk>
- *
- * Alpha typecast: Michal Jaegermann <michal@ellpspace.math.ualberta.ca>
- *
- * This file is part of the Linux modutils.
- *
- * 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.
- */
-
-#ifdef HAVE_WORDEXP
-#undef HAVE_WORDEXP
-#define HAVE_WORDEXP 0
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <string.h>
-#include <ctype.h>
-#if HAVE_WORDEXP
-#include <wordexp.h>
-#elif HAVE_GLOB
-#include <glob.h>
-#endif
-#include "util.h"
-
-/*
- * Split into words delimited by whitespace,
- * handle remaining quotes though...
- * If strip_quotes != 0 then strip one level of quotes from the line.
- */
-static void split_line(GLOB_LIST *g, char *line, int strip_quotes)
-{
- int len;
- char *d;
- char *e;
- char *p;
- char tmpline[PATH_MAX];
-
- for (p = line; *p; p = e) {
- /* Skip leading whitespace */
- while (*p && isspace(*p))
- ++p;
-
- /* find end of word */
- d = tmpline;
- for (e = p; *e && !(isspace(*e)); ++e) {
- char match;
-
- /* Quote handling */
- switch (*e) {
- case '\\':
- if (!strip_quotes)
- *d++ = *e;
- break;
-
- case '"':
- case '\'':
- match = *e;
- if (!strip_quotes)
- *d++ = *e;
- for (++e; *e && *e != match; ++e) {
- *d++ = *e;
- if (*e == '\\' && *(e + 1) == match)
- *d++ = *++e;
- }
- if (!strip_quotes)
- *d++ = *e;
- break;
-
- default:
- *d++ = *e;
- break;
- }
- }
-
- if ((len = (int)(d - tmpline)) > 0) {
- char *str = xmalloc(len + 1);
- strncpy(str, tmpline, len);
- str[len] = '\0';
- g->pathv = (char **)xrealloc(g->pathv,
- (g->pathc + 2) * sizeof(char *));
- g->pathv[g->pathc++] = str;
- }
- }
-
- if (g->pathc)
- g->pathv[g->pathc] = NULL;
-}
-
-static int glob_it(char *pt, GLOB_LIST *g)
-{
-#if HAVE_WORDEXP
- wordexp_t w;
-
- memset(&w, 0, sizeof(w));
- if (wordexp(pt, &w, WRDE_UNDEF)) {
- /*
- error("wordexp %s failed", pt);
- */
- return -1;
- }
- /* else */
- g->pathc = w.we_wordc;
- g->pathv = w.we_wordv;
-
- return 0;
-#elif HAVE_GLOB /* but not wordexp */
- glob_t w;
-
- memset(&w, 0, sizeof(w));
- if (glob(pt, GLOB_NOSORT, NULL, &w)) {
- /*
- error("glob %s failed", pt);
- */
- return -1;
- }
- /* else */
- if (w.gl_pathc && strpbrk(w.gl_pathv[0], SHELL_META)) {
- globfree(&w);
- return -1;
- }
- g->pathc = w.gl_pathc;
- g->pathv = w.gl_pathv;
-
- return 0;
-#else /* Neither wordexp nor glob */
- return -1;
-#endif
-}
-
-/*
- * Expand the string (including meta-character) to a list of matches
- *
- * Return 0 if OK else -1
- */
-int meta_expand(char *pt, GLOB_LIST *g, char *base_dir, char *version, int type)
-{
- FILE *fin;
- int len = 0;
- char *line = NULL;
- char *p, *p1;
- char tmpline[PATH_MAX + 1];
- char wrk[sizeof(tmpline)];
- char tmpcmd[2*sizeof(tmpline)+20]; /* room for /bin/echo "text" */
-
- g->pathc = 0;
- g->pathv = NULL;
-
- /*
- * Take care of version dependent expansions
- * Needed for forced version handling
- */
- if ((p = strchr(pt, '`')) != NULL && (type & ME_BUILTIN_COMMAND)) {
- do {
- char *s;
-
- for (s = p + 1; isspace(*s); ++s)
- ;
-
- if (strncmp(s, "uname -r", 8) == 0) {
- while (*s && (*s != '`'))
- ++s;
- if (*s == '`') {
- *p = '\0';
- snprintf(wrk, sizeof(wrk), "%s%s%s",
- pt,
- version,
- s + 1);
- *p = '`';
- }
- strcpy(tmpline, wrk); /* safe, same size */
- pt = tmpline;
- } else if (strncmp(s, "kernelversion", 13) == 0) {
- while (*s && (*s != '`'))
- ++s;
- if (*s == '`') {
- int n;
- char *k;
-
- *p = '\0';
- for (n = 0, k = version; *k; ++k) {
- if (*k == '.' && ++n == 2)
- break;
- }
- snprintf(wrk, sizeof(wrk), "%s%.*s%s",
- pt,
- /* typecast for Alpha */
- (int)(k - version),
- version,
- s + 1);
- *p = '`';
- strcpy(tmpline, wrk); /* safe, same size */
- pt = tmpline;
- }
- } else
- break;
- } while ((p = strchr(pt, '`')) != NULL);
- }
-
- /*
- * Any remaining meta-chars?
- */
- if (strpbrk(pt, SHELL_META) == NULL) {
- /*
- * No meta-chars.
- * Split into words, delimited by whitespace.
- */
- snprintf(wrk, sizeof(wrk), "%s%s", (base_dir ? base_dir : ""), pt);
- strcpy(tmpline, wrk); /* safe, same size */
- if ((p = strtok(tmpline, " \t\n")) != NULL) {
- while (p) {
- g->pathv = (char **)xrealloc(g->pathv,
- (g->pathc + 2) * sizeof(char *));
- g->pathv[g->pathc++] = xstrdup(p);
- p = strtok(NULL, " \t\n");
- }
- }
- if (g->pathc)
- g->pathv[g->pathc] = NULL;
- return 0;
- }
- /* else */
- /*
- * Handle remaining meta-chars
- */
-
- /*
- * Just plain quotes?
- */
- if (strpbrk(pt, "&();|<>$`!{}[]~=+:?*") == NULL &&
- (p = strpbrk(pt, "\"'\\"))) {
- split_line(g, pt, 1);
- return 0;
- }
-
- if (strpbrk(pt, "&();|<>$`\"'\\!{}~+:[]~?*") == NULL) {
- /* Only "=" remaining, should be module options */
- split_line(g, pt, 0);
- return 0;
- }
-
- /*
- * If there are meta-characters and
- * if they are only shell glob meta-characters: do globbing
- */
-#if HAVE_WORDEXP
- if (strpbrk(pt, "&();|<>`\"'\\!{}~=+:") == NULL &&
- strpbrk(pt, "$[]~?*"))
-#else
- if (strpbrk(pt, "&();|<>$`\"'\\!{}~=+:") == NULL &&
- strpbrk(pt, "[]~?*"))
-#endif
- if ((type & ME_GLOB) && glob_it(pt, g) == 0)
- return 0;
-
- if (strpbrk(pt, "&();|<>$`\"'\\!{}~+:[]~?*") == NULL) {
- /* Only "=" remaining, should be module options */
- split_line(g, pt, 0);
- return 0;
- }
-
- /*
- * Last resort: Use "echo".
- * DANGER: Applying shell expansion to user supplied input is a
- * major security risk. Modutils code should only do meta
- * expansion via shell commands for trusted data. Basically
- * this means only for data in the config file. Even that
- * assumes that the user cannot run modprobe as root with
- * their own config file. Programs (including the kernel)
- * that invoke modprobe as root with user supplied input must
- * pass exactly one user supplied parameter and must set
- * safe mode.
- */
- if (!(type & ME_SHELL_COMMAND))
- return 0;
- snprintf(wrk, sizeof(wrk), "%s%s", (base_dir ? base_dir : ""), pt);
- strcpy(tmpline, wrk); /* safe, same size */
- snprintf(tmpcmd, sizeof(tmpcmd), "/bin/echo \"");
- for (p = tmpline, p1 = tmpcmd + strlen(tmpcmd); *p; ++p, ++p1) {
- if (*p == '"' || *p == '\\')
- *p1++ = '\\';
- *p1 = *p;
- }
- *p1++ = '"';
- *p1++ = '\0';
- if (p1 - tmpcmd > sizeof(tmpcmd)) {
- error("tmpcmd overflow, should never happen");
- exit(1);
- }
- if ((fin = popen(tmpcmd, "r")) == NULL) {
- error("Can't execute: %s", tmpcmd);
- return -1;
- }
- /* else */
-
- /*
- * Collect the result
- */
- while (fgets(tmpcmd, PATH_MAX, fin) != NULL) {
- int l = strlen(tmpcmd);
-
- line = (char *)xrealloc(line, len + l + 1);
- line[len] = '\0';
- strcat(line + len, tmpcmd); /* safe, realloc */
- len += l;
- }
- pclose(fin);
-
- if (line) {
- /* shell used to strip one set of quotes. Paranoia code in
- * 2.3.20 stops that strip so we do it ourselves.
- */
- split_line(g, line, 1);
- free(line);
- }
-
- return 0;
-}
diff --git a/mdk-stage1/insmod-modutils/util/modstat.c b/mdk-stage1/insmod-modutils/util/modstat.c
deleted file mode 100644
index ad82306c0..000000000
--- a/mdk-stage1/insmod-modutils/util/modstat.c
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- * Get kernel symbol table(s) and other relevant module info.
- *
- * Add module_name_list and l_module_name_list.
- * Keith Owens <kaos@ocs.com.au> November 1999.
- * Björn Ekwall <bj0rn@blox.se> in February 1999 (C)
- * Initial work contributed by Richard Henderson <rth@tamu.edu>
- *
- * This file is part of the Linux modutils.
- *
- * 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 <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include "util.h"
-#include "module.h"
-#include "obj.h"
-#include "modstat.h"
-
-struct module_stat *module_stat;
-size_t n_module_stat;
-char *module_name_list;
-size_t l_module_name_list;
-struct module_symbol *ksyms;
-size_t nksyms;
-int k_new_syscalls;
-
-static void *old_kernsym;
-
-/************************************************************************/
-static void drop(void)
-{
- /*
- * Clean the slate for multiple runs
- */
- if (module_stat) {
- struct module_stat *m;
- int i;
-
- for (i = 0, m = module_stat; i < n_module_stat; ++i, ++m) {
- if (m->syms)
- free(m->syms);
- if (m->refs)
- free(m->refs);
- }
- free(module_stat);
- module_stat = NULL;
- n_module_stat = 0;
- }
- if (module_name_list) {
- free(module_name_list);
- module_name_list = NULL;
- l_module_name_list = 0;
- }
- if (ksyms) {
- free(ksyms);
- ksyms = NULL;
- nksyms = 0;
- }
- if (old_kernsym) {
- free(old_kernsym);
- old_kernsym = NULL;
- }
-}
-
-static int new_get_kernel_info(int type)
-{
- struct module_stat *modules;
- struct module_stat *m;
- struct module_symbol *syms;
- struct module_symbol *s;
- size_t ret;
- size_t bufsize;
- size_t nmod;
- size_t nsyms;
- size_t i;
- size_t j;
- char *module_names;
- char *mn;
-
- drop();
-
- /*
- * Collect the loaded modules
- */
- module_names = xmalloc(bufsize = 256);
- while (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
- if (errno != ENOSPC) {
- error("QM_MODULES: %m\n");
- return 0;
- }
- module_names = xrealloc(module_names, bufsize = ret);
- }
- module_name_list = module_names;
- l_module_name_list = bufsize;
- n_module_stat = nmod = ret;
- module_stat = modules = xmalloc(nmod * sizeof(struct module_stat));
- memset(modules, 0, nmod * sizeof(struct module_stat));
-
- /* Collect the info from the modules */
- for (i = 0, mn = module_names, m = modules;
- i < nmod;
- ++i, ++m, mn += strlen(mn) + 1) {
- struct module_info info;
-
- m->name = mn;
- if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
- if (errno == ENOENT) {
- /* The module was removed out from underneath us. */
- m->flags = NEW_MOD_DELETED;
- continue;
- }
- /* else oops */
- error("module %s: QM_INFO: %m", mn);
- return 0;
- }
-
- m->addr = info.addr;
-
- if (type & K_INFO) {
- m->size = info.size;
- m->flags = info.flags;
- m->usecount = info.usecount;
- m->modstruct = info.addr;
- }
-
- if (type & K_REFS) {
- int mm;
- char *mrefs;
- char *mr;
-
- mrefs = xmalloc(bufsize = 64);
- while (query_module(mn, QM_REFS, mrefs, bufsize, &ret)) {
- if (errno != ENOSPC) {
- error("QM_REFS: %m");
- return 1;
- }
- mrefs = xrealloc(mrefs, bufsize = ret);
- }
- for (j = 0, mr = mrefs;
- j < ret;
- ++j, mr += strlen(mr) + 1) {
- for (mm = 0; mm < i; ++mm) {
- if (strcmp(mr, module_stat[mm].name) == 0) {
- m->nrefs += 1;
- m->refs = xrealloc(m->refs, m->nrefs * sizeof(struct module_stat **));
- m->refs[m->nrefs - 1] = module_stat + mm;
- break;
- }
- }
- }
- free(mrefs);
- }
-
- if (type & K_SYMBOLS) { /* Want info about symbols */
- syms = xmalloc(bufsize = 1024);
- while (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
- if (errno == ENOSPC) {
- syms = xrealloc(syms, bufsize = ret);
- continue;
- }
- if (errno == ENOENT) {
- /*
- * The module was removed out
- * from underneath us.
- */
- m->flags = NEW_MOD_DELETED;
- free(syms);
- goto next;
- } else {
- error("module %s: QM_SYMBOLS: %m", mn);
- return 0;
- }
- }
- nsyms = ret;
-
- m->nsyms = nsyms;
- m->syms = syms;
-
- /* Convert string offsets to string pointers */
- for (j = 0, s = syms; j < nsyms; ++j, ++s)
- s->name += (unsigned long) syms;
- }
- next:
- }
-
- if (type & K_SYMBOLS) { /* Want info about symbols */
- /* Collect the kernel's symbols. */
- syms = xmalloc(bufsize = 16 * 1024);
- while (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
- if (errno != ENOSPC) {
- error("kernel: QM_SYMBOLS: %m");
- return 0;
- }
- syms = xrealloc(syms, bufsize = ret);
- }
- nksyms = nsyms = ret;
- ksyms = syms;
-
- /* Convert string offsets to string pointers */
- for (j = 0, s = syms; j < nsyms; ++j, ++s)
- s->name += (unsigned long) syms;
- }
-
- return 1;
-}
-
-#ifdef COMPAT_2_0
-/************************************************************************/
-
-#define mscan(offs,siz,ptr) \
- if (lseek(kmem_fd, (off_t)(offs), SEEK_SET) == -1 || \
- read(kmem_fd, (ptr), (siz)) != (siz)) { \
- if (kmem_fd != -1) \
- close(kmem_fd); \
- error("kmem: %m"); \
- return 0; \
- }
-
-#define OLD_MOD_RUNNING 1
-#define OLD_MOD_DELETED 2
-#define OLD_MOD_VISITED 0x20000000
-
-/* Fetch all the symbols and divvy them up as appropriate for the modules. */
-static int old_get_kernel_info(int type)
-{
- struct old_kernel_sym *kernsym;
- struct old_kernel_sym *k;
- struct module_stat *module;
- struct module_stat *mod;
- struct module_symbol *s = NULL;
- int kmem_fd = -1;
- int nkernsym;
- int nmod;
- int nm;
- int nms;
- int i;
-
- drop();
- module_name_list = xmalloc(1);
- *module_name_list = '\0';
-
- if ((nkernsym = get_kernel_syms(NULL)) < 0) {
- error("get_kernel_syms: %m");
- return 0;
- }
- kernsym = k = xmalloc(nkernsym * sizeof(struct old_kernel_sym));
- old_kernsym = kernsym;
- if (get_kernel_syms(kernsym) != nkernsym) {
- error("inconsistency with get_kernel_syms -- is someone else "
- "playing with modules?");
- free(kernsym);
- return 0;
- }
-
- /* Number of modules */
- for (k = kernsym, nmod = 0, i = 0; i < nkernsym; ++i, ++k) {
- if (k->name[0] == '#') {
- if (k->name[1]) {
- ++nmod;
- i = strlen(k->name+1) + 1;
- module_name_list =
- xrealloc(module_name_list,
- l_module_name_list + i);
- strcpy(module_name_list+l_module_name_list, /* safe, xrealloc */
- k->name+1);
- l_module_name_list += i; /* NUL separated strings */
- }
- else
- break;
- }
- }
- module_stat = mod = module = xmalloc(nmod * sizeof(struct module_stat));
- memset(module, 0, nmod * sizeof(struct module_stat));
- n_module_stat = nmod;
-
- /*
- * Will we need kernel internal info?
- */
- if ((type & K_INFO) || (type & K_REFS)) {
- if ((kmem_fd = open("/dev/kmem", O_RDONLY)) < 0) {
- perror("ksyms: open /dev/kmem");
- return 0;
- }
- }
-
- /*
- * Collect the module information.
- */
- for (k = kernsym, nm = 0, i = 0; i < nkernsym; ++i, ++k) {
- if (k->name[0] == '#') {
- struct old_kernel_sym *p;
- struct old_module info;
-
- if (k->name[1] == '\0')
- break; /* kernel resident symbols follow */
- /* else normal module */
-
- module = mod++;
- ++nm;
- module->name = k->name + 1;
- module->modstruct = k->value;
-
- if ((type & K_INFO) || (type & K_REFS)) {
- long tmp;
- /*
- * k->value is the address of the
- * struct old_module
- * in the kernel (for use via /dev/kmem)
- */
- mscan(k->value, sizeof(info), &info);
- module->addr = info.addr;
- module->size = info.size * getpagesize();
-
- mscan(info.addr, sizeof(long), &tmp);
- module->flags = info.state &
- (OLD_MOD_RUNNING | OLD_MOD_DELETED);
- module->flags |= NEW_MOD_USED_ONCE; /* Cheat */
- if (tmp & OLD_MOD_AUTOCLEAN)
- module->flags |= NEW_MOD_AUTOCLEAN;
- if (tmp & OLD_MOD_VISITED)
- module->flags |= NEW_MOD_VISITED;
-
- module->usecount = tmp & ~(OLD_MOD_AUTOCLEAN | OLD_MOD_VISITED);
- }
-
- if ((type & K_REFS) && info.ref) {
- struct old_module_ref mr;
- int j;
- unsigned long ref = info.ref;
-
- do {
- mscan(ref, sizeof(struct old_module_ref), &mr);
- for (j = 0; j < nm -1; ++j) {
- if (mr.module == module_stat[j].modstruct) {
- module->nrefs += 1;
- module->refs = xrealloc(module->refs, module->nrefs * sizeof(struct module_stat **));
- module->refs[module->nrefs - 1] = module_stat + j;
- break;
- }
- }
- } while ((ref = mr.next) != 0);
- }
-
- if (!(type & K_SYMBOLS))
- continue;
- /*
- * Find out how many symbols this module has.
- */
- for (nms = 0, p = k+1; p->name[0] != '#'; ++p)
- ++nms;
- s = xmalloc(nms * sizeof(struct module_symbol));
- module->syms = s;
- module->nsyms = nms;
- } else if (type & K_SYMBOLS) { /* Want info about symbols */
- s->name = (unsigned long) k->name;
- s->value = k->value;
- ++s;
- }
- }
- if ((type & K_INFO) || (type & K_REFS)) {
- if (kmem_fd != -1)
- close(kmem_fd);
- }
-
- /*
- * Kernel resident symbols follows
- */
- if (type & K_SYMBOLS) { /* Want info about symbols */
- if (k->name[0] == '#')
- ++k;
- nksyms = nkernsym - (k - kernsym);
- if (nksyms) {
- ksyms = s = xmalloc(nksyms * sizeof(struct module_symbol));
- for (i = 0; i < nksyms; ++i, ++k) {
- if (k->name[0] != '#') {
- s->name = (unsigned long) k->name;
- s->value = k->value;
- ++s;
- }
- }
- nksyms = s - ksyms;
- } else
- ksyms = NULL;
- }
-
- return 1;
-}
-#endif /* COMPAT_2_0 */
-
-int get_kernel_info(int type)
-{
- k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL);
-
-#ifdef COMPAT_2_0
- if (!k_new_syscalls)
- return old_get_kernel_info(type);
-#endif /* COMPAT_2_0 */
-
- return new_get_kernel_info(type);
-}
diff --git a/mdk-stage1/insmod-modutils/util/snap_shot.c b/mdk-stage1/insmod-modutils/util/snap_shot.c
deleted file mode 100644
index ae0cc7c79..000000000
--- a/mdk-stage1/insmod-modutils/util/snap_shot.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* Take a snap shot of ksyms and modules for Oops debugging
- Copyright 1999 Linux International.
-
- Contributed by Keith Owens <kaos@ocs.com.au>
-
- This file is part of the Linux modutils.
-
- 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
- */
-
-#ident "$Id$"
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <time.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "module.h"
-#include "obj.h"
-#include "modstat.h"
-#include "util.h"
-
-static char snap_dir[] = "/var/log/ksymoops";
-
-/* If snap_dir exists, take a snap shot of ksyms and modules to snap_dir.
- * Prefix the files with the equivalent of
- * date +%Y%m%d%T%M%S | sed -e 's/://g'
- */
-void snap_shot(const char *module_names, int n_module_names)
-{
- char file[] = "ccyymmddhhmmss.modules", buffer[4096];
- static char *infile[] = { "/proc/ksyms", "/proc/modules" };
- static char *suffix[] = { "ksyms", "modules" };
- struct tm *local;
- time_t t;
- int i, l;
- FILE *in, *out;
-
- if (module_names) {
- /* Only snap shot if the list of modules has changed.
- * Otherwise auto cleanup takes a snap shot every time
- * and ends up with a large snap shot directory.
- */
- char *new_module_names;
- size_t n_new_module_names;
- get_kernel_info(0);
- new_module_names = module_name_list;
- n_new_module_names = n_module_stat;
- if (n_module_names && n_new_module_names == n_module_names) {
- while (n_module_names) {
- if (strcmp(module_names, new_module_names))
- break; /* difference detected */
- i = strlen(module_names) + 1;
- module_names += i;
- new_module_names += i;
- --n_module_names;
- }
- }
- if (!n_module_names)
- return; /* no difference, no need for snap shot */
- }
-
- if (chdir(snap_dir))
- return;
- t = time(NULL);
- local = localtime(&t);
- for (i = 0; i < sizeof(infile)/sizeof(infile[0]); ++i) {
- snprintf(file, sizeof(file), "%04d%02d%02d%02d%02d%02d.%s",
- local->tm_year+1900,
- local->tm_mon + 1,
- local->tm_mday,
- local->tm_hour,
- local->tm_min,
- local->tm_sec,
- suffix[i]);
- out = fopen(file, "w");
- if (!out) {
- error("cannot create %s/%s %m", snap_dir, file);
- return;
- }
- in = fopen(infile[i], "r");
- if (!in) {
- error("cannot open %s %m", infile[i]);
- return;
- }
- while ((l = fread(buffer, 1, sizeof(buffer), in)) > 0) {
- if (fwrite(buffer, l, 1, out) != 1) {
- error("unable to write to %s %m", file);
- fclose(in);
- fclose(out);
- return;
- }
- }
- if (ferror(in))
- error("unable to read from %s %m", infile[i]);
- fclose(in);
- fclose(out);
- }
-}
-
-/* If snap_dir exists, log a message to snap_dir. The log file is called the
- * equivalent of date +%Y%m%d | sed -e 's/://g'. Each line is prefixed with
- * timestamp down to seconds and followed by a newline.
- */
-void snap_shot_log(const char *fmt,...)
-{
- char date[] = "ccyymmdd", file[] = "ccyymmdd.log", stamp[] = "ccyymmdd hhmmss";
- struct tm *local;
- time_t t;
- FILE *log;
- va_list args;
- int save_errno = errno;
-
- if (chdir(snap_dir))
- return;
- t = time(NULL);
- local = localtime(&t);
- snprintf(date, sizeof(date), "%04d%02d%02d",
- local->tm_year+1900,
- local->tm_mon + 1,
- local->tm_mday);
- snprintf(file, sizeof(file), "%s.log", date);
- log = fopen(file, "a");
- if (!log) {
- error("cannot create %s/%s %m", snap_dir, file);
- return;
- }
- snprintf(stamp, sizeof(stamp), "%s %02d%02d%02d",
- date,
- local->tm_hour,
- local->tm_min,
- local->tm_sec);
- fprintf(log, "%s ", stamp);
- va_start(args, fmt);
- errno = save_errno; /* fmt may use %m */
- vfprintf(log, fmt, args);
- va_end(args);
- fprintf(log, "\n");
- fclose(log);
-}
diff --git a/mdk-stage1/insmod-modutils/util/sys_cm.c b/mdk-stage1/insmod-modutils/util/sys_cm.c
deleted file mode 100644
index 851fb709e..000000000
--- a/mdk-stage1/insmod-modutils/util/sys_cm.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Functions for the Linux module syscall interface.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <errno.h>
-
-#include "module.h"
-
-/* Kernel headers before 2.1.mumble need this on the Alpha to get
- _syscall* defined. */
-#define __LIBRARY__
-
-#include <asm/unistd.h>
-
-
-/*======================================================================*/
-
-#if defined(__i386__) || defined(__m68k__) || defined(__arm__)
-
-#define __NR__create_module __NR_create_module
-static inline _syscall2(long, _create_module, const char *, name, size_t, size)
-
-unsigned long create_module(const char *name, size_t size)
-{
- /* Why all this fuss?
-
- In linux 2.1, the address returned by create module point in
- kernel space which is now mapped at the top of user space (at
- 0xc0000000 on i386). This looks like a negative number for a
- long. The normal syscall macro of linux 2.0 (and all libc compile
- with linux 2.0 or below) consider that the return value is a
- negative number and consider it is an error number (A kernel
- convention, return value are positive or negative, indicating the
- error number).
-
- By checking the value of errno, we know if we have been fooled by
- the syscall2 macro and we fix it. */
-
- long ret = _create_module(name, size);
- if (ret == -1 && errno > 125)
- {
- ret = -errno;
- errno = 0;
- }
- return ret;
-}
-
-#elif defined(__alpha__)
-
-/* Alpha doesn't have the same problem, exactly, but a bug in older
- kernels fails to clear the error flag. Clear it here explicitly. */
-
-#define __NR__create_module __NR_create_module
-static inline _syscall4(unsigned long, _create_module, const char *, name,
- size_t, size, size_t, dummy, size_t, err);
-
-unsigned long create_module(const char *name, size_t size)
-{
- return _create_module(name, size, 0, 0);
-}
-
-#else
-
-/* Sparc, MIPS, (and Alpha, but that's another problem) don't mistake
- return values for errors due to the nature of the system call. */
-
-_syscall2(unsigned long, create_module, const char *, name, size_t, size)
-
-#endif
diff --git a/mdk-stage1/insmod-modutils/util/sys_dm.c b/mdk-stage1/insmod-modutils/util/sys_dm.c
deleted file mode 100644
index a166a30f4..000000000
--- a/mdk-stage1/insmod-modutils/util/sys_dm.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Functions for the Linux module syscall interface.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <errno.h>
-
-#include "module.h"
-
-/* Kernel headers before 2.1.mumble need this on the Alpha to get
- _syscall* defined. */
-#define __LIBRARY__
-
-#include <asm/unistd.h>
-
-
-/*======================================================================*/
-
-_syscall1(int, delete_module, const char *, name)
diff --git a/mdk-stage1/insmod-modutils/util/sys_gks.c b/mdk-stage1/insmod-modutils/util/sys_gks.c
deleted file mode 100644
index f71772c71..000000000
--- a/mdk-stage1/insmod-modutils/util/sys_gks.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Functions for the Linux module syscall interface.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <errno.h>
-
-#include "module.h"
-
-/* Kernel headers before 2.1.mumble need this on the Alpha to get
- _syscall* defined. */
-#define __LIBRARY__
-
-#include <asm/unistd.h>
-
-
-/*======================================================================*/
-
-_syscall1(int, get_kernel_syms, struct old_kernel_sym *, ksyms)
diff --git a/mdk-stage1/insmod-modutils/util/sys_nim.c b/mdk-stage1/insmod-modutils/util/sys_nim.c
deleted file mode 100644
index bbe42135c..000000000
--- a/mdk-stage1/insmod-modutils/util/sys_nim.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Functions for the Linux module syscall interface.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <errno.h>
-
-#include "module.h"
-
-/* Kernel headers before 2.1.mumble need this on the Alpha to get
- _syscall* defined. */
-#define __LIBRARY__
-
-#include <asm/unistd.h>
-
-
-/*======================================================================*/
-
-#ifndef CONFIG_USE_SYSCALL
-
-extern int init_module(const char *name, const struct module *info);
-
-int
-sys_init_module(const char *name, const struct module *info)
-{
- return init_module(name, info);
-}
-
-#else
-
-#define __NR_sys_init_module __NR_init_module
-_syscall2(int, sys_init_module, const char *, name,
- const struct module *, info)
-
-#endif
diff --git a/mdk-stage1/insmod-modutils/util/sys_oim.c b/mdk-stage1/insmod-modutils/util/sys_oim.c
deleted file mode 100644
index 73ac6be52..000000000
--- a/mdk-stage1/insmod-modutils/util/sys_oim.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Functions for the Linux module syscall interface.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <errno.h>
-
-#include "module.h"
-
-/* Kernel headers before 2.1.mumble need this on the Alpha to get
- _syscall* defined. */
-#define __LIBRARY__
-
-#include <asm/unistd.h>
-
-
-/*======================================================================*/
-
-#define __NR_old_sys_init_module __NR_init_module
-_syscall5(int, old_sys_init_module, const char *, name, char *, code,
- unsigned, codesize, struct old_mod_routines *, routines,
- struct old_symbol_table *, symtab)
diff --git a/mdk-stage1/insmod-modutils/util/sys_qm.c b/mdk-stage1/insmod-modutils/util/sys_qm.c
deleted file mode 100644
index 119a219a2..000000000
--- a/mdk-stage1/insmod-modutils/util/sys_qm.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Functions for the Linux module syscall interface.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <errno.h>
-
-#include "module.h"
-
-/* Kernel headers before 2.1.mumble need this on the Alpha to get
- _syscall* defined. */
-#define __LIBRARY__
-
-#include <asm/unistd.h>
-
-
-/*======================================================================*/
-
-/* I am fucking tired of the "this doesn't build on 2.0.x" questions.
- But if you ask, we still officially require 2.1.x to build. */
-#if !defined(__NR_query_module)
-# if defined(__i386__)
-# define __NR_query_module 167
-# elif defined(__alpha__)
-# define __NR_query_module 347
-# elif defined(__sparc__)
-# define __NR_query_module 184
-# elif defined(__mc68000__)
-# define __NR_query_module 167
-# elif defined(__arm__)
-# define __NR_query_module (__NR_SYSCALL_BASE + 167)
-# elif defined(__mips__)
-# define __NR_query_module 4187
-# endif
-#endif
-
-_syscall5(int, query_module, const char *, name, int, which,
- void *, buf, size_t, bufsize, size_t *, ret);
diff --git a/mdk-stage1/insmod-modutils/util/xftw.c b/mdk-stage1/insmod-modutils/util/xftw.c
deleted file mode 100644
index fe764a63c..000000000
--- a/mdk-stage1/insmod-modutils/util/xftw.c
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * modutils specific implementation of ftw().
- *
- * Copyright 2000:
- * Keith Owens <kaos@ocs.com.au> August 2000
- *
- * This file is part of the Linux modutils.
- *
- * 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.
- */
-
-/*
- modutils requires special processing during the file tree walk
- of /lib/modules/<version> and any paths that the user specifies.
- The standard ftw() does a blind walk of all paths and can end
- up following the build symlink down the kernel source tree.
- Although nftw() has the option to get more control such as not
- automatically following symbolic links, even that is not enough
- for modutils. The requirements are:
-
- Paths must be directories or symlinks to directories.
-
- Each directory is read and sorted into alphabetical order
- before processing.
-
- A directory is type 1 iff it was specified on a path statement
- (either explicit or default) and the directory contains a
- subdirectory with one of the known names and the directory name
- does not end with "/kernel". Otherwise it is type 2.
-
- In a type 1 directory, walk the kernel subdirectory if it exists,
- then the old known names in their historical order then any
- remaining directory entries in alphabetical order and finally any
- non-directory entries in alphabetical order.
-
- Entries in a type 1 directory are filtered against the "prune"
- list. A type 1 directory can contain additional files which
- are not modules nor symlinks to modules. The prune list skips
- known additional files, if a distribution wants to store
- additional text files in the top level directory they should be
- added to the prune list.
-
- A type 2 directory must contain only modules or symlinks to
- modules. They are processed in alphabetical order, without
- pruning. Symlinks to directories are an error in type 2
- directories.
-
- The user function is not called for type 1 directories, nor for
- pruned entries. It is called for type 2 directories and their
- contents. It is also called for any files left in a type 1
- directory after pruning and processing type 2 subdirectories.
- The user function never sees symlinks, they are resolved before
- calling the function.
-
- Why have different directory types? The original file tree
- walk was not well defined. Some users specified each directory
- individually, others just pointed at the top level directory.
- Either version worked until the "build" symlink was added. Now
- users who specify the top level directory end up running the
- entire kernel source tree looking for modules, not nice. We
- cannot just ignore symlinks because pcmcia uses symlinks to
- modules for backwards compatibility.
-
- Type 1 is when a user specifies the top level directory which needs
- special processing, type 2 is individual subdirectories. But the
- only way to tell the difference is by looking at the contents. The
- "/kernel" directory introduced in 2.3.12 either contains nothing
- (old make modules_install) or contains all the kernel modules using
- the same tree structure as the source. Because "/kernel" can
- contain old names but is really a type 2 directory, it is detected
- as a special case.
- */
-
-#include <dirent.h>
-#include <errno.h>
-#include <limits.h>
-#include <malloc.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#include "util.h"
-#include "config.h"
-
-extern char *tbpath[];
-
-extern OPT_LIST *prune_list;
-extern int n_prune_list;
-
-extern char *tbtype[];
-
-struct xftw_dirent {
- struct stat statbuf;
- char *name;
- char *fullname;
-};
-
-#define XFTW_MAXDEPTH 64 /* Maximum directory depth handled */
-
-typedef struct {
- struct xftw_dirent *contents;
- int size;
- int used;
-} xftw_tree_t;
-
-static xftw_tree_t tree[XFTW_MAXDEPTH];
-
-/* Free all data for one tree level */
-static void xftw_free_tree(int depth)
-{
- int i;
- xftw_tree_t *t = tree+depth;
- for (i = 0; i < t->size; ++i) {
- free(t->contents[i].name);
- free(t->contents[i].fullname);
- }
- free(t->contents);
- t->contents = NULL;
- t->size = 0;
- t->used = 0;
-}
-
-/* Increment dirents used at this depth, resizing if necessary */
-static void xftw_add_dirent(int depth)
-{
- xftw_tree_t *t = tree+depth;
- int i, size = t->size;
- if (++t->used < size)
- return;
- size += 10; /* arbitrary increment */
- t->contents = xrealloc(t->contents, size*sizeof(*(t->contents)));
- for (i = t->size; i < size; ++i) {
- memset(&(t->contents[i].statbuf), 0, sizeof(t->contents[i].statbuf));
- t->contents[i].name = NULL;
- t->contents[i].fullname = NULL;
- }
- t->size = size;
-}
-
-/* Concatenate directory name and entry name into one string.
- * Note: caller must free result or leak.
- */
-static char *xftw_dir_name(const char *directory, const char *entry)
-{
- int i = strlen(directory);
- char *name;
- if (entry)
- i += strlen(entry);
- i += 2;
- name = xmalloc(i);
- strcpy(name, directory); /* safe, xmalloc */
- if (*directory && entry)
- strcat(name, "/"); /* safe, xmalloc */
- if (entry)
- strcat(name, entry); /* safe, xmalloc */
- return(name);
-}
-
-/* Call the user function for a directory entry */
-static int xftw_do_name(const char *directory, const char *entry, struct stat *sb, xftw_func_t funcptr)
-{
- int ret = 0;
- char *name = xftw_dir_name(directory, entry);
-
- if (S_ISLNK(sb->st_mode)) {
- char real[PATH_MAX], *newname;
- verbose("resolving %s symlink to ", name);
- if (!(newname = realpath(name, real))) {
- if (errno == ENOENT) {
- verbose("%s: does not exist, dangling symlink ignored\n", real);
- goto cleanup;
- }
- perror("... failed");
- goto cleanup;
- }
- verbose("%s ", newname);
- if (lstat(newname, sb)) {
- error("lstat on %s failed ", newname);
- perror("");
- goto cleanup;
- }
- free(name);
- name = xstrdup(newname);
- }
-
- if (!S_ISREG(sb->st_mode) &&
- !S_ISDIR(sb->st_mode)) {
- error("%s is not plain file nor directory\n", name);
- goto cleanup;
- }
-
- verbose("user function %s\n", name);
- ret = (*funcptr)(name, sb);
-cleanup:
- free(name);
- return(ret);
-}
-
-/* Sort directory entries into alphabetical order */
-static int xftw_sortdir(const void *a, const void *b)
-{
- return(strcmp(((struct xftw_dirent *)a)->name, ((struct xftw_dirent *)b)->name));
-}
-
-/* Read a directory and sort it, ignoring "." and ".." */
-static int xftw_readdir(const char *directory, int depth)
-{
- DIR *d;
- struct dirent *ent;
- verbose("xftw_readdir %s\n", directory);
- if (!(d = opendir(directory))) {
- perror(directory);
- return(1);
- }
- while ((ent = readdir(d))) {
- char *name;
- struct xftw_dirent *f;
- if (strcmp(ent->d_name, ".") == 0 ||
- strcmp(ent->d_name, "..") == 0)
- continue;
- name = xftw_dir_name(directory, ent->d_name);
- xftw_add_dirent(depth);
- f = tree[depth].contents+tree[depth].used-1;
- f->name = xstrdup(ent->d_name);
- f->fullname = name; /* do not free name, it is in use */
- if (lstat(name, &(f->statbuf))) {
- perror(name);
- return(1);
- }
- }
- closedir(d);
- qsort(tree[depth].contents, tree[depth].used, sizeof(*(tree[0].contents)), &xftw_sortdir);
- return(0);
-}
-
-/* Process a type 2 directory */
-int xftw_type2(const char *directory, const char *entry, int depth, xftw_func_t funcptr)
-{
- int ret, i;
- xftw_tree_t *t = tree+depth;
- struct stat statbuf;
- char *dirname = xftw_dir_name(directory, entry);
-
- verbose("type 2 %s\n", dirname);
- if (depth > XFTW_MAXDEPTH) {
- error("xftw_type2 exceeded maxdepth\n");
- ret = 1;
- goto cleanup;
- }
- if ((ret = xftw_readdir(dirname, depth)))
- goto cleanup;
-
- t = tree+depth;
- /* user function sees type 2 directories */
- if ((ret = lstat(dirname, &statbuf)) ||
- (ret = xftw_do_name("", dirname, &statbuf, funcptr)))
- goto cleanup;
-
- /* user sees all contents of type 2 directory, no pruning */
- for (i = 0; i < t->used; ++i) {
- struct xftw_dirent *c = t->contents+i;
- if (S_ISLNK(c->statbuf.st_mode)) {
- if (!stat(c->name, &(c->statbuf))) {
- if (S_ISDIR(c->statbuf.st_mode)) {
- error("symlink to directory is not allowed, %s ignored\n", c->name);
- *(c->name) = '\0'; /* ignore it */
- }
- }
- }
- if (!*(c->name))
- continue;
- if (S_ISDIR(c->statbuf.st_mode)) {
- /* recursion is the curse of the programming classes */
- ret = xftw_type2(dirname, c->name, depth+1, funcptr);
- if (ret)
- goto cleanup;
- }
- else if ((ret = xftw_do_name(dirname, c->name, &(c->statbuf), funcptr)))
- goto cleanup;
- *(c->name) = '\0'; /* processed */
- }
-
- ret = 0;
-cleanup:
- free(dirname);
- return(ret);
-}
-
-/* Only external visible function. Decide on the type of directory and
- * process accordingly.
- */
-int xftw(const char *directory, xftw_func_t funcptr)
-{
- struct stat statbuf;
- int ret, i, j, type;
- xftw_tree_t *t;
- struct xftw_dirent *c;
-
- verbose("xftw starting at %s ", directory);
- if (lstat(directory, &statbuf)) {
- verbose("lstat on %s failed\n", directory);
- return(0);
- }
- if (S_ISLNK(statbuf.st_mode)) {
- char real[PATH_MAX];
- verbose("resolving symlink to ");
- if (!(directory = realpath(directory, real))) {
- if (errno == ENOENT) {
- verbose("%s: does not exist, dangling symlink ignored\n", real);
- return(0);
- }
- perror("... failed");
- return(-1);
- }
- verbose("%s ", directory);
- if (lstat(directory, &statbuf)) {
- error("lstat on %s failed ", directory);
- perror("");
- return(-1);
- }
- }
- if (!S_ISDIR(statbuf.st_mode)) {
- error("%s is not a directory\n", directory);
- return(-1);
- }
- verbose("\n");
-
- /* All returns after this point must be via cleanup */
-
- if ((ret = xftw_readdir(directory, 0)))
- goto cleanup;
-
- t = tree; /* depth 0 */
- type = 2;
- for (i = 0 ; type == 2 && i < t->used; ++i) {
- c = t->contents+i;
- for (j = 0; tbtype[j]; ++j) {
- if (strcmp(c->name, tbtype[j]) == 0 &&
- S_ISDIR(c->statbuf.st_mode)) {
- const char *p = directory + strlen(directory) - 1;
- if (*p == '/')
- --p;
- if (p - directory >= 6 && strncmp(p-6, "/kernel", 7) == 0)
- continue; /* "/kernel" path is a special case, type 2 */
- type = 1; /* known subdirectory */
- break;
- }
- }
- }
-
- if (type == 1) {
- OPT_LIST *p;
- /* prune entries in type 1 directories only */
- for (i = 0 ; i < t->used; ++i) {
- for (p = prunelist; p->name; ++p) {
- c = t->contents+i;
- if (strcmp(p->name, c->name) == 0) {
- verbose("pruned %s\n", c->name);
- *(c->name) = '\0'; /* ignore */
- }
- }
- }
- /* run known subdirectories first in historical order, "kernel" is now top of list */
- for (i = 0 ; i < t->used; ++i) {
- c = t->contents+i;
- for (j = 0; tbtype[j]; ++j) {
- if (*(c->name) &&
- strcmp(c->name, tbtype[j]) == 0 &&
- S_ISDIR(c->statbuf.st_mode)) {
- if ((ret = xftw_type2(directory, c->name, 1, funcptr)))
- goto cleanup;
- *(c->name) = '\0'; /* processed */
- }
- }
- }
- /* any other directories left, in alphabetical order */
- for (i = 0 ; i < t->used; ++i) {
- c = t->contents+i;
- if (*(c->name) &&
- S_ISDIR(c->statbuf.st_mode)) {
- if ((ret = xftw_type2(directory, c->name, 1, funcptr)))
- goto cleanup;
- *(c->name) = '\0'; /* processed */
- }
- }
- /* anything else is passed to the user function */
- for (i = 0 ; i < t->used; ++i) {
- c = t->contents+i;
- if (*(c->name)) {
- verbose("%s found in type 1 directory %s\n", c->name, directory);
- if ((ret = xftw_do_name(directory, c->name, &(c->statbuf), funcptr)))
- goto cleanup;
- *(c->name) = '\0'; /* processed */
- }
- }
- }
- else {
- /* type 2 */
- xftw_free_tree(0);
- if ((ret = xftw_type2(directory, NULL, 0, funcptr)))
- goto cleanup;
- }
-
- /* amazing, it all worked */
- ret = 0;
-cleanup:
- for (i = 0; i < XFTW_MAXDEPTH; ++i)
- xftw_free_tree(i);
- return(ret);
-}
diff --git a/mdk-stage1/insmod-modutils/util/xmalloc.c b/mdk-stage1/insmod-modutils/util/xmalloc.c
deleted file mode 100644
index 9113d47fe..000000000
--- a/mdk-stage1/insmod-modutils/util/xmalloc.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Misc utility functions.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include "util.h"
-
-
-/*======================================================================*/
-
-void *
-xmalloc(size_t size)
-{
- void *ptr = malloc(size);
- if (!ptr)
- {
- error("Out of memory");
- exit(1);
- }
- return ptr;
-}
diff --git a/mdk-stage1/insmod-modutils/util/xrealloc.c b/mdk-stage1/insmod-modutils/util/xrealloc.c
deleted file mode 100644
index d287486f7..000000000
--- a/mdk-stage1/insmod-modutils/util/xrealloc.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Misc utility functions.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include "util.h"
-
-
-/*======================================================================*/
-
-void *
-xrealloc(void *old, size_t size)
-{
- void *ptr = realloc(old, size);
- if (!ptr)
- {
- error("Out of memory");
- exit(1);
- }
- return ptr;
-}
diff --git a/mdk-stage1/insmod-modutils/util/xstrcat.c b/mdk-stage1/insmod-modutils/util/xstrcat.c
deleted file mode 100644
index abb075c83..000000000
--- a/mdk-stage1/insmod-modutils/util/xstrcat.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Misc utility functions.
- Copyright 2000 Keith Owens <kaos@ocs.com.au>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id"
-
-#include <stdlib.h>
-#include <string.h>
-#include "util.h"
-
-
-/*======================================================================*/
-
-char *
-xstrcat(char *dest, const char *src, size_t size)
-{
- int ldest = strlen(dest);
- int lsrc = strlen(src);
- if ((size - ldest - 1) < lsrc) {
- error("xstrcat: destination overflow");
- exit(1);
- }
- memcpy(dest+ldest, src, lsrc+1);
- return(dest);
-}
diff --git a/mdk-stage1/insmod-modutils/util/xstrdup.c b/mdk-stage1/insmod-modutils/util/xstrdup.c
deleted file mode 100644
index 11b289eb0..000000000
--- a/mdk-stage1/insmod-modutils/util/xstrdup.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Misc utility functions.
- Copyright 1996, 1997 Linux International.
- Contributed by Richard Henderson <rth@tamu.edu>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id$"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "util.h"
-
-
-/*======================================================================*/
-
-char *
-xstrdup(const char *s)
-{
- char *n = strdup(s);
- if (!n)
- {
- error("Out of memory");
- exit(1);
- }
- return n;
-}
diff --git a/mdk-stage1/insmod-modutils/util/xsystem.c b/mdk-stage1/insmod-modutils/util/xsystem.c
deleted file mode 100644
index edb995268..000000000
--- a/mdk-stage1/insmod-modutils/util/xsystem.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Misc utility functions.
- Copyright 2000 Keith Owens <kaos@ocs.com.au>
-
- This file is part of the Linux modutils.
-
- 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. */
-
-#ident "$Id"
-
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <unistd.h>
-
-
-/*======================================================================*/
-
-/* Clone of the system() function From Steven's Advanced Programming in a Unix
- * Environment. Modified to use *argv[] and execvp to avoid shell expansion
- * problems, modutils runs as root so system() is unsafe.
- */
-
-int
-xsystem(const char *file, char *const argv[])
-{
- pid_t pid;
- int status;
- if ((pid = fork()) < 0)
- return(-1);
- if (pid == 0) {
- execvp(file, argv);
- _exit(127);
- }
- while (waitpid(pid, &status, 0) < 0) {
- if (errno != EINTR)
- return(-1);
- }
- return(status);
-}
diff --git a/mdk-stage1/ka.c b/mdk-stage1/ka.c
new file mode 100644
index 000000000..7b9d98fbe
--- /dev/null
+++ b/mdk-stage1/ka.c
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2005 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "ka.h"
+#include <sys/mount.h>
+#include "mount.h"
+#include <sys/wait.h>
+#include <dirent.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+
+#include "config-stage1.h"
+#include "frontend.h"
+#include "log.h"
+#include "tools.h"
+
+struct in_addr next_server = { 0 };
+
+#if 0
+static void save_stuff_for_rescue(void)
+{
+ copy_file("/etc/resolv.conf", STAGE2_LOCATION "/etc/resolv.conf", NULL);
+}
+#endif
+
+static void my_pause(void) {
+ unsigned char t;
+ fflush(stdout);
+ read(0, &t, 1);
+}
+
+static enum return_type ka_wait_for_stage2(int count)
+{
+ char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd*/
+ char * ka_launch[] = { "/ka/ka-d-client", "-w","-s","getstage2","-e","(cd " STAGE2_LOCATION "; tar -x -f - )", NULL }; /* The command line for ka_launch */
+ char * mkfs_launch[] = { "/sbin/mke2fs", "-m", "0", ramdisk, NULL}; /* The mkfs command for formating the ramdisk */
+
+ log_message("KA: Preparing to receive stage 2....");
+ wait_message("Preparing to receive stage 2");
+
+ int pida, wait_status;
+
+ if (!(pida = fork())) { /* Forking current process for running mkfs */
+ //close(1);
+ close(2);
+ execv(mkfs_launch[0], mkfs_launch); /* Formating the ramdisk */
+ printf("KA: Can't execute %s\n<press Enter>\n", mkfs_launch[0]);
+ my_pause();
+ return KAERR_CANTFORK;
+ }
+ while (wait4(-1, &wait_status, 0, NULL) != pida) {}; /* Waiting the end of mkfs */
+ remove_wait_message();
+
+ wait_message("Mounting /dev/ram3 at %s", STAGE2_LOCATION);
+ if (my_mount(ramdisk, STAGE2_LOCATION, "ext2", 1)) {/* Trying to mount the ramdisk */
+ return RETURN_ERROR;
+ }
+ remove_wait_message();
+
+ log_message("KA: Waiting for stage 2....");
+ wait_message("Waiting for rescue from KA server (Try %d/%d)", count, KA_MAX_RETRY);
+ pid_t pid; /* Process ID of the child process */
+ pid_t wpid; /* Process ID from wait() */
+ int status; /* Exit status from wait() */
+
+ pid = fork();
+ if ( pid == -1 ) {
+ fprintf(stderr, "%s: Failed to fork()\n", strerror(errno));
+ exit(13);
+ } else if ( pid == 0 ) {
+ // close(2);
+ execv(ka_launch[0], ka_launch);
+ } else {
+ // wpid = wait(&status); /* Child's exit status */
+ wpid = wait4(-1, &status, 0, NULL);
+ if ( wpid == -1 ) {
+ fprintf(stderr,"%s: wait()\n", strerror(errno));
+ return RETURN_ERROR;
+ } else if ( wpid != pid )
+ abort();
+ else {
+ if ( WIFEXITED(status) ) {
+ printf("Exited: $? = %d\n", WEXITSTATUS(status));
+ } else if ( WIFSIGNALED(status) ) {
+ printf("Signal: %d%s\n", WTERMSIG(status), WCOREDUMP(status) ? " with core file." : "");
+ }
+ }
+ }
+
+ remove_wait_message();
+ return RETURN_OK;
+ // if (!(pid = fork())) { /* Froking current process for running ka-deploy (client side) */
+ // close(1); /* Closing stdout */
+ // close(2); /* Closing stderr */
+ // execve(ka_launch[0], ka_launch,grab_env()); /* Running ka-deploy (client side) */
+ // printf("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]);
+ // log_message("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]);
+ // my_pause();
+ // return KAERR_CANTFORK;
+ //}
+
+ //while (wait4(-1, &wait_status, 0, NULL) != pid) {}; /* Waiting the end of duplication */
+ // log_message("kalaunch ret %d\n", WIFEXITED(wait_status));
+ // remove_wait_message();
+ //sleep(100000);
+ // return RETURN_OK;
+}
+
+enum return_type perform_ka(void) {
+ enum return_type results;
+ int server_failure = 1; /* Number of time we've failed to find a ka server */
+ FILE *f = fopen ("/ka/tftpserver","w");
+
+ if (f != NULL) {
+ /* Writing the NEXT_SERVER value of the DHCP Request in the /ka/tftpserver file */
+ fprintf(f,"%s\n",inet_ntoa(next_server));
+ fclose(f);
+ }
+
+ log_message("KA: Trying to retrieve stage2 from server");
+ log_message("KA: ka_wait_for_stage2");
+ do {
+ /* We are trying to get a valid stage 2 (rescue) */
+ results=ka_wait_for_stage2(server_failure);
+ if (results != RETURN_OK) {
+ return results;
+ } else {
+ /* Trying to open STAGE2_LOCATION/ka directory */
+ char dir[255] = STAGE2_LOCATION;
+ strcat(dir,"/ka");
+ DIR *dp = opendir(dir);
+
+ /* Does the STAGE2_LOCATION/ka directory exists ? = Does the rescue with ka well downloaded ?*/
+ if (!dp) {
+ log_message("KA: Server not found !");
+ /* Be sure that the STAGE2_LOCATION isn't mounted after receiving a wrong rescue */
+ if (umount (STAGE2_LOCATION)) {
+ log_perror("KA: Unable to umount STAGE2");
+ }
+ int cpt;
+
+ if (server_failure++ == KA_MAX_RETRY){
+ /* if the KA server can't be reach KA_MAX_RETRY times */
+ char * reboot_launch[] = { "/sbin/reboot", NULL};
+ for (cpt=5; cpt>0; cpt--) {
+ wait_message("!!! Can't reach a valid KA server !!! (Rebooting in %d sec)",cpt);
+ sleep (1);
+ }
+ /* Rebooting the computer to avoid infinite loop on ka mode */
+ execv(reboot_launch[0], reboot_launch);
+ }
+
+ for (cpt=5; cpt>0; cpt--) {
+ wait_message("KA server not found ! (Try %d/%d in %d sec)",server_failure,KA_MAX_RETRY,cpt);
+ log_message("Ka not found %d/%d", server_failure,KA_MAX_RETRY);
+ sleep (1);
+ }
+ remove_wait_message();
+ /* We should try another time*/
+ results=RETURN_BACK;
+ continue;
+ }
+
+ if (dp) {
+ log_message("KA: Stage 2 downloaded successfully");
+ closedir(dp); /* Closing the /ka directory */
+ server_failure=1; /* Resetting server_failure */
+ results = RETURN_OK;
+ }
+ }
+
+ log_message("KA: Preparing chroot");
+ return RETURN_OK;
+
+ // if (IS_RESCUE) { /* if we are in rescue mode */
+ // save_stuff_for_rescue(); /* Saving resolve.conf */
+ // if (umount (STAGE2_LOCATION)) { /* Unmounting STAGE2 elseif kernel can't mount it ! */
+ // log_perror("KA: Unable to umount STAGE2");
+ // return RETURN_ERROR;
+ // }
+ // }
+ } while (results == RETURN_BACK);
+
+ // method_name = strdup("ka");
+ return RETURN_OK;
+}
diff --git a/mdk-stage1/insmod.h b/mdk-stage1/ka.h
index d91f239cf..44d6244f9 100644
--- a/mdk-stage1/insmod.h
+++ b/mdk-stage1/ka.h
@@ -1,7 +1,5 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
+ * Copyright 2005 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -12,9 +10,11 @@
*
*/
-#ifndef _INSMOD_INTERFACE_H_
-#define _INSMOD_INTERFACE_H_
+#ifndef _KA_H_
+#define _KA_H_
+
+#define KAERR_CANTFORK -20
-int insmod_call(char * full_filename, char * params);
+enum return_type perform_ka(void);
#endif
diff --git a/mdk-stage1/linux-2.2/nfs.h b/mdk-stage1/linux-2.2/nfs.h
deleted file mode 100644
index 7936d5a71..000000000
--- a/mdk-stage1/linux-2.2/nfs.h
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * NFS protocol definitions
- */
-#ifndef _LINUX_NFS_H
-#define _LINUX_NFS_H
-
-#include <linux/sunrpc/msg_prot.h>
-
-#define NFS_PORT 2049
-#define NFS_MAXDATA 8192
-#define NFS_MAXPATHLEN 1024
-#define NFS_MAXNAMLEN 255
-#define NFS_MAXGROUPS 16
-#define NFS_FHSIZE 32
-#define NFS_COOKIESIZE 4
-#define NFS_FIFO_DEV (-1)
-#define NFSMODE_FMT 0170000
-#define NFSMODE_DIR 0040000
-#define NFSMODE_CHR 0020000
-#define NFSMODE_BLK 0060000
-#define NFSMODE_REG 0100000
-#define NFSMODE_LNK 0120000
-#define NFSMODE_SOCK 0140000
-#define NFSMODE_FIFO 0010000
-
-
-enum nfs_stat {
- NFS_OK = 0,
- NFSERR_PERM = 1,
- NFSERR_NOENT = 2,
- NFSERR_IO = 5,
- NFSERR_NXIO = 6,
- NFSERR_EAGAIN = 11,
- NFSERR_ACCES = 13,
- NFSERR_EXIST = 17,
- NFSERR_XDEV = 18,
- NFSERR_NODEV = 19,
- NFSERR_NOTDIR = 20,
- NFSERR_ISDIR = 21,
- NFSERR_INVAL = 22, /* that Sun forgot */
- NFSERR_FBIG = 27,
- NFSERR_NOSPC = 28,
- NFSERR_ROFS = 30,
- NFSERR_OPNOTSUPP = 45,
- NFSERR_NAMETOOLONG = 63,
- NFSERR_NOTEMPTY = 66,
- NFSERR_DQUOT = 69,
- NFSERR_STALE = 70,
- NFSERR_WFLUSH = 99
-};
-
-enum nfs_ftype {
- NFNON = 0,
- NFREG = 1,
- NFDIR = 2,
- NFBLK = 3,
- NFCHR = 4,
- NFLNK = 5,
- NFSOCK = 6,
- NFBAD = 7,
- NFFIFO = 8
-};
-
-struct nfs_fh {
- char data[NFS_FHSIZE];
-};
-
-#define NFS_PROGRAM 100003
-#define NFS_VERSION 2
-#define NFSPROC_NULL 0
-#define NFSPROC_GETATTR 1
-#define NFSPROC_SETATTR 2
-#define NFSPROC_ROOT 3
-#define NFSPROC_LOOKUP 4
-#define NFSPROC_READLINK 5
-#define NFSPROC_READ 6
-#define NFSPROC_WRITECACHE 7
-#define NFSPROC_WRITE 8
-#define NFSPROC_CREATE 9
-#define NFSPROC_REMOVE 10
-#define NFSPROC_RENAME 11
-#define NFSPROC_LINK 12
-#define NFSPROC_SYMLINK 13
-#define NFSPROC_MKDIR 14
-#define NFSPROC_RMDIR 15
-#define NFSPROC_READDIR 16
-#define NFSPROC_STATFS 17
-
-/* Mount support for NFSroot */
-#ifdef __KERNEL__
-#define NFS_MNT_PROGRAM 100005
-#define NFS_MNT_VERSION 1
-#define NFS_MNT_PORT 627
-#define NFS_MNTPROC_MNT 1
-#define NFS_MNTPROC_UMNT 3
-#endif
-
-#if defined(__KERNEL__) || defined(NFS_NEED_KERNEL_TYPES)
-
-extern struct rpc_program nfs_program;
-extern struct rpc_stat nfs_rpcstat;
-
-struct nfs_time {
- __u32 seconds;
- __u32 useconds;
-};
-
-struct nfs_fattr {
- enum nfs_ftype type;
- __u32 mode;
- __u32 nlink;
- __u32 uid;
- __u32 gid;
- __u32 size;
- __u32 blocksize;
- __u32 rdev;
- __u32 blocks;
- __u32 fsid;
- __u32 fileid;
- struct nfs_time atime;
- struct nfs_time mtime;
- struct nfs_time ctime;
-};
-
-struct nfs_sattr {
- __u32 mode;
- __u32 uid;
- __u32 gid;
- __u32 size;
- struct nfs_time atime;
- struct nfs_time mtime;
-};
-
-struct nfs_fsinfo {
- __u32 tsize;
- __u32 bsize;
- __u32 blocks;
- __u32 bfree;
- __u32 bavail;
-};
-
-struct nfs_writeargs {
- struct nfs_fh * fh;
- __u32 offset;
- __u32 count;
- const void * buffer;
-};
-
-#ifdef NFS_NEED_XDR_TYPES
-
-struct nfs_sattrargs {
- struct nfs_fh * fh;
- struct nfs_sattr * sattr;
-};
-
-struct nfs_diropargs {
- struct nfs_fh * fh;
- const char * name;
-};
-
-struct nfs_readargs {
- struct nfs_fh * fh;
- __u32 offset;
- __u32 count;
- void * buffer;
-};
-
-struct nfs_createargs {
- struct nfs_fh * fh;
- const char * name;
- struct nfs_sattr * sattr;
-};
-
-struct nfs_renameargs {
- struct nfs_fh * fromfh;
- const char * fromname;
- struct nfs_fh * tofh;
- const char * toname;
-};
-
-struct nfs_linkargs {
- struct nfs_fh * fromfh;
- struct nfs_fh * tofh;
- const char * toname;
-};
-
-struct nfs_symlinkargs {
- struct nfs_fh * fromfh;
- const char * fromname;
- const char * topath;
- struct nfs_sattr * sattr;
-};
-
-struct nfs_readdirargs {
- struct nfs_fh * fh;
- __u32 cookie;
- void * buffer;
- unsigned int bufsiz;
-};
-
-struct nfs_diropok {
- struct nfs_fh * fh;
- struct nfs_fattr * fattr;
-};
-
-struct nfs_readres {
- struct nfs_fattr * fattr;
- unsigned int count;
-};
-
-struct nfs_readlinkres {
- char ** string;
- unsigned int * lenp;
- unsigned int maxlen;
- void * buffer;
-};
-
-struct nfs_readdirres {
- void * buffer;
- unsigned int bufsiz;
-};
-
-#endif /* NFS_NEED_XDR_TYPES */
-#endif /* __KERNEL__ */
-
-#endif
diff --git a/mdk-stage1/linux-2.2/nfs_mount.h b/mdk-stage1/linux-2.2/nfs_mount.h
deleted file mode 100644
index 60493b150..000000000
--- a/mdk-stage1/linux-2.2/nfs_mount.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef _LINUX_NFS_MOUNT_H
-#define _LINUX_NFS_MOUNT_H
-
-/*
- * linux/include/linux/nfs_mount.h
- *
- * Copyright (C) 1992 Rick Sladkey
- *
- * structure passed from user-space to kernel-space during an nfs mount
- */
-
-/*
- * WARNING! Do not delete or change the order of these fields. If
- * a new field is required then add it to the end. The version field
- * tracks which fields are present. This will ensure some measure of
- * mount-to-kernel version compatibility. Some of these aren't used yet
- * but here they are anyway.
- */
-#define NFS_MOUNT_VERSION 3
-
-struct nfs_mount_data {
- int version; /* 1 */
- int fd; /* 1 */
- struct nfs_fh root; /* 1 */
- int flags; /* 1 */
- int rsize; /* 1 */
- int wsize; /* 1 */
- int timeo; /* 1 */
- int retrans; /* 1 */
- int acregmin; /* 1 */
- int acregmax; /* 1 */
- int acdirmin; /* 1 */
- int acdirmax; /* 1 */
- struct sockaddr_in addr; /* 1 */
- char hostname[256]; /* 1 */
- int namlen; /* 2 */
- unsigned int bsize; /* 3 */
-};
-
-/* bits in the flags field */
-
-#define NFS_MOUNT_SOFT 0x0001 /* 1 */
-#define NFS_MOUNT_INTR 0x0002 /* 1 */
-#define NFS_MOUNT_SECURE 0x0004 /* 1 */
-#define NFS_MOUNT_POSIX 0x0008 /* 1 */
-#define NFS_MOUNT_NOCTO 0x0010 /* 1 */
-#define NFS_MOUNT_NOAC 0x0020 /* 1 */
-#define NFS_MOUNT_TCP 0x0040 /* 2 */
-#define NFS_MOUNT_VER3 0x0080 /* 3 */
-#define NFS_MOUNT_KERBEROS 0x0100 /* 3 */
-#define NFS_MOUNT_NONLM 0x0200 /* 3 */
-
-#endif
diff --git a/mdk-stage1/log.c b/mdk-stage1/log.c
index 5379c96dd..cb3f741dc 100644
--- a/mdk-stage1/log.c
+++ b/mdk-stage1/log.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -31,27 +31,35 @@
#include "log.h"
+static FILE * logtty = NULL;
static FILE * logfile = NULL;
void vlog_message(const char * s, va_list args)
{
- fprintf(logfile, "* ");
- vfprintf(logfile, s, args);
- fprintf(logfile, "\n");
- fflush(logfile);
+ va_list args_copy;
+ va_copy(args_copy, args);
+
+ if (logfile) {
+ fprintf(logfile, "* ");
+ vfprintf(logfile, s, args);
+ fprintf(logfile, "\n");
+ fflush(logfile);
+ }
+ if (logtty) {
+ fprintf(logtty, "* ");
+ vfprintf(logtty, s, args_copy);
+ fprintf(logtty, "\n");
+ fflush(logtty);
+ }
+
+ va_end(args_copy);
}
void log_message(const char * s, ...)
{
va_list args;
-
- if (!logfile) {
- fprintf(stderr, "Log is not open!\n");
- return;
- }
-
va_start(args, s);
vlog_message(s, args);
va_end(args);
@@ -59,7 +67,7 @@ void log_message(const char * s, ...)
return;
}
-void log_perror(char *msg)
+void log_perror(const char *msg)
{
log_message("%s: %s", msg, strerror(errno));
}
@@ -68,9 +76,8 @@ void log_perror(char *msg)
void open_log(void)
{
if (!IS_TESTING) {
- logfile = fopen("/dev/tty3", "w");
- if (!logfile)
- logfile = fopen("/tmp/install.log", "a");
+ logtty = fopen("/dev/tty3", "w");
+ logfile = fopen("/tmp/stage1.log", "w");
}
else
logfile = fopen("debug.log", "w");
@@ -81,5 +88,7 @@ void close_log(void)
if (logfile) {
log_message("stage1: disconnecting life support systems");
fclose(logfile);
+ if (logtty)
+ fclose(logtty);
}
}
diff --git a/mdk-stage1/log.h b/mdk-stage1/log.h
index fcc641ad9..d726a6b21 100644
--- a/mdk-stage1/log.h
+++ b/mdk-stage1/log.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -25,9 +25,9 @@
#include <stdarg.h>
-void log_message(const char * s, ...);
+void log_message(const char * s, ...) __attribute__ ((format (printf, 1, 2)));
void vlog_message(const char * s, va_list args);
-void log_perror(char *msg);
+void log_perror(const char *msg);
void open_log(void);
void close_log(void);
diff --git a/mdk-stage1/lomount.c b/mdk-stage1/lomount.c
index 281de4a93..caca48ea1 100644
--- a/mdk-stage1/lomount.c
+++ b/mdk-stage1/lomount.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -110,62 +110,84 @@ set_loop (const char *device, const char *file)
return 0;
}
-int
-del_loop (const char *device)
+
+char* find_free_loop()
+{
+ struct loop_info loopinfo;
+ int i;
+ for (i=0; i<256; i++) {
+ int fd;
+ char ldev[100];
+ sprintf(ldev, "/dev/loop%d", i);
+ ensure_dev_exists(ldev);
+ fd = open(ldev, O_RDONLY);
+ if (!ioctl(fd, LOOP_GET_STATUS, &loopinfo)) {
+ close(fd);
+ continue;
+ }
+ if (errno == ENXIO) {
+ log_message("%s is available", ldev);
+ close(fd);
+ return strdup(ldev);
+ } else {
+ log_perror("LOOP_GET_STATUS(unexpected error)");
+ close(fd);
+ continue;
+ }
+ }
+ return NULL;
+}
+
+void
+del_loop(char * loopdev)
{
int fd;
- if ((fd = open (device, O_RDONLY)) < 0)
- return 1;
+ if (!loopdev)
+ return;
+
+ if ((fd = open (loopdev, O_RDONLY)) < 0)
+ return;
if (ioctl (fd, LOOP_CLR_FD, 0) < 0)
- return 1;
+ return;
close (fd);
- return 0;
}
-
-char * loopdev = "/dev/loop3"; /* Ugly. But do I care? */
-
int
-lomount(char *loopfile, char *where)
+lomount(char *loopfile, char *where, char **dev, int compressed)
{
long int flag;
+ char * loopdev;
flag = MS_MGC_VAL;
flag |= MS_RDONLY;
- my_insmod("loop", ANY_DRIVER_TYPE, NULL);
+ my_modprobe("loop", ANY_DRIVER_TYPE, "max_loop=256");
+ if (compressed) {
+ my_modprobe("squashfs", ANY_DRIVER_TYPE, NULL);
+ }
+
+ if (!(loopdev = find_free_loop())) {
+ log_message("could not find a free loop");
+ return 1;
+ }
+ if (dev)
+ *dev = loopdev;
if (set_loop(loopdev, loopfile)) {
log_message("set_loop failed on %s (%s)", loopdev, strerror(errno));
return 1;
}
- if (my_mount(loopdev, where, "iso9660")) {
+ if (my_mount(loopdev, where, compressed ? "squashfs" : "iso9660", 0)) {
del_loop(loopdev);
return 1;
}
- log_message("lomount succeded for %s on %s", loopfile, where);
- return 0;
-}
-
-
-int
-loumount()
-{
- if (umount(loopdev)) {
- log_perror("loumount");
- return 1;
- }
-
- if (del_loop(loopdev)) {
- log_perror("del_loop");
- return 1;
- }
+ log_message("lomount succeeded for %s on %s", loopfile, where);
return 0;
}
diff --git a/mdk-stage1/lomount.h b/mdk-stage1/lomount.h
index f298fe341..7f3af2460 100644
--- a/mdk-stage1/lomount.h
+++ b/mdk-stage1/lomount.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -15,7 +15,7 @@
#ifndef LOMOUNT_H
#define LOMOUNT_H
-int lomount(char *loopfile, char *where);
-int loumount();
+int lomount(char *loopfile, char *where, char **loopdev, int compressed);
+void del_loop(char *loopdev);
#endif
diff --git a/mdk-stage1/mar/.cvsignore b/mdk-stage1/mar/.cvsignore
deleted file mode 100644
index bfde37886..000000000
--- a/mdk-stage1/mar/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-mar
diff --git a/mdk-stage1/mar/Makefile b/mdk-stage1/mar/Makefile
deleted file mode 100644
index dc5316a1a..000000000
--- a/mdk-stage1/mar/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
- #******************************************************************************
- #
- # mar - The Mandrake Archiver
- #
- # $Id$
- #
- # Guillaume Cottenceau (gc@mandrakesoft.com)
- #
- # Copyright 2000 MandrakeSoft
- #
- # This software may be freely redistributed under the terms of the GNU
- # public license.
- #
- # 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- #
- #*****************************************************************************
-
-top_dir = ..
-
-include $(top_dir)/Makefile.common
-
-
-all: libmar.a libmar-DIET.a mar
-
-clean:
- rm -f *.o libmar.a libmar-DIET.a mar
-
-FLAGS = -Wall -Werror -Os -fomit-frame-pointer -c
-
-
-mar: mar-frontend.o mar-extract-only-standalone.o
- gcc -o mar mar-frontend.o mar-extract-only-standalone.o -lbz2
- $(STRIPCMD) $@
-
-libmar.a: mar-extract-only.o
- ar -cru $@ $^
- ranlib $@
-
-libmar-DIET.a: mar-extract-only-DIET.o
- ar -cru $@ $^
- ranlib $@
-
-mar-extract-only.o: mar-extract-only.c mar-extract-only.h mar.h
- gcc $(FLAGS) $(GLIBC_INCLUDES) mar-extract-only.c
-
-mar-extract-only-DIET.o: mar-extract-only.c mar-extract-only.h mar.h
- gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ mar-extract-only.c
-
-mar-frontend.o: mar-frontend.c mar.h mar-extract-only.h
- gcc $(FLAGS) $(GLIBC_INCLUDES) mar-frontend.c
-
-mar-extract-only-standalone.o: mar-extract-only.c mar-extract-only.h mar.h
- gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ mar-extract-only.c
diff --git a/mdk-stage1/mar/mar-extract-only.c b/mdk-stage1/mar/mar-extract-only.c
deleted file mode 100644
index 2d3898cfc..000000000
--- a/mdk-stage1/mar/mar-extract-only.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/*
- * mar - The Mandrake Archiver
- *
- * An archiver that supports compression (through zlib).
- *
- */
-
-/*
- * This code should suffice for stage1 on-the-fly uncompression of kernel modules.
- * (and it DOES perform tests and return values, blaaaah..)
- */
-
-#include "mar-extract-only.h"
-#include "mar.h"
-
-#ifdef _STANDALONE_
-void
-zerr(BZFILE * f) /* decrease code size */
-{
- fprintf(stderr, BZ2_bzerror(f, &z_errnum));
-}
-void
-log_perror(char *msg)
-{
- perror(msg);
-}
-void
-log_message(char *msg)
-{
- fprintf(stderr, msg);
-}
-#else /* _STANDALONE_ */
-#include "../log.h"
-void
-zerr(BZFILE * f) /* decrease code size */
-{
- log_message(BZ2_bzerror(f, &z_errnum));
-}
-#endif /* _STANDALONE_ */
-
-
-static int
-mar_open_file(char *filename, struct mar_stream *s)
-{
- int end_filetable = 0;
- struct mar_element * previous_element = NULL;
-
- /* mar_zfile */
- s->mar_zfile = BZ2_bzopen(filename, "rb");
- if (!s->mar_zfile)
- {
- log_perror(filename);
- return -1;
- }
-
- while (end_filetable == 0)
- {
- char buf[512];
- int ptr = 0;
- /* read filename */
- do
- {
- if (BZ2_bzread(s->mar_zfile, &(buf[ptr]), sizeof(char)) != sizeof(char))
- {
- zerr(s->mar_zfile);
- return -1;
- }
- ptr++;
- } while ((buf[ptr-1] != 0) && (ptr < 512));
- /* ptr == 1 when we arrive on the "char 0" of the end of the filetable */
- if (ptr > 1)
- {
- struct mar_element * e = (struct mar_element *) malloc(sizeof(struct mar_element));
- e->filename = strdup(buf);
- /* read file_length */
- if (BZ2_bzread(s->mar_zfile, &(e->file_length), sizeof(int)) != sizeof(int))
- {
- zerr(s->mar_zfile);
- return -1;
- }
- /* read data_offset */
- if (BZ2_bzread(s->mar_zfile, &(e->data_offset), sizeof(int)) != sizeof(int))
- {
- zerr(s->mar_zfile);
- return -1;
- }
- /* write down chaining */
- if (previous_element)
- previous_element->next_element = e;
- else
- s->first_element = e;
- previous_element = e;
- }
- else
- end_filetable = 1;
-
- }
- /* chaining for last element */
- previous_element->next_element = NULL;
-
- return 0;
-}
-
-
-char **
-mar_list_contents(char * mar_filename)
-{
- struct mar_stream s;
- struct mar_element * elem;
- char * tmp_contents[500];
- char ** answ;
- int i = 0;
-
- if (mar_open_file(mar_filename, &s))
- return NULL;
-
- elem = s.first_element;
- while (elem)
- {
- tmp_contents[i++] = strdup(elem->filename);
- elem = elem->next_element;
- }
- tmp_contents[i++] = NULL;
- answ = (char **) malloc(sizeof(char *) * i);
- memcpy(answ, tmp_contents, sizeof(char *) * i);
- return answ;
-}
-
-
-int
-mar_extract_file(char *mar_filename, char *filename_to_extract, char *dest_dir)
-{
- struct mar_stream s;
- struct mar_element * elem;
-
- if (mar_open_file(mar_filename, &s))
- return -1;
-
- elem = s.first_element;
- while (elem)
- {
- if (strcmp(elem->filename, filename_to_extract) == 0)
- {
- char garb_buf[4096];
- char *buf;
- char *dest_file;
- int fd, i;
- dest_file = (char *) alloca(strlen(dest_dir) + strlen(filename_to_extract) + 1);
- strcpy(dest_file, dest_dir);
- strcat(dest_file, filename_to_extract);
- fd = creat(dest_file, 00660);
- if (fd == -1)
- {
- log_perror(dest_file);
- return -1;
- }
- buf = (char *) alloca(elem->file_length);
- if (!buf)
- {
- log_perror(dest_file);
- return -1;
- }
- i = elem->data_offset;
- while (i > 0) {
- int to_read = i > sizeof(garb_buf) ? sizeof(garb_buf) : i;
- if (BZ2_bzread(s.mar_zfile, garb_buf, to_read) != to_read) {
- log_message("MAR: unexpected EOF in stream");
- return -1;
- }
- i -= to_read;
- }
- if (BZ2_bzread(s.mar_zfile, buf, elem->file_length) != elem->file_length)
- {
- zerr(s.mar_zfile);
- return -1;
- }
- if (write(fd, buf, elem->file_length) != elem->file_length)
- {
- log_perror(dest_file);
- return -1;
- }
- close(fd); /* do not check return value for code size */
- BZ2_bzclose(s.mar_zfile);
- return 0;
- }
- elem = elem->next_element;
- }
- BZ2_bzclose(s.mar_zfile);
- return 1; /* 1 for file_not_found_in_archive */
-}
-
-
diff --git a/mdk-stage1/mar/mar-extract-only.h b/mdk-stage1/mar/mar-extract-only.h
deleted file mode 100644
index 6fa34efe4..000000000
--- a/mdk-stage1/mar/mar-extract-only.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/*
- * mar - The Mandrake Archiver
- *
- * An archiver that supports compression (through zlib).
- *
- */
-
-/*
- * Header for stage1 on-the-fly needs.
- */
-
-#ifndef MAR_EXTRACT_ONLY_H
-#define MAR_EXTRACT_ONLY_H
-
-int mar_extract_file(char *mar_filename, char *filename_to_extract, char *dest_dir);
-char ** mar_list_contents(char *mar_filename);
-
-#endif
diff --git a/mdk-stage1/mar/mar-frontend.c b/mdk-stage1/mar/mar-frontend.c
deleted file mode 100644
index 2e87626db..000000000
--- a/mdk-stage1/mar/mar-frontend.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/*
- * mar - The Mandrake Archiver
- *
- * An archiver that supports compression (through zlib).
- *
- */
-
-/*
- * This code includes the extracting and creating features.
- *
- */
-
-#include "mar.h"
-#include "mar-extract-only.h"
-
-
-int
-file_size(char *filename)
-{
- struct stat buf;
- if (stat(filename, &buf) != 0)
- {
- perror(filename);
- return -1;
- }
- return buf.st_size;
-}
-
-
-/* Yes I don't use the datastructure I directly write the final fileformat in memory then write down it.
- * Yes it's bad.
- */
-/* ``files'' is a NULL-terminated array of char* */
-
-char * fnf_tag = "FILE_NOT_FOUND&";
-
-int
-mar_create_file(char *dest_file, char **files)
-{
- int filenum = 0;
- int current_offset_filetable = 0;
- int current_delta_rawdata = 0;
- int filetable_size;
- char * temp_marfile_buffer;
- int total_length = 0;
-
- filetable_size = sizeof(char); /* ``char 0'' */
- while (files[filenum])
- {
- int fsiz = file_size(files[filenum]);
- if (fsiz == -1)
- files[filenum] = fnf_tag;
- else {
- filetable_size += 2*sizeof(int) /* file_length, data_offset */ + strlen(files[filenum]) + 1;
- total_length += fsiz;
- }
- filenum++;
- }
-
- total_length += filetable_size;
-
- temp_marfile_buffer = (char *) malloc(total_length); /* create the whole file in-memory (not with alloca! it can be bigger than typical limit for stack of programs (ulimit -s) */
- DEBUG_MAR(printf("D: mar::create_marfile total-length %d\n", total_length););
-
- filenum = 0;
- while (files[filenum])
- {
- if (strcmp(files[filenum], fnf_tag)) {
- FILE * f = fopen(files[filenum], "r");
- int fsize;
- if (!f)
- {
- perror(files[filenum]);
- return -1;
- }
-
- /* filename */
- strcpy(&(temp_marfile_buffer[current_offset_filetable]), files[filenum]);
- current_offset_filetable += strlen(files[filenum]) + 1;
-
- /* file_length */
- fsize = file_size(files[filenum]);
- if (fsize == -1) return -1;
- memcpy(&temp_marfile_buffer[current_offset_filetable], &fsize, sizeof(int));
- current_offset_filetable += sizeof(int);
-
- /* data_offset */
- memcpy(&temp_marfile_buffer[current_offset_filetable], &current_delta_rawdata, sizeof(int));
- current_offset_filetable += sizeof(int);
-
- /* data_raw_data */
- if (fread(&temp_marfile_buffer[current_delta_rawdata + filetable_size], 1, fsize, f) != fsize)
- {
- perror(files[filenum]);
- return -1;
- }
- fclose(f);
-
- current_delta_rawdata += fsize;
- }
-
- filenum++;
- }
-
- /* write down ``char 0'' to terminate file table */
- memset(&temp_marfile_buffer[current_offset_filetable], 0, sizeof(char));
-
- /* ok, buffer is ready, let's write it on-disk */
- {
- BZFILE * f = BZ2_bzopen(dest_file, "w9");
- if (!f)
- {
- perror(dest_file);
- return -1;
- }
- if (BZ2_bzwrite(f, temp_marfile_buffer, total_length) != total_length)
- {
- fprintf(stderr, BZ2_bzerror(f, &z_errnum));
- return -1;
- }
- BZ2_bzclose(f);
- }
-
- printf("mar: created archive %s (%d files, length %d)\n", dest_file, filenum, total_length);
- return 0;
-}
-
-
-void
-print_usage(char *progname)
-{
- printf("Usage: %s [-lxc] [files..]\n", progname);
- exit(0);
-}
-
-int
-main(int argc, char **argv)
-{
- if (argc <= 2)
- print_usage(argv[0]);
-
- if (argc >= 3)
- {
- if (strcmp(argv[1], "-l") == 0)
- {
- char ** contents = mar_list_contents(argv[2]);
- if (contents)
- while (contents && *contents) {
- printf("\t%s\n", *contents);
- contents++;
- }
- exit(0);
- }
- if ((strcmp(argv[1], "-x") == 0) && argc == 4)
- {
- int res = mar_extract_file(argv[2], argv[3], "./");
- if (res == 1)
- fprintf(stderr, "W: file-not-found-in-archive %s\n", argv[3]);
- if (res == -1)
- exit(-1);
- exit(0);
- }
- if ((strcmp(argv[1], "-c") == 0) && argc >= 4)
- {
- char **files = (char **) alloca(((argc-3)+1) * sizeof(char *));
- int i = 3;
- while (i < argc)
- {
- files[i-3] = argv[i];
- i++;
- }
- files[argc-3] = NULL;
- {
- int results;
- results = mar_create_file(argv[2], files);
- if (results != 0)
- fprintf(stderr, "E: create-marfile-failed\n");
- exit(results);
- }
-
- }
- }
-
- return 0;
-}
diff --git a/mdk-stage1/mar/mar.h b/mdk-stage1/mar/mar.h
deleted file mode 100644
index 672d7ded8..000000000
--- a/mdk-stage1/mar/mar.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/*
- * mar - The Mandrake Archiver
- *
- * An archiver that supports compression (through bzlib).
- *
- * Designed to be small so these bad designs are inside:
- * . archive and compression are mixed together
- * . create the mar file in-memory
- * . does not free memory
- *
- */
-
-#ifndef MAR_H
-#define MAR_H
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include <bzlib.h>
-
-/*
- * Format of a mar file:
- *
- * ASCIIZ filename \ |
- * int file_length | repeated | bzipped
- * int pointer_in_archive / |
- * char 0 |
- * raw_files_data /
- *
- */
-
-struct mar_element
-{
- char * filename; /* filename (ASCIIZ) of the element */
- int file_length; /* length (in bytes) of the raw data of the element */
- int data_offset; /* seek start of the raw data in the underlying mar stream */
- struct mar_element * next_element; /* pointer to the next element in the mar stream; NULL if last */
-};
-
-struct mar_stream
-{
- struct mar_element * first_element; /* pointer to the first element inside the mar stream */
- BZFILE * mar_zfile; /* associated zfile (opened) */
-};
-
-int z_errnum;
-
-#define DEBUG_MAR(x)
-
-#endif
diff --git a/mdk-stage1/minilibc.c b/mdk-stage1/minilibc.c
deleted file mode 100644
index 77b65accc..000000000
--- a/mdk-stage1/minilibc.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/*
- * Portions from Erik Troan (ewt@redhat.com)
- *
- * Copyright 1996 Red Hat Software
- *
- */
-
-
-#define MINILIBC_INTERNAL
-
-#include "minilibc.h"
-
-int atexit (void (*__func) (void))
-{
- return 0;
-}
-
-void exit()
-{
- _do_exit(0);
- for (;;); /* Shut up gcc */
-}
-
-
-char ** _environ = NULL;
-int errno = 0;
-
-void _init (int __status)
-{
-}
-
-void __libc_init_first (int __status)
-{
-}
-
-int __libc_start_main (int (*main) (int, char **, char **), int argc,
- char **argv, void (*init) (void), void (*fini) (void),
- void (*rtld_fini) (void), void *stack_end)
-{
- exit ((*main) (argc, argv, NULL));
- /* never get here */
- return 0;
-}
-
-void _fini (int __status)
-{
-}
-
-inline int socket(int a, int b, int c)
-{
- unsigned long args[] = { a, b, c };
-
- return socketcall(SYS_SOCKET, args);
-}
-
-inline int bind(int a, void * b, int c)
-{
- unsigned long args[] = { a, (long) b, c };
-
- return socketcall(SYS_BIND, args);
-}
-
-inline int listen(int a, int b)
-{
- unsigned long args[] = { a, b, 0 };
-
- return socketcall(SYS_LISTEN, args);
-}
-
-inline int accept(int a, void * addr, void * addr2)
-{
- unsigned long args[] = { a, (long) addr, (long) addr2 };
-
- return socketcall(SYS_ACCEPT, args);
-}
-
-
-void sleep(int secs)
-{
- struct timeval tv;
-
- tv.tv_sec = secs;
- tv.tv_usec = 0;
-
- select(0, NULL, NULL, NULL, &tv);
-}
-
-
-int strlen(const char * string)
-{
- int i = 0;
-
- while (*string++) i++;
-
- return i;
-}
-
-char * strncpy(char * dst, const char * src, int len)
-{
- char * chptr = dst;
- int i = 0;
-
- while (*src && i < len) *dst++ = *src++, i++;
- if (i < len) *dst = '\0';
-
- return chptr;
-}
-
-char * strcpy(char * dst, const char * src)
-{
- char * chptr = dst;
-
- while (*src) *dst++ = *src++;
- *dst = '\0';
-
- return chptr;
-}
-
-void * memcpy(void * dst, const void * src, size_t count)
-{
- char * a = dst;
- const char * b = src;
-
- while (count--)
- *a++ = *b++;
-
- return dst;
-}
-
-
-int strcmp(const char * a, const char * b)
-{
- int i, j;
-
- i = strlen(a); j = strlen(b);
- if (i < j)
- return -1;
- else if (j < i)
- return 1;
-
- while (*a && (*a == *b)) a++, b++;
-
- if (!*a) return 0;
-
- if (*a < *b)
- return -1;
- else
- return 1;
-}
-
-int strncmp(const char * a, const char * b, int len)
-{
- char buf1[1000], buf2[1000];
-
- strncpy(buf1, a, len);
- strncpy(buf2, b, len);
- buf1[len] = '\0';
- buf2[len] = '\0';
-
- return strcmp(buf1, buf2);
-}
-
-char * strchr(char * str, int ch)
-{
- char * chptr;
-
- chptr = str;
- while (*chptr)
- {
- if (*chptr == ch) return chptr;
- chptr++;
- }
-
- return NULL;
-}
-
-
-char * strstr(char *haystack, char *needle)
-{
- char * tmp = haystack;
- while ((tmp = strchr(tmp, needle[0])) != NULL) {
- int i = 1;
- while (i < strlen(tmp) && i < strlen(needle) && tmp[i] == needle[i])
- i++;
- if (needle[i] == '\0')
- return tmp;
- tmp++;
- }
- return NULL;
-}
-
-
-/* Minimum printf which handles only characters, %d's and %s's */
-void printf(char * fmt, ...)
-{
- char buf[2048];
- char * start = buf;
- char * chptr = buf;
- va_list args;
- char * strarg;
- int numarg;
-
- strncpy(buf, fmt, sizeof(buf));
- va_start(args, fmt);
-
- while (start)
- {
- while (*chptr != '%' && *chptr) chptr++;
-
- if (*chptr == '%')
- {
- *chptr++ = '\0';
- print_str_init(1, start);
-
- switch (*chptr++)
- {
- case 's':
- strarg = va_arg(args, char *);
- print_str_init(1, strarg);
- break;
-
- case 'd':
- numarg = va_arg(args, int);
- print_int_init(1, numarg);
- break;
- }
-
- start = chptr;
- }
- else
- {
- print_str_init(1, start);
- start = NULL;
- }
- }
-}
-
diff --git a/mdk-stage1/minilibc.h b/mdk-stage1/minilibc.h
deleted file mode 100644
index e717d4255..000000000
--- a/mdk-stage1/minilibc.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/*
- * Portions from Erik Troan (ewt@redhat.com)
- *
- * Copyright 1996 Red Hat Software
- *
- */
-
-
-#include <stdarg.h>
-
-#define _LOOSE_KERNEL_NAMES 1
-
-#define NULL ((void *) 0)
-
-#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
-#define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status))
-#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
-#define WTERMSIG(status) ((status) & 0x7f)
-#define WSTOPSIG(status) WEXITSTATUS(status)
-#define WIFEXITED(status) (WTERMSIG(status) == 0)
-
-#define MS_MGC_VAL 0xc0ed0000
-
-#define isspace(a) (a == ' ' || a == '\t')
-
-extern char ** _environ;
-
-extern int errno;
-
-/* Aieee, gcc 2.95+ creates a stub for posix_types.h on i386 which brings
- glibc headers in and thus makes __FD_SET etc. not defined with 2.3+ kernels. */
-#define _FEATURES_H 1
-#include <linux/socket.h>
-#include <linux/types.h>
-#include <linux/time.h>
-#include <linux/if.h>
-#include <linux/un.h>
-#include <linux/loop.h>
-#include <linux/net.h>
-#include <asm/posix_types.h>
-#include <asm/termios.h>
-#include <asm/ioctls.h>
-#include <asm/unistd.h>
-#include <asm/fcntl.h>
-#include <asm/signal.h>
-
-
-#ifndef MINILIBC_INTERNAL
-static inline _syscall5(int,mount,const char *,spec,const char *,dir,const char *,type,unsigned long,rwflag,const void *,data);
-static inline _syscall5(int,_newselect,int,n,fd_set *,rd,fd_set *,wr,fd_set *,ex,struct timeval *,timeval);
-static inline _syscall4(int,wait4,pid_t,pid,int *,status,int,opts,void *,rusage)
-static inline _syscall3(int,write,int,fd,const char *,buf,unsigned long,count)
-static inline _syscall3(int,reboot,int,magic,int,magic_too,int,flag)
-static inline _syscall3(int,execve,const char *,fn,void *,argv,void *,envp)
-static inline _syscall3(int,read,int,fd,const char *,buf,unsigned long,count)
-static inline _syscall3(int,open,const char *,fn,int,flags,mode_t,mode)
-static inline _syscall3(int,ioctl,int,fd,int,request,void *,argp)
-static inline _syscall2(int,dup2,int,one,int,two)
-static inline _syscall2(int,kill,pid_t,pid,int,sig)
-static inline _syscall2(int,symlink,const char *,a,const char *,b)
-static inline _syscall2(int,chmod,const char * ,path,mode_t,mode)
-static inline _syscall2(int,sethostname,const char *,name,int,len)
-static inline _syscall2(int,setdomainname,const char *,name,int,len)
-static inline _syscall2(int,setpgid,int,name,int,len)
-static inline _syscall2(int,signal,int,num,void *,len)
-static inline _syscall1(int,umount,const char *,dir)
-static inline _syscall1(int,unlink,const char *,fn)
-static inline _syscall1(int,close,int,fd)
-static inline _syscall1(int,swapoff,const char *,fn)
-static inline _syscall0(int,getpid)
-static inline _syscall0(int,sync)
-#ifdef __sparc__
-/* Nonstandard fork calling convention :( */
-static inline int fork(void) {
- int __res;
- __asm__ __volatile__ (
- "mov %0, %%g1\n\t"
- "t 0x10\n\t"
- "bcc 1f\n\t"
- "dec %%o1\n\t"
- "sethi %%hi(%2), %%g1\n\t"
- "st %%o0, [%%g1 + %%lo(%2)]\n\t"
- "b 2f\n\t"
- "mov -1, %0\n\t"
- "1:\n\t"
- "and %%o0, %%o1, %0\n\t"
- "2:\n\t"
- : "=r" (__res)
- : "0" (__NR_fork), "i" (&errno)
- : "g1", "o0", "cc");
- return __res;
-}
-#else
-static inline _syscall0(int,fork)
-#endif
-static inline _syscall0(pid_t,setsid)
-static inline _syscall3(int,syslog,int, type, char *, buf, int, len);
-#else
-static inline _syscall5(int,_newselect,int,n,fd_set *,rd,fd_set *,wr,fd_set *,ex,struct timeval *,timeval);
-static inline _syscall3(int,write,int,fd,const char *,buf,unsigned long,count)
-static inline _syscall2(int,socketcall,int,code,unsigned long *, args)
-#define __NR__do_exit __NR_exit
-extern inline _syscall1(int,_do_exit,int,exitcode)
-#endif
-
-#define select _newselect
-
-extern int errno;
-
-inline int socket(int a, int b, int c);
-inline int bind(int a, void * b, int c);
-inline int listen(int a, int b);
-inline int accept(int a, void * addr, void * addr2);
-
-void sleep(int secs);
-
-int strlen(const char * string);
-char * strcpy(char * dst, const char * src);
-void * memcpy(void * dst, const void * src, size_t count);
-int strcmp(const char * a, const char * b);
-int strncmp(const char * a, const char * b, int len);
-char * strchr(char * str, int ch);
-char * strstr(char *haystack, char *needle);
-char * strncpy(char * dst, const char * src, int len);
-
-void print_str_init(int fd, char * string);
-void print_int_init(int fd, int i);
-/* Minimum printf which handles only characters, %d's and %s's */
-void printf(char * fmt, ...);
-
diff --git a/mdk-stage1/modules.c b/mdk-stage1/modules.c
index 2788315f8..76177302e 100644
--- a/mdk-stage1/modules.c
+++ b/mdk-stage1/modules.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -18,103 +18,130 @@
* (3) insmod them
*/
+#include "stage1.h"
+
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/mount.h>
#include <fcntl.h>
+#include <libgen.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
-#include "insmod.h"
-#include "stage1.h"
+#include <errno.h>
+#include <time.h>
+#include <sys/utsname.h>
+#include <libkmod.h>
#include "log.h"
-#include "mar/mar-extract-only.h"
+#include "utils.h"
#include "frontend.h"
+#include "mount.h"
+#include "zlibsupport.h"
#include "modules.h"
-static struct module_deps_elem * modules_deps = NULL;
+static char modules_directory[100];
+static struct module_descr_elem * modules_descr = NULL;
-static char * archive_name = "/modules/modules.mar";
-static int disable_modules = 0;
+extern long init_module(void *, unsigned long, const char *);
-
-/* unarchive and insmod given module
- * WARNING: module must not contain the trailing ".o"
- */
-static int insmod_archived_file(const char * mod_name, char * options)
+static const char *moderror(int err)
{
- char module_name[50];
- char final_name[50] = "/tmp/";
- int i, rc;
-
- strncpy(module_name, mod_name, sizeof(module_name));
- strcat(module_name, ".o");
- i = mar_extract_file(archive_name, module_name, "/tmp/");
- if (i == 1) {
- log_message("file-not-found-in-archive %s", module_name);
- return -1;
+ switch (err) {
+ case ENOEXEC:
+ return "Invalid module format";
+ case ENOENT:
+ return "Unknown symbol in module";
+ case ESRCH:
+ return "Module has wrong symbol version";
+ case EINVAL:
+ return "Invalid parameters";
+ default:
+ return strerror(err);
}
- if (i != 0)
- return -1;
+}
- strcat(final_name, mod_name);
- strcat(final_name, ".o");
+int insmod_local_file(char * path, char * options)
+{
+ void *file;
+ unsigned long len;
+ int rc;
+
+ if (IS_TESTING)
+ return 0;
- rc = insmod_call(final_name, options);
+ file = grab_file(path, &len);
+
+ if (!file) {
+ log_perror(asprintf_("\terror reading %s", path));
+ return -1;
+ }
+
+ rc = init_module(file, len, options ? options : "");
if (rc)
- log_message("\tfailed");
- unlink(final_name); /* sucking no space left on device */
+ log_message("\terror: %s", moderror(errno));
return rc;
}
-
-
-static int load_modules_dependencies(void)
+static char *kernel_module_extension(void)
{
- char * deps_file = "/modules/modules.dep";
- char * buf, * ptr, * start, * end;
- struct stat s;
- int fd, line, i;
+ return ".ko.xz";
+}
- log_message("loading modules dependencies");
- if (IS_TESTING)
- return 0;
+static char *filename2modname(char * filename) {
+ char *modname, *p;
- fd = open(deps_file, O_RDONLY);
- if (fd == -1) {
- log_perror(deps_file);
- return -1;
+ modname = strdup(basename(filename));
+ if (strstr(modname, kernel_module_extension())) {
+ modname[strlen(modname)-strlen(kernel_module_extension())] = '\0'; /* remove trailing .ko.gz */
}
-
- fstat(fd, &s);
- buf = alloca(s.st_size + 1);
- if (read(fd, buf, s.st_size) != s.st_size) {
- log_perror(deps_file);
- return -1;
+
+ p = modname;
+ while (p && *p) {
+ if (*p == '-')
+ *p = '_';
+ p++;
}
- buf[s.st_size] = '\0';
- close(fd);
- ptr = buf;
- line = 0;
- while (ptr) {
- line++;
- ptr = strchr(ptr + 1, '\n');
+ return modname;
+}
+
+static void find_modules_directory(void)
+{
+ struct utsname kernel_uname;
+ char * prefix = "/lib/modules";
+ char * release;
+ if (uname(&kernel_uname)) {
+ fatal_error("uname failed");
}
+ release = kernel_uname.release;
+ sprintf(modules_directory , "%s/%s", prefix, release);
+}
+
+static int load_modules_descriptions(void)
+{
+ char * descr_file = asprintf_("%s/%s", modules_directory, "modules.description");
+ char * buf, * ptr, * start, * end;
+ struct stat s;
+ int line;
+
+ log_message("loading modules descriptions");
- modules_deps = malloc(sizeof(*modules_deps) * (line+1));
+ buf = cat_file(descr_file, &s);
+ if (!buf)
+ return -1;
+ line = line_counts(buf);
+ modules_descr = malloc(sizeof(*modules_descr) * (line+1));
start = buf;
line = 0;
while (start < (buf+s.st_size) && *start) {
- char * tmp_deps[50];
-
end = strchr(start, '\n');
*end = '\0';
- ptr = strchr(start, ':');
+ ptr = strchr(start, '\t');
if (!ptr) {
start = end + 1;
continue;
@@ -122,54 +149,32 @@ static int load_modules_dependencies(void)
*ptr = '\0';
ptr++;
- while (*ptr && (*ptr == ' ')) ptr++;
- if (!*ptr) {
- start = end + 1;
- continue;
- }
-
- /* sort of a good line */
- modules_deps[line].name = strdup(start);
-
- start = ptr;
- i = 0;
- while (start && *start) {
- ptr = strchr(start, ' ');
- if (ptr) *ptr = '\0';
- tmp_deps[i++] = strdup(start);
- if (ptr)
- start = ptr + 1;
- else
- start = NULL;
- while (start && *start && *start == ' ')
- start++;
- }
- tmp_deps[i++] = NULL;
-
- modules_deps[line].deps = memdup(tmp_deps, sizeof(char *) * i);
+ modules_descr[line].modname = filename2modname(start);
+ modules_descr[line].description = strndup(ptr, 50);
line++;
start = end + 1;
}
- modules_deps[line].name = NULL;
+ modules_descr[line].modname = NULL;
+
+ free(buf);
return 0;
}
-
void init_modules_insmoding(void)
{
- if (load_modules_dependencies()) {
- log_message("warning, error initing modules stuff, modules loading disabled");
- disable_modules = 1;
+ find_modules_directory();
+ if (load_modules_descriptions()) {
+ log_message("warning, error initing modules stuff");
}
}
static void add_modules_conf(char * str)
{
- static char data[500] = "";
- char * target = "/etc/modules.conf";
+ static char data[5000] = "";
+ char * target = "/tmp/modules.conf";
int fd;
if (strlen(data) + strlen(str) >= sizeof(data))
@@ -185,98 +190,166 @@ static void add_modules_conf(char * str)
return;
}
- if (write(fd, data, strlen(data) + 1) != strlen(data) + 1)
+ if (write(fd, data, strlen(data) + 1) != (ssize_t) (strlen(data) + 1))
log_perror(str);
close(fd);
}
-static int module_already_present(const char * name)
+int module_already_present(const char * name)
{
FILE * f;
+ struct stat sb;
+ char *path;
int answ = 0;
- f = fopen("/proc/modules", "rb");
- while (1) {
- char buf[500];
- if (!fgets(buf, sizeof(buf), f)) break;
- if (!strncmp(name, buf, strlen(name)))
+
+ if ((f = fopen("/proc/modules", "rb"))) {
+ while (1) {
+ char buf[500];
+ if (!fgets(buf, sizeof(buf), f)) break;
+ if (!strncmp(name, buf, strlen(name)) && buf[strlen(name)] == ' ')
+ answ = 1;
+ }
+ fclose(f);
+ }
+
+ /* built-in module case. try to find them through sysfs */
+ if (!answ) {
+ asprintf(&path, "/sys/module/%s", name);
+ if (!stat(path, &sb))
answ = 1;
+ free(path);
+ }
+ if (!answ) {
+ asprintf(&path, "/sys/fs/%s", name);
+ if (!stat(path, &sb))
+ answ = 1;
+ free(path);
}
- fclose(f);
return answ;
}
-static int insmod_with_deps(const char * mod_name, char * options)
-{
- struct module_deps_elem * dep;
-
- dep = modules_deps;
- while (dep && dep->name && strcmp(dep->name, mod_name)) dep++;
-
- if (dep && dep->name && dep->deps) {
- char ** one_dep;
- one_dep = dep->deps;
- while (*one_dep) {
- /* here, we can fail but we don't care, if the error is
- * important, the desired module will fail also */
- insmod_with_deps(*one_dep, NULL);
- one_dep++;
+#ifndef ENABLE_NETWORK_STANDALONE
+static enum insmod_return insmod_with_deps(const char * alias, char * options) {
+ struct kmod_ctx *ctx;
+ struct kmod_list *l, *list = NULL;
+ int err = 0, flags = 0;
+
+ if (!*modules_directory)
+ find_modules_directory();
+
+ ctx = kmod_new(modules_directory, NULL);
+ if (!ctx) {
+ fputs("Error: kmod_new() failed!\n", stderr);
+ goto exit;
+ }
+ kmod_load_resources(ctx);
+
+ err = kmod_module_new_from_lookup(ctx, alias, &list);
+ if (err < 0)
+ goto exit;
+
+ // No module found...
+ if (list == NULL)
+ goto exit;
+
+ // filter through blacklist
+ struct kmod_list *filtered = NULL;
+ err = kmod_module_apply_filter(ctx, KMOD_FILTER_BLACKLIST, list, &filtered);
+ kmod_module_unref_list(list);
+ if (err < 0)
+ goto exit;
+ list = filtered;
+
+ kmod_list_foreach(l, list) {
+ struct kmod_module *mod = kmod_module_get_module(l);
+ err = kmod_module_probe_insert_module(mod, flags,
+ options, NULL, NULL, NULL);
+
+ if (err >= 0)
+ /* ignore flag return values such as a mod being blacklisted */
+ err = 0;
+ else {
+ switch (err) {
+ case -EEXIST:
+ fprintf(stderr, "could not insert '%s': Module already in kernel\n",
+ kmod_module_get_name(mod));
+ break;
+ case -ENOENT:
+ fprintf(stderr, "could not insert '%s': Unknown symbol in module, "
+ "or unknown parameter (see dmesg)\n",
+ kmod_module_get_name(mod));
+ break;
+ default:
+ fprintf(stderr, "could not insert '%s': %s\n",
+ kmod_module_get_name(mod),
+ strerror(-err));
+ break;
+ }
}
+
+ kmod_module_unref(mod);
+ if (err < 0)
+ break;
}
- if (module_already_present(mod_name))
- return 0;
+ kmod_module_unref_list(list);
+
+exit:
+ kmod_unref(ctx);
- log_message("needs %s", mod_name);
- return insmod_archived_file(mod_name, options);
+ switch (err){
+ case 0:
+ return INSMOD_OK;
+ case -ENOENT:
+ return INSMOD_FAILED_FILE_NOT_FOUND;
+ default:
+ return INSMOD_FAILED;
+ }
}
+#endif
-int my_insmod(const char * mod_name, enum driver_type type, char * options)
+#ifndef DISABLE_NETWORK
+enum insmod_return my_modprobe(const char * mod_name, enum driver_type type, char * options)
+#else
+enum insmod_return my_modprobe(const char * mod_name, enum driver_type type __attribute__ ((unused)), char * options)
+#endif
{
- char alias[500];
int i;
-#ifndef DISABLE_MEDIAS
- static int number_scsi = 0;
-#endif
#ifndef DISABLE_NETWORK
char ** net_devices = NULL; /* fucking compiler */
#endif
- log_message("have to insmod %s", mod_name);
+ if (module_already_present(mod_name))
+ return INSMOD_OK;
- if (disable_modules) {
- log_message("\tdisabled");
- return 0;
- }
+ log_message("have to insmod %s", mod_name);
#ifndef DISABLE_NETWORK
if (type == NETWORK_DEVICES)
net_devices = get_net_devices();
#endif
- if (IS_TESTING)
- return 0;
-
+#ifdef ENABLE_NETWORK_STANDALONE
+ {
+ char *cmd = options ? asprintf_("/sbin/modprobe %s %s", mod_name, options) :
+ asprintf_("/sbin/modprobe %s", mod_name);
+ log_message("running %s", cmd);
+ i = system(cmd);
+ }
+#else
i = insmod_with_deps(mod_name, options);
+#endif
if (i == 0) {
log_message("\tsucceeded %s", mod_name);
-#ifndef DISABLE_MEDIAS
- if (type == SCSI_ADAPTERS) {
- if (number_scsi > 0)
- sprintf(alias, "alias scsi_hostadapter%d %s", number_scsi, mod_name);
- else
- sprintf(alias, "alias scsi_hostadapter %s", mod_name);
- number_scsi++;
- add_modules_conf(alias);
- }
-#endif
#ifndef DISABLE_NETWORK
if (type == NETWORK_DEVICES) {
char ** new_net_devices = get_net_devices();
while (new_net_devices && *new_net_devices) {
+ char alias[500];
char ** ptr = net_devices;
while (ptr && *ptr) {
if (!strcmp(*new_net_devices, *ptr))
@@ -286,7 +359,6 @@ int my_insmod(const char * mod_name, enum driver_type type, char * options)
sprintf(alias, "alias %s %s", *new_net_devices, mod_name);
add_modules_conf(alias);
log_message("NET: %s", alias);
- net_discovered_interface(*new_net_devices);
already_present:
new_net_devices++;
@@ -294,7 +366,7 @@ int my_insmod(const char * mod_name, enum driver_type type, char * options)
}
#endif
} else
- log_message("warning, insmod failed (%s %s)", mod_name, options);
+ log_message("warning, insmod failed (%s %s) (%d)", mod_name, options, i);
return i;
@@ -313,10 +385,10 @@ static enum return_type insmod_with_options(char * mod, enum driver_type type)
strcat(options, mod);
strcat(options, " ");
- strcat(options, answers[0]); // because my_insmod will eventually modify the string
+ strcat(options, answers[0]); // because my_modprobe will eventually modify the string
- if (my_insmod(mod, type, answers[0])) {
- error_message("Insmod failed.");
+ if (my_modprobe(mod, type, answers[0]) != INSMOD_OK) {
+ stg1_error_message("Insmod failed.");
return RETURN_ERROR;
}
@@ -325,32 +397,65 @@ static enum return_type insmod_with_options(char * mod, enum driver_type type)
return RETURN_OK;
}
+static int strsortfunc(const void *a, const void *b)
+{
+ return strcmp(* (char * const *) a, * (char * const *) b);
+}
+
enum return_type ask_insmod(enum driver_type type)
{
- char * mytype;
- char msg[200];
enum return_type results;
char * choice;
+ char ** dlist = list_directory(modules_directory);
+ char ** modules = alloca(sizeof(char *) * (string_array_length(dlist) + 1));
+ char ** descrs = alloca(sizeof(char *) * (string_array_length(dlist) + 1));
+ char ** p_dlist = dlist;
+ char ** p_modules = modules;
+ char ** p_descrs = descrs;
- unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */
+ qsort(dlist, string_array_length(dlist), sizeof(char *), strsortfunc);
- if (type == SCSI_ADAPTERS)
- mytype = "SCSI";
- else if (type == NETWORK_DEVICES)
- mytype = "NET";
- else
- return RETURN_ERROR;
+ unset_automatic(); /* we are in a fallback mode */
- if (disable_modules)
+ while (p_dlist && *p_dlist) {
+ struct module_descr_elem * descr;
+ if (!strstr(*p_dlist, kernel_module_extension())) {
+ p_dlist++;
+ continue;
+ }
+ *p_modules = *p_dlist;
+ *p_descrs = NULL;
+ (*p_modules)[strlen(*p_modules)-strlen(kernel_module_extension())] = '\0'; /* remove trailing .ko.gz */
+
+ descr = modules_descr;
+ while (descr && descr->modname && strcmp(descr->modname, *p_modules)) descr++;
+ if (descr)
+ *p_descrs = descr->description;
+
+ p_dlist++;
+ p_modules++;
+ p_descrs++;
+ }
+ *p_modules = NULL;
+ *p_descrs = NULL;
+
+ if (modules && *modules) {
+ char * mytype;
+ char msg[200];
+ if (type == MEDIA_ADAPTERS)
+ mytype = "MEDIA";
+ else if (type == NETWORK_DEVICES)
+ mytype = "NET";
+ else
+ return RETURN_ERROR;
+
+ snprintf(msg, sizeof(msg), "Which driver should I try to gain %s access?", mytype);
+ results = ask_from_list_comments(msg, modules, descrs, &choice);
+ if (results == RETURN_OK)
+ return insmod_with_options(choice, type);
+ else
+ return results;
+ } else {
return RETURN_BACK;
-
- snprintf(msg, sizeof(msg), "Which driver should I try to gain %s access?", mytype);
-
- results = ask_from_list(msg, mar_list_contents(archive_name), &choice);
-
- if (results == RETURN_OK) {
- choice[strlen(choice)-2] = '\0'; /* remove trailing .o */
- return insmod_with_options(choice, type);
- } else
- return results;
+ }
}
diff --git a/mdk-stage1/modules.h b/mdk-stage1/modules.h
index b1c921b01..1a6d8753f 100644
--- a/mdk-stage1/modules.h
+++ b/mdk-stage1/modules.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -18,15 +18,20 @@
#include "stage1.h"
#include "probing.h"
+enum insmod_return { INSMOD_OK, INSMOD_FAILED, INSMOD_FAILED_FILE_NOT_FOUND };
+
void init_modules_insmoding(void);
-int my_insmod(const char * mod_name, enum driver_type type, char * options);
+void init_firmware_loader(void);
+int insmod_local_file(char * path, char * options);
+enum insmod_return my_modprobe(const char * mod_name, enum driver_type type, char * options);
enum return_type ask_insmod(enum driver_type);
+int module_already_present(const char * name);
-struct module_deps_elem {
- char * name;
- char ** deps;
+struct module_descr_elem {
+ char * modname;
+ char * description;
};
-
+extern int disable_modules;
#endif
diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c
index 171bf30b5..14b2b2fc2 100644
--- a/mdk-stage1/mount.c
+++ b/mdk-stage1/mount.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -19,6 +19,9 @@
*
*/
+// for asprintf:
+#define _GNU_SOURCE
+#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
@@ -26,87 +29,40 @@
#include <sys/stat.h>
#include <sys/types.h>
#include "log.h"
+#include "utils.h"
#include "modules.h"
#include "mount.h"
-#ifndef DISABLE_MEDIAS
/* WARNING: this won't work if the argument is not /dev/ based */
-static int ensure_dev_exists(char *dev)
+int ensure_dev_exists(const char * dev)
{
- int major, minor;
- int type = S_IFBLK; /* my default type is block. don't forget to change for chars */
- char * name;
struct stat buf;
- name = &dev[5]; /* we really need that dev be passed as /dev/something.. */
-
if (!stat(dev, &buf))
return 0; /* if the file already exists, we assume it's correct */
- if (name[0] == 's' && name[1] == 'd') {
- /* SCSI disks */
- major = 8;
- minor = (name[2] - 'a') << 4;
- if (name[3] && name[4])
- minor += 10 + (name[4] - '0');
- else if (name[3])
- minor += (name[3] - '0');
- } else if (name[0] == 'h' && name[1] == 'd') {
- /* IDE disks/cd's */
- if (name[2] == 'a')
- major = 3, minor = 0;
- else if (name[2] == 'b')
- major = 3, minor = 64;
- else if (name[2] == 'c')
- major = 22, minor = 0;
- else if (name[2] == 'd')
- major = 22, minor = 64;
- else if (name[2] == 'e')
- major = 33, minor = 0;
- else if (name[2] == 'f')
- major = 33, minor = 64;
- else if (name[2] == 'g')
- major = 34, minor = 0;
- else if (name[2] == 'h')
- major = 34, minor = 64;
- else
- return -1;
-
- if (name[3] && name[4])
- minor += 10 + (name[4] - '0');
- else if (name[3])
- minor += (name[3] - '0');
- } else if (name[0] == 's' && name[1] == 'c' && name[2] == 'd') {
- /* SCSI cd's */
- major = 11;
- minor = name[3] - '0';
- } else {
- log_message("I don't know how to create device %s, please post bugreport to me!", dev);
- return -1;
- }
+ // give udev some time to create nodes if module was just insmoded:
+ system("udevadm settle");
- if (mknod(dev, type | 0600, makedev(major, minor))) {
- log_perror(dev);
+ if (!stat(dev, &buf)) {
+ log_message("I don't know how to create device %s, please post bugreport to me!", dev);
return -1;
}
return 0;
}
-#endif /* DISABLE_MEDIAS */
/* mounts, creating the device if needed+possible */
-int my_mount(char *dev, char *location, char *fs)
+int my_mount(char *dev, char *location, char *fs, int force_rw)
{
- unsigned long flags;
char * opts = NULL;
struct stat buf;
int rc;
-#ifndef DISABLE_MEDIAS
if (strcmp(fs, "nfs")) {
rc = ensure_dev_exists(dev);
if (rc != 0) {
@@ -114,7 +70,6 @@ int my_mount(char *dev, char *location, char *fs)
return -1;
}
}
-#endif
log_message("mounting %s on %s as type %s", dev, location, fs);
@@ -135,41 +90,20 @@ int my_mount(char *dev, char *location, char *fs)
}
}
- flags = MS_MGC_VAL;
-
#ifndef DISABLE_MEDIAS
- if (!strcmp(fs, "vfat")) {
- my_insmod("vfat", ANY_DRIVER_TYPE, NULL);
+ if (!strcmp(fs, "nfs"))
+ opts = "nolock";
+ if (!strcmp(fs, "vfat"))
opts = "check=relaxed";
- }
-
- if (!strcmp(fs, "reiserfs")) {
- my_insmod("reiserfs", ANY_DRIVER_TYPE, NULL);
- }
-
- if (!strcmp(fs, "iso9660")) {
- my_insmod("isofs", ANY_DRIVER_TYPE, NULL);
- flags |= MS_RDONLY;
- }
#endif
-
-#ifndef DISABLE_NETWORK
- if (!strcmp(fs, "nfs")) {
- int flags = 0;
-
- my_insmod("nfs", ANY_DRIVER_TYPE, NULL);
- flags |= MS_RDONLY;
-
- log_message("preparing nfsmount for %s", dev);
-
- rc = nfsmount_prepare(dev, &flags, &opts);
- if (rc != 0)
- return rc;
+ char *cmd;
+ rc = asprintf(&cmd, "mount %s %s -t %s -o %s%s > /dev/null 2>&1", dev, location, fs, (force_rw ? "" : "ro,"), (opts ? opts : ""));
+ if (rc == -1) {
+ log_perror("asprint allocation failure");
+ rmdir(location);
+ return rc;
}
-#endif
-
- rc = mount(dev, location, fs, flags, opts);
-
+ rc = system(cmd);
if (rc != 0) {
log_perror("mount failed");
rmdir(location);
diff --git a/mdk-stage1/mount.h b/mdk-stage1/mount.h
index b679e5c30..dc8d674c3 100644
--- a/mdk-stage1/mount.h
+++ b/mdk-stage1/mount.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -22,10 +22,7 @@
#ifndef _MOUNT_H_
#define _MOUNT_H_
-#ifndef DISABLE_NETWORK
-#include "nfsmount.h"
-#endif
-
-int my_mount(char *dev, char *location, char *fs);
+int my_mount(char *dev, char *location, char *fs, int force_rw);
+int ensure_dev_exists(const char * dev);
#endif
diff --git a/mdk-stage1/mount_rpcgen.h b/mdk-stage1/mount_rpcgen.h
deleted file mode 100644
index d70ccaf9d..000000000
--- a/mdk-stage1/mount_rpcgen.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Please do not edit this file.
- * It was generated using rpcgen.
- */
-
-#ifndef _MOUNT_H_RPCGEN
-#define _MOUNT_H_RPCGEN
-
-#include <rpc/rpc.h>
-
-#define MNTPATHLEN 1024
-#define MNTNAMLEN 255
-#define FHSIZE 32
-
-typedef char fhandle[FHSIZE];
-#ifdef __cplusplus
-extern "C" bool_t xdr_fhandle(XDR *, fhandle);
-#elif __STDC__
-extern bool_t xdr_fhandle(XDR *, fhandle);
-#else /* Old Style C */
-bool_t xdr_fhandle();
-#endif /* Old Style C */
-
-
-struct fhstatus {
- u_int fhs_status;
- union {
- fhandle fhs_fhandle;
- } fhstatus_u;
-};
-typedef struct fhstatus fhstatus;
-#ifdef __cplusplus
-extern "C" bool_t xdr_fhstatus(XDR *, fhstatus*);
-#elif __STDC__
-extern bool_t xdr_fhstatus(XDR *, fhstatus*);
-#else /* Old Style C */
-bool_t xdr_fhstatus();
-#endif /* Old Style C */
-
-
-typedef char *dirpath;
-#ifdef __cplusplus
-extern "C" bool_t xdr_dirpath(XDR *, dirpath*);
-#elif __STDC__
-extern bool_t xdr_dirpath(XDR *, dirpath*);
-#else /* Old Style C */
-bool_t xdr_dirpath();
-#endif /* Old Style C */
-
-
-typedef char *name;
-#ifdef __cplusplus
-extern "C" bool_t xdr_name(XDR *, name*);
-#elif __STDC__
-extern bool_t xdr_name(XDR *, name*);
-#else /* Old Style C */
-bool_t xdr_name();
-#endif /* Old Style C */
-
-
-typedef struct mountbody *mountlist;
-#ifdef __cplusplus
-extern "C" bool_t xdr_mountlist(XDR *, mountlist*);
-#elif __STDC__
-extern bool_t xdr_mountlist(XDR *, mountlist*);
-#else /* Old Style C */
-bool_t xdr_mountlist();
-#endif /* Old Style C */
-
-
-struct mountbody {
- name ml_hostname;
- dirpath ml_directory;
- mountlist ml_next;
-};
-typedef struct mountbody mountbody;
-#ifdef __cplusplus
-extern "C" bool_t xdr_mountbody(XDR *, mountbody*);
-#elif __STDC__
-extern bool_t xdr_mountbody(XDR *, mountbody*);
-#else /* Old Style C */
-bool_t xdr_mountbody();
-#endif /* Old Style C */
-
-
-typedef struct groupnode *groups;
-#ifdef __cplusplus
-extern "C" bool_t xdr_groups(XDR *, groups*);
-#elif __STDC__
-extern bool_t xdr_groups(XDR *, groups*);
-#else /* Old Style C */
-bool_t xdr_groups();
-#endif /* Old Style C */
-
-
-struct groupnode {
- name gr_name;
- groups gr_next;
-};
-typedef struct groupnode groupnode;
-#ifdef __cplusplus
-extern "C" bool_t xdr_groupnode(XDR *, groupnode*);
-#elif __STDC__
-extern bool_t xdr_groupnode(XDR *, groupnode*);
-#else /* Old Style C */
-bool_t xdr_groupnode();
-#endif /* Old Style C */
-
-
-typedef struct exportnode *exports;
-#ifdef __cplusplus
-extern "C" bool_t xdr_exports(XDR *, exports*);
-#elif __STDC__
-extern bool_t xdr_exports(XDR *, exports*);
-#else /* Old Style C */
-bool_t xdr_exports();
-#endif /* Old Style C */
-
-
-struct exportnode {
- dirpath ex_dir;
- groups ex_groups;
- exports ex_next;
-};
-typedef struct exportnode exportnode;
-#ifdef __cplusplus
-extern "C" bool_t xdr_exportnode(XDR *, exportnode*);
-#elif __STDC__
-extern bool_t xdr_exportnode(XDR *, exportnode*);
-#else /* Old Style C */
-bool_t xdr_exportnode();
-#endif /* Old Style C */
-
-
-#define MOUNTPROG ((u_long)100005)
-#define MOUNTVERS ((u_long)1)
-
-#ifdef __cplusplus
-#define MOUNTPROC_NULL ((u_long)0)
-extern "C" void * mountproc_null_1(void *, CLIENT *);
-extern "C" void * mountproc_null_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_MNT ((u_long)1)
-extern "C" fhstatus * mountproc_mnt_1(dirpath *, CLIENT *);
-extern "C" fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *);
-#define MOUNTPROC_DUMP ((u_long)2)
-extern "C" mountlist * mountproc_dump_1(void *, CLIENT *);
-extern "C" mountlist * mountproc_dump_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_UMNT ((u_long)3)
-extern "C" void * mountproc_umnt_1(dirpath *, CLIENT *);
-extern "C" void * mountproc_umnt_1_svc(dirpath *, struct svc_req *);
-#define MOUNTPROC_UMNTALL ((u_long)4)
-extern "C" void * mountproc_umntall_1(void *, CLIENT *);
-extern "C" void * mountproc_umntall_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_EXPORT ((u_long)5)
-extern "C" exports * mountproc_export_1(void *, CLIENT *);
-extern "C" exports * mountproc_export_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_EXPORTALL ((u_long)6)
-extern "C" exports * mountproc_exportall_1(void *, CLIENT *);
-extern "C" exports * mountproc_exportall_1_svc(void *, struct svc_req *);
-
-#elif __STDC__
-#define MOUNTPROC_NULL ((u_long)0)
-extern void * mountproc_null_1(void *, CLIENT *);
-extern void * mountproc_null_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_MNT ((u_long)1)
-extern fhstatus * mountproc_mnt_1(dirpath *, CLIENT *);
-extern fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *);
-#define MOUNTPROC_DUMP ((u_long)2)
-extern mountlist * mountproc_dump_1(void *, CLIENT *);
-extern mountlist * mountproc_dump_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_UMNT ((u_long)3)
-extern void * mountproc_umnt_1(dirpath *, CLIENT *);
-extern void * mountproc_umnt_1_svc(dirpath *, struct svc_req *);
-#define MOUNTPROC_UMNTALL ((u_long)4)
-extern void * mountproc_umntall_1(void *, CLIENT *);
-extern void * mountproc_umntall_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_EXPORT ((u_long)5)
-extern exports * mountproc_export_1(void *, CLIENT *);
-extern exports * mountproc_export_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_EXPORTALL ((u_long)6)
-extern exports * mountproc_exportall_1(void *, CLIENT *);
-extern exports * mountproc_exportall_1_svc(void *, struct svc_req *);
-
-#else /* Old Style C */
-#define MOUNTPROC_NULL ((u_long)0)
-extern void * mountproc_null_1();
-extern void * mountproc_null_1_svc();
-#define MOUNTPROC_MNT ((u_long)1)
-extern fhstatus * mountproc_mnt_1();
-extern fhstatus * mountproc_mnt_1_svc();
-#define MOUNTPROC_DUMP ((u_long)2)
-extern mountlist * mountproc_dump_1();
-extern mountlist * mountproc_dump_1_svc();
-#define MOUNTPROC_UMNT ((u_long)3)
-extern void * mountproc_umnt_1();
-extern void * mountproc_umnt_1_svc();
-#define MOUNTPROC_UMNTALL ((u_long)4)
-extern void * mountproc_umntall_1();
-extern void * mountproc_umntall_1_svc();
-#define MOUNTPROC_EXPORT ((u_long)5)
-extern exports * mountproc_export_1();
-extern exports * mountproc_export_1_svc();
-#define MOUNTPROC_EXPORTALL ((u_long)6)
-extern exports * mountproc_exportall_1();
-extern exports * mountproc_exportall_1_svc();
-#endif /* Old Style C */
-
-#endif /* !_MOUNT_H_RPCGEN */
diff --git a/mdk-stage1/network.c b/mdk-stage1/network.c
index 9a07fa34a..ab512399a 100644
--- a/mdk-stage1/network.c
+++ b/mdk-stage1/network.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -19,35 +19,47 @@
*
*/
+#include "stage1.h"
+
#include <stdlib.h>
-#include <unistd.h>
#include <string.h>
+#include <unistd.h>
#include <sys/socket.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <net/route.h>
-#include <resolv.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <stdio.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include <resolv.h>
+#include <sys/utsname.h>
-#include "stage1.h"
#include "frontend.h"
#include "modules.h"
#include "probing.h"
#include "log.h"
-#include "dns.h"
+#include "tools.h"
+#include "utils.h"
#include "mount.h"
#include "automatic.h"
#include "dhcp.h"
+#include "adsl.h"
#include "url.h"
+#include "dns.h"
#include "network.h"
+#include "directory.h"
+#include "wireless.h"
+#ifndef DISABLE_KA
+#include "ka.h"
+#endif
static void error_message_net(void) /* reduce code size */
{
- error_message("Could not configure network.");
+ stg1_error_message("Could not configure network.");
}
@@ -166,7 +178,16 @@ int configure_net_device(struct interface_info * intf)
close(s);
intf->is_up = 1;
-
+
+ if (intf->boot_proto != BOOTPROTO_DHCP && !streq(intf->device, "lo")) {
+ /* I need to sleep a bit in order for kernel to finish
+ init of the network device; if not, first sendto() for
+ gethostbyaddr will get an EINVAL. */
+ wait_message("Bringing up networking...");
+ sleep(2);
+ remove_wait_message();
+ }
+
return 0;
}
@@ -226,7 +247,8 @@ static int add_default_route(void)
}
-static int write_resolvconf(void) {
+static int write_resolvconf(void)
+{
char * filename = "/etc/resolv.conf";
FILE * f;
@@ -254,16 +276,12 @@ static int write_resolvconf(void) {
}
-static int save_netinfo(struct interface_info * intf) {
+static int save_netinfo(struct interface_info * intf)
+{
char * file_network = "/tmp/network";
char file_intf[500];
FILE * f;
- if (dns_server.s_addr == 0) {
- log_message("resolvconf needs a dns server");
- return -1;
- }
-
f = fopen(file_network, "w");
if (!f) {
log_perror(file_network);
@@ -273,11 +291,8 @@ static int save_netinfo(struct interface_info * intf) {
fprintf(f, "NETWORKING=yes\n");
fprintf(f, "FORWARD_IPV4=false\n");
- if (hostname)
+ if (hostname && !(intf->boot_proto == BOOTPROTO_DHCP))
fprintf(f, "HOSTNAME=%s\n", hostname);
- if (domain)
- fprintf(f, "DOMAINNAME=%s\n", domain);
-
if (gateway.s_addr != 0)
fprintf(f, "GATEWAY=%s\n", inet_ntoa(gateway));
@@ -295,14 +310,27 @@ static int save_netinfo(struct interface_info * intf) {
fprintf(f, "DEVICE=%s\n", intf->device);
- if (intf->boot_proto == BOOTPROTO_DHCP)
+ if (intf->boot_proto == BOOTPROTO_DHCP) {
fprintf(f, "BOOTPROTO=dhcp\n");
- else {
+ if (dhcp_hostname && !streq(dhcp_hostname, ""))
+ fprintf(f, "DHCP_HOSTNAME=%s\n", dhcp_hostname);
+ } else if (intf->boot_proto == BOOTPROTO_STATIC) {
fprintf(f, "BOOTPROTO=static\n");
fprintf(f, "IPADDR=%s\n", inet_ntoa(intf->ip));
fprintf(f, "NETMASK=%s\n", inet_ntoa(intf->netmask));
fprintf(f, "NETWORK=%s\n", inet_ntoa(intf->network));
fprintf(f, "BROADCAST=%s\n", inet_ntoa(intf->broadcast));
+ if (domain)
+ fprintf(f, "DOMAIN=%s\n", domain);
+ if (dns_server.s_addr != 0)
+ fprintf(f, "DNS1=%s\n", inet_ntoa(dns_server));
+ if (dns_server2.s_addr != 0)
+ fprintf(f, "DNS2=%s\n", inet_ntoa(dns_server2));
+ } else if (intf->boot_proto == BOOTPROTO_ADSL_PPPOE) {
+ fprintf(f, "BOOTPROTO=adsl_pppoe\n");
+ fprintf(f, "USER=%s\n", intf->user);
+ fprintf(f, "PASS=%s\n", intf->pass);
+ fprintf(f, "ACNAME=%s\n", intf->acname);
}
fclose(f);
@@ -316,9 +344,11 @@ char * guess_netmask(char * ip_addr)
struct in_addr addr;
unsigned long int tmp;
- if (!inet_aton(ip_addr, &addr))
+ if (streq(ip_addr, "") || !inet_aton(ip_addr, &addr))
return "";
+ log_message("guessing netmask");
+
tmp = ntohl(addr.s_addr);
if (((tmp & 0xFF000000) >> 24) <= 127)
@@ -330,12 +360,27 @@ char * guess_netmask(char * ip_addr)
}
+char * guess_domain_from_hostname(char *hostname)
+{
+ char *domain = strchr(strdup(hostname), '.');
+ if (!domain || domain[1] == '\0') {
+ log_message("unable to guess domain from hostname: %s", hostname);
+ return NULL;
+ }
+ return domain + 1; /* skip '.' */
+}
+
+
static void static_ip_callback(char ** strings)
{
struct in_addr addr;
- if (!inet_aton(strings[0], &addr))
+ static int done = 0;
+ if (done)
+ return;
+ if (streq(strings[0], "") || !inet_aton(strings[0], &addr))
return;
+ done = 1;
if (!strcmp(strings[1], "")) {
char * ptr;
@@ -356,11 +401,11 @@ static void static_ip_callback(char ** strings)
static enum return_type setup_network_interface(struct interface_info * intf)
{
enum return_type results;
- char * bootprotos[] = { "Static", "DHCP", NULL };
- char * bootprotos_auto[] = { "static", "dhcp" };
+ char * bootprotos[] = { "DHCP", "Static", "ADSL", NULL };
+ char * bootprotos_auto[] = { "dhcp", "static", "adsl" };
char * choice;
- results = ask_from_list_auto("Please choose the desired IP attribution.", bootprotos, &choice, "network", bootprotos_auto);
+ results = ask_from_list_auto("Please select your network connection type.", bootprotos, &choice, "network", bootprotos_auto);
if (results != RETURN_OK)
return results;
@@ -370,13 +415,13 @@ static enum return_type setup_network_interface(struct interface_info * intf)
static char ** answers = NULL;
struct in_addr addr;
- results = ask_from_entries_auto("Please enter the network information. (leave netmask void for Internet standard)",
+ results = ask_from_entries_auto("Please enter the network information. (leave netmask blank for Internet standard)",
questions, &answers, 16, questions_auto, static_ip_callback);
if (results != RETURN_OK)
return setup_network_interface(intf);
- if (!inet_aton(answers[0], &addr)) {
- error_message("Invalid IP address.");
+ if (streq(answers[0], "") || !inet_aton(answers[0], &addr)) {
+ stg1_error_message("Invalid IP address.");
return setup_network_interface(intf);
}
memcpy(&intf->ip, &addr, sizeof(addr));
@@ -386,17 +431,23 @@ static enum return_type setup_network_interface(struct interface_info * intf)
dns_server.s_addr = 0; /* keep an understandable state */
}
+ if (streq(answers[0], answers[1])) {
+ log_message("IP and DNS are the same, guess you don't want a DNS, disabling it");
+ dns_server.s_addr = 0; /* keep an understandable state */
+ }
+
if (!inet_aton(answers[2], &gateway)) {
log_message("invalid gateway");
gateway.s_addr = 0; /* keep an understandable state */
}
- if (!inet_aton(answers[3], &addr)) {
- log_message("invalid netmask -- back to the guess");
- inet_aton(guess_netmask(answers[0]), &addr);
- }
- else
+ if ((streq(answers[3], "") && inet_aton(guess_netmask(answers[0]), &addr))
+ || inet_aton(answers[3], &addr))
memcpy(&intf->netmask, &addr, sizeof(addr));
+ else {
+ stg1_error_message("Invalid netmask.");
+ return setup_network_interface(intf);
+ }
*((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) &
*((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask));
@@ -411,7 +462,11 @@ static enum return_type setup_network_interface(struct interface_info * intf)
intf->is_ptp = 0;
}
intf->boot_proto = BOOTPROTO_STATIC;
- } else {
+
+ if (configure_net_device(intf))
+ return RETURN_ERROR;
+
+ } else if (streq(choice, "DHCP")) {
results = perform_dhcp(intf);
if (results == RETURN_BACK)
@@ -419,48 +474,61 @@ static enum return_type setup_network_interface(struct interface_info * intf)
if (results == RETURN_ERROR)
return results;
intf->boot_proto = BOOTPROTO_DHCP;
- }
-
- if (configure_net_device(intf))
+
+ if (configure_net_device(intf))
+ return RETURN_ERROR;
+
+ } else if (streq(choice, "ADSL")) {
+ results = perform_adsl(intf);
+
+ if (results == RETURN_BACK)
+ return setup_network_interface(intf);
+ if (results == RETURN_ERROR)
+ return results;
+ } else
return RETURN_ERROR;
+
return add_default_route();
}
static enum return_type configure_network(struct interface_info * intf)
{
- char ips[50];
- char * name;
+ char * dnshostname;
if (hostname && domain)
return RETURN_OK;
- wait_message("Trying to resolve hostname...");
- strcpy(ips, inet_ntoa(intf->ip));
- name = mygethostbyaddr(ips);
- remove_wait_message();
-
- if (name) {
- hostname = strdup(name);
- domain = strchr(strdup(name), '.') + 1;
- log_message("got hostname and domain from dns entry, %s and %s", hostname, domain);
- return RETURN_OK;
- }
+ dnshostname = mygethostbyaddr(inet_ntoa(intf->ip));
- log_message("reverse name lookup on self failed");
+ if (dnshostname) {
+ if (intf->boot_proto == BOOTPROTO_STATIC)
+ hostname = strdup(dnshostname);
+ domain = guess_domain_from_hostname(dnshostname);
+ if (domain) {
+ log_message("got hostname and domain from dns entry, %s and %s", dnshostname, domain);
+ return RETURN_OK;
+ }
+ } else
+ log_message("reverse name lookup on self failed");
if (domain)
return RETURN_OK;
+ dnshostname = NULL;
if (dns_server.s_addr != 0) {
wait_message("Trying to resolve dns...");
- strcpy(ips, inet_ntoa(dns_server));
- name = mygethostbyaddr(ips);
+ dnshostname = mygethostbyaddr(inet_ntoa(dns_server));
remove_wait_message();
- }
-
- if (name) {
- domain = strchr(strdup(name), '.') + 1;
+ if (dnshostname) {
+ log_message("got DNS fullname, %s", dnshostname);
+ domain = guess_domain_from_hostname(dnshostname);
+ } else
+ log_message("reverse name lookup on DNS failed");
+ } else
+ log_message("no DNS, unable to guess domain");
+
+ if (domain) {
log_message("got domain from DNS fullname, %s", domain);
} else {
enum return_type results;
@@ -468,15 +536,21 @@ static enum return_type configure_network(struct interface_info * intf)
char * questions_auto[] = { "hostname", "domain" };
static char ** answers = NULL;
char * boulet;
-
- log_message("reverse name lookup on DNS failed");
-
- results = ask_from_entries_auto("I could not guess hostname and domain name; please fill in this information. "
- "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for "
- "domain name, for a machine called `mybox.mynetwork.com' on the Internet.",
- questions, &answers, 32, questions_auto, NULL);
- if (results != RETURN_OK)
+
+ if (dhcp_hostname || dhcp_domain) {
+ answers = (char **) calloc(1, sizeof(questions));
+ answers[0] = strdup(dhcp_hostname);
+ answers[1] = strdup(dhcp_domain);
+ }
+
+ if (!dhcp_hostname || !dhcp_domain) {
+ results = ask_from_entries_auto("I could not guess hostname and domain name; please fill in this information. "
+ "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for "
+ "domain name, for a machine called `mybox.mynetwork.com' on the Internet.",
+ questions, &answers, 32, questions_auto, NULL);
+ if (results != RETURN_OK)
return results;
+ }
hostname = answers[0];
if ((boulet = strchr(hostname, '.')) != NULL)
@@ -484,6 +558,9 @@ static enum return_type configure_network(struct interface_info * intf)
domain = answers[1];
}
+ log_message("using hostname %s", hostname);
+ log_message("using domain %s", domain);
+
return RETURN_OK;
}
@@ -491,17 +568,34 @@ static enum return_type configure_network(struct interface_info * intf)
static enum return_type bringup_networking(struct interface_info * intf)
{
static struct interface_info loopback;
- enum return_type results = RETURN_ERROR;
-
- my_insmod("af_packet", ANY_DRIVER_TYPE, NULL);
+ enum return_type results;
+ int fd;
- while (results != RETURN_OK) {
+ /* try to find if module already loaded or built-in to avoid failing */
+ /* badly */
+ fd = open("/proc/net/packet", O_RDONLY);
+ if (fd < 0)
+ my_modprobe("af_packet", ANY_DRIVER_TYPE, NULL);
+ else
+ close(fd);
+
+ do {
+ results = configure_wireless(intf->device);
+ } while (results == RETURN_ERROR);
+
+ if (results == RETURN_BACK)
+ return RETURN_BACK;
+
+ do {
results = setup_network_interface(intf);
if (results != RETURN_OK)
return results;
write_resolvconf();
results = configure_network(intf);
- }
+ } while (results == RETURN_ERROR);
+
+ if (results == RETURN_BACK)
+ return bringup_networking(intf);
write_resolvconf(); /* maybe we have now domain to write also */
@@ -523,6 +617,63 @@ static enum return_type bringup_networking(struct interface_info * intf)
}
+static char * auto_select_up_intf(int detection_mode)
+{
+#define SIOCETHTOOL 0x8946
+#define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */
+
+ struct ethtool_value {
+ uint32_t cmd;
+ uint32_t data;
+ };
+
+ char ** interfaces, ** ptr;
+ interfaces = get_net_devices();
+
+ int s;
+ s = socket(AF_INET, SOCK_DGRAM, 0);
+ if (s < 0) {
+ return NULL;
+ }
+
+ ptr = interfaces;
+ while (ptr && *ptr) {
+ if (detection_mode != AUTO_DETECTION_WIRED || !wireless_is_aware(s, *interfaces)) {
+ struct ifreq ifr;
+ struct ethtool_value edata;
+ strncpy(ifr.ifr_name, *ptr, IFNAMSIZ);
+ edata.cmd = ETHTOOL_GLINK;
+ ifr.ifr_data = (caddr_t)&edata;
+ if (ioctl(s, SIOCETHTOOL, &ifr) == 0 && edata.data) {
+ close(s);
+ log_message("NETWORK: choosing interface %s (link beat detected)", *ptr);
+ return *ptr;
+ }
+ }
+ ptr++;
+ }
+
+ log_message("NETWORK: no interface has a link beat");
+
+ if (detection_mode == AUTO_DETECTION_WIRED) {
+ ptr = interfaces;
+ while (ptr && *ptr) {
+ if (!wireless_is_aware(s, *interfaces)) {
+ close(s);
+ log_message("NETWORK: choosing interface %s (wired interface)", *ptr);
+ return *ptr;
+ }
+ ptr++;
+ }
+ log_message("NETWORK: no interface is wired");
+ }
+
+ close(s);
+
+ return NULL;
+}
+
+
static char * interface_select(void)
{
char ** interfaces, ** ptr;
@@ -540,7 +691,7 @@ static char * interface_select(void)
}
if (count == 0) {
- error_message("No NET device found.");
+ stg1_error_message("No NET device found.");
i = ask_insmod(NETWORK_DEVICES);
if (i == RETURN_BACK)
return NULL;
@@ -550,6 +701,20 @@ static char * interface_select(void)
if (count == 1)
return *interfaces;
+ /* this can't be done in ask_from_list_comments_auto because "auto" and "wired" are not in the interfaces list */
+ if (IS_AUTOMATIC) {
+ enum auto_detection_type auto_detect = AUTO_DETECTION_NONE;
+ if (streq(get_auto_value("interface"), "auto"))
+ auto_detect = AUTO_DETECTION_ALL;
+ else if (streq(get_auto_value("interface"), "wired"))
+ auto_detect = AUTO_DETECTION_WIRED;
+ if (auto_detect != AUTO_DETECTION_NONE) {
+ choice = auto_select_up_intf(auto_detect);
+ if (choice)
+ return choice;
+ }
+ }
+
i = 0;
while (interfaces[i]) {
descriptions[i] = get_net_intf_description(interfaces[i]);
@@ -565,12 +730,171 @@ static char * interface_select(void)
return choice;
}
+static enum return_type get_http_proxy(char **http_proxy_host, char **http_proxy_port)
+{
+ char *questions[] = { "HTTP proxy host", "HTTP proxy port", NULL };
+ char *questions_auto[] = { "proxy_host", "proxy_port", NULL };
+ static char ** answers = NULL;
+ enum return_type results;
+
+ results = ask_from_entries_auto("Please enter HTTP proxy host and port if you need it, else leave them blank or cancel.",
+ questions, &answers, 40, questions_auto, NULL);
+ if (results == RETURN_OK) {
+ *http_proxy_host = answers[0];
+ *http_proxy_port = answers[1];
+ } else {
+ *http_proxy_host = NULL;
+ *http_proxy_port = NULL;
+ }
+
+ return results;
+}
+
+
+static int url_split(const char *url, const char *protocol, char **host, char **path)
+{
+ char *protocol_sep, *host_sep;
+
+ protocol_sep = strstr(url, "://");
+ if (!protocol_sep) {
+ log_message("NETWORK: no protocol in \"%s\"", url);
+ return -1;
+ }
+
+ if (strncmp(protocol, url, protocol_sep - url))
+ return -1;
+
+ url = protocol_sep + 3;
+ host_sep = strchr(url, '/');
+ if (!host_sep || host_sep == url) {
+ log_message("NETWORK: no hostname in \"%s\"", url);
+ return -1;
+ }
+
+ *host = strndup(url, host_sep - url);
+ *path = strdup(host_sep);
+
+ return 0;
+}
+
+#define MIRRORLIST_MAX_ITEMS 500
+typedef char *mirrorlist_t[2][MIRRORLIST_MAX_ITEMS+1];
+
+static enum return_type get_mirrorlist(mirrorlist_t mirrorlist, int start, char *version, const char *protocol, char *http_proxy_host, char *http_proxy_port) {
+ int fd, size, line_pos = 0;
+ char path[1024];
+ char line[1024];
+ char type[100] = DISTRIB_TYPE;
+ int mirror_idx = start;
+
+ int use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, "");
+ lowercase(type);
+ snprintf(path, sizeof(path), "%s/%s.%s.%s.list", MIRRORLIST_PATH, type, version, ARCH);
+
+ fd = http_download_file(MIRRORLIST_HOST, path, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port);
+ if (fd < 0) {
+ log_message("HTTP: unable to get mirrors list from %s (%s)", MIRRORLIST_HOST, path);
+ return RETURN_ERROR;
+ }
+
+ while (read(fd, line + line_pos, 1) > 0) {
+ if (line[line_pos] == '\n') {
+ char *url;
+ line[line_pos] = '\0';
+ line_pos = 0;
+
+ /* skip medium if it does not look like a distrib path */
+ if (!strstr(line, ",type=distrib,"))
+ continue;
+
+ url = strstr(line, ",url=");
+ if (!url)
+ continue;
+ url += 5;
+
+ if (url_split(url, protocol, &mirrorlist[0][mirror_idx], &mirrorlist[1][mirror_idx]) < 0)
+ continue;
+
+ mirror_idx++;
+ } else {
+ line_pos++;
+ }
+
+ if (mirror_idx >= MIRRORLIST_MAX_ITEMS)
+ break;
+ }
+ close(fd);
+
+ mirrorlist[0][mirror_idx] = NULL;
+ mirrorlist[1][mirror_idx] = NULL;
+
+ return RETURN_OK;
+}
+
+static int choose_mirror_from_host_list(mirrorlist_t mirrorlist, char **selected_host, char **filepath)
+{
+ enum return_type results;
+ int mirror_idx = 0;
+
+ do {
+ results = ask_from_list_index("Please select a mirror from the list below.",
+ mirrorlist[0], NULL, &mirror_idx);
+
+ if (results == RETURN_BACK) {
+ return RETURN_ERROR;
+ } else if (results == RETURN_OK) {
+ if (mirror_idx == 0) {
+ /* enter the mirror manually */
+ return RETURN_OK;
+ }
+ *selected_host = strdup(mirrorlist[0][mirror_idx]);
+ *filepath = strdup(mirrorlist[1][mirror_idx]);
+ return RETURN_OK;
+ }
+ } while (results == RETURN_ERROR);
+
+ return RETURN_ERROR;
+}
+
+
+static int choose_mirror_from_list(char *http_proxy_host, char *http_proxy_port, const char *protocol, char **selected_host, char **filepath)
+{
+ enum return_type results;
+ char *versions[] = { "Specify the mirror manually", DISTRIB_NAME " " DISTRIB_VERSION, NULL };
+ char *version = DISTRIB_NAME " " DISTRIB_VERSION;
+
+ do {
+ results = ask_from_list("Please select a medium from the list below.", versions, &version);
+
+ if (results == RETURN_BACK) {
+ return RETURN_BACK;
+ } else if (results == RETURN_OK) {
+ if (!strcmp(version, versions[0])) {
+ /* enter the mirror manually */
+ return RETURN_OK;
+ } else {
+ /* a medium has been selected */
+ mirrorlist_t mirrorlist;
+ mirrorlist[0][0] = "Specify the mirror manually";
+ mirrorlist[1][0] = NULL;
+
+ results = get_mirrorlist(mirrorlist, 1, DISTRIB_VERSION, protocol, http_proxy_host, http_proxy_port);
+ if (results == RETURN_ERROR)
+ return RETURN_ERROR;
+
+ results = choose_mirror_from_host_list(mirrorlist, selected_host, filepath);
+ }
+ }
+ } while (results == RETURN_ERROR);
+
+ return results;
+}
/* -=-=-- */
-static enum return_type intf_select_and_up(void)
+enum return_type intf_select_and_up()
{
static struct interface_info intf[20];
static int num_interfaces = 0;
@@ -597,7 +921,7 @@ static enum return_type intf_select_and_up(void)
if (results == RETURN_OK)
save_netinfo(sel_intf);
-
+
return results;
}
@@ -609,7 +933,7 @@ enum return_type nfs_prepare(void)
char * questions_auto[] = { "server", "directory", NULL };
static char ** answers = NULL;
char * nfsmount_location;
- enum return_type results = intf_select_and_up();
+ enum return_type results = intf_select_and_up(NULL, NULL);
if (results != RETURN_OK)
return results;
@@ -618,41 +942,31 @@ enum return_type nfs_prepare(void)
results = ask_from_entries_auto("Please enter the name or IP address of your NFS server, "
"and the directory containing the " DISTRIB_NAME " Distribution.",
questions, &answers, 40, questions_auto, NULL);
- if (results != RETURN_OK)
+ if (results != RETURN_OK || streq(answers[0], "")) {
+ unset_automatic(); /* we are in a fallback mode */
return nfs_prepare();
+ }
nfsmount_location = malloc(strlen(answers[0]) + strlen(answers[1]) + 2);
strcpy(nfsmount_location, answers[0]);
strcat(nfsmount_location, ":");
strcat(nfsmount_location, answers[1]);
- if (my_mount(nfsmount_location, IMAGE_LOCATION, "nfs") == -1) {
- error_message("I can't mount the directory from the NFS server.");
+ if (my_mount(nfsmount_location, MEDIA_LOCATION, "nfs", 0) == -1) {
+ stg1_error_message("I can't mount the directory from the NFS server.");
results = RETURN_BACK;
continue;
}
+ free(nfsmount_location); nfsmount_location = NULL;
- if (access(IMAGE_LOCATION LIVE_LOCATION, R_OK)) {
- error_message("That NFS volume does not seem to contain the " DISTRIB_NAME " Distribution.");
- umount(IMAGE_LOCATION);
- results = RETURN_BACK;
- }
+ results = try_with_directory(MEDIA_LOCATION, "nfs", "nfs-iso");
+ if (results != RETURN_OK)
+ umount(MEDIA_LOCATION);
+ if (results == RETURN_ERROR)
+ return RETURN_ERROR;
}
while (results == RETURN_BACK);
- log_message("found the " DISTRIB_NAME " Installation, good news!");
-
- if (IS_SPECIAL_STAGE2) {
- if (load_ramdisk() != RETURN_OK) {
- error_message("Could not load program into memory.");
- return nfs_prepare();
- }
- }
-
- if (IS_RESCUE)
- umount(IMAGE_LOCATION);
-
- method_name = strdup("nfs");
return RETURN_OK;
}
@@ -663,10 +977,13 @@ enum return_type ftp_prepare(void)
char * questions_auto[] = { "server", "directory", "user", "pass", NULL };
static char ** answers = NULL;
enum return_type results;
+ struct utsname kernel_uname;
+ char *http_proxy_host, *http_proxy_port;
+ int use_http_proxy;
if (!ramdisk_possible()) {
- error_message("FTP install needs more than %d Mbytes of memory (detected %d Mbytes).",
- MEM_LIMIT_RAMDISK, total_memory());
+ stg1_error_message("FTP install needs more than %d Mbytes of memory (detected %d Mbytes). You may want to try an NFS install.",
+ MEM_LIMIT_DRAKX, total_memory());
return RETURN_ERROR;
}
@@ -675,65 +992,138 @@ enum return_type ftp_prepare(void)
if (results != RETURN_OK)
return results;
+ get_http_proxy(&http_proxy_host, &http_proxy_port);
+ use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, "");
+
+ uname(&kernel_uname);
+
do {
char location_full[500];
- int ftp_serv_response;
+ int ftp_serv_response = -1;
int fd, size;
+ int need_arch = 0;
+ char ftp_hostname[500];
+
+ if (!IS_AUTOMATIC) {
+ if (answers == NULL)
+ answers = (char **) calloc(1, sizeof(questions));
+
+ results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "ftp", &answers[0], &answers[1]);
+
+ if (results == RETURN_BACK)
+ return ftp_prepare();
+
+ if (use_http_proxy) {
+ results = ask_yes_no("Do you want to use this HTTP proxy for FTP connections too ?");
+
+ if (results == RETURN_BACK)
+ return ftp_prepare();
+
+ use_http_proxy = results == RETURN_OK;
+ }
+ }
results = ask_from_entries_auto("Please enter the name or IP address of the FTP server, "
"the directory containing the " DISTRIB_NAME " Distribution, "
- "and the login/pass if necessary (leave login blank for anonymous).",
+ "and the login/pass if necessary (leave login blank for anonymous). ",
questions, &answers, 40, questions_auto, NULL);
- if (results != RETURN_OK)
+ if (results != RETURN_OK || streq(answers[0], "")) {
+ unset_automatic(); /* we are in a fallback mode */
return ftp_prepare();
-
- log_message("FTP: trying to connect to %s", answers[0]);
-
- ftp_serv_response = ftp_open_connection(answers[0], answers[2], answers[3], "");
- if (ftp_serv_response < 0) {
- log_message("FTP: error connect %d", ftp_serv_response);
- if (ftp_serv_response == FTPERR_BAD_HOSTNAME)
- error_message("Error: bad hostname.");
- else if (ftp_serv_response == FTPERR_FAILED_CONNECT)
- error_message("Error: failed to connect to remote host.");
- else
- error_message("Error: couldn't connect.");
- results = RETURN_BACK;
- continue;
}
- strcpy(location_full, answers[1]);
- strcat(location_full, get_ramdisk_realname());
+ strcpy(location_full, answers[1][0] == '/' ? "" : "/");
+ strcat(location_full, answers[1]);
+
+ if (use_http_proxy) {
+ log_message("FTP: don't connect to %s directly, will use proxy", answers[0]);
+ } else {
+ log_message("FTP: trying to connect to %s", answers[0]);
+ ftp_serv_response = ftp_open_connection(answers[0], answers[2], answers[3], "");
+ if (ftp_serv_response < 0) {
+ log_message("FTP: error connect %d", ftp_serv_response);
+ if (ftp_serv_response == FTPERR_BAD_HOSTNAME)
+ stg1_error_message("Error: bad hostname.");
+ else if (ftp_serv_response == FTPERR_FAILED_CONNECT)
+ stg1_error_message("Error: failed to connect to remote host.");
+ else
+ stg1_error_message("Error: couldn't connect.");
+ results = RETURN_BACK;
+ continue;
+ }
+ }
+
+ strcat(location_full, COMPRESSED_FILE_REL("/"));
log_message("FTP: trying to retrieve %s", location_full);
- fd = ftp_start_download(ftp_serv_response, location_full, &size);
+ if (use_http_proxy) {
+ if (strcmp(answers[2], "")) {
+ strcpy(ftp_hostname, answers[2]); /* user name */
+ strcat(ftp_hostname, ":");
+ strcat(ftp_hostname, answers[3]); /* password */
+ strcat(ftp_hostname, "@");
+ } else {
+ strcpy(ftp_hostname, "");
+ }
+ strcat(ftp_hostname, answers[0]);
+ fd = http_download_file(ftp_hostname, location_full, &size, "ftp", http_proxy_host, http_proxy_port);
+ } else {
+ fd = ftp_start_download(ftp_serv_response, location_full, &size);
+ }
+
+ /* Try arched directory */
if (fd < 0) {
- log_message("FTP: error get %d", fd);
- if (fd == FTPERR_PASSIVE_ERROR)
- error_message("Error: error with passive connection.");
- else if (fd == FTPERR_FILE_NOT_FOUND)
- error_message("Error: file not found (%s).", location_full);
- else if (fd == FTPERR_BAD_SERVER_RESPONSE)
- error_message("Error: bad server response (server too busy?).");
- else
- error_message("Error: couldn't retrieve Installation program.");
+ log_message("%s failed.", location_full);
+ char *with_arch = asprintf_("%s%s/%s/%s", answers[1][0] == '/' ? "" : "/", answers[1], ARCH, COMPRESSED_FILE_REL("/"));
+ log_message("trying %s...", with_arch);
+ if (use_http_proxy)
+ fd = http_download_file(answers[0], with_arch, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port);
+ else
+ fd = ftp_start_download(ftp_serv_response, with_arch, &size);
+ if (0 < fd) {
+ strcpy(location_full, with_arch);
+ need_arch = 1;
+ }
+ }
+
+ if (fd < 0) {
+ char *msg = str_ftp_error(fd);
+ log_message("FTP: error get %d for remote file %s", fd, location_full);
+ stg1_error_message("Error: %s.", msg ? msg : "couldn't retrieve Installation program");
results = RETURN_BACK;
continue;
}
log_message("FTP: size of download %d bytes", size);
- results = load_ramdisk_fd(fd, size);
- if (results == RETURN_OK)
- ftp_end_data_command(fd);
-
- method_name = strdup("ftp");
- add_to_env("HOST", answers[0]);
- add_to_env("PREFIX", answers[1]);
- if (strcmp(answers[2], "")) {
- add_to_env("LOGIN", answers[2]);
- add_to_env("PASSWORD", answers[3]);
+ results = load_compressed_fd(fd, size);
+ if (results == RETURN_OK) {
+ if (!use_http_proxy)
+ ftp_end_data_command(ftp_serv_response);
+ } else {
+ unset_automatic(); /* we are in a fallback mode */
+ return results;
+ }
+
+ if (use_http_proxy) {
+ add_to_env("METHOD", "http");
+ snprintf(location_full, sizeof(location_full), "ftp://%s%s", ftp_hostname, answers[1]);
+ if (need_arch)
+ strcat(location_full, "/" ARCH);
+ add_to_env("URLPREFIX", location_full);
+ add_to_env("PROXY", http_proxy_host);
+ add_to_env("PROXYPORT", http_proxy_port);
+ } else {
+ add_to_env("METHOD", "ftp");
+ add_to_env("HOST", answers[0]);
+ if (need_arch)
+ strcat(answers[1], "/" ARCH);
+ add_to_env("PREFIX", answers[1]);
+ if (!streq(answers[2], "")) {
+ add_to_env("LOGIN", answers[2]);
+ add_to_env("PASSWORD", answers[3]);
+ }
}
}
while (results == RETURN_BACK);
@@ -747,10 +1137,11 @@ enum return_type http_prepare(void)
char * questions_auto[] = { "server", "directory", NULL };
static char ** answers = NULL;
enum return_type results;
+ char *http_proxy_host, *http_proxy_port;
if (!ramdisk_possible()) {
- error_message("HTTP install needs more than %d Mbytes of memory (detected %d Mbytes).",
- MEM_LIMIT_RAMDISK, total_memory());
+ stg1_error_message("HTTP install needs more than %d Mbytes of memory (detected %d Mbytes). You may want to try an NFS install.",
+ MEM_LIMIT_DRAKX, total_memory());
return RETURN_ERROR;
}
@@ -759,42 +1150,102 @@ enum return_type http_prepare(void)
if (results != RETURN_OK)
return results;
+ get_http_proxy(&http_proxy_host, &http_proxy_port);
+
do {
char location_full[500];
- int fd, size;
+ int fd, size, need_arch = 0;
+ int use_http_proxy;
+
+ if (!IS_AUTOMATIC) {
+ if (answers == NULL)
+ answers = (char **) calloc(1, sizeof(questions));
+
+ results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "http", &answers[0], &answers[1]);
+
+ if (results == RETURN_BACK)
+ return http_prepare();
+ }
results = ask_from_entries_auto("Please enter the name or IP address of the HTTP server, "
"and the directory containing the " DISTRIB_NAME " Distribution.",
questions, &answers, 40, questions_auto, NULL);
- if (results != RETURN_OK)
+ if (results != RETURN_OK || streq(answers[0], "")) {
+ unset_automatic(); /* we are in a fallback mode */
return http_prepare();
+ }
- strcpy(location_full, answers[1]);
- strcat(location_full, get_ramdisk_realname());
+ strcpy(location_full, answers[1][0] == '/' ? "" : "/");
+ strcat(location_full, answers[1]);
+ strcat(location_full, COMPRESSED_FILE_REL("/"));
- log_message("HTTP: trying to retrieve %s", location_full);
+ log_message("HTTP: trying to retrieve %s from %s", location_full, answers[0]);
- fd = http_download_file(answers[0], location_full, &size);
+ use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, "");
+
+ fd = http_download_file(answers[0], location_full, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port);
+
+ /* Try arched directory */
+ if (fd < 0) {
+ log_message("%s failed.", location_full);
+ char *with_arch = asprintf_("%s%s/%s/%s", answers[1][0] == '/' ? "" : "/", answers[1], ARCH, COMPRESSED_FILE_REL("/"));
+ log_message("trying %s...", with_arch);
+ fd = http_download_file(answers[0], with_arch, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port);
+ if (0 < fd) {
+ strcpy(location_full, with_arch);
+ need_arch = 1;
+ }
+ }
+
if (fd < 0) {
log_message("HTTP: error %d", fd);
if (fd == FTPERR_FAILED_CONNECT)
- error_message("Error: couldn't connect to server.");
+ stg1_error_message("Error: couldn't connect to server.");
else
- error_message("Error: couldn't get file (%s).", location_full);
+ stg1_error_message("Error: couldn't get file (%s).", location_full);
results = RETURN_BACK;
continue;
}
log_message("HTTP: size of download %d bytes", size);
- results = load_ramdisk_fd(fd, size);
+ if (load_compressed_fd(fd, size) != RETURN_OK) {
+ unset_automatic(); /* we are in a fallback mode */
+ return RETURN_ERROR;
+ }
- method_name = strdup("http");
- sprintf(location_full, "http://%s/%s", answers[0], answers[1]);
+ add_to_env("METHOD", "http");
+ sprintf(location_full, "http://%s%s%s", answers[0], answers[1][0] == '/' ? "" : "/", answers[1]);
+ if (need_arch)
+ strcat(location_full, "/" ARCH);
add_to_env("URLPREFIX", location_full);
+ if (!streq(http_proxy_host, ""))
+ add_to_env("PROXY", http_proxy_host);
+ if (!streq(http_proxy_port, ""))
+ add_to_env("PROXYPORT", http_proxy_port);
}
while (results == RETURN_BACK);
return RETURN_OK;
}
+
+#ifndef DISABLE_KA
+enum return_type ka_prepare(void)
+{
+ enum return_type results;
+
+ if (!ramdisk_possible()) {
+ stg1_error_message("KA install needs more than %d Mbytes of memory (detected %d Mbytes).",
+ MEM_LIMIT_DRAKX, total_memory());
+ return RETURN_ERROR;
+ }
+
+ results = intf_select_and_up();
+
+ if (results != RETURN_OK)
+ return results;
+
+ return perform_ka();
+}
+#endif
diff --git a/mdk-stage1/network.h b/mdk-stage1/network.h
index b832ea906..914bc2ca5 100644
--- a/mdk-stage1/network.h
+++ b/mdk-stage1/network.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -26,26 +26,33 @@
#include <netinet/ip.h>
#include <arpa/inet.h>
+enum return_type intf_select_and_up();
enum return_type nfs_prepare(void);
enum return_type ftp_prepare(void);
enum return_type http_prepare(void);
+#ifndef DISABLE_KA
+enum return_type ka_prepare(void);
+#endif
-enum boot_proto_type { BOOTPROTO_STATIC, BOOTPROTO_DHCP };
+enum boot_proto_type { BOOTPROTO_STATIC, BOOTPROTO_DHCP, BOOTPROTO_ADSL_PPPOE };
+enum auto_detection_type { AUTO_DETECTION_NONE, AUTO_DETECTION_ALL, AUTO_DETECTION_WIRED };
/* all of these in_addr things are in network byte order! */
struct interface_info {
- char device[10];
- int is_ptp, is_up;
- struct in_addr ip, netmask, broadcast, network;
- enum boot_proto_type boot_proto;
+ char device[10];
+ int is_ptp, is_up;
+ struct in_addr ip, netmask, broadcast, network;
+ enum boot_proto_type boot_proto;
+ char *user, *pass, *acname; /* for ADSL connection */
};
/* these are to be used only by dhcp.c */
char * guess_netmask(char * ip_addr);
+
int configure_net_device(struct interface_info * intf);
extern char * hostname;
diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c
index 416d05ae6..c0489b58d 100644
--- a/mdk-stage1/newt-frontend.c
+++ b/mdk-stage1/newt-frontend.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -24,6 +24,7 @@
* Each different frontend must implement all functions defined in frontend.h
*/
+#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
@@ -31,21 +32,29 @@
#include <stdio.h>
#include <stdarg.h>
#include <sys/time.h>
-#include "stage1.h"
-#include "log.h"
-#include "newt.h"
+#include <newt.h>
-#include "frontend.h"
+#include <probing.h>
+#include "frontend.h"
-void init_frontend(void)
+void init_frontend(char * welcome_msg)
{
+ int i;
+ for (i=0; i<38; i++) printf("\n");
newtInit();
newtCls();
-
- newtDrawRootText(0, 0, "Welcome to " DISTRIB_NAME " (" VERSION ") " __DATE__ " " __TIME__);
-
- newtPushHelpLine(" <Alt-F1> for here, <Alt-F3> to see the logs, <Alt-F4> for kernel msg");
+
+ if (welcome_msg[0]) {
+ char *msg;
+ int cols, rows;
+ newtGetScreenSize(&cols, &rows);
+ asprintf(&msg, " %-*s", cols - 1, welcome_msg);
+ newtDrawRootText(0, 0, msg);
+ free(msg);
+ newtPushHelpLine(" <Alt-F1> for here, <Alt-F3> to see the logs, <Alt-F4> for kernel msg");
+ }
+ newtRefresh();
}
@@ -55,58 +64,48 @@ void finish_frontend(void)
}
-void error_message(char *msg, ...)
+void verror_message(char *msg, va_list ap)
{
- va_list args;
- va_start(args, msg);
- va_end(args);
- newtWinMessagev("Error", "Ok", msg, args);
- unset_param(MODE_AUTOMATIC);
+ newtWinMessagev("Error", "Ok", msg, ap);
}
-void info_message(char *msg, ...)
+void vinfo_message(char *msg, va_list ap)
{
- va_list args;
- va_start(args, msg);
- va_end(args);
- if (!IS_AUTOMATIC)
- newtWinMessagev("Notice", "Ok", msg, args);
- else
- vlog_message(msg, args);
+ newtWinMessagev("Notice", "Ok", msg, ap);
}
-void wait_message(char *msg, ...)
+void vwait_message(char *msg, va_list ap)
{
- int width = 8;
- int height = 3;
+ int width, height;
char * title = "Please wait...";
newtComponent c, f;
+ newtGrid grid;
char * buf = NULL;
+ char * flowed;
int size = 0;
int i = 0;
- va_list args;
-
- va_start(args, msg);
do {
size += 1000;
if (buf) free(buf);
buf = malloc(size);
- i = vsnprintf(buf, size, msg, args);
- width += i;
- } while (i == size);
-
- va_end(args);
+ i = vsnprintf(buf, size, msg, ap);
+ } while (i >= size || i == -1);
+
+ flowed = newtReflowText(buf, 60, 5, 5, &width, &height);
- newtCenteredWindow(width, height, title);
+ c = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP);
+ newtTextboxSetText(c, flowed);
- c = newtTextbox(1, 1, width - 2, height - 2, NEWT_TEXTBOX_WRAP);
- newtTextboxSetText(c, buf);
- f = newtForm(NULL, NULL, 0);
+ grid = newtCreateGrid(1, 1);
+ newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, c, 0, 0, 0, 0, 0, 0);
+ newtGridWrappedWindow(grid, title);
+ free(flowed);
free(buf);
+ f = newtForm(NULL, NULL, 0);
newtFormAddComponent(f, c);
newtDrawForm(f);
@@ -125,7 +124,7 @@ static int size_progress;
static int actually_drawn;
static char * msg_progress;
-void init_progression(char *msg, int size)
+void init_progression_raw(char *msg, int size)
{
size_progress = size;
if (size) {
@@ -144,7 +143,7 @@ void init_progression(char *msg, int size)
}
}
-void update_progression(int current_size)
+void update_progression_raw(int current_size)
{
if (size_progress) {
if (current_size <= size_progress)
@@ -167,7 +166,7 @@ void update_progression(int current_size)
}
}
-void end_progression(void)
+void end_progression_raw(void)
{
if (size_progress) {
newtPopWindow();
@@ -178,52 +177,39 @@ void end_progression(void)
}
-enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice)
+enum return_type ask_from_list_index(char *msg, char ** elems, char ** elems_comments, int * answer)
{
- char * items[50];
- int answer = 0, rc;
- char ** sav_elems = elems;
- int i;
+ char * items[50000];
+ int rc;
- i = 0;
- while (elems && *elems) {
- items[i] = malloc(sizeof(char) * (strlen(*elems) + strlen(*elems_comments) + 4));
- strcpy(items[i], *elems);
- strcat(items[i], " (");
- strcat(items[i], *elems_comments);
- strcat(items[i], ")");
- i++;
- elems++;
- elems_comments++;
+ if (elems_comments) {
+ int i;
+
+ i = 0;
+ while (elems && *elems) {
+ int j = (*elems_comments) ? strlen(*elems_comments) : 0;
+ items[i] = malloc(sizeof(char) * (strlen(*elems) + j + 4));
+ strcpy(items[i], *elems);
+ if (*elems_comments) {
+ strcat(items[i], " (");
+ strcat(items[i], *elems_comments);
+ strcat(items[i], ")");
+ }
+ elems_comments++;
+ i++;
+ elems++;
+ }
+ items[i] = NULL;
}
- items[i] = NULL;
- rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, items, &answer, "Ok", "Cancel", NULL);
+ rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, elems_comments ? items : elems, answer, "Ok", "Cancel", NULL);
if (rc == 2)
return RETURN_BACK;
- *choice = strdup(sav_elems[answer]);
-
return RETURN_OK;
}
-
-enum return_type ask_from_list(char *msg, char ** elems, char ** choice)
-{
- int answer = 0, rc;
-
- rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, elems, &answer, "Ok", "Cancel", NULL);
-
- if (rc == 2)
- return RETURN_BACK;
-
- *choice = strdup(elems[answer]);
-
- return RETURN_OK;
-}
-
-
enum return_type ask_yes_no(char *msg)
{
int rc;
@@ -240,7 +226,7 @@ enum return_type ask_yes_no(char *msg)
static void (*callback_real_function)(char ** strings) = NULL;
-static void default_callback(newtComponent co, void * data)
+static void default_callback(newtComponent co __attribute__ ((unused)), void * data)
{
newtComponent * entries = data;
char * strings[50], ** ptr;
@@ -313,7 +299,7 @@ static int mynewtWinEntries(char * title, char * text, int suggestedWidth, int f
for (i = 0; i < numItems; i++) {
newtComponent entr = newtEntry(-1, -1, items[i].value ?
*items[i].value : NULL, dataWidth,
- items[i].value, items[i].flags);
+ (const char**)items[i].value, items[i].flags);
newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT,
newtLabel(-1, -1, items[i].text),
@@ -367,7 +353,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers
while (questions && *questions) {
entries[i].text = *questions;
- entries[i].flags = NEWT_FLAG_SCROLL;
+ entries[i].flags = NEWT_FLAG_SCROLL | (!strcmp(*questions, "Password") ? NEWT_FLAG_PASSWORD : 0);
i++;
questions++;
}
@@ -375,7 +361,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers
entries[i].value = NULL;
if (*answers == NULL)
- *answers = (char **) malloc(sizeof(char *) * i);
+ *answers = (char **) calloc(1, sizeof(char *) * i);
else
already_answers = *answers;
@@ -388,7 +374,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers
*(entries[j].value) = NULL;
}
- rc = mynewtWinEntries("Please fill entries...", msg, 52, 5, 5, entry_size, callback_func, entries, "Ok", "Cancel", NULL);
+ rc = mynewtWinEntries("Please fill in entries...", msg, 52, 5, 5, entry_size, callback_func, entries, "Ok", "Cancel", NULL);
if (rc == 3)
return RETURN_BACK;
@@ -397,3 +383,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers
return RETURN_OK;
}
+
+
+void suspend_to_console(void) { newtSuspend(); }
+void resume_from_suspend(void) { newtResume(); }
diff --git a/mdk-stage1/nfsmount.c b/mdk-stage1/nfsmount.c
deleted file mode 100644
index 77fbb530e..000000000
--- a/mdk-stage1/nfsmount.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/* this is based on work from redhat, made it lighter (gc)
- */
-
-
-/* MODIFIED for Red Hat Linux installer
- * msw@redhat.com
- * o always mounts without lockd
- * o uses our own host resolution
- */
-
-/*
- * nfsmount.c -- Linux NFS mount
- * Copyright (C) 1993 Rick Sladkey <jrs@world.std.com>
- *
- * 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, 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.
- *
- * Wed Feb 8 12:51:48 1995, biro@yggdrasil.com (Ross Biro): allow all port
- * numbers to be specified on the command line.
- *
- * Fri, 8 Mar 1996 18:01:39, Swen Thuemmler <swen@uni-paderborn.de>:
- * Omit the call to connect() for Linux version 1.3.11 or later.
- *
- * Wed Oct 1 23:55:28 1997: Dick Streefland <dick_streefland@tasking.com>
- * Implemented the "bg", "fg" and "retry" mount options for NFS.
- */
-
-/*
- * nfsmount.c,v 1.1.1.1 1993/11/18 08:40:51 jrs Exp
- */
-
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <netdb.h>
-#include <sys/mount.h>
-#include <rpc/rpc.h>
-#include <rpc/pmap_prot.h>
-#include <rpc/pmap_clnt.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/utsname.h>
-#include <sys/stat.h>
-#include <arpa/inet.h>
-#include "linux-2.2/nfs.h"
-#include "linux-2.2/nfs_mount.h" //#include "mount_constants.h"
-
-
-#include "dns.h"
-#include "log.h"
-
-#include "nfsmount.h"
-
-
-bool_t
-xdr_fhandle(XDR *xdrs, fhandle objp)
-{
- if (!xdr_opaque(xdrs, objp, FHSIZE)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_fhstatus(XDR *xdrs, fhstatus *objp)
-{
-
- if (!xdr_u_int(xdrs, &objp->fhs_status)) {
- return (FALSE);
- }
- switch (objp->fhs_status) {
- case 0:
- if (!xdr_fhandle(xdrs, objp->fhstatus_u.fhs_fhandle)) {
- return (FALSE);
- }
- break;
- default:
- break;
- }
- return (TRUE);
-}
-
-bool_t
-xdr_dirpath(XDR *xdrs, dirpath *objp)
-{
-
- if (!xdr_string(xdrs, objp, MNTPATHLEN)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-static int nfs_mount_version = 3; /* kernel >= 2.1.32 */ /* *********** TODO for kernel 2.4, nfs-mount version 4 */
-
-
-int nfsmount_prepare(const char *spec, int *flags, char **mount_opts)
-{
- char hostdir[1024];
- CLIENT *mclient;
- char *hostname, *dirname;
- fhandle root_fhandle;
- struct timeval total_timeout;
- enum clnt_stat clnt_stat;
- static struct nfs_mount_data data;
- struct sockaddr_in server_addr;
- struct sockaddr_in mount_server_addr;
- int msock, fsock;
- struct timeval retry_timeout;
- struct fhstatus status;
- char *s;
- int port;
-
- msock = fsock = -1;
- mclient = NULL;
-
- strncpy(hostdir, spec, sizeof(hostdir));
- if ((s = (strchr(hostdir, ':')))) {
- hostname = hostdir;
- dirname = s + 1;
- *s = '\0';
- } else {
- log_message("nfsmount: format not host:dir");
- goto fail;
- }
-
- server_addr.sin_family = AF_INET;
-
- /* first, try as IP address */
- if (!inet_aton(hostname, &server_addr.sin_addr)) {
- /* failure, try as machine name */
- if (mygethostbyname(hostname, &server_addr.sin_addr)) {
- log_message("nfsmount: can't get address for %s", hostname);
- goto fail;
- } else
- server_addr.sin_family = AF_INET;
- }
-
- memcpy (&mount_server_addr, &server_addr, sizeof (mount_server_addr));
-
-
-
- /* Set default options.
- * rsize/wsize (and bsize, for ver >= 3) are left 0 in order to
- * let the kernel decide.
- * timeo is filled in after we know whether it'll be TCP or UDP. */
- memset(&data, 0, sizeof(data));
- data.retrans = 3;
- data.acregmin = 3;
- data.acregmax = 60;
- data.acdirmin = 30;
- data.acdirmax = 60;
-#if NFS_MOUNT_VERSION >= 2
- data.namlen = NAME_MAX;
-#endif
-
-#if NFS_MOUNT_VERSION >= 3
- if (nfs_mount_version >= 3)
- data.flags |= NFS_MOUNT_NONLM; /* HACK HACK msw */
-#endif
-
- /* Adjust options if none specified */
- if (!data.timeo)
- data.timeo = 7; /* udp */
-
-
- data.version = nfs_mount_version;
- *mount_opts = (char *) &data;
-
- if (*flags & MS_REMOUNT)
- return 0;
-
-
- retry_timeout.tv_sec = 3;
- retry_timeout.tv_usec = 0;
- total_timeout.tv_sec = 20;
- total_timeout.tv_usec = 0;
-
-
- /* contact the mount daemon via TCP */
- mount_server_addr.sin_port = htons(0);
- msock = RPC_ANYSOCK;
- mclient = clnttcp_create(&mount_server_addr, MOUNTPROG, MOUNTVERS, &msock, 0, 0);
-
- /* if this fails, contact the mount daemon via UDP */
- if (!mclient) {
- mount_server_addr.sin_port = htons(0);
- msock = RPC_ANYSOCK;
- mclient = clntudp_create(&mount_server_addr, MOUNTPROG, MOUNTVERS, retry_timeout, &msock);
- }
- if (mclient) {
- /* try to mount hostname:dirname */
- mclient->cl_auth = authunix_create_default();
- clnt_stat = clnt_call(mclient, MOUNTPROC_MNT,
- (xdrproc_t) xdr_dirpath, (caddr_t) &dirname,
- (xdrproc_t) xdr_fhstatus, (caddr_t) &status,
- total_timeout);
- if (clnt_stat != RPC_SUCCESS) {
- if (errno != ECONNREFUSED) {
- log_message(clnt_sperror(mclient, "mount"));
- goto fail; /* don't retry */
- }
- log_message(clnt_sperror(mclient, "mount"));
- auth_destroy(mclient->cl_auth);
- clnt_destroy(mclient);
- mclient = 0;
- close(msock);
- }
- } else
- goto fail;
-
- if (status.fhs_status != 0) {
- if (status.fhs_status == 2)
- log_message("NFS server says: No such file or directory");
- else if (status.fhs_status == 13)
- log_message("NFS server says: Permission denied");
- else
- log_message("nfsmount prepare failed, reason given by server: %d", status.fhs_status);
- goto fail;
- }
-
- memcpy((char *) &root_fhandle, (char *) status.fhstatus_u.fhs_fhandle, sizeof (root_fhandle));
-
- /* create nfs socket for kernel */
-
- fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (fsock < 0) {
- log_perror("nfs socket");
- goto fail;
- }
- if (bindresvport(fsock, 0) < 0) {
- log_perror("nfs bindresvport");
- goto fail;
- }
- server_addr.sin_port = PMAPPORT;
- port = pmap_getport(&server_addr, NFS_PROGRAM, NFS_VERSION, IPPROTO_UDP);
- if (port == 0)
- port = NFS_PORT;
-#ifdef NFS_MOUNT_DEBUG
- else
- log_message("used portmapper to find NFS port\n");
- log_message("using port %d for nfs deamon\n", port);
-#endif
- server_addr.sin_port = htons(port);
-
- /* prepare data structure for kernel */
-
- data.fd = fsock;
- memcpy((char *) &data.root, (char *) &root_fhandle, sizeof (root_fhandle));
- memcpy((char *) &data.addr, (char *) &server_addr, sizeof(data.addr));
- strncpy(data.hostname, hostname, sizeof(data.hostname));
-
- /* clean up */
-
- auth_destroy(mclient->cl_auth);
- clnt_destroy(mclient);
- close(msock);
- return 0;
-
- /* abort */
-
- fail:
- if (msock != -1) {
- if (mclient) {
- auth_destroy(mclient->cl_auth);
- clnt_destroy(mclient);
- }
- close(msock);
- }
- if (fsock != -1)
- close(fsock);
-
- return -1;
-}
-
diff --git a/mdk-stage1/nfsmount.h b/mdk-stage1/nfsmount.h
deleted file mode 100644
index 12ffa69a6..000000000
--- a/mdk-stage1/nfsmount.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Please do not edit this file.
- * It was generated using rpcgen.
- */
-
-#ifndef _NFSMOUNT_H_RPCGEN
-#define _NFSMOUNT_H_RPCGEN
-
-#include <rpc/rpc.h>
-
-int nfsmount_prepare(const char *spec, int *flags, char **mount_opts);
-
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
- */
-
-/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
-#ifndef _rpcsvc_mount_h
-#define _rpcsvc_mount_h
-#define MNTPATHLEN 1024
-#define MNTNAMLEN 255
-#define FHSIZE 32
-
-typedef char fhandle[FHSIZE];
-#ifdef __cplusplus
-extern "C" bool_t xdr_fhandle(XDR *, fhandle);
-#elif __STDC__
-extern bool_t xdr_fhandle(XDR *, fhandle);
-#else /* Old Style C */
-bool_t xdr_fhandle();
-#endif /* Old Style C */
-
-
-struct fhstatus {
- u_int fhs_status;
- union {
- fhandle fhs_fhandle;
- } fhstatus_u;
-};
-typedef struct fhstatus fhstatus;
-#ifdef __cplusplus
-extern "C" bool_t xdr_fhstatus(XDR *, fhstatus*);
-#elif __STDC__
-extern bool_t xdr_fhstatus(XDR *, fhstatus*);
-#else /* Old Style C */
-bool_t xdr_fhstatus();
-#endif /* Old Style C */
-
-
-typedef char *dirpath;
-#ifdef __cplusplus
-extern "C" bool_t xdr_dirpath(XDR *, dirpath*);
-#elif __STDC__
-extern bool_t xdr_dirpath(XDR *, dirpath*);
-#else /* Old Style C */
-bool_t xdr_dirpath();
-#endif /* Old Style C */
-
-
-typedef char *name;
-#ifdef __cplusplus
-extern "C" bool_t xdr_name(XDR *, name*);
-#elif __STDC__
-extern bool_t xdr_name(XDR *, name*);
-#else /* Old Style C */
-bool_t xdr_name();
-#endif /* Old Style C */
-
-
-typedef struct mountbody *mountlist;
-#ifdef __cplusplus
-extern "C" bool_t xdr_mountlist(XDR *, mountlist*);
-#elif __STDC__
-extern bool_t xdr_mountlist(XDR *, mountlist*);
-#else /* Old Style C */
-bool_t xdr_mountlist();
-#endif /* Old Style C */
-
-
-struct mountbody {
- name ml_hostname;
- dirpath ml_directory;
- mountlist ml_next;
-};
-typedef struct mountbody mountbody;
-#ifdef __cplusplus
-extern "C" bool_t xdr_mountbody(XDR *, mountbody*);
-#elif __STDC__
-extern bool_t xdr_mountbody(XDR *, mountbody*);
-#else /* Old Style C */
-bool_t xdr_mountbody();
-#endif /* Old Style C */
-
-
-typedef struct groupnode *groups;
-#ifdef __cplusplus
-extern "C" bool_t xdr_groups(XDR *, groups*);
-#elif __STDC__
-extern bool_t xdr_groups(XDR *, groups*);
-#else /* Old Style C */
-bool_t xdr_groups();
-#endif /* Old Style C */
-
-
-struct groupnode {
- name gr_name;
- groups gr_next;
-};
-typedef struct groupnode groupnode;
-#ifdef __cplusplus
-extern "C" bool_t xdr_groupnode(XDR *, groupnode*);
-#elif __STDC__
-extern bool_t xdr_groupnode(XDR *, groupnode*);
-#else /* Old Style C */
-bool_t xdr_groupnode();
-#endif /* Old Style C */
-
-
-typedef struct exportnode *exports;
-#ifdef __cplusplus
-extern "C" bool_t xdr_exports(XDR *, exports*);
-#elif __STDC__
-extern bool_t xdr_exports(XDR *, exports*);
-#else /* Old Style C */
-bool_t xdr_exports();
-#endif /* Old Style C */
-
-
-struct exportnode {
- dirpath ex_dir;
- groups ex_groups;
- exports ex_next;
-};
-typedef struct exportnode exportnode;
-#ifdef __cplusplus
-extern "C" bool_t xdr_exportnode(XDR *, exportnode*);
-#elif __STDC__
-extern bool_t xdr_exportnode(XDR *, exportnode*);
-#else /* Old Style C */
-bool_t xdr_exportnode();
-#endif /* Old Style C */
-
-
-struct ppathcnf {
- int pc_link_max;
- short pc_max_canon;
- short pc_max_input;
- short pc_name_max;
- short pc_path_max;
- short pc_pipe_buf;
- u_char pc_vdisable;
- char pc_xxx;
- short pc_mask[2];
-};
-typedef struct ppathcnf ppathcnf;
-#ifdef __cplusplus
-extern "C" bool_t xdr_ppathcnf(XDR *, ppathcnf*);
-#elif __STDC__
-extern bool_t xdr_ppathcnf(XDR *, ppathcnf*);
-#else /* Old Style C */
-bool_t xdr_ppathcnf();
-#endif /* Old Style C */
-
-#endif /*!_rpcsvc_mount_h*/
-
-#define MOUNTPROG ((u_long)100005)
-#define MOUNTVERS ((u_long)1)
-
-#ifdef __cplusplus
-#define MOUNTPROC_NULL ((u_long)0)
-extern "C" void * mountproc_null_1(void *, CLIENT *);
-extern "C" void * mountproc_null_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_MNT ((u_long)1)
-extern "C" fhstatus * mountproc_mnt_1(dirpath *, CLIENT *);
-extern "C" fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *);
-#define MOUNTPROC_DUMP ((u_long)2)
-extern "C" mountlist * mountproc_dump_1(void *, CLIENT *);
-extern "C" mountlist * mountproc_dump_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_UMNT ((u_long)3)
-extern "C" void * mountproc_umnt_1(dirpath *, CLIENT *);
-extern "C" void * mountproc_umnt_1_svc(dirpath *, struct svc_req *);
-#define MOUNTPROC_UMNTALL ((u_long)4)
-extern "C" void * mountproc_umntall_1(void *, CLIENT *);
-extern "C" void * mountproc_umntall_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_EXPORT ((u_long)5)
-extern "C" exports * mountproc_export_1(void *, CLIENT *);
-extern "C" exports * mountproc_export_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_EXPORTALL ((u_long)6)
-extern "C" exports * mountproc_exportall_1(void *, CLIENT *);
-extern "C" exports * mountproc_exportall_1_svc(void *, struct svc_req *);
-
-#elif __STDC__
-#define MOUNTPROC_NULL ((u_long)0)
-extern void * mountproc_null_1(void *, CLIENT *);
-extern void * mountproc_null_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_MNT ((u_long)1)
-extern fhstatus * mountproc_mnt_1(dirpath *, CLIENT *);
-extern fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *);
-#define MOUNTPROC_DUMP ((u_long)2)
-extern mountlist * mountproc_dump_1(void *, CLIENT *);
-extern mountlist * mountproc_dump_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_UMNT ((u_long)3)
-extern void * mountproc_umnt_1(dirpath *, CLIENT *);
-extern void * mountproc_umnt_1_svc(dirpath *, struct svc_req *);
-#define MOUNTPROC_UMNTALL ((u_long)4)
-extern void * mountproc_umntall_1(void *, CLIENT *);
-extern void * mountproc_umntall_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_EXPORT ((u_long)5)
-extern exports * mountproc_export_1(void *, CLIENT *);
-extern exports * mountproc_export_1_svc(void *, struct svc_req *);
-#define MOUNTPROC_EXPORTALL ((u_long)6)
-extern exports * mountproc_exportall_1(void *, CLIENT *);
-extern exports * mountproc_exportall_1_svc(void *, struct svc_req *);
-
-#else /* Old Style C */
-#define MOUNTPROC_NULL ((u_long)0)
-extern void * mountproc_null_1();
-extern void * mountproc_null_1_svc();
-#define MOUNTPROC_MNT ((u_long)1)
-extern fhstatus * mountproc_mnt_1();
-extern fhstatus * mountproc_mnt_1_svc();
-#define MOUNTPROC_DUMP ((u_long)2)
-extern mountlist * mountproc_dump_1();
-extern mountlist * mountproc_dump_1_svc();
-#define MOUNTPROC_UMNT ((u_long)3)
-extern void * mountproc_umnt_1();
-extern void * mountproc_umnt_1_svc();
-#define MOUNTPROC_UMNTALL ((u_long)4)
-extern void * mountproc_umntall_1();
-extern void * mountproc_umntall_1_svc();
-#define MOUNTPROC_EXPORT ((u_long)5)
-extern exports * mountproc_export_1();
-extern exports * mountproc_export_1_svc();
-#define MOUNTPROC_EXPORTALL ((u_long)6)
-extern exports * mountproc_exportall_1();
-extern exports * mountproc_exportall_1_svc();
-#endif /* Old Style C */
-#define MOUNTVERS_POSIX ((u_long)2)
-
-#ifdef __cplusplus
-extern "C" void * mountproc_null_2(void *, CLIENT *);
-extern "C" void * mountproc_null_2_svc(void *, struct svc_req *);
-extern "C" fhstatus * mountproc_mnt_2(dirpath *, CLIENT *);
-extern "C" fhstatus * mountproc_mnt_2_svc(dirpath *, struct svc_req *);
-extern "C" mountlist * mountproc_dump_2(void *, CLIENT *);
-extern "C" mountlist * mountproc_dump_2_svc(void *, struct svc_req *);
-extern "C" void * mountproc_umnt_2(dirpath *, CLIENT *);
-extern "C" void * mountproc_umnt_2_svc(dirpath *, struct svc_req *);
-extern "C" void * mountproc_umntall_2(void *, CLIENT *);
-extern "C" void * mountproc_umntall_2_svc(void *, struct svc_req *);
-extern "C" exports * mountproc_export_2(void *, CLIENT *);
-extern "C" exports * mountproc_export_2_svc(void *, struct svc_req *);
-extern "C" exports * mountproc_exportall_2(void *, CLIENT *);
-extern "C" exports * mountproc_exportall_2_svc(void *, struct svc_req *);
-#define MOUNTPROC_PATHCONF ((u_long)7)
-extern "C" ppathcnf * mountproc_pathconf_2(dirpath *, CLIENT *);
-extern "C" ppathcnf * mountproc_pathconf_2_svc(dirpath *, struct svc_req *);
-
-#elif __STDC__
-extern void * mountproc_null_2(void *, CLIENT *);
-extern void * mountproc_null_2_svc(void *, struct svc_req *);
-extern fhstatus * mountproc_mnt_2(dirpath *, CLIENT *);
-extern fhstatus * mountproc_mnt_2_svc(dirpath *, struct svc_req *);
-extern mountlist * mountproc_dump_2(void *, CLIENT *);
-extern mountlist * mountproc_dump_2_svc(void *, struct svc_req *);
-extern void * mountproc_umnt_2(dirpath *, CLIENT *);
-extern void * mountproc_umnt_2_svc(dirpath *, struct svc_req *);
-extern void * mountproc_umntall_2(void *, CLIENT *);
-extern void * mountproc_umntall_2_svc(void *, struct svc_req *);
-extern exports * mountproc_export_2(void *, CLIENT *);
-extern exports * mountproc_export_2_svc(void *, struct svc_req *);
-extern exports * mountproc_exportall_2(void *, CLIENT *);
-extern exports * mountproc_exportall_2_svc(void *, struct svc_req *);
-#define MOUNTPROC_PATHCONF ((u_long)7)
-extern ppathcnf * mountproc_pathconf_2(dirpath *, CLIENT *);
-extern ppathcnf * mountproc_pathconf_2_svc(dirpath *, struct svc_req *);
-
-#else /* Old Style C */
-extern void * mountproc_null_2();
-extern void * mountproc_null_2_svc();
-extern fhstatus * mountproc_mnt_2();
-extern fhstatus * mountproc_mnt_2_svc();
-extern mountlist * mountproc_dump_2();
-extern mountlist * mountproc_dump_2_svc();
-extern void * mountproc_umnt_2();
-extern void * mountproc_umnt_2_svc();
-extern void * mountproc_umntall_2();
-extern void * mountproc_umntall_2_svc();
-extern exports * mountproc_export_2();
-extern exports * mountproc_export_2_svc();
-extern exports * mountproc_exportall_2();
-extern exports * mountproc_exportall_2_svc();
-#define MOUNTPROC_PATHCONF ((u_long)7)
-extern ppathcnf * mountproc_pathconf_2();
-extern ppathcnf * mountproc_pathconf_2_svc();
-#endif /* Old Style C */
-
-#endif /* !_NFSMOUNT_H_RPCGEN */
diff --git a/mdk-stage1/params.c b/mdk-stage1/params.c
new file mode 100644
index 000000000..9398759ab
--- /dev/null
+++ b/mdk-stage1/params.c
@@ -0,0 +1,175 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "params.h"
+#include "utils.h"
+#include "automatic.h"
+#include "log.h"
+
+static struct param_elem params[50];
+static int param_number = 0;
+
+void process_cmdline(void)
+{
+ char buf[512];
+ int size, i;
+ int fd = -1;
+
+ if (IS_TESTING) {
+ log_message("TESTING: opening cmdline... ");
+
+ if ((fd = open("cmdline", O_RDONLY)) == -1)
+ log_message("TESTING: could not open cmdline");
+ }
+
+ if (fd == -1) {
+ log_message("opening /proc/cmdline... ");
+
+ if ((fd = open("/proc/cmdline", O_RDONLY)) == -1)
+ fatal_error("could not open /proc/cmdline");
+ }
+
+ size = read(fd, buf, sizeof(buf));
+ buf[size-1] = '\0'; // -1 to eat the \n
+ close(fd);
+
+ log_message("\t%s", buf);
+
+ i = 0;
+ while (buf[i] != '\0') {
+ char *name, *value = NULL;
+ int j = i;
+ while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0')
+ i++;
+ if (i == j) {
+ i++;
+ continue;
+ }
+ name = _memdup(&buf[j], i-j + 1);
+ name[i-j] = '\0';
+
+ if (buf[i] == '=') {
+ int k = i+1;
+ i++;
+ while (buf[i] != ' ' && buf[i] != '\0')
+ i++;
+ value = _memdup(&buf[k], i-k + 1);
+ value[i-k] = '\0';
+ }
+
+ params[param_number].name = name;
+ params[param_number].value = value;
+ param_number++;
+ if (!strcmp(name, "changedisk")) set_param(MODE_CHANGEDISK);
+ if (!strcmp(name, "updatemodules") ||
+ !strcmp(name, "thirdparty")) set_param(MODE_THIRDPARTY);
+ if (!strcmp(name, "rescue") ||
+ !strcmp(name, "kamethod")) set_param(MODE_RESCUE);
+ if (!strcmp(name, "rescue")) set_param(MODE_RESCUE);
+ if (!strcmp(name, "keepmounted")) set_param(MODE_KEEP_MOUNTED);
+ if (!strcmp(name, "noauto")) set_param(MODE_NOAUTO);
+ if (!strcmp(name, "netauto")) set_param(MODE_NETAUTO);
+ if (!strcmp(name, "debugstage1")) set_param(MODE_DEBUGSTAGE1);
+ if (!strcmp(name, "automatic")) {
+ set_param(MODE_AUTOMATIC);
+ grab_automatic_params(value);
+ }
+ if (buf[i] == '\0')
+ break;
+ i++;
+ }
+
+ if (IS_AUTOMATIC && strcmp(get_auto_value("thirdparty"), "")) {
+ set_param(MODE_THIRDPARTY);
+ }
+
+ log_message("\tgot %d args", param_number);
+}
+
+
+int stage1_mode = 0;
+
+int get_param(int i)
+{
+#ifdef SPAWN_INTERACTIVE
+ static int fd = 0;
+ char buf[5000];
+ char * ptr;
+ int nb;
+
+ if (fd <= 0) {
+ fd = open(interactive_fifo, O_RDONLY);
+ if (fd == -1)
+ return (stage1_mode & i);
+ fcntl(fd, F_SETFL, O_NONBLOCK);
+ }
+
+ if (fd > 0) {
+ if ((nb = read(fd, buf, sizeof(buf))) > 0) {
+ buf[nb] = '\0';
+ ptr = buf;
+ while ((ptr = strstr(ptr, "+ "))) {
+ if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE);
+ ptr++;
+ }
+ ptr = buf;
+ while ((ptr = strstr(ptr, "- "))) {
+ if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE);
+ ptr++;
+ }
+ }
+ }
+#endif
+
+ return (stage1_mode & i);
+}
+
+char * get_param_valued(char *param_name)
+{
+ int i;
+ for (i = 0; i < param_number ; i++)
+ if (!strcmp(params[i].name, param_name))
+ return params[i].value;
+
+ return NULL;
+}
+
+void set_param_valued(char *param_name, char *param_value)
+{
+ params[param_number].name = param_name;
+ params[param_number].value = param_value;
+ param_number++;
+}
+
+void set_param(int i)
+{
+ stage1_mode |= i;
+}
+
+void unset_param(int i)
+{
+ stage1_mode &= ~i;
+}
+
+void unset_automatic(void)
+{
+ log_message("unsetting automatic");
+ unset_param(MODE_AUTOMATIC);
+}
diff --git a/mdk-stage1/params.h b/mdk-stage1/params.h
new file mode 100644
index 000000000..06b64bd52
--- /dev/null
+++ b/mdk-stage1/params.h
@@ -0,0 +1,31 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef _PARAMS_H_
+#define _PARAMS_H_
+
+void process_cmdline(void);
+int get_param(int i);
+char * get_param_valued(char *param_name);
+void set_param(int i);
+void unset_param(int i);
+void unset_automatic(void);
+
+struct param_elem
+{
+ char * name;
+ char * value;
+};
+
+#endif
diff --git a/mdk-stage1/partition.c b/mdk-stage1/partition.c
new file mode 100644
index 000000000..cb59f0514
--- /dev/null
+++ b/mdk-stage1/partition.c
@@ -0,0 +1,170 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * Portions from Erik Troan (ewt@redhat.com)
+ *
+ * Copyright 1996 Red Hat Software
+ *
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <libgen.h>
+#include "stage1.h"
+#include "frontend.h"
+#include "modules.h"
+#include "probing.h"
+#include "log.h"
+#include "mount.h"
+#include "automatic.h"
+
+#include "disk.h"
+#include "partition.h"
+
+struct partition_detection_anchor {
+ off_t offset;
+ const char * anchor;
+};
+
+static int seek_and_compare(int fd, struct partition_detection_anchor anch)
+{
+ char buf[500];
+ size_t count;
+ if (lseek(fd, anch.offset, SEEK_SET) == (off_t)-1) {
+ log_perror("seek failed");
+ return -1;
+ }
+ count = read(fd, buf, strlen(anch.anchor));
+ if (count != strlen(anch.anchor)) {
+ log_perror("read failed");
+ return -1;
+ }
+ buf[count] = '\0';
+ if (strcmp(anch.anchor, buf))
+ return 1;
+ return 0;
+}
+
+static const char * detect_partition_type(char * dev)
+{
+ struct partition_detection_info {
+ const char * name;
+ struct partition_detection_anchor anchor0;
+ struct partition_detection_anchor anchor1;
+ struct partition_detection_anchor anchor2;
+ };
+ struct partition_detection_info partitions_signatures[] = {
+ { "Linux Swap", { 4086, "SWAP-SPACE" }, { 0, NULL }, { 0, NULL } },
+ { "Linux Swap", { 4086, "SWAPSPACE2" }, { 0, NULL }, { 0, NULL } },
+ { "Ext4", { 0x438, "\x53\xEF" }, { 0, NULL }, { 0, NULL } },
+ { "ReiserFS", { 0x10034, "ReIsErFs" }, { 0, NULL }, { 0, NULL } },
+ { "ReiserFS", { 0x10034, "ReIsEr2Fs" }, { 0, NULL }, { 0, NULL } },
+ { "XFS", { 0, "XFSB" }, { 0x200, "XAGF" }, { 0x400, "XAGI" } },
+ { "JFS", { 0x8000, "JFS1" }, { 0, NULL }, { 0, NULL } },
+ { "NTFS", { 0x1FE, "\x55\xAA" }, { 0x3, "NTFS" }, { 0, NULL } },
+ { "FAT32", { 0x1FE, "\x55\xAA" }, { 0x52, "FAT32" }, { 0, NULL } },
+ { "FAT", { 0x1FE, "\x55\xAA" }, { 0x36, "FAT" }, { 0, NULL } },
+ { "Linux LVM", { 0, "HM\1\0" }, { 0, NULL }, { 0, NULL } }
+ };
+ int partitions_signatures_nb = sizeof(partitions_signatures) / sizeof(struct partition_detection_info);
+ int i;
+ int fd;
+ const char *part_type = NULL;
+
+ char device_fullname[50];
+ strcpy(device_fullname, "/dev/");
+ strcat(device_fullname, dev);
+
+ if (ensure_dev_exists(device_fullname))
+ return NULL;
+ log_message("guessing type of %s", device_fullname);
+
+ if ((fd = open(device_fullname, O_RDONLY, 0)) < 0) {
+ log_perror("open");
+ return NULL;
+ }
+
+ for (i=0; i<partitions_signatures_nb; i++) {
+ int results = seek_and_compare(fd, partitions_signatures[i].anchor0);
+ if (results == -1)
+ goto detect_partition_type_end;
+ if (results == 1)
+ continue;
+ if (!partitions_signatures[i].anchor1.anchor)
+ goto detect_partition_found_it;
+
+ results = seek_and_compare(fd, partitions_signatures[i].anchor1);
+ if (results == -1)
+ goto detect_partition_type_end;
+ if (results == 1)
+ continue;
+ if (!partitions_signatures[i].anchor2.anchor)
+ goto detect_partition_found_it;
+
+ results = seek_and_compare(fd, partitions_signatures[i].anchor2);
+ if (results == -1)
+ goto detect_partition_type_end;
+ if (results == 1)
+ continue;
+
+ detect_partition_found_it:
+ part_type = partitions_signatures[i].name;
+ break;
+ }
+
+ detect_partition_type_end:
+ close(fd);
+ return part_type;
+}
+
+int list_partitions(char * dev_name, char ** parts, char ** comments)
+{
+ int major, minor, blocks;
+ char name[100];
+ FILE * f;
+ int i = 0;
+ char buf[512];
+
+ if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) {
+ log_perror(dev_name);
+ return 1;
+ }
+
+ while (fgets(buf, sizeof(buf), f)) {
+ memset(name, 0, sizeof(name));
+ sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name);
+ if ((strstr(name, dev_name) == name) && (blocks > 1) && (name[strlen(dev_name)] != '\0')) {
+ const char * partition_type = detect_partition_type(name);
+ parts[i] = strdup(name);
+ comments[i] = (char *) malloc(sizeof(char) * 100);
+ sprintf(comments[i], "size: %d Mbytes", blocks >> 10);
+ if (partition_type) {
+ strcat(comments[i], ", type: ");
+ strcat(comments[i], partition_type);
+ }
+ i++;
+ }
+ }
+ parts[i] = NULL;
+ fclose(f);
+
+ return 0;
+}
diff --git a/mdk-stage1/insmod-busybox/insmod-frontend.c b/mdk-stage1/partition.h
index 3e5d6b3d7..47639a3d0 100644
--- a/mdk-stage1/insmod-busybox/insmod-frontend.c
+++ b/mdk-stage1/partition.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Olivier Blin (oblin)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2005 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -12,13 +12,17 @@
*
*/
-#include <stdio.h>
+/*
+ * Portions from Erik Troan (ewt@redhat.com)
+ *
+ * Copyright 1996 Red Hat Software
+ *
+ */
+
+#ifndef _PARTITION_H_
+#define _PARTITION_H_
+int list_partitions(char * dev_name, char ** parts, char ** comments);
-int insmod_main( int argc, char **argv);
+#endif
-int main( int argc, char **argv)
-{
- printf("Using insmod provided by busybox.\n");
- return insmod_main(argc, argv);
-}
diff --git a/mdk-stage1/pci-resource/.cvsignore b/mdk-stage1/pci-resource/.cvsignore
deleted file mode 100644
index 4c7b0844b..000000000
--- a/mdk-stage1/pci-resource/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-pci-ids.h
diff --git a/mdk-stage1/pci-resource/Makefile b/mdk-stage1/pci-resource/Makefile
deleted file mode 100644
index 8627ab03c..000000000
--- a/mdk-stage1/pci-resource/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
- #******************************************************************************
- #
- # $Id$
- #
- # Guillaume Cottenceau (gc@mandrakesoft.com)
- #
- # Copyright 2000 MandrakeSoft
- #
- # This software may be freely redistributed under the terms of the GNU
- # public license.
- #
- # 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- #
- #*****************************************************************************
-
-
-all: pci-ids.h
-
-pci-ids.h: /usr/share/ldetect-lst/pcitable update-pci-ids.pl
- perl update-pci-ids.pl > $@ || rm -f $@
-
-clean:
- rm -f pci-ids.h
diff --git a/mdk-stage1/pci-resource/update-pci-ids.pl b/mdk-stage1/pci-resource/update-pci-ids.pl
deleted file mode 100755
index dee8bcf06..000000000
--- a/mdk-stage1/pci-resource/update-pci-ids.pl
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/perl
-
-use lib "../../perl-install";
-
-use common qw(:common);
-require '/usr/bin/merge2pcitable.pl';
-
-my $drivers = read_pcitable("/usr/share/ldetect-lst/pcitable");
-
-
-print '
-#define PCI_REVISION_ID 0x08 /* Revision ID */
-
-struct pci_module_map {
- unsigned short vendor; /* PCI vendor id */
- unsigned short device; /* PCI device id */
- const char *name; /* PCI human readable name */
- const char *module; /* module to load */
-};
-
-';
-
-my %t = (scsi => 'scsi', eth => 'net');
-
-if (-x "../mar/mar" && -f "../../modules/network_modules.mar" && -f "../../modules/hd_modules.mar") {
- $modulez{'eth'} = [ `../mar/mar -l ../../modules/network_modules.mar` ];
- $modulez{'scsi'} = [ `../mar/mar -l ../../modules/hd_modules.mar` ];
- $check_marfiles = 1;
-}
-
-
-foreach $type (keys %t) {
- print "#ifndef DISABLE_NETWORK\n" if ($type eq 'eth');
- print "#ifndef DISABLE_MEDIAS\n" if ($type eq 'scsi');
-
- print "
-struct pci_module_map ${type}_pci_ids[] = {
-";
- my %l;
- foreach (glob("../../kernel/lib/modules/*/$t{$type}/*.o"), glob("../../kernel/lib/modules/*/kernel/drivers/$t{$type}/{*/,}*.o")) {
- m|([^/]*)\.o$|;
- $l{$1} = 1;
- }
- my %absent;
- while (my ($k, $v) = each %$drivers) {
- $l{$v->[0]} or next;
- $k =~ /^(....)(....)/;
- printf qq|\t{0x%s , 0x%s , ( "%s" ), ( "%s" )} ,\n|,
- $1, $2, $v->[1], $v->[0];
- if (defined($check_marfiles)) {
- ($absent{$v->[0]} = 1) if (!grep(/^\t$v->[0]\.o\s/, @{$modulez{$type}}));
- }
- }
-
- if (%absent) { print STDERR "\tmissing for $type: "; foreach (keys %absent) { print STDERR "$_ " } print STDERR "\n"; };
-
-print "
-};
-int ${type}_num_ids=sizeof(${type}_pci_ids)/sizeof(struct pci_module_map);
-";
-
- print "#endif\n";
-
-}
diff --git a/mdk-stage1/pcmcia/Makefile b/mdk-stage1/pcmcia/Makefile
index e2e670146..6b8bf0cb8 100644
--- a/mdk-stage1/pcmcia/Makefile
+++ b/mdk-stage1/pcmcia/Makefile
@@ -1,8 +1,8 @@
#******************************************************************************
#
- # Guillaume Cottenceau (gc@mandrakesoft.com)
+ # Guillaume Cottenceau (gc)
#
- # Copyright 2000 MandrakeSoft
+ # Copyright 2001 Mandriva
#
# This software may be freely redistributed under the terms of the GNU
# public license.
@@ -13,22 +13,40 @@
#
#*****************************************************************************
+# startup.c is based on pcmcia-socket-startup from pcmciautils-013
+
top_dir = ..
include $(top_dir)/Makefile.common
+TARGET = libpcmcia.a
+YFLAGS := -d
-all: libpcmcia.a
+all: $(TARGET) pcmcia_probe.o
clean:
- rm -f *.o libpcmcia.a
+ rm -f *.o $(TARGET) lex_config.c yacc_config.c yacc_config.h
+
+FLAGS = -D__linux__ -Wall -Werror -Wno-deprecated-declarations -Os -fomit-frame-pointer -pipe -c -I.. -D_DEFAULT_SOURCE
+# (blino) make sure yynewerror and yyerrlab are uselessly used
+FLAGS += -Dlint
+LFLAGS += --nounput
+
+
+OBJS = probe.o startup.o yacc_config.o lex_config.o
+
-FLAGS = -Wall -Werror -Os -fomit-frame-pointer -pipe -c -I..
+%.c %.h : %.y
+ $(YACC) $(YFLAGS) $<
+ mv y.tab.c $*.c
+ mv y.tab.h $*.h
-libpcmcia.a: pcmcia_probe.o cardmgr.o lex_config.o yacc_config.o
+$(TARGET): $(OBJS) yacc_config.h
ar -cru $@ $^
ranlib $@
-.c.o:
- gcc $(FLAGS) $(GLIBC_INCLUDES) $<
+$(OBJS): %.o: %.c
+ gcc $(FLAGS) $(INCLUDES) -c $< -o $@
+pcmcia_probe.o: probe.c
+ gcc -fPIC $(FLAGS) $(INCLUDES) -c $< -o $@
diff --git a/mdk-stage1/pcmcia/bulkmem.h b/mdk-stage1/pcmcia/bulkmem.h
index 1b0bcbd1e..7748d4432 100644
--- a/mdk-stage1/pcmcia/bulkmem.h
+++ b/mdk-stage1/pcmcia/bulkmem.h
@@ -1,7 +1,7 @@
/*
* Definitions for bulk memory services
*
- * bulkmem.h 1.12 2000/06/12 21:55:41
+ * bulkmem.h 1.13 2001/08/24 12:16:12
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -18,8 +18,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
diff --git a/mdk-stage1/pcmcia/cardmgr.c b/mdk-stage1/pcmcia/cardmgr.c
deleted file mode 100644
index 1899d04b8..000000000
--- a/mdk-stage1/pcmcia/cardmgr.c
+++ /dev/null
@@ -1,805 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/* Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.23.tar.bz2
- *
- * Licence of this code follows:
-
- PCMCIA Card Manager daemon
-
- cardmgr.c 1.150 2000/12/14 17:12:59
-
- The contents of this file are subject to the Mozilla Public
- License Version 1.1 (the "License"); you may not use this file
- except in compliance with the License. You may obtain a copy of
- the License at http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS
- IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- implied. See the License for the specific language governing
- rights and limitations under the License.
-
- The initial developer of the original code is David A. Hinds
- <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
- are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
-
- Alternatively, the contents of this file may be used under the
- terms of the GNU Public License version 2 (the "GPL"), in which
- case the provisions of the GPL are applicable instead of the
- above. If you wish to allow the use of your version of this file
- only under the terms of the GPL and not to allow others to use
- your version of this file under the MPL, indicate your decision
- by deleting the provisions above and replace them with the notice
- and other provisions required by the GPL. If you do not delete
- the provisions above, a recipient may use your version of this
- file under either the MPL or the GPL.
-
- */
-
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <sys/utsname.h>
-#include <sys/file.h>
-
-#include <pcmcia/version.h>
-#include <pcmcia/config.h>
-#include <pcmcia/cs_types.h>
-#include <pcmcia/cs.h>
-#include <pcmcia/cistpl.h>
-#include <pcmcia/ds.h>
-
-#include "../log.h"
-#include "modules.h"
-
-#include "cardmgr.h"
-#include "pcmcia.h"
-
-/*====================================================================*/
-
-typedef struct socket_info_t {
- int fd;
- int state;
- card_info_t *card;
- bind_info_t *bind[MAX_BINDINGS];
- mtd_ident_t *mtd[2*CISTPL_MAX_DEVICES];
-} socket_info_t;
-
-#define SOCKET_PRESENT 0x01
-#define SOCKET_READY 0x02
-#define SOCKET_BOUND 0x04
-
-/* Linked list of resource adjustments */
-struct adjust_list_t *root_adjust = NULL;
-
-/* Linked list of device definitions */
-struct device_info_t *root_device = NULL;
-
-/* Special pointer to "anonymous" card definition */
-struct card_info_t *blank_card = NULL;
-
-/* Linked list of card definitions */
-struct card_info_t *root_card = NULL;
-
-/* Linked list of function definitions */
-struct card_info_t *root_func = NULL;
-
-/* Linked list of MTD definitions */
-struct mtd_ident_t *root_mtd = NULL;
-
-/* Default MTD */
-struct mtd_ident_t *default_mtd = NULL;
-
-static int sockets;
-static struct socket_info_t socket[MAX_SOCKS];
-
-static char *configpath = "/etc/pcmcia";
-
-/* Default path for socket info table */
-static char *stabfile;
-
-/*====================================================================*/
-
-static int major = 0;
-
-static int lookup_dev(char *name)
-{
- FILE *f;
- int n;
- char s[32], t[32];
-
- f = fopen("/proc/devices", "r");
- if (f == NULL)
- return -errno;
- while (fgets(s, 32, f) != NULL) {
- if (sscanf(s, "%d %s", &n, t) == 2)
- if (strcmp(name, t) == 0)
- break;
- }
- fclose(f);
- if (strcmp(name, t) == 0)
- return n;
- else
- return -ENODEV;
-}
-
-static int open_dev(dev_t dev, int mode)
-{
- char *fn;
- int fd;
- if ((fn = tmpnam(NULL)) == NULL)
- return -1;
- if (mknod(fn, mode, dev) != 0)
- return -1;
- fd = open(fn, (mode&S_IWRITE) ? O_RDWR : O_RDONLY);
- if (fd < 0)
- fd = open(fn, O_NONBLOCK|((mode&S_IWRITE) ? O_RDWR : O_RDONLY));
- unlink(fn);
- return fd;
-}
-
-static int open_sock(int sock, int mode)
-{
- dev_t dev = (major<<8) + sock;
- return open_dev(dev, mode);
-}
-
-/*======================================================================
-
- xlate_scsi_name() is a sort-of-hack used to deduce the minor
- device numbers of SCSI devices, from the information available to
- the low-level driver.
-
-======================================================================*/
-
-
-#include <linux/major.h>
-#include <scsi/scsi.h>
-
-static int xlate_scsi_name(bind_info_t *bind)
-{
- int i, fd, mode, minor;
- u_long arg[2], id1, id2;
-
- id1 = strtol(bind->name+3, NULL, 16);
- if ((bind->major == SCSI_DISK0_MAJOR) ||
- (bind->major == SCSI_CDROM_MAJOR))
- mode = S_IREAD|S_IFBLK;
- else
- mode = S_IREAD|S_IFCHR;
-
- for (i = 0; i < 16; i++) {
- minor = (bind->major == SCSI_DISK0_MAJOR) ? (i<<4) : i;
- fd = open_dev((bind->major<<8)+minor, mode);
- if (fd < 0)
- continue;
- if (ioctl(fd, SCSI_IOCTL_GET_IDLUN, arg) == 0) {
- id2 = (arg[0]&0x0f) + ((arg[0]>>4)&0xf0) +
- ((arg[0]>>8)&0xf00) + ((arg[0]>>12)&0xf000);
- if (id1 == id2) {
- close(fd);
- switch (bind->major) {
- case SCSI_DISK0_MAJOR:
- case SCSI_GENERIC_MAJOR:
- sprintf(bind->name+2, "%c", 'a'+i); break;
- case SCSI_CDROM_MAJOR:
- sprintf(bind->name, "scd%d", i); break;
- case SCSI_TAPE_MAJOR:
- sprintf(bind->name+2, "%d", i); break;
- }
- bind->minor = minor;
- return 0;
- }
- }
- close(fd);
- }
- return -1;
-}
-
-
-/*====================================================================*/
-
-static void write_stab(void)
-{
- int i, j, k;
- FILE *f;
- socket_info_t *s;
- bind_info_t *bind;
-
- f = fopen(stabfile, "w");
- if (f == NULL) {
- log_message("CM: fopen(stabfile) failed: %m");
- return;
- }
- if (flock(fileno(f), LOCK_EX) != 0) {
- log_message("CM: flock(stabfile) failed: %m");
- return;
- }
- for (i = 0; i < sockets; i++) {
- s = &socket[i];
- if (!(s->state & SOCKET_PRESENT))
- fprintf(f, "Socket %d: empty\n", i);
- else if (!s->card)
- fprintf(f, "Socket %d: unsupported card\n", i);
- else {
- fprintf(f, "Socket %d: %s\n", i, s->card->name);
- for (j = 0; j < s->card->bindings; j++)
- for (k = 0, bind = s->bind[j];
- bind != NULL;
- k++, bind = bind->next) {
- char *class = s->card->device[j]->class;
- fprintf(f, "%d\t%s\t%s\t%d\t%s",
- i, (class ? class : "none"),
- bind->dev_info, k, bind->name);
- if (bind->major)
- fprintf(f, "\t%d\t%d\n",
- bind->major, bind->minor);
- else
- fputc('\n', f);
- }
- }
- }
- fflush(f);
- fclose(f);
-}
-
-/*====================================================================*/
-
-static int get_tuple(int ns, cisdata_t code, ds_ioctl_arg_t *arg)
-{
- socket_info_t *s = &socket[ns];
-
- arg->tuple.DesiredTuple = code;
- arg->tuple.Attributes = 0;
- if (ioctl(s->fd, DS_GET_FIRST_TUPLE, arg) != 0)
- return -1;
- arg->tuple.TupleOffset = 0;
- if (ioctl(s->fd, DS_GET_TUPLE_DATA, arg) != 0) {
- log_message("CM: error reading CIS data on socket %d: %m", ns);
- return -1;
- }
- if (ioctl(s->fd, DS_PARSE_TUPLE, arg) != 0) {
- log_message("CM: error parsing CIS on socket %d: %m", ns);
- return -1;
- }
- return 0;
-}
-
-/*====================================================================*/
-
-typedef struct {
- u_short vendor, device;
-} pci_id_t;
-
-
-static card_info_t *lookup_card(int ns)
-{
- socket_info_t *s = &socket[ns];
- card_info_t *card = NULL;
- ds_ioctl_arg_t arg;
- cistpl_vers_1_t *vers = NULL;
- cistpl_manfid_t manfid = { 0, 0 };
- pci_id_t pci_id = { 0, 0 };
- cistpl_funcid_t funcid = { 0xff, 0xff };
- cs_status_t status;
- config_info_t config;
- int i, ret, match;
- int has_cis = 0;
-
- /* Do we have a CIS structure? */
- ret = ioctl(s->fd, DS_VALIDATE_CIS, &arg);
- has_cis = ((ret == 0) && (arg.cisinfo.Chains > 0));
-
- /* Try to read VERS_1, MANFID tuples */
- if (has_cis) {
- /* rule of thumb: cards with no FUNCID, but with common memory
- device geometry information, are probably memory cards */
- if (get_tuple(ns, CISTPL_FUNCID, &arg) == 0)
- memcpy(&funcid, &arg.tuple_parse.parse.funcid,
- sizeof(funcid));
- else if (get_tuple(ns, CISTPL_DEVICE_GEO, &arg) == 0)
- funcid.func = CISTPL_FUNCID_MEMORY;
- if (get_tuple(ns, CISTPL_MANFID, &arg) == 0)
- memcpy(&manfid, &arg.tuple_parse.parse.manfid,
- sizeof(manfid));
- if (get_tuple(ns, CISTPL_VERS_1, &arg) == 0)
- vers = &arg.tuple_parse.parse.version_1;
-
- match = 0;
- for (card = root_card; card; card = card->next) {
- switch (card->ident_type) {
-
- case VERS_1_IDENT:
- if (vers == NULL)
- break;
- for (i = 0; i < card->id.vers.ns; i++) {
- if (strcmp(card->id.vers.pi[i], "*") == 0)
- continue;
- if (i >= vers->ns)
- break;
- if (strcmp(card->id.vers.pi[i],
- vers->str+vers->ofs[i]) != 0)
- break;
- }
- if (i < card->id.vers.ns)
- break;
- match = 1;
- break;
-
- case MANFID_IDENT:
- if ((manfid.manf == card->id.manfid.manf) &&
- (manfid.card == card->id.manfid.card))
- match = 1;
- break;
-
- case TUPLE_IDENT:
- arg.tuple.DesiredTuple = card->id.tuple.code;
- arg.tuple.Attributes = 0;
- ret = ioctl(s->fd, DS_GET_FIRST_TUPLE, &arg);
- if (ret != 0) break;
- arg.tuple.TupleOffset = card->id.tuple.ofs;
- ret = ioctl(s->fd, DS_GET_TUPLE_DATA, &arg);
- if (ret != 0) break;
- if (strncmp((char *)arg.tuple_parse.data,
- card->id.tuple.info,
- strlen(card->id.tuple.info)) != 0)
- break;
- match = 1;
- break;
-
- default:
- /* Skip */
- break;
- }
- if (match) break;
- }
- }
-
- /* Check PCI vendor/device info */
- status.Function = config.Function = config.ConfigBase = 0;
- if ((ioctl(s->fd, DS_GET_CONFIGURATION_INFO, &config) == 0) &&
- (config.IntType == INT_CARDBUS)) {
- pci_id.vendor = config.ConfigBase & 0xffff;
- pci_id.device = config.ConfigBase >> 16;
- if (!card) {
- for (card = root_card; card; card = card->next)
- if ((card->ident_type == PCI_IDENT) &&
- (pci_id.vendor == card->id.manfid.manf) &&
- (pci_id.device == card->id.manfid.card))
- break;
- }
- }
-
- /* Try for a FUNCID match */
- if (!card && (funcid.func != 0xff)) {
- for (card = root_func; card; card = card->next)
- if (card->id.func.funcid == funcid.func)
- break;
- }
-
- if (card) {
- log_message("CM: socket %d: %s", ns, card->name);
- return card;
- }
-
- status.Function = 0;
- if (!blank_card || (status.CardState & CS_EVENT_CB_DETECT) ||
- manfid.manf || manfid.card || pci_id.vendor || vers) {
- log_message("CM: unsupported card in socket %d", ns);
- return NULL;
- } else {
- card = blank_card;
- log_message("CM: socket %d: %s", ns, card->name);
- return card;
- }
-}
-
-
-static void cardmgr_fail(void)
-{
- log_message("CM: cardmgr: failed");
-}
-
-/*====================================================================*/
-
-static int load_config(void)
-{
- if (chdir(configpath)) {
- log_message("CM: chdir to %s failed: %m", configpath);
- return -1;
- }
-
- if (parse_configfile("config"))
- return -1;
-
- if (!root_device)
- log_message("CM: no device drivers defined");
-
- if (!root_card && !root_func)
- log_message("CM: no cards defined");
-
- return 0;
-}
-
-
-/*====================================================================*/
-
-static void install_module(char *mod, char *opts)
-{
- my_insmod(mod, ANY_DRIVER_TYPE, opts);
-}
-
-/*====================================================================*/
-
-static mtd_ident_t *lookup_mtd(region_info_t *region)
-{
- mtd_ident_t *mtd;
- int match = 0;
-
- for (mtd = root_mtd; mtd; mtd = mtd->next) {
- switch (mtd->mtd_type) {
- case JEDEC_MTD:
- if ((mtd->jedec_mfr == region->JedecMfr) &&
- (mtd->jedec_info == region->JedecInfo)) {
- match = 1;
- break;
- }
- case DTYPE_MTD:
- break;
- default:
- break;
- }
- if (match) break;
- }
- if (mtd)
- return mtd;
- else
- return default_mtd;
-}
-
-/*====================================================================*/
-
-static void bind_mtd(int sn)
-{
- socket_info_t *s = &socket[sn];
- region_info_t region;
- bind_info_t bind;
- mtd_info_t mtd_info;
- mtd_ident_t *mtd;
- int i, attr, ret, nr;
-
- nr = 0;
- for (attr = 0; attr < 2; attr++) {
- region.Attributes = attr;
- ret = ioctl(s->fd, DS_GET_FIRST_REGION, &region);
- while (ret == 0) {
- mtd = lookup_mtd(&region);
- if (mtd) {
- /* Have we seen this MTD before? */
- for (i = 0; i < nr; i++)
- if (s->mtd[i] == mtd) break;
- if (i == nr) {
- install_module(mtd->module, mtd->opts);
- s->mtd[nr] = mtd;
- mtd->refs++;
- nr++;
- }
- log_message("CM: %s memory region at 0x%lx: %s",
- attr ? "Attribute" : "Common", (long unsigned int) region.CardOffset,
- mtd->name);
- /* Bind MTD to this region */
- strcpy(mtd_info.dev_info, s->mtd[i]->module);
- mtd_info.Attributes = region.Attributes;
- mtd_info.CardOffset = region.CardOffset;
- if (ioctl(s->fd, DS_BIND_MTD, &mtd_info) != 0) {
- log_message( "bind MTD '%s' to region at 0x%lx failed: %m",
- (char *)mtd_info.dev_info, (long unsigned int) region.CardOffset);
- }
- }
- ret = ioctl(s->fd, DS_GET_NEXT_REGION, &region);
- }
- }
- s->mtd[nr] = NULL;
-
- /* Now bind each unique MTD as a normal client of this socket */
- for (i = 0; i < nr; i++) {
- strcpy(bind.dev_info, s->mtd[i]->module);
- bind.function = 0;
- if (ioctl(s->fd, DS_BIND_REQUEST, &bind) != 0)
- log_message("CM: bind MTD '%s' to socket %d failed: %m",
- (char *)bind.dev_info, sn);
- }
-}
-
-/*====================================================================*/
-
-static void update_cis(socket_info_t *s)
-{
- cisdump_t cis;
- FILE *f = fopen(s->card->cis_file, "r");
- if (f == NULL)
- log_message("CM: could not open '%s': %m", s->card->cis_file);
- else {
- cis.Length = fread(cis.Data, 1, CISTPL_MAX_CIS_SIZE, f);
- fclose(f);
- if (ioctl(s->fd, DS_REPLACE_CIS, &cis) != 0)
- log_message("CM: could not replace CIS: %m");
- }
-}
-
-/*====================================================================*/
-
-static void do_insert(int sn)
-{
- socket_info_t *s = &socket[sn];
- card_info_t *card;
- device_info_t **dev;
- bind_info_t *bind, **tail;
- int i, j, ret;
-
- /* Already identified? */
- if (s->card && (s->card != blank_card))
- return;
-
- log_message("CM: initializing socket %d", sn);
- card = lookup_card(sn);
- /* Make sure we've learned something new before continuing */
- if (card == s->card)
- return;
- s->card = card;
- card->refs++;
- if (card->cis_file)
- update_cis(s);
-
- dev = card->device;
-
- /* Set up MTD's */
- for (i = 0; i < card->bindings; i++)
- if (dev[i]->needs_mtd)
- break;
-
- if (i < card->bindings)
- bind_mtd(sn);
-
- /* Install kernel modules */
- for (i = 0; i < card->bindings; i++) {
- dev[i]->refs++;
- for (j = 0; j < dev[i]->modules; j++)
- install_module(dev[i]->module[j], dev[i]->opts[j]);
- }
-
- /* Bind drivers by their dev_info identifiers */
- for (i = 0; i < card->bindings; i++) {
- bind = calloc(1, sizeof(bind_info_t));
- strcpy((char *)bind->dev_info, (char *)dev[i]->dev_info);
- if (strcmp(bind->dev_info, "cb_enabler") == 0)
- bind->function = BIND_FN_ALL;
- else
- bind->function = card->dev_fn[i];
- if (ioctl(s->fd, DS_BIND_REQUEST, bind) != 0) {
- if (errno == EBUSY) {
- log_message("CM: '%s' already bound to socket %d",
- (char *)bind->dev_info, sn);
- } else {
- log_message("CM: bind '%s' to socket %d failed: %m",
- (char *)bind->dev_info, sn);
- write_stab();
- return;
- }
- }
-
- for (ret = j = 0; j < 10; j++) {
- ret = ioctl(s->fd, DS_GET_DEVICE_INFO, bind);
- if ((ret == 0) || (errno != EAGAIN))
- break;
- usleep(100000);
- }
- if (ret != 0) {
- log_message("CM: get dev info on socket %d failed: %m",
- sn);
- ioctl(s->fd, DS_UNBIND_REQUEST, bind);
- write_stab();
- return;
- }
- tail = &s->bind[i];
- while (ret == 0) {
- bind_info_t *old;
- if ((strlen(bind->name) > 3) && (bind->name[2] == '#'))
- xlate_scsi_name(bind);
- old = *tail = bind; tail = (bind_info_t **)&bind->next;
- bind = (bind_info_t *)malloc(sizeof(bind_info_t));
- memcpy(bind, old, sizeof(bind_info_t));
- ret = ioctl(s->fd, DS_GET_NEXT_DEVICE, bind);
- }
- *tail = NULL; free(bind);
- write_stab();
- }
-}
-
-/*====================================================================*/
-
-static void wait_for_pending(void)
-{
- cs_status_t status;
- int i;
- status.Function = 0;
- for (;;) {
- usleep(100000);
- for (i = 0; i < sockets; i++)
- if ((ioctl(socket[i].fd, DS_GET_STATUS, &status) == 0) && (status.CardState & CS_EVENT_CARD_INSERTION))
- break;
- if (i == sockets)
- break;
- }
-}
-
-/*====================================================================*/
-
-static void adjust_resources(void)
-{
- adjust_list_t *al;
- int ret;
- char tmp[64];
- int fd = socket[0].fd;
-
- for (al = root_adjust; al; al = al->next) {
- ret = ioctl(fd, DS_ADJUST_RESOURCE_INFO, &al->adj);
- if (ret != 0) {
- switch (al->adj.Resource) {
- case RES_MEMORY_RANGE:
- sprintf(tmp, "memory %#lx-%#lx",
- al->adj.resource.memory.Base,
- al->adj.resource.memory.Base +
- al->adj.resource.memory.Size - 1);
- break;
- case RES_IO_RANGE:
- sprintf(tmp, "IO ports %#x-%#x",
- al->adj.resource.io.BasePort,
- al->adj.resource.io.BasePort +
- al->adj.resource.io.NumPorts - 1);
- break;
- case RES_IRQ:
- sprintf(tmp, "irq %u", al->adj.resource.irq.IRQ);
- break;
- }
- log_message("CM: could not adjust resource: %s: %m", tmp);
- }
- }
-}
-
-/*====================================================================*/
-
-static int init_sockets(void)
-{
- int fd, i;
- servinfo_t serv;
-
- major = lookup_dev("pcmcia");
- if (major < 0) {
- if (major == -ENODEV)
- log_message("CM: no pcmcia driver in /proc/devices");
- else
- log_message("CM: could not open /proc/devices: %m");
- return -1;
- }
-
- for (fd = -1, i = 0; i < MAX_SOCKS; i++) {
- fd = open_sock(i, S_IFCHR|S_IREAD|S_IWRITE);
- if (fd < 0)
- break;
- socket[i].fd = fd;
- socket[i].state = 0;
- }
-
- if ((fd < 0) && (errno != ENODEV) && (errno != ENOENT))
- log_message("CM: open_sock(socket %d) failed: %m", i);
- sockets = i;
- if (sockets == 0) {
- log_message("CM: no sockets found!");
- return -1;
- } else
- log_message("CM: found %d sockets", sockets);
-
- if (ioctl(socket[0].fd, DS_GET_CARD_SERVICES_INFO, &serv) == 0) {
- if (serv.Revision != CS_RELEASE_CODE)
- log_message("CM: warning, Card Services release does not match kernel");
- } else {
- log_message("CM: could not get CS revision info!");
- return -1;
- }
- adjust_resources();
- return 0;
-}
-
-/*====================================================================*/
-
-int cardmgr_call(void)
-{
- int i, max_fd, ret, event;
- struct timeval tv;
- fd_set fds;
-
- stabfile = "/var/run/stab";
-
- log_message("CM: cardmgr/hacked starting, version is " CS_RELEASE);
-
- if (load_config()) {
- cardmgr_fail();
- return -1;
- }
-
- if (init_sockets()) {
- cardmgr_fail();
- return -1;
- }
-
- /* If we've gotten this far, then clean up pid and stab at exit */
- write_stab();
-
- for (i = max_fd = 0; i < sockets; i++)
- max_fd = (socket[i].fd > max_fd) ? socket[i].fd : max_fd;
-
- /* First select() call: poll, don't wait */
- tv.tv_sec = tv.tv_usec = 0;
-
- /* Wait for sockets in setup-pending state to settle */
- wait_for_pending();
-
-
- FD_ZERO(&fds);
- for (i = 0; i < sockets; i++)
- FD_SET(socket[i].fd, &fds);
-
- if (select(max_fd+1, &fds, NULL, NULL, &tv) < 0) {
- log_perror("CM: select fails");
- return -1;
- }
-
- for (i = 0; i < sockets; i++) {
- if (!FD_ISSET(socket[i].fd, &fds))
- continue;
- ret = read(socket[i].fd, &event, 4);
- if ((ret == -1) && (errno != EAGAIN))
- log_message("CM: read(%d): %m\n", i);
- if (ret != 4)
- continue;
-
- switch (event) {
- case CS_EVENT_CARD_INSERTION:
- case CS_EVENT_INSERTION_REQUEST:
- socket[i].state |= SOCKET_PRESENT;
- case CS_EVENT_CARD_RESET:
- socket[i].state |= SOCKET_READY;
- do_insert(i);
- break;
- case CS_EVENT_RESET_PHYSICAL:
- socket[i].state &= ~SOCKET_READY;
- break;
- }
-
- }
-
- return 0;
-
-}
diff --git a/mdk-stage1/pcmcia/cardmgr.h b/mdk-stage1/pcmcia/cardmgr.h
deleted file mode 100644
index fe04044e5..000000000
--- a/mdk-stage1/pcmcia/cardmgr.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * cardmgr.h 1.35 2000/06/12 21:33:03
- *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License
- * at http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- * the License for the specific language governing rights and
- * limitations under the License.
- *
- * The initial developer of the original code is David A. Hinds
- * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
- * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
- *
- * Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
- * above. If you wish to allow the use of your version of this file
- * only under the terms of the GPL and not to allow others to use
- * your version of this file under the MPL, indicate your decision by
- * deleting the provisions above and replace them with the notice and
- * other provisions required by the GPL. If you do not delete the
- * provisions above, a recipient may use your version of this file
- * under either the MPL or the GPL.
- */
-
-#define MAX_SOCKS 8
-#define MAX_BINDINGS 4
-#define MAX_MODULES 4
-
-typedef struct adjust_list_t {
- adjust_t adj;
- struct adjust_list_t *next;
-} adjust_list_t;
-
-typedef struct func_ident_t {
- u_char funcid;
-} func_ident_t;
-
-typedef struct manfid_ident_t {
- u_short manf;
- u_short card;
-} manfid_ident_t;
-
-typedef struct vers_ident_t {
- int ns;
- char *pi[4];
-} vers_ident_t;
-
-typedef struct tuple_ident_t {
- cisdata_t code;
- long ofs;
- char *info;
-} tuple_ident_t;
-
-typedef struct device_info_t {
- dev_info_t dev_info;
- int needs_mtd;
- int modules;
- char *module[MAX_MODULES];
- char *opts[MAX_MODULES];
- char *class;
- int refs;
- struct device_info_t *next;
-} device_info_t;
-
-typedef struct card_info_t {
- char *name;
- enum {
- VERS_1_IDENT=1, MANFID_IDENT, TUPLE_IDENT, FUNC_IDENT,
- BLANK_IDENT, PCI_IDENT
- } ident_type;
- union {
- vers_ident_t vers;
- manfid_ident_t manfid;
- tuple_ident_t tuple;
- func_ident_t func;
- } id;
- int bindings;
- device_info_t *device[MAX_BINDINGS];
- int dev_fn[MAX_BINDINGS];
- char *cis_file;
- int refs;
- struct card_info_t *next;
-} card_info_t;
-
-typedef struct mtd_ident_t {
- char *name;
- enum {
- JEDEC_MTD=1, DTYPE_MTD, DEFAULT_MTD
- } mtd_type;
- int dtype, jedec_mfr, jedec_info;
- char *module, *opts;
- int refs;
- struct mtd_ident_t *next;
-} mtd_ident_t;
-
-extern adjust_list_t *root_adjust;
-extern device_info_t *root_device;
-extern card_info_t *blank_card;
-extern card_info_t *root_card, *root_func;
-extern mtd_ident_t *root_mtd, *default_mtd;
-
-int parse_configfile(char *fn);
diff --git a/mdk-stage1/pcmcia/cirrus.h b/mdk-stage1/pcmcia/cirrus.h
index b7aad5894..78f73b26d 100644
--- a/mdk-stage1/pcmcia/cirrus.h
+++ b/mdk-stage1/pcmcia/cirrus.h
@@ -1,5 +1,5 @@
/*
- * cirrus.h 1.9 2000/06/12 21:29:37
+ * cirrus.h 1.10 2001/08/24 12:15:33
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
@@ -48,11 +48,6 @@
#define PD67_EXT_INDEX 0x2e /* Extension index */
#define PD67_EXT_DATA 0x2f /* Extension data */
-#define pd67_ext_get(s, r) \
- (i365_set(s, PD67_EXT_INDEX, r), i365_get(s, PD67_EXT_DATA))
-#define pd67_ext_set(s, r, v) \
- (i365_set(s, PD67_EXT_INDEX, r), i365_set(s, PD67_EXT_DATA, v))
-
/* PD6722 extension registers -- indexed in PD67_EXT_INDEX */
#define PD67_DATA_MASK0 0x01 /* Data mask 0 */
#define PD67_DATA_MASK1 0x02 /* Data mask 1 */
@@ -125,10 +120,6 @@
#define PD67_EC1_INV_MGMT_IRQ 0x10
#define PD67_EC1_PULLUP_CTL 0x20
-/* Fields in PD67_EXTERN_DATA */
-#define PD67_EXD_VS1(s) (0x01 << ((s)<<1))
-#define PD67_EXD_VS2(s) (0x02 << ((s)<<1))
-
/* Fields in PD67_MISC_CTL_3 */
#define PD67_MC3_IRQ_MASK 0x03
#define PD67_MC3_IRQ_PCPCI 0x00
@@ -163,20 +154,4 @@
/* Socket Number Register */
#define PD6832_SOCKET_NUMBER 0x004c /* 8 bit */
-/* Data structure for tracking vendor-specific state */
-typedef struct cirrus_state_t {
- u_char misc1; /* PD67_MISC_CTL_1 */
- u_char misc2; /* PD67_MISC_CTL_2 */
- u_char ectl1; /* PD67_EXT_CTL_1 */
- u_char timer[6]; /* PD67_TIME_* */
-} cirrus_state_t;
-
-#define CIRRUS_PCIC_ID \
- IS_PD6729, IS_PD6730, IS_PD6832
-
-#define CIRRUS_PCIC_INFO \
- { "Cirrus PD6729", IS_CIRRUS|IS_PCI, ID(CIRRUS, 6729) }, \
- { "Cirrus PD6730", IS_CIRRUS|IS_PCI, PCI_VENDOR_ID_CIRRUS, -1 }, \
- { "Cirrus PD6832", IS_CIRRUS|IS_CARDBUS, ID(CIRRUS, 6832) }
-
#endif /* _LINUX_CIRRUS_H */
diff --git a/mdk-stage1/pcmcia/cistpl.h b/mdk-stage1/pcmcia/cistpl.h
index a4b16a6e4..1d4cac20e 100644
--- a/mdk-stage1/pcmcia/cistpl.h
+++ b/mdk-stage1/pcmcia/cistpl.h
@@ -1,5 +1,5 @@
/*
- * cistpl.h 1.34 2000/06/19 23:18:12
+ * cistpl.h 1.35 2001/08/24 12:16:12
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
diff --git a/mdk-stage1/pcmcia/config.h b/mdk-stage1/pcmcia/config.h
deleted file mode 100644
index 4ad8fe81a..000000000
--- a/mdk-stage1/pcmcia/config.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- Automatically generated by 'make config' -- don't edit!
-*/
-#ifndef _PCMCIA_CONFIG_H
-#define _PCMCIA_CONFIG_H
-
-#define AUTOCONF_INCLUDED
-#define __IN_PCMCIA_PACKAGE__
-
-#define LINUX "/home/gc/rpm/BUILD/linux"
-#define PREFIX "/home/gc/rpm/tmp/kernel-2.4.0-build"
-#define CC "/usr/bin/kgcc"
-#define LD "ld"
-#define KFLAGS ""
-#define UFLAGS ""
-#define PCDEBUG ""
-#define USE_PM 1
-#define UNSAFE_TOOLS 1
-#define CONFIG_CARDBUS 1
-#undef CONFIG_PNP_BIOS
-#define MODDIR "/lib/modules/2.4.0-6mdk"
-
-/* Options from /home/gc/rpm/BUILD/linux/.config */
-#define CONFIG_MODULES 1
-#undef CONFIG_PCMCIA
-#undef CONFIG_SMP
-#define CONFIG_PCI 1
-#define CONFIG_PCI_QUIRKS 1
-#define CONFIG_PM 1
-#define CONFIG_SCSI 1
-#define CONFIG_IEEE1394 1
-#define CONFIG_INET 1
-#define CONFIG_NET_PCMCIA_RADIO 1
-#define CONFIG_TR 1
-#undef CONFIG_NET_FASTROUTE
-#undef CONFIG_NET_DIVERT
-#define CONFIG_MODVERSIONS 1
-#define CONFIG_X86_L1_CACHE_BYTES 32
-#define CONFIG_X86_L1_CACHE_SHIFT 5
-#define CONFIG_PROC_FS 1
-#define ARCH "i386"
-#define HOST_ARCH "i386"
-#define AFLAGS ""
-#define CONFIG_ISA 1
-#define CONFIG_UID16 1
-
-#define UTS_RELEASE "2.4.0-6mdk"
-#define UTS_VERSION "#1 Wed Jan 24 16:10:16 CET 2001"
-#define LINUX_VERSION_CODE 132096
-#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
-
-#define HAS_PROC_BUS 1
-#define SYSV_INIT 1
-#define RC_DIR "/etc/rc.d"
-#undef HAS_FORMS
-#define MANDIR "/usr/share/man"
-#define XMANDIR "/usr/X11R6/man"
-
-#endif /* _PCMCIA_CONFIG_H */
diff --git a/mdk-stage1/pcmcia/cs.h b/mdk-stage1/pcmcia/cs.h
index be6f92d65..9abeac216 100644
--- a/mdk-stage1/pcmcia/cs.h
+++ b/mdk-stage1/pcmcia/cs.h
@@ -1,5 +1,5 @@
/*
- * cs.h 1.71 2000/08/29 00:54:20
+ * cs.h 1.73 2001/08/24 12:16:12
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
@@ -49,8 +49,8 @@ typedef struct adjust_t {
u_int Attributes;
union {
struct memory {
- u_long Base;
- u_long Size;
+ unsigned long Base;
+ unsigned long Size;
} memory;
struct io {
ioaddr_t BasePort;
@@ -181,6 +181,7 @@ typedef struct config_req_t {
#define INT_MEMORY 0x01
#define INT_MEMORY_AND_IO 0x02
#define INT_CARDBUS 0x04
+#define INT_ZOOMED_VIDEO 0x08
/* For RequestIO and ReleaseIO */
typedef struct io_req_t {
@@ -266,7 +267,7 @@ typedef struct modwin_t {
/* For RequestWindow */
typedef struct win_req_t {
u_int Attributes;
- u_long Base;
+ unsigned long Base;
u_int Size;
u_int AccessSpeed;
} win_req_t;
@@ -397,14 +398,6 @@ typedef struct mtd_bind_t {
#ifdef __KERNEL__
/*
- * Calls to set up low-level "Socket Services" drivers
- */
-
-typedef int (*ss_entry_t)(u_int sock, u_int cmd, void *arg);
-extern int register_ss_entry(int nsock, ss_entry_t entry);
-extern void unregister_ss_entry(ss_entry_t entry);
-
-/*
* The main Card Services entry point
*/
@@ -435,30 +428,6 @@ extern int CardServices(int func, void *a1, void *a2, void *a3);
extern int CardServices(int func, ...);
#endif
-#ifdef __BEOS__
-#define SS_MODULE_NAME(s) ("busses/pcmcia/" s "/v1")
-#define MTD_MODULE_NAME(s) ("busses/pcmcia/" s "/v1")
-#define CS_CLIENT_MODULE_NAME "bus_managers/pcmcia_cs/client/v1"
-typedef struct cs_client_module_info {
- bus_manager_info binfo;
- int (*_CardServices)(int, ...);
- int (*_MTDHelperEntry)(int, ...);
- void (*_add_timer)(struct timer_list *);
- void (*_del_timer)(struct timer_list *);
-} cs_client_module_info;
-#define CS_SOCKET_MODULE_NAME "bus_managers/pcmcia_cs/socket/v1"
-typedef struct cs_socket_module_info {
- bus_manager_info binfo;
- int (*_register_ss_entry)(int, ss_entry_t);
- void (*_unregister_ss_entry)(ss_entry_t);
- void (*_add_timer)(struct timer_list *);
- void (*_del_timer)(struct timer_list *);
- int (*register_resource)(int, u_long, u_long);
- int (*release_resource)(int, u_long, u_long);
- int (*check_resource)(int, u_long, u_long);
-} cs_socket_module_info;
-#endif
-
#endif /* __KERNEL__ */
#endif /* _LINUX_CS_H */
diff --git a/mdk-stage1/pcmcia/cs_types.h b/mdk-stage1/pcmcia/cs_types.h
index 40cf84b51..4598d7f48 100644
--- a/mdk-stage1/pcmcia/cs_types.h
+++ b/mdk-stage1/pcmcia/cs_types.h
@@ -1,5 +1,5 @@
/*
- * cs_types.h 1.18 2000/06/12 21:55:40
+ * cs_types.h 1.19 2001/08/24 12:16:12
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
@@ -38,8 +38,13 @@
#endif
#endif
-typedef u_short socket_t;
+#ifdef __arm__
+typedef u_int ioaddr_t;
+#else
typedef u_short ioaddr_t;
+#endif
+
+typedef u_short socket_t;
typedef u_int event_t;
typedef u_char cisdata_t;
typedef u_short page_t;
diff --git a/mdk-stage1/pcmcia/driver_ops.h b/mdk-stage1/pcmcia/driver_ops.h
index 00cde3336..2f0a066d3 100644
--- a/mdk-stage1/pcmcia/driver_ops.h
+++ b/mdk-stage1/pcmcia/driver_ops.h
@@ -1,5 +1,5 @@
/*
- * driver_ops.h 1.15 2000/06/12 21:55:40
+ * driver_ops.h 1.16 2001/08/24 12:16:13
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
@@ -68,15 +68,6 @@ typedef struct driver_operations {
int register_driver(struct driver_operations *ops);
void unregister_driver(struct driver_operations *ops);
-#ifdef __BEOS__
-#define CB_ENABLER_MODULE_NAME "bus_managers/cb_enabler/v1"
-typedef struct cb_enabler_module_info {
- bus_manager_info binfo;
- int (*register_driver)(struct driver_operations *ops);
- void (*unregister_driver)(struct driver_operations *ops);
-} cb_enabler_module_info;
-#endif /* __BEOS__ */
-
#endif /* __KERNEL__ */
#endif /* _LINUX_DRIVER_OPS_H */
diff --git a/mdk-stage1/pcmcia/ds.h b/mdk-stage1/pcmcia/ds.h
index 975ba596a..29db7b415 100644
--- a/mdk-stage1/pcmcia/ds.h
+++ b/mdk-stage1/pcmcia/ds.h
@@ -1,5 +1,5 @@
/*
- * ds.h 1.56 2000/06/12 21:55:40
+ * ds.h 1.57 2001/08/24 12:16:13
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
@@ -30,8 +30,8 @@
#ifndef _LINUX_DS_H
#define _LINUX_DS_H
-#include <pcmcia/driver_ops.h>
-#include <pcmcia/bulkmem.h>
+#include <pcmcia_/driver_ops.h>
+#include <pcmcia_/bulkmem.h>
typedef struct tuple_parse_t {
tuple_t tuple;
@@ -143,21 +143,6 @@ int unregister_pccard_driver(dev_info_t *dev_info);
#define register_pcmcia_driver register_pccard_driver
#define unregister_pcmcia_driver unregister_pccard_driver
-#ifdef __BEOS__
-#define DS_MODULE_NAME "bus_managers/pcmcia_ds/v1"
-typedef struct ds_module_info {
- bus_manager_info binfo;
- int (*_register_pccard_driver)(dev_info_t *,
- dev_link_t *(*)(void),
- void (*)(dev_link_t *));
- int (*_unregister_pccard_driver)(dev_info_t *);
- struct driver_info_t **root_driver;
- int *sockets;
- struct socket_info_t **socket_table;
- sem_id *list_sem;
-} ds_module_info;
-#endif /* __BEOS__ */
-
#endif /* __KERNEL__ */
#endif /* _LINUX_DS_H */
diff --git a/mdk-stage1/pcmcia/i82365.h b/mdk-stage1/pcmcia/i82365.h
index 15e8e2540..38ff167fb 100644
--- a/mdk-stage1/pcmcia/i82365.h
+++ b/mdk-stage1/pcmcia/i82365.h
@@ -1,5 +1,5 @@
/*
- * i82365.h 1.20 2000/07/20 23:00:27
+ * i82365.h 1.21 2001/08/24 12:15:33
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
@@ -97,7 +97,6 @@
#define I365_CSC_GPI 0x10
/* Flags for I365_ADDRWIN */
-#define I365_ADDR_MEMCS16 0x20
#define I365_ENA_IO(map) (0x40 << (map))
#define I365_ENA_MEM(map) (0x01 << (map))
@@ -131,24 +130,6 @@
#define I365_MEM_WRPROT 0x8000 /* In offset high byte */
#define I365_MEM_REG 0x4000
-#define I365_REG(slot, reg) (((slot) << 6) | (reg))
-
-/* Default ISA interrupt mask */
-#define I365_ISA_IRQ_MASK 0xdeb8 /* irq's 3-5,7,9-12,14,15 */
-
-/* Device ID's for PCI-to-PCMCIA bridges */
-
-#ifndef PCI_VENDOR_ID_INTEL
-#define PCI_VENDOR_ID_INTEL 0x8086
-#endif
-#ifndef PCI_DEVICE_ID_INTEL_82092AA_0
-#define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221
-#endif
-#ifndef PCI_VENDOR_ID_OMEGA
-#define PCI_VENDOR_ID_OMEGA 0x119b
-#endif
-#ifndef PCI_DEVICE_ID_OMEGA_82C092G
-#define PCI_DEVICE_ID_OMEGA_82C092G 0x1221
-#endif
+#define I365_REG(slot, reg) (((slot) << 6) + reg)
#endif /* _LINUX_I82365_H */
diff --git a/mdk-stage1/pcmcia/lex_config.c b/mdk-stage1/pcmcia/lex_config.c
deleted file mode 100644
index b374c8bf4..000000000
--- a/mdk-stage1/pcmcia/lex_config.c
+++ /dev/null
@@ -1,2008 +0,0 @@
-/* A lexical scanner generated by flex */
-
-/* Scanner skeleton version:
- * $Header$
- */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-
-#include <stdio.h>
-
-
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
-#endif
-#endif
-
-
-#ifdef __cplusplus
-
-#include <stdlib.h>
-#include <unistd.h>
-
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-#if __STDC__
-
-#define YY_USE_PROTOS
-#define YY_USE_CONST
-
-#endif /* __STDC__ */
-#endif /* ! __cplusplus */
-
-#ifdef __TURBOC__
- #pragma warn -rch
- #pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN yy_start = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START ((yy_start - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#define YY_BUF_SIZE 16384
-
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-
-extern int yyleng;
-extern FILE *yyin, *yyout;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator). This
- * avoids problems with code like:
- *
- * if ( condition_holds )
- * yyless( 5 );
- * else
- * do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
-
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- *yy_cp = yy_hold_char; \
- YY_RESTORE_YY_MORE_OFFSET \
- yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-typedef unsigned int yy_size_t;
-
-
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- int yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
- };
-
-static YY_BUFFER_STATE yy_current_buffer = 0;
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- */
-#define YY_CURRENT_BUFFER yy_current_buffer
-
-
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-
-static int yy_n_chars; /* number of characters read into yy_ch_buf */
-
-
-int yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1; /* whether we need to initialize */
-static int yy_start = 0; /* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin. A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart YY_PROTO(( FILE *input_file ));
-
-void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
-void yy_load_buffer_state YY_PROTO(( void ));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
-void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
-void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
-
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
-YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
-
-static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
-static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
-static void yy_flex_free YY_PROTO(( void * ));
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
-
-typedef unsigned char YY_CHAR;
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-typedef int yy_state_type;
-extern char *yytext;
-#define yytext_ptr yytext
-
-static yy_state_type yy_get_previous_state YY_PROTO(( void ));
-static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
-static int yy_get_next_buffer YY_PROTO(( void ));
-static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- yytext_ptr = yy_bp; \
- yyleng = (int) (yy_cp - yy_bp); \
- yy_hold_char = *yy_cp; \
- *yy_cp = '\0'; \
- yy_c_buf_p = yy_cp;
-
-#define YY_NUM_RULES 45
-#define YY_END_OF_BUFFER 46
-static yyconst short int yy_accept[247] =
- { 0,
- 5, 5, 2, 2, 46, 44, 5, 4, 5, 44,
- 6, 41, 41, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 3,
- 2, 45, 5, 5, 6, 0, 43, 0, 6, 41,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,
- 0, 0, 3, 2, 0, 43, 0, 42, 0, 0,
- 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
- 0, 18, 0, 0, 0, 0, 23, 0, 0, 0,
-
- 0, 26, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 8, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 25,
- 0, 27, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 11, 0, 0, 14, 0, 0, 0, 0,
- 19, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 31, 0, 0, 0, 0, 0, 13, 0,
- 0, 0, 0, 20, 21, 22, 0, 0, 0, 28,
- 0, 0, 0, 1, 0, 0, 0, 0, 12, 15,
- 0, 0, 17, 0, 0, 0, 0, 29, 0, 0,
-
- 32, 0, 0, 0, 0, 16, 0, 0, 0, 0,
- 0, 0, 0, 39, 7, 0, 0, 24, 0, 0,
- 0, 0, 0, 36, 0, 0, 0, 0, 0, 0,
- 33, 0, 0, 0, 34, 0, 0, 0, 40, 0,
- 0, 35, 37, 0, 38, 0
- } ;
-
-static yyconst int yy_ec[256] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 4, 1, 5, 6, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 7, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 1, 6, 1,
- 1, 1, 1, 1, 9, 9, 9, 9, 9, 9,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 10, 1, 1, 11, 1, 12, 13, 14, 15,
-
- 16, 17, 18, 1, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1
- } ;
-
-static yyconst int yy_meta[36] =
- { 0,
- 1, 2, 3, 2, 1, 1, 4, 4, 4, 1,
- 1, 4, 4, 4, 4, 4, 4, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1
- } ;
-
-static yyconst short int yy_base[253] =
- { 0,
- 0, 0, 34, 37, 293, 294, 40, 294, 41, 41,
- 0, 41, 45, 31, 273, 42, 40, 257, 38, 34,
- 274, 47, 273, 262, 53, 271, 57, 35, 60, 0,
- 79, 294, 82, 83, 0, 83, 294, 87, 0, 87,
- 0, 263, 260, 260, 255, 253, 269, 74, 245, 265,
- 244, 253, 262, 248, 259, 249, 249, 256, 255, 80,
- 239, 240, 248, 238, 80, 236, 236, 232, 294, 236,
- 233, 245, 0, 97, 95, 97, 108, 0, 230, 234,
- 242, 241, 294, 226, 242, 234, 226, 229, 234, 235,
- 226, 294, 231, 229, 220, 213, 294, 228, 209, 212,
-
- 228, 294, 209, 219, 221, 217, 216, 206, 211, 203,
- 215, 219, 194, 294, 294, 199, 196, 212, 209, 193,
- 208, 192, 190, 206, 200, 190, 195, 187, 190, 294,
- 192, 294, 188, 184, 200, 198, 195, 192, 188, 181,
- 191, 181, 294, 181, 186, 294, 186, 189, 180, 183,
- 294, 182, 161, 179, 183, 165, 170, 167, 158, 177,
- 166, 171, 294, 161, 174, 172, 158, 152, 294, 165,
- 165, 154, 162, 294, 166, 294, 153, 154, 158, 294,
- 157, 157, 160, 294, 146, 157, 140, 136, 294, 294,
- 147, 141, 294, 150, 133, 151, 139, 294, 148, 133,
-
- 294, 143, 142, 127, 126, 294, 142, 138, 140, 140,
- 124, 124, 136, 294, 294, 126, 118, 294, 130, 118,
- 113, 114, 115, 294, 125, 127, 108, 116, 99, 87,
- 294, 90, 87, 86, 294, 96, 78, 74, 294, 75,
- 64, 294, 294, 46, 294, 294, 118, 122, 126, 130,
- 134, 64
- } ;
-
-static yyconst short int yy_def[253] =
- { 0,
- 246, 1, 247, 247, 246, 246, 246, 246, 246, 248,
- 249, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 250,
- 246, 246, 246, 246, 249, 248, 246, 251, 249, 246,
- 252, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 250, 246, 248, 248, 251, 252, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
-
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
-
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 0, 246, 246, 246, 246,
- 246, 246
- } ;
-
-static yyconst short int yy_nxt[330] =
- { 0,
- 6, 7, 8, 9, 10, 11, 12, 13, 6, 6,
- 6, 14, 15, 16, 17, 18, 19, 6, 20, 21,
- 6, 6, 22, 23, 24, 25, 6, 26, 27, 28,
- 6, 29, 6, 6, 6, 31, 32, 31, 31, 32,
- 31, 33, 33, 33, 34, 37, 35, 40, 40, 42,
- 38, 40, 40, 45, 43, 48, 51, 53, 56, 69,
- 46, 54, 57, 47, 62, 70, 63, 78, 52, 49,
- 66, 58, 67, 245, 41, 71, 59, 64, 72, 244,
- 74, 68, 74, 33, 33, 33, 34, 37, 35, 36,
- 85, 76, 38, 40, 40, 98, 77, 104, 74, 37,
-
- 74, 37, 243, 242, 38, 86, 38, 241, 105, 99,
- 36, 240, 76, 239, 238, 237, 236, 77, 30, 30,
- 30, 30, 36, 36, 36, 36, 39, 39, 235, 39,
- 73, 234, 233, 73, 75, 75, 75, 75, 232, 231,
- 230, 229, 228, 227, 226, 225, 224, 223, 222, 221,
- 220, 219, 218, 217, 216, 215, 214, 213, 212, 211,
- 210, 209, 208, 207, 206, 205, 204, 203, 202, 201,
- 200, 199, 198, 197, 196, 195, 194, 193, 192, 191,
- 190, 189, 188, 187, 186, 185, 184, 183, 182, 181,
- 180, 179, 178, 177, 176, 175, 174, 173, 172, 171,
-
- 170, 169, 168, 167, 166, 165, 164, 163, 162, 161,
- 160, 159, 158, 157, 156, 155, 154, 153, 152, 151,
- 150, 149, 148, 147, 146, 145, 144, 143, 142, 141,
- 140, 139, 138, 137, 136, 135, 134, 133, 132, 131,
- 130, 129, 128, 127, 126, 125, 124, 123, 122, 121,
- 120, 119, 118, 117, 116, 115, 114, 113, 112, 111,
- 110, 109, 108, 107, 106, 103, 102, 101, 100, 97,
- 96, 95, 94, 93, 92, 91, 90, 89, 88, 87,
- 84, 83, 82, 81, 80, 79, 65, 61, 60, 55,
- 50, 44, 246, 5, 246, 246, 246, 246, 246, 246,
-
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246
- } ;
-
-static yyconst short int yy_chk[330] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 3, 3, 3, 4, 4,
- 4, 7, 9, 7, 9, 10, 9, 12, 12, 14,
- 10, 13, 13, 16, 14, 17, 19, 20, 22, 28,
- 16, 20, 22, 16, 25, 28, 25, 252, 19, 17,
- 27, 22, 27, 244, 12, 29, 22, 25, 29, 241,
- 31, 27, 31, 33, 34, 33, 34, 36, 34, 38,
- 48, 38, 36, 40, 40, 60, 38, 65, 74, 75,
-
- 74, 76, 240, 238, 75, 48, 76, 237, 65, 60,
- 77, 236, 77, 234, 233, 232, 230, 77, 247, 247,
- 247, 247, 248, 248, 248, 248, 249, 249, 229, 249,
- 250, 228, 227, 250, 251, 251, 251, 251, 226, 225,
- 223, 222, 221, 220, 219, 217, 216, 213, 212, 211,
- 210, 209, 208, 207, 205, 204, 203, 202, 200, 199,
- 197, 196, 195, 194, 192, 191, 188, 187, 186, 185,
- 183, 182, 181, 179, 178, 177, 175, 173, 172, 171,
- 170, 168, 167, 166, 165, 164, 162, 161, 160, 159,
- 158, 157, 156, 155, 154, 153, 152, 150, 149, 148,
-
- 147, 145, 144, 142, 141, 140, 139, 138, 137, 136,
- 135, 134, 133, 131, 129, 128, 127, 126, 125, 124,
- 123, 122, 121, 120, 119, 118, 117, 116, 113, 112,
- 111, 110, 109, 108, 107, 106, 105, 104, 103, 101,
- 100, 99, 98, 96, 95, 94, 93, 91, 90, 89,
- 88, 87, 86, 85, 84, 82, 81, 80, 79, 72,
- 71, 70, 68, 67, 66, 64, 63, 62, 61, 59,
- 58, 57, 56, 55, 54, 53, 52, 51, 50, 49,
- 47, 46, 45, 44, 43, 42, 26, 24, 23, 21,
- 18, 15, 5, 246, 246, 246, 246, 246, 246, 246,
-
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 246, 246, 246, 246, 246
- } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "lex_config.l"
-#define INITIAL 0
-/* Special state for handling include files */
-#define src 1
-
-#line 5 "lex_config.l"
-/*
- * lex_config.l 1.39 2000/06/12 21:33:02
- *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License
- * at http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- * the License for the specific language governing rights and
- * limitations under the License.
- *
- * The initial developer of the original code is David A. Hinds
- * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
- * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
- *
- * Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
- * above. If you wish to allow the use of your version of this file
- * only under the terms of the GPL and not to allow others to use
- * your version of this file under the MPL, indicate your decision by
- * deleting the provisions above and replace them with the notice and
- * other provisions required by the GPL. If you do not delete the
- * provisions above, a recipient may use your version of this file
- * under either the MPL or the GPL.
- */
-
-#undef src
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <syslog.h>
-#include <glob.h>
-#define src 1
-
-#include <pcmcia/cs_types.h>
-#include <pcmcia/cs.h>
-
-#include "yacc_config.h"
-
-/* For assembling nice error messages */
-char *current_file;
-int current_lineno;
-
-static int lex_number(char *s);
-static int lex_string(char *s);
-static void do_source(char *fn);
-static int do_eof(void);
-
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap YY_PROTO(( void ));
-#else
-extern int yywrap YY_PROTO(( void ));
-#endif
-#endif
-
-#ifndef YY_NO_UNPUT
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO(( yyconst char * ));
-#endif
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-static int yyinput YY_PROTO(( void ));
-#else
-static int input YY_PROTO(( void ));
-#endif
-#endif
-
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO(( int new_state ));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO(( void ));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO(( void ));
-#endif
-
-#else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
-#endif
-
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
-#else
-/* Just try to get by without declaring the routines. This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
-#endif
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
- if ( yy_current_buffer->yy_is_interactive ) \
- { \
- int c = '*', n; \
- for ( n = 0; n < max_size && \
- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
- buf[n] = (char) c; \
- if ( c == '\n' ) \
- buf[n++] = (char) c; \
- if ( c == EOF && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- result = n; \
- } \
- else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
- && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" );
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL int yylex YY_PROTO(( void ))
-#endif
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
- YY_USER_ACTION
-
-YY_DECL
- {
- register yy_state_type yy_current_state;
- register char *yy_cp, *yy_bp;
- register int yy_act;
-
-#line 63 "lex_config.l"
-
-
-
- if ( yy_init )
- {
- yy_init = 0;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! yy_start )
- yy_start = 1; /* first start state */
-
- if ( ! yyin )
- yyin = stdin;
-
- if ( ! yyout )
- yyout = stdout;
-
- if ( ! yy_current_buffer )
- yy_current_buffer =
- yy_create_buffer( yyin, YY_BUF_SIZE );
-
- yy_load_buffer_state();
- }
-
- while ( 1 ) /* loops until end-of-file is reached */
- {
- yy_cp = yy_c_buf_p;
-
- /* Support of yytext. */
- *yy_cp = yy_hold_char;
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
- yy_current_state = yy_start;
-yy_match:
- do
- {
- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 247 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- ++yy_cp;
- }
- while ( yy_base[yy_current_state] != 294 );
-
-yy_find_action:
- yy_act = yy_accept[yy_current_state];
- if ( yy_act == 0 )
- { /* have to back up */
- yy_cp = yy_last_accepting_cpos;
- yy_current_state = yy_last_accepting_state;
- yy_act = yy_accept[yy_current_state];
- }
-
- YY_DO_BEFORE_ACTION;
-
-
-do_action: /* This label is used only to access EOF actions. */
-
-
- switch ( yy_act )
- { /* beginning of action switch */
- case 0: /* must back up */
- /* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = yy_hold_char;
- yy_cp = yy_last_accepting_cpos;
- yy_current_state = yy_last_accepting_state;
- goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 65 "lex_config.l"
-BEGIN(src);
- YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 66 "lex_config.l"
-/* skip */ ;
- YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 67 "lex_config.l"
-do_source(yytext); BEGIN(INITIAL);
- YY_BREAK
-case YY_STATE_EOF(INITIAL):
-case YY_STATE_EOF(src):
-#line 68 "lex_config.l"
-if (do_eof()) yyterminate();
- YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 70 "lex_config.l"
-current_lineno++;
- YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 71 "lex_config.l"
-/* skip */ ;
- YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 72 "lex_config.l"
-/* skip */ ;
- YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 74 "lex_config.l"
-return ANONYMOUS;
- YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 75 "lex_config.l"
-return BIND;
- YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 76 "lex_config.l"
-return CIS;
- YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 77 "lex_config.l"
-return CARD;
- YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 78 "lex_config.l"
-return CLASS;
- YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 79 "lex_config.l"
-return DEFAULT;
- YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 80 "lex_config.l"
-return DEVICE;
- YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 81 "lex_config.l"
-return DTYPE;
- YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 82 "lex_config.l"
-return EXCLUDE;
- YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 83 "lex_config.l"
-return FUNCTION;
- YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 84 "lex_config.l"
-return INCLUDE;
- YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 85 "lex_config.l"
-return IRQ_NO;
- YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 86 "lex_config.l"
-return JEDEC;
- YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 87 "lex_config.l"
-return MANFID;
- YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 88 "lex_config.l"
-return MEMORY;
- YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 89 "lex_config.l"
-return MODULE;
- YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 90 "lex_config.l"
-return MTD;
- YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 91 "lex_config.l"
-return NEEDS_MTD;
- YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 92 "lex_config.l"
-return OPTS;
- YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 93 "lex_config.l"
-return PCI;
- YY_BREAK
-case 27:
-YY_RULE_SETUP
-#line 94 "lex_config.l"
-return PORT;
- YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 95 "lex_config.l"
-return REGION;
- YY_BREAK
-case 29:
-YY_RULE_SETUP
-#line 96 "lex_config.l"
-return RESERVE;
- YY_BREAK
-case 30:
-YY_RULE_SETUP
-#line 97 "lex_config.l"
-return TO;
- YY_BREAK
-case 31:
-YY_RULE_SETUP
-#line 98 "lex_config.l"
-return TUPLE;
- YY_BREAK
-case 32:
-YY_RULE_SETUP
-#line 99 "lex_config.l"
-return VERSION;
- YY_BREAK
-case 33:
-YY_RULE_SETUP
-#line 101 "lex_config.l"
-return lex_number("1");
- YY_BREAK
-case 34:
-YY_RULE_SETUP
-#line 102 "lex_config.l"
-return lex_number("2");
- YY_BREAK
-case 35:
-YY_RULE_SETUP
-#line 103 "lex_config.l"
-return lex_number("3");
- YY_BREAK
-case 36:
-YY_RULE_SETUP
-#line 104 "lex_config.l"
-return lex_number("4");
- YY_BREAK
-case 37:
-YY_RULE_SETUP
-#line 105 "lex_config.l"
-return lex_number("5");
- YY_BREAK
-case 38:
-YY_RULE_SETUP
-#line 106 "lex_config.l"
-return lex_number("6");
- YY_BREAK
-case 39:
-YY_RULE_SETUP
-#line 107 "lex_config.l"
-return lex_number("7");
- YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 108 "lex_config.l"
-return lex_number("8");
- YY_BREAK
-case 41:
-YY_RULE_SETUP
-#line 110 "lex_config.l"
-return lex_number(yytext);
- YY_BREAK
-case 42:
-YY_RULE_SETUP
-#line 112 "lex_config.l"
-return lex_number(yytext);
- YY_BREAK
-case 43:
-YY_RULE_SETUP
-#line 114 "lex_config.l"
-return lex_string(yytext);
- YY_BREAK
-case 44:
-YY_RULE_SETUP
-#line 116 "lex_config.l"
-return yytext[0];
- YY_BREAK
-case 45:
-YY_RULE_SETUP
-#line 118 "lex_config.l"
-ECHO;
- YY_BREAK
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = yy_hold_char;
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * yylex(). If so, then we have to assure
- * consistency between yy_current_buffer and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yy_current_buffer->yy_input_file = yyin;
- yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state();
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state );
-
- yy_bp = yytext_ptr + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++yy_c_buf_p;
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
- yy_cp = yy_c_buf_p;
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer() )
- {
- case EOB_ACT_END_OF_FILE:
- {
- yy_did_buffer_switch_on_eof = 0;
-
- if ( yywrap() )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p =
- yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state();
-
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- yy_c_buf_p =
- &yy_current_buffer->yy_ch_buf[yy_n_chars];
-
- yy_current_state = yy_get_previous_state();
-
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
- } /* end of yylex */
-
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-
-static int yy_get_next_buffer()
- {
- register char *dest = yy_current_buffer->yy_ch_buf;
- register char *source = yytext_ptr;
- register int number_to_move, i;
- int ret_val;
-
- if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( yy_current_buffer->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- yy_current_buffer->yy_n_chars = yy_n_chars = 0;
-
- else
- {
- int num_to_read =
- yy_current_buffer->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
- YY_FATAL_ERROR(
-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
-#else
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = yy_current_buffer;
-
- int yy_c_buf_p_offset =
- (int) (yy_c_buf_p - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- int new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- yy_flex_realloc( (void *) b->yy_ch_buf,
- b->yy_buf_size + 2 );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = yy_current_buffer->yy_buf_size -
- number_to_move - 1;
-#endif
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
- yy_n_chars, num_to_read );
-
- yy_current_buffer->yy_n_chars = yy_n_chars;
- }
-
- if ( yy_n_chars == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- yyrestart( yyin );
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- yy_current_buffer->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- yy_n_chars += number_to_move;
- yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
- yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
-
- yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
-
- return ret_val;
- }
-
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-static yy_state_type yy_get_previous_state()
- {
- register yy_state_type yy_current_state;
- register char *yy_cp;
-
- yy_current_state = yy_start;
-
- for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
- {
- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 247 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- }
-
- return yy_current_state;
- }
-
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
-
-#ifdef YY_USE_PROTOS
-static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
-#else
-static yy_state_type yy_try_NUL_trans( yy_current_state )
-yy_state_type yy_current_state;
-#endif
- {
- register int yy_is_jam;
- register char *yy_cp = yy_c_buf_p;
-
- register YY_CHAR yy_c = 1;
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 247 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 246);
-
- return yy_is_jam ? 0 : yy_current_state;
- }
-
-
-
-
-#ifdef __cplusplus
-static int yyinput()
-#else
-static int input()
-#endif
- {
- int c;
-
- *yy_c_buf_p = yy_hold_char;
-
- if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
- /* This was really a NUL. */
- *yy_c_buf_p = '\0';
-
- else
- { /* need more input */
- int offset = yy_c_buf_p - yytext_ptr;
- ++yy_c_buf_p;
-
- switch ( yy_get_next_buffer() )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- yyrestart( yyin );
-
- /* fall through */
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( yywrap() )
- return EOF;
-
- if ( ! yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput();
-#else
- return input();
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p = yytext_ptr + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
- *yy_c_buf_p = '\0'; /* preserve yytext */
- yy_hold_char = *++yy_c_buf_p;
-
-
- return c;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yyrestart( FILE *input_file )
-#else
-void yyrestart( input_file )
-FILE *input_file;
-#endif
- {
- if ( ! yy_current_buffer )
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
-
- yy_init_buffer( yy_current_buffer, input_file );
- yy_load_buffer_state();
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-#else
-void yy_switch_to_buffer( new_buffer )
-YY_BUFFER_STATE new_buffer;
-#endif
- {
- if ( yy_current_buffer == new_buffer )
- return;
-
- if ( yy_current_buffer )
- {
- /* Flush out information for old buffer. */
- *yy_c_buf_p = yy_hold_char;
- yy_current_buffer->yy_buf_pos = yy_c_buf_p;
- yy_current_buffer->yy_n_chars = yy_n_chars;
- }
-
- yy_current_buffer = new_buffer;
- yy_load_buffer_state();
-
- /* We don't actually know whether we did this switch during
- * EOF (yywrap()) processing, but the only time this flag
- * is looked at is after yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- yy_did_buffer_switch_on_eof = 1;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_load_buffer_state( void )
-#else
-void yy_load_buffer_state()
-#endif
- {
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
- yyin = yy_current_buffer->yy_input_file;
- yy_hold_char = *yy_c_buf_p;
- }
-
-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-#else
-YY_BUFFER_STATE yy_create_buffer( file, size )
-FILE *file;
-int size;
-#endif
- {
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_buf_size = size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- yy_init_buffer( b, file );
-
- return b;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_delete_buffer( YY_BUFFER_STATE b )
-#else
-void yy_delete_buffer( b )
-YY_BUFFER_STATE b;
-#endif
- {
- if ( ! b )
- return;
-
- if ( b == yy_current_buffer )
- yy_current_buffer = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- yy_flex_free( (void *) b->yy_ch_buf );
-
- yy_flex_free( (void *) b );
- }
-
-
-#ifndef YY_ALWAYS_INTERACTIVE
-#ifndef YY_NEVER_INTERACTIVE
-extern int isatty YY_PROTO(( int ));
-#endif
-#endif
-
-#ifdef YY_USE_PROTOS
-void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
-#else
-void yy_init_buffer( b, file )
-YY_BUFFER_STATE b;
-FILE *file;
-#endif
-
-
- {
- yy_flush_buffer( b );
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
-#if YY_ALWAYS_INTERACTIVE
- b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
- b->yy_is_interactive = 0;
-#else
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-#endif
-#endif
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_flush_buffer( YY_BUFFER_STATE b )
-#else
-void yy_flush_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-
- {
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == yy_current_buffer )
- yy_load_buffer_state();
- }
-
-
-#ifndef YY_NO_SCAN_BUFFER
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-#else
-YY_BUFFER_STATE yy_scan_buffer( base, size )
-char *base;
-yy_size_t size;
-#endif
- {
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- yy_switch_to_buffer( b );
-
- return b;
- }
-#endif
-
-
-#ifndef YY_NO_SCAN_STRING
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
-#else
-YY_BUFFER_STATE yy_scan_string( yy_str )
-yyconst char *yy_str;
-#endif
- {
- int len;
- for ( len = 0; yy_str[len]; ++len )
- ;
-
- return yy_scan_bytes( yy_str, len );
- }
-#endif
-
-
-#ifndef YY_NO_SCAN_BYTES
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
-#else
-YY_BUFFER_STATE yy_scan_bytes( bytes, len )
-yyconst char *bytes;
-int len;
-#endif
- {
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n;
- int i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = len + 2;
- buf = (char *) yy_flex_alloc( n );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
- for ( i = 0; i < len; ++i )
- buf[i] = bytes[i];
-
- buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = yy_scan_buffer( buf, n );
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
- }
-#endif
-
-
-#ifndef YY_NO_PUSH_STATE
-#ifdef YY_USE_PROTOS
-static void yy_push_state( int new_state )
-#else
-static void yy_push_state( new_state )
-int new_state;
-#endif
- {
- if ( yy_start_stack_ptr >= yy_start_stack_depth )
- {
- yy_size_t new_size;
-
- yy_start_stack_depth += YY_START_STACK_INCR;
- new_size = yy_start_stack_depth * sizeof( int );
-
- if ( ! yy_start_stack )
- yy_start_stack = (int *) yy_flex_alloc( new_size );
-
- else
- yy_start_stack = (int *) yy_flex_realloc(
- (void *) yy_start_stack, new_size );
-
- if ( ! yy_start_stack )
- YY_FATAL_ERROR(
- "out of memory expanding start-condition stack" );
- }
-
- yy_start_stack[yy_start_stack_ptr++] = YY_START;
-
- BEGIN(new_state);
- }
-#endif
-
-
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state()
- {
- if ( --yy_start_stack_ptr < 0 )
- YY_FATAL_ERROR( "start-condition stack underflow" );
-
- BEGIN(yy_start_stack[yy_start_stack_ptr]);
- }
-#endif
-
-
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state()
- {
- return yy_start_stack[yy_start_stack_ptr - 1];
- }
-#endif
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-#ifdef YY_USE_PROTOS
-static void yy_fatal_error( yyconst char msg[] )
-#else
-static void yy_fatal_error( msg )
-char msg[];
-#endif
- {
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
- }
-
-
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- yytext[yyleng] = yy_hold_char; \
- yy_c_buf_p = yytext + n; \
- yy_hold_char = *yy_c_buf_p; \
- *yy_c_buf_p = '\0'; \
- yyleng = n; \
- } \
- while ( 0 )
-
-
-/* Internal utility routines. */
-
-#ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
-static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
-#else
-static void yy_flex_strncpy( s1, s2, n )
-char *s1;
-yyconst char *s2;
-int n;
-#endif
- {
- register int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
- }
-#endif
-
-#ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
-static int yy_flex_strlen( yyconst char *s )
-#else
-static int yy_flex_strlen( s )
-yyconst char *s;
-#endif
- {
- register int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
- }
-#endif
-
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_alloc( yy_size_t size )
-#else
-static void *yy_flex_alloc( size )
-yy_size_t size;
-#endif
- {
- return (void *) malloc( size );
- }
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_realloc( void *ptr, yy_size_t size )
-#else
-static void *yy_flex_realloc( ptr, size )
-void *ptr;
-yy_size_t size;
-#endif
- {
- /* The cast to (char *) in the following accommodates both
- * implementations that use char* generic pointers, and those
- * that use void* generic pointers. It works with the latter
- * because both ANSI C and C++ allow castless assignment from
- * any pointer type to void*, and deal with argument conversions
- * as though doing an assignment.
- */
- return (void *) realloc( (char *) ptr, size );
- }
-
-#ifdef YY_USE_PROTOS
-static void yy_flex_free( void *ptr )
-#else
-static void yy_flex_free( ptr )
-void *ptr;
-#endif
- {
- free( ptr );
- }
-
-#if YY_MAIN
-int main()
- {
- yylex();
- return 0;
- }
-#endif
-#line 118 "lex_config.l"
-
-
-#ifndef yywrap
-int yywrap() { return 1; }
-#endif
-
-/*======================================================================
-
- Stuff to parse basic data types
-
-======================================================================*/
-
-static int lex_number(char *s)
-{
- yylval.num = strtoul(s, NULL, 0);
- return NUMBER;
-}
-
-static int lex_string(char *s)
-{
- int n = strlen(s);
- yylval.str = malloc(n-1);
- strncpy(yylval.str, s+1, n-2);
- yylval.str[n-2] = '\0';
- return STRING;
-}
-
-/*======================================================================
-
- Code to support nesting of configuration files
-
-======================================================================*/
-
-#define MAX_SOURCE_DEPTH 4
-struct source_stack {
- YY_BUFFER_STATE buffer;
- char *filename;
- int lineno, fileno;
- FILE *file;
- glob_t glob;
-} source_stack[MAX_SOURCE_DEPTH];
-static int source_stack_ptr = 0;
-static int parse_env = 0;
-
-static int get_glob(void)
-{
- struct source_stack *s = &source_stack[source_stack_ptr];
- while (s->fileno < s->glob.gl_pathc) {
- char *fn = s->glob.gl_pathv[s->fileno];
- s->file = fopen(fn, "r");
- if (s->file == NULL) {
- if (strpbrk(fn, "?*[") == NULL)
- syslog(LOG_INFO, "could not open '%s': %m", fn);
- s->fileno++;
- } else {
- current_lineno = 1;
- current_file = strdup(fn);
- yy_switch_to_buffer(yy_create_buffer(s->file, YY_BUF_SIZE));
- source_stack_ptr++;
- s->fileno++;
- return 0;
- }
- }
- return -1;
-}
-
-static void do_source(char *fn)
-{
- struct source_stack *s = &source_stack[source_stack_ptr];
-
- if (source_stack_ptr >= MAX_SOURCE_DEPTH) {
- syslog(LOG_INFO, "source depth limit exceeded");
- return;
- }
- glob(fn, GLOB_NOCHECK, NULL, &s->glob);
- s->fileno = 0;
- s->buffer = YY_CURRENT_BUFFER;
- s->lineno = current_lineno;
- s->filename = current_file;
- get_glob();
-}
-
-static int do_eof(void)
-{
- struct source_stack *s = &source_stack[--source_stack_ptr];
- if (source_stack_ptr < 0) {
- if (parse_env == 0) {
- char *t = getenv("PCMCIA_OPTS");
- if (t == NULL) return -1;
- parse_env = 1;
- source_stack_ptr = 0;
- current_file = "PCMCIA_OPTS";
- current_lineno = 1;
- yy_scan_string(t);
- return 0;
- } else
- return -1;
- }
- fclose(s->file);
- free(current_file);
- yy_delete_buffer(YY_CURRENT_BUFFER);
- if (get_glob() != 0) {
- yy_switch_to_buffer(s->buffer);
- current_lineno = s->lineno;
- current_file = s->filename;
- }
- return 0;
-}
-
-/*======================================================================
-
- The main entry point... returns -1 if the file can't be accessed.
-
-======================================================================*/
-int yyparse(void);
-
-int parse_configfile(char *fn)
-{
- FILE *f;
-
- f = fopen(fn, "r");
- if (!f) {
- syslog(LOG_INFO, "could not open '%s': %m", fn);
- return -1;
- }
- current_lineno = 1;
- current_file = fn;
- source_stack_ptr = 0;
- yyrestart(f);
- yyparse();
- fclose(f);
- return 0;
-}
-
diff --git a/mdk-stage1/pcmcia/lex_config.l b/mdk-stage1/pcmcia/lex_config.l
new file mode 100644
index 000000000..54500c446
--- /dev/null
+++ b/mdk-stage1/pcmcia/lex_config.l
@@ -0,0 +1,224 @@
+/* Special state for handling include files */
+%x src
+
+%{
+/*
+ * Startup tool for non statically mapped PCMCIA sockets
+ *
+ * (C) 2005 Dominik Brodowski <linux@brodo.de>
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
+ *
+ * License: GPL v2
+ */
+
+#undef src
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <syslog.h>
+
+#ifdef HAS_WORDEXP
+#include <wordexp.h>
+#else
+#include <glob.h>
+#endif
+
+#define src 1
+
+#include "yacc_config.h"
+
+#define YY_NO_INPUT 1 /* mdk-stage1 */
+#define YY_NO_UNPUT 1 /* mdk-stage1 */
+extern int yyparse(void); /* mdk-stage1 */
+
+/* For assembling nice error messages */
+char *current_file;
+int current_lineno;
+
+static int lex_number(char *s);
+static int lex_string(char *s);
+static void do_source(char *fn);
+static int do_eof(void);
+
+%}
+
+int [0-9]+
+hex 0x[0-9a-fA-F]+
+str \"([^"]|\\.)*\"
+
+%%
+
+source[ \t]+ BEGIN(src); return SOURCE;
+<src>[^\n]+ do_source(yytext); BEGIN(INITIAL);
+<<EOF>> if (do_eof()) yyterminate();
+
+\n current_lineno++;
+[ \t]* /* skip */ ;
+[ ]*[#;].* /* skip */ ;
+
+exclude return EXCLUDE;
+include return INCLUDE;
+irq return IRQ_NO;
+port return PORT;
+memory return MEMORY;
+module /* skip */ ;
+
+{int} return lex_number(yytext);
+
+{hex} return lex_number(yytext);
+
+{str} return lex_string(yytext);
+
+. return yytext[0];
+
+%%
+
+#ifndef yywrap
+int yywrap() { return 1; }
+#endif
+
+/*======================================================================
+
+ Stuff to parse basic data types
+
+======================================================================*/
+
+static int lex_number(char *s)
+{
+ yylval.num = strtoul(s, NULL, 0);
+ return NUMBER;
+}
+
+static int lex_string(char *s)
+{
+ int n = strlen(s);
+ yylval.str = malloc(n-1);
+ strncpy(yylval.str, s+1, n-2);
+ yylval.str[n-2] = '\0';
+ return STRING;
+}
+
+/*======================================================================
+
+ Code to support nesting of configuration files
+
+======================================================================*/
+
+#define MAX_SOURCE_DEPTH 4
+struct source_stack {
+ YY_BUFFER_STATE buffer;
+ char *filename;
+ int lineno, fileno;
+ FILE *file;
+#ifdef HAS_WORDEXP
+ wordexp_t word;
+#else
+ glob_t glob;
+#endif
+} source_stack[MAX_SOURCE_DEPTH];
+static int source_stack_ptr = 0;
+static int parse_env = 0;
+
+static int get_glob(void)
+{
+ struct source_stack *s = &source_stack[source_stack_ptr];
+#ifdef HAS_WORDEXP
+ while (s->fileno < s->word.we_wordc) {
+ char *fn = s->word.we_wordv[s->fileno];
+#else
+ while (s->fileno < s->glob.gl_pathc) {
+ char *fn = s->glob.gl_pathv[s->fileno];
+#endif
+ s->file = fopen(fn, "r");
+ if (s->file == NULL) {
+ if (strpbrk(fn, "?*[") == NULL)
+ syslog(LOG_ERR, "could not open '%s': %m", fn);
+ s->fileno++;
+ } else {
+ current_lineno = 1;
+ current_file = strdup(fn);
+ yy_switch_to_buffer(yy_create_buffer(s->file, YY_BUF_SIZE));
+ source_stack_ptr++;
+ s->fileno++;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+static void do_source(char *fn)
+{
+ struct source_stack *s = &source_stack[source_stack_ptr];
+
+ if (source_stack_ptr >= MAX_SOURCE_DEPTH) {
+ syslog(LOG_ERR, "source depth limit exceeded");
+ return;
+ }
+#ifdef HAS_WORDEXP
+ wordexp(fn, &s->word, 0);
+#else
+ glob(fn, GLOB_NOCHECK, NULL, &s->glob);
+#endif
+ s->fileno = 0;
+ s->buffer = YY_CURRENT_BUFFER;
+ s->lineno = current_lineno;
+ s->filename = current_file;
+ get_glob();
+}
+
+static int do_eof(void)
+{
+ struct source_stack *s = &source_stack[--source_stack_ptr];
+ if (source_stack_ptr < 0) {
+ if (parse_env == 0) {
+ char *t = getenv("PCMCIA_OPTS");
+ if (t == NULL) return -1;
+ parse_env = 1;
+ source_stack_ptr = 0;
+ current_file = "PCMCIA_OPTS";
+ current_lineno = 1;
+ yy_scan_string(t);
+ return 0;
+ } else
+ return -1;
+ }
+ fclose(s->file);
+ free(current_file);
+ yy_delete_buffer(YY_CURRENT_BUFFER);
+ if (get_glob() != 0) {
+ yy_switch_to_buffer(s->buffer);
+ current_lineno = s->lineno;
+ current_file = s->filename;
+ }
+ return 0;
+}
+
+/*======================================================================
+
+ The main entry point... returns -1 if the file can't be accessed.
+
+======================================================================*/
+
+int parse_configfile(char *fn)
+{
+ FILE *f;
+
+ f = fopen(fn, "r");
+ if (!f) {
+ syslog(LOG_ERR, "could not open '%s': %m", fn);
+ return -1;
+ }
+ current_lineno = 1;
+ current_file = fn;
+ source_stack_ptr = 0;
+ yyrestart(f);
+ yyparse();
+ fclose(f);
+ return 0;
+}
+
diff --git a/mdk-stage1/pcmcia/merge_from_pcitable b/mdk-stage1/pcmcia/merge_from_pcitable
new file mode 100755
index 000000000..bb127640c
--- /dev/null
+++ b/mdk-stage1/pcmcia/merge_from_pcitable
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+
+# This program will show on stdout yenta_socket stuff from pcitable
+# which is not in probe.c
+
+use MDK::Common;
+use lib qw(/usr/lib/libDrakX);
+use run_program;
+use c;
+
+my %probes;
+foreach (cat_('probe.c')) {
+ if (/^pci_id_t pci_id\[\] = {/ ... /^};/) {
+ /^\s*{\s*0x([\da-f]+),\s*0x([\da-f]+),\s*"([^"]*)",\s*"([^"]*)"\s*}/
+ and $probes{"$1$2"} = { vendor => $1, device => $2, driver => $3, name => $4 };
+ }
+}
+
+require '/usr/bin/merge2pcitable.pl';
+
+my %pcitable;
+my @yenta_socket_ids = grep { $_ } map {
+ /.*pci:v0000(....).*d0000(....).*/;
+ my $key = lc("$1$2");
+ $pcitable{$key} = { vendor => $1, device => $2 };
+ $key;
+ } grep { /^alias/ } run_program::get_stdout('/sbin/modinfo', 'yenta_socket');
+
+
+if (my @missing_in_probe_c = difference2(\@yenta_socket_ids, [ keys %probes ])) {
+ print "Missing in `probe.c':\n",
+ map {
+ my $p = $pcitable{$_};
+ my $name = c::get_pci_description(hex($p->{vendor}), hex($p->{device}));
+ qq( { 0x$p->{vendor}, 0x$p->{device}, "yenta_socket", "$name" },\n);
+ } sort @missing_in_probe_c;
+}
diff --git a/mdk-stage1/pcmcia/pcmcia.h b/mdk-stage1/pcmcia/pcmcia.h
index 1967b3497..ae7db247b 100644
--- a/mdk-stage1/pcmcia/pcmcia.h
+++ b/mdk-stage1/pcmcia/pcmcia.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -16,6 +16,6 @@
#define _PCMCIA_CARDMGR_INTERFACE_H_
char * pcmcia_probe(void);
-int cardmgr_call(void);
+void pcmcia_socket_startup(int socket_no);
#endif
diff --git a/mdk-stage1/pcmcia/pcmcia_probe.c b/mdk-stage1/pcmcia/pcmcia_probe.c
deleted file mode 100644
index 57651d75f..000000000
--- a/mdk-stage1/pcmcia/pcmcia_probe.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
- *
- * Copyright 2000 MandrakeSoft
- *
- * This software may be freely redistributed under the terms of the GNU
- * public license.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-/* Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.23.tar.bz2
- *
- * Licence of this code follows:
-
- PCMCIA controller probe
-
- probe.c 1.52 2000/06/12 21:33:02
-
- The contents of this file are subject to the Mozilla Public
- License Version 1.1 (the "License"); you may not use this file
- except in compliance with the License. You may obtain a copy of
- the License at http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS
- IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- implied. See the License for the specific language governing
- rights and limitations under the License.
-
- The initial developer of the original code is David A. Hinds
- <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
- are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
-
- Alternatively, the contents of this file may be used under the
- terms of the GNU Public License version 2 (the "GPL"), in which
- case the provisions of the GPL are applicable instead of the
- above. If you wish to allow the use of your version of this file
- only under the terms of the GPL and not to allow others to use
- your version of this file under the MPL, indicate your decision
- by deleting the provisions above and replace them with the notice
- and other provisions required by the GPL. If you do not delete
- the provisions above, a recipient may use your version of this
- file under either the MPL or the GPL.
-
-======================================================================*/
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-
-#include <pcmcia/config.h>
-
-#include "../log.h"
-#include "pcmcia.h"
-
-/*====================================================================*/
-
-typedef struct {
- u_short vendor, device;
- char *tag;
- char *name;
-} pci_id_t;
-
-pci_id_t pci_id[] = {
- { 0x1013, 0x1100, "Cirrus Logic CL 6729", "Cirrus PD6729" },
- { 0x1013, 0x1110, "Cirrus Logic PD 6832", "Cirrus PD6832" },
- { 0x10b3, 0xb106, "SMC 34C90", "SMC 34C90" },
- { 0x1180, 0x0465, "Ricoh RL5C465", "Ricoh RL5C465" },
- { 0x1180, 0x0466, "Ricoh RL5C466", "Ricoh RL5C466" },
- { 0x1180, 0x0475, "Ricoh RL5C475", "Ricoh RL5C475" },
- { 0x1180, 0x0476, "Ricoh RL5C476", "Ricoh RL5C476" },
- { 0x1180, 0x0478, "Ricoh RL5C478", "Ricoh RL5C478" },
- { 0x104c, 0xac12, "Texas Instruments PCI1130", "TI 1130" },
- { 0x104c, 0xac13, "Texas Instruments PCI1031", "TI 1031" },
- { 0x104c, 0xac15, "Texas Instruments PCI1131", "TI 1131" },
- { 0x104c, 0xac16, "Texas Instruments PCI1250", "TI 1250A" },
- { 0x104c, 0xac17, "Texas Instruments PCI1220", "TI 1220" },
- { 0x104c, 0xac19, "Texas Instruments PCI1221", "TI 1221" },
- { 0x104c, 0xac1a, "Texas Instruments PCI1210", "TI 1210" },
- { 0x104c, 0xac1d, "Texas Instruments PCI1251A", "TI 1251A" },
- { 0x104c, 0xac1f, "Texas Instruments PCI1251B", "TI 1251B" },
- { 0x104c, 0xac1b, "Texas Instruments PCI1450", "TI 1450" },
- { 0x104c, 0xac1c, "Texas Instruments PCI1225", "TI 1225" },
- { 0x104c, 0xac1e, "Texas Instruments PCI1211", "TI 1211" },
- { 0x104c, 0xac50, "Texas Instruments PCI1410", "TI 1410" },
- { 0x104c, 0xac51, "Texas Instruments PCI1420", "TI 1420" },
- { 0x1217, 0x6729, "O2 Micro 6729", "O2Micro OZ6729" },
- { 0x1217, 0x673a, "O2 Micro 6730", "O2Micro OZ6730" },
- { 0x1217, 0x6832, "O2 Micro 6832/6833", "O2Micro OZ6832/OZ6833" },
- { 0x1217, 0x6836, "O2 Micro 6836/6860", "O2Micro OZ6836/OZ6860" },
- { 0x1217, 0x6872, "O2 Micro 6812", "O2Micro OZ6812" },
- { 0x1179, 0x0603, "Toshiba ToPIC95-A", "Toshiba ToPIC95-A" },
- { 0x1179, 0x060a, "Toshiba ToPIC95-B", "Toshiba ToPIC95-B" },
- { 0x1179, 0x060f, "Toshiba ToPIC97", "Toshiba ToPIC97" },
- { 0x1179, 0x0617, "Toshiba ToPIC100", "Toshiba ToPIC100" },
- { 0x119b, 0x1221, "Omega Micro 82C092G", "Omega Micro 82C092G" },
- { 0x8086, 0x1221, "Intel 82092AA", "Intel 82092AA" }
-};
-#define PCI_COUNT (sizeof(pci_id)/sizeof(pci_id_t))
-
-static int pci_probe(void)
-{
- char s[256], *name = NULL;
- u_int device, vendor, i;
- FILE *f;
-
- log_message("PCMCIA: probing PCI bus..");
-
- f = fopen("/proc/bus/pci/devices", "r");
-
- if (!f) {
- log_message("where are you going without /proc/bus/pci/devices ??");
- return -1;
- }
-
- while (fgets(s, 256, f) != NULL) {
- u_int n = strtoul(s+5, NULL, 16);
- vendor = (n >> 16); device = (n & 0xffff);
- for (i = 0; i < PCI_COUNT; i++)
- if ((vendor == pci_id[i].vendor) &&
- (device == pci_id[i].device)) break;
- if (i < PCI_COUNT) {
- name = pci_id[i].name;
- break;
- }
- }
-
- fclose(f);
-
- if (name) {
- log_message("\t%s found, 2 sockets.", name);
- return 0;
- } else {
- log_message("\tnot found.");
- return -ENODEV;
- }
-}
-
-/*====================================================================*/
-
-#include <sys/io.h>
-typedef u_short ioaddr_t;
-
-#include "i82365.h"
-#include "cirrus.h"
-#include "vg468.h"
-
-static ioaddr_t i365_base = 0x03e0;
-
-static u_char i365_get(u_short sock, u_short reg)
-{
- u_char val = I365_REG(sock, reg);
- outb(val, i365_base); val = inb(i365_base+1);
- return val;
-}
-
-static void i365_set(u_short sock, u_short reg, u_char data)
-{
- u_char val = I365_REG(sock, reg);
- outb(val, i365_base); outb(data, i365_base+1);
-}
-
-static void i365_bset(u_short sock, u_short reg, u_char mask)
-{
- u_char d = i365_get(sock, reg);
- d |= mask;
- i365_set(sock, reg, d);
-}
-
-static void i365_bclr(u_short sock, u_short reg, u_char mask)
-{
- u_char d = i365_get(sock, reg);
- d &= ~mask;
- i365_set(sock, reg, d);
-}
-
-static int i365_probe(void)
-{
- int val, sock, done;
- char *name = "i82365sl";
-
- log_message("PCMCIA: probing for Intel PCIC (ISA)..");
-
- sock = done = 0;
- ioperm(i365_base, 4, 1);
- ioperm(0x80, 1, 1);
- for (; sock < 2; sock++) {
- val = i365_get(sock, I365_IDENT);
- switch (val) {
- case 0x82:
- name = "i82365sl A step";
- break;
- case 0x83:
- name = "i82365sl B step";
- break;
- case 0x84:
- name = "VLSI 82C146";
- break;
- case 0x88: case 0x89: case 0x8a:
- name = "IBM Clone";
- break;
- case 0x8b: case 0x8c:
- break;
- default:
- done = 1;
- }
- if (done) break;
- }
-
- if (sock == 0) {
- log_message("\tnot found.");
- return -ENODEV;
- }
-
- if ((sock == 2) && (strcmp(name, "VLSI 82C146") == 0))
- name = "i82365sl DF";
-
- /* Check for Vadem chips */
- outb(0x0e, i365_base);
- outb(0x37, i365_base);
- i365_bset(0, VG468_MISC, VG468_MISC_VADEMREV);
- val = i365_get(0, I365_IDENT);
- if (val & I365_IDENT_VADEM) {
- if ((val & 7) < 4)
- name = "Vadem VG-468";
- else
- name = "Vadem VG-469";
- i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV);
- }
-
- /* Check for Cirrus CL-PD67xx chips */
- i365_set(0, PD67_CHIP_INFO, 0);
- val = i365_get(0, PD67_CHIP_INFO);
- if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) {
- val = i365_get(0, PD67_CHIP_INFO);
- if ((val & PD67_INFO_CHIP_ID) == 0) {
- if (val & PD67_INFO_SLOTS)
- name = "Cirrus CL-PD672x";
- else {
- name = "Cirrus CL-PD6710";
- sock = 1;
- }
- i365_set(0, PD67_EXT_INDEX, 0xe5);
- if (i365_get(0, PD67_EXT_INDEX) != 0xe5)
- name = "VIA VT83C469";
- }
- }
-
- log_message("\t%s found, %d sockets.", name, sock);
- return 0;
-
-} /* i365_probe */
-
-
-/*====================================================================*/
-
-#include "tcic.h"
-
-static u_char tcic_getb(ioaddr_t base, u_char reg)
-{
- u_char val = inb(base+reg);
- return val;
-}
-
-static void tcic_setb(ioaddr_t base, u_char reg, u_char data)
-{
- outb(data, base+reg);
-}
-
-static u_short tcic_getw(ioaddr_t base, u_char reg)
-{
- u_short val = inw(base+reg);
- return val;
-}
-
-static void tcic_setw(ioaddr_t base, u_char reg, u_short data)
-{
- outw(data, base+reg);
-}
-
-static u_short tcic_aux_getw(ioaddr_t base, u_short reg)
-{
- u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg;
- tcic_setb(base, TCIC_MODE, mode);
- return tcic_getw(base, TCIC_AUX);
-}
-
-static void tcic_aux_setw(ioaddr_t base, u_short reg, u_short data)
-{
- u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg;
- tcic_setb(base, TCIC_MODE, mode);
- tcic_setw(base, TCIC_AUX, data);
-}
-
-static int get_tcic_id(ioaddr_t base)
-{
- u_short id;
- tcic_aux_setw(base, TCIC_AUX_TEST, TCIC_TEST_DIAG);
- id = tcic_aux_getw(base, TCIC_AUX_ILOCK);
- id = (id & TCIC_ILOCKTEST_ID_MASK) >> TCIC_ILOCKTEST_ID_SH;
- tcic_aux_setw(base, TCIC_AUX_TEST, 0);
- return id;
-}
-
-static int tcic_probe_at(ioaddr_t base)
-{
- int i;
- u_short old;
-
- /* Anything there?? */
- for (i = 0; i < 0x10; i += 2)
- if (tcic_getw(base, i) == 0xffff)
- return -1;
-
- log_message("\tat %#3.3x: ", base);
-
- /* Try to reset the chip */
- tcic_setw(base, TCIC_SCTRL, TCIC_SCTRL_RESET);
- tcic_setw(base, TCIC_SCTRL, 0);
-
- /* Can we set the addr register? */
- old = tcic_getw(base, TCIC_ADDR);
- tcic_setw(base, TCIC_ADDR, 0);
- if (tcic_getw(base, TCIC_ADDR) != 0) {
- tcic_setw(base, TCIC_ADDR, old);
- return -2;
- }
-
- tcic_setw(base, TCIC_ADDR, 0xc3a5);
- if (tcic_getw(base, TCIC_ADDR) != 0xc3a5)
- return -3;
-
- return 2;
-}
-
-static int tcic_probe(void)
-{
- int sock, id;
-
- log_message("PCMCIA: probing for Databook TCIC-2 (ISA)..");
-
- ioperm(TCIC_BASE, 16, 1);
- ioperm(0x80, 1, 1);
- sock = tcic_probe_at(TCIC_BASE);
-
- if (sock <= 0) {
- log_message("\tnot found.");
- return -ENODEV;
- }
-
- id = get_tcic_id(TCIC_BASE);
- switch (id) {
- case TCIC_ID_DB86082:
- log_message("DB86082"); break;
- case TCIC_ID_DB86082A:
- log_message("DB86082A"); break;
- case TCIC_ID_DB86084:
- log_message("DB86084"); break;
- case TCIC_ID_DB86084A:
- log_message("DB86084A"); break;
- case TCIC_ID_DB86072:
- log_message("DB86072"); break;
- case TCIC_ID_DB86184:
- log_message("DB86184"); break;
- case TCIC_ID_DB86082B:
- log_message("DB86082B"); break;
- default:
- log_message("Unknown TCIC-2 ID 0x%02x", id);
- }
- log_message("\tfound at %#6x, %d sockets.\n", TCIC_BASE, sock);
-
- return 0;
-
-} /* tcic_probe */
-
-
-/*====================================================================*/
-
-char * pcmcia_probe(void)
-{
- if (!pci_probe())
- return "i82365";
- else if (!i365_probe())
- return "i82365";
- else if (!tcic_probe())
- return "tcic";
- else
- return NULL;
-}
diff --git a/mdk-stage1/pcmcia/probe.c b/mdk-stage1/pcmcia/probe.c
new file mode 100644
index 000000000..240fe3a17
--- /dev/null
+++ b/mdk-stage1/pcmcia/probe.c
@@ -0,0 +1,426 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000-2001 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.29.tar.bz2
+ *
+ * FIXME: resync with latest pcmcia-cs-3.2.8 or with pcmciautils-0.18 (which uses sysfs)
+ *
+ */
+
+/*======================================================================
+
+ PCMCIA controller probe
+
+ probe.c 1.55 2001/08/24 12:19:20
+
+ The contents of this file are subject to the Mozilla Public
+ License Version 1.1 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS
+ IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ implied. See the License for the specific language governing
+ rights and limitations under the License.
+
+ The initial developer of the original code is David A. Hinds
+ <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
+ are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
+
+ Alternatively, the contents of this file may be used under the
+ terms of the GNU General Public License version 2 (the "GPL"), in
+ which case the provisions of the GPL are applicable instead of the
+ above. If you wish to allow the use of your version of this file
+ only under the terms of the GPL and not to allow others to use
+ your version of this file under the MPL, indicate your decision
+ by deleting the provisions above and replace them with the notice
+ and other provisions required by the GPL. If you do not delete
+ the provisions above, a recipient may use your version of this
+ file under either the MPL or the GPL.
+
+======================================================================*/
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include "log.h"
+#include "pcmcia.h"
+
+/*====================================================================*/
+
+typedef struct {
+ u_short vendor, device;
+ char *modname;
+ char *name;
+} pci_id_t;
+
+pci_id_t pci_id[] = {
+ { 0x1013, 0x1100, "pd6729", "Cirrus Logic CL 6729" },
+ { 0x1013, 0x1110, "yenta_socket", "Cirrus Logic PD 6832" },
+ { 0x104c, 0x8011, "yenta_socket", "" },
+ { 0x104c, 0x8031, "yenta_socket", "Texas Instruments|PCIxx21/x515 Cardbus Controller" },
+ { 0x104c, 0x8036, "yenta_socket", "Texas Instruments|PCI6515 Cardbus Controller" },
+ { 0x104c, 0x8039, "yenta_socket", "Texas Instruments|PCIxx12 Cardbus Controller " },
+ { 0x104c, 0xac12, "yenta_socket", "Texas Instruments PCI1130" },
+ { 0x104c, 0xac13, "yenta_socket", "Texas Instruments PCI1031" },
+ { 0x104c, 0xac15, "yenta_socket", "Texas Instruments PCI1131" },
+ { 0x104c, 0xac16, "yenta_socket", "Texas Instruments PCI1250" },
+ { 0x104c, 0xac17, "yenta_socket", "Texas Instruments PCI1220" },
+ { 0x104c, 0xac19, "yenta_socket", "Texas Instruments PCI1221" },
+ { 0x104c, 0xac1a, "yenta_socket", "Texas Instruments PCI1210" },
+ { 0x104c, 0xac1b, "yenta_socket", "Texas Instruments PCI1450" },
+ { 0x104c, 0xac1c, "yenta_socket", "Texas Instruments PCI1225" },
+ { 0x104c, 0xac1d, "yenta_socket", "Texas Instruments PCI1251A" },
+ { 0x104c, 0xac1e, "yenta_socket", "Texas Instruments PCI1211" },
+ { 0x104c, 0xac1f, "yenta_socket", "Texas Instruments PCI1251B" },
+ { 0x104c, 0xac40, "yenta_socket", "Texas Instruments PCI4450" },
+ { 0x104c, 0xac41, "yenta_socket", "Texas Instruments PCI4410" },
+ { 0x104c, 0xac42, "yenta_socket", "Texas Instruments PCI4451" },
+ { 0x104c, 0xac44, "yenta_socket", "Texas Instruments PCI4510" },
+ { 0x104c, 0xac46, "yenta_socket", "Texas Instruments PCI4520" },
+ { 0x104c, 0xac47, "yenta_socket", "Texas Instruments PCI7510" },
+ { 0x104c, 0xac48, "yenta_socket", "Texas Instruments PCI7610" },
+ { 0x104c, 0xac49, "yenta_socket", "Texas Instruments PCI7410" },
+ { 0x104c, 0xac50, "yenta_socket", "Texas Instruments PCI1410" },
+ { 0x104c, 0xac51, "yenta_socket", "Texas Instruments PCI1420" },
+ { 0x104c, 0xac52, "yenta_socket", "Texas Instruments PCI1451" },
+ { 0x104c, 0xac54, "yenta_socket", "Texas Instruments PCI1620" },
+ { 0x104c, 0xac55, "yenta_socket", "Texas Instruments PCI1520" },
+ { 0x104c, 0xac56, "yenta_socket", "Texas Instruments PCI1510" },
+ { 0x104c, 0xac8d, "yenta_socket", "Texas Instruments|PCI7620" },
+ { 0x104c, 0xac8e, "yenta_socket", "Texas Instruments|PCI7420 CardBus Controller" },
+ { 0x104c, 0xac8e, "yenta_socket", "Texas Instruments PCI7420" },
+ { 0x10b3, 0xb106, "yenta_socket", "SMC 34C90" },
+ { 0x1179, 0x0603, "pd6729", "Toshiba ToPIC95-A" },
+ { 0x1179, 0x060a, "yenta_socket", "Toshiba ToPIC95-B" },
+ { 0x1179, 0x060f, "yenta_socket", "Toshiba ToPIC97" },
+ { 0x1179, 0x0617, "yenta_socket", "Toshiba ToPIC100" },
+ { 0x1180, 0x0465, "yenta_socket", "Ricoh RL5C465" },
+ { 0x1180, 0x0466, "yenta_socket", "Ricoh RL5C466" },
+ { 0x1180, 0x0475, "yenta_socket", "Ricoh RL5C475" },
+ { 0x1180, 0x0476, "yenta_socket", "Ricoh RL5C476" },
+ { 0x1180, 0x0477, "yenta_socket", "Ricoh RL5C477" },
+ { 0x1180, 0x0478, "yenta_socket", "Ricoh RL5C478" },
+ { 0x119b, 0x1221, "pd6729", "Omega Micro 82C092G" },
+ { 0x1524, 0x1211, "yenta_socket", "ENE 1211" },
+ { 0x1524, 0x1225, "yenta_socket", "ENE 1225" },
+ { 0x1524, 0x1410, "yenta_socket", "ENE 1410" },
+ { 0x1524, 0x1411, "yenta_socket", "ENE Technology CB1411" },
+ { 0x1524, 0x1412, "yenta_socket", "ENE Technology Inc|CB-712/4 Cardbus Controller " },
+ { 0x1524, 0x1420, "yenta_socket", "ENE 1420" },
+ { 0x1524, 0x1421, "yenta_socket", "ENE Technology Inc|CB-720/2/4 Cardbus Controller" },
+ { 0x1524, 0x1422, "yenta_socket", "ENE Technology Inc|CB-722/4 Cardbus Controller" },
+ { 0x8086, 0x1221, "i82092", "Intel 82092AA_0" },
+ { 0x8086, 0x1222, "i82092", "Intel 82092AA_1" },
+};
+#define PCI_COUNT (sizeof(pci_id)/sizeof(pci_id_t))
+
+char * driver = NULL;
+
+static int pci_probe(void)
+{
+ char s[256], *name = NULL;
+ u_int device, vendor, i;
+ FILE *f;
+
+ log_message("PCMCIA: probing PCI bus..");
+
+ if ((f = fopen("/proc/bus/pci/devices", "r")) != NULL) {
+ while (fgets(s, 256, f) != NULL) {
+ u_int n = strtoul(s+5, NULL, 16);
+ vendor = (n >> 16); device = (n & 0xffff);
+ if (vendor == 0x1217) {
+ driver = "yenta_socket";
+ name = "O2 Micro|PCMCIA Controller";
+ break;
+ }
+ for (i = 0; i < PCI_COUNT; i++)
+ if ((vendor == pci_id[i].vendor) &&
+ (device == pci_id[i].device)) break;
+ if (i < PCI_COUNT) {
+ name = pci_id[i].name;
+ driver = pci_id[i].modname;
+ }
+ }
+ }
+ fclose(f);
+
+ if (name) {
+ log_message("\t%s found, 2 sockets (driver %s).", name, driver);
+ return 0;
+ } else {
+ log_message("\tnot found.");
+ return -ENODEV;
+ }
+}
+
+/*====================================================================*/
+
+#include <sys/io.h>
+typedef u_short ioaddr_t;
+
+#include "i82365.h"
+#include "cirrus.h"
+#include "vg468.h"
+
+static ioaddr_t i365_base = 0x03e0;
+
+static u_char i365_get(u_short sock, u_short reg)
+{
+ u_char val = I365_REG(sock, reg);
+ outb(val, i365_base); val = inb(i365_base+1);
+ return val;
+}
+
+static void i365_set(u_short sock, u_short reg, u_char data)
+{
+ u_char val = I365_REG(sock, reg);
+ outb(val, i365_base); outb(data, i365_base+1);
+}
+
+static void i365_bset(u_short sock, u_short reg, u_char mask)
+{
+ u_char d = i365_get(sock, reg);
+ d |= mask;
+ i365_set(sock, reg, d);
+}
+
+static void i365_bclr(u_short sock, u_short reg, u_char mask)
+{
+ u_char d = i365_get(sock, reg);
+ d &= ~mask;
+ i365_set(sock, reg, d);
+}
+
+int i365_probe(void)
+{
+ int val, sock, done;
+ char *name = "i82365sl";
+
+ log_message("PCMCIA: probing for Intel PCIC (ISA)..");
+
+ sock = done = 0;
+ if (ioperm(i365_base, 4, 1)) {
+ log_perror("PCMCIA: ioperm");
+ return -1;
+ }
+ ioperm(0x80, 1, 1);
+ for (; sock < 2; sock++) {
+ val = i365_get(sock, I365_IDENT);
+ switch (val) {
+ case 0x82:
+ name = "i82365sl A step";
+ break;
+ case 0x83:
+ name = "i82365sl B step";
+ break;
+ case 0x84:
+ name = "VLSI 82C146";
+ break;
+ case 0x88: case 0x89: case 0x8a:
+ name = "IBM Clone";
+ break;
+ case 0x8b: case 0x8c:
+ break;
+ default:
+ done = 1;
+ }
+ if (done) break;
+ }
+
+ if (sock == 0) {
+ log_message("\tnot found.");
+ return -ENODEV;
+ }
+
+ if ((sock == 2) && (strcmp(name, "VLSI 82C146") == 0))
+ name = "i82365sl DF";
+
+ /* Check for Vadem chips */
+ outb(0x0e, i365_base);
+ outb(0x37, i365_base);
+ i365_bset(0, VG468_MISC, VG468_MISC_VADEMREV);
+ val = i365_get(0, I365_IDENT);
+ if (val & I365_IDENT_VADEM) {
+ if ((val & 7) < 4)
+ name = "Vadem VG-468";
+ else
+ name = "Vadem VG-469";
+ i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV);
+ }
+
+ /* Check for Cirrus CL-PD67xx chips */
+ i365_set(0, PD67_CHIP_INFO, 0);
+ val = i365_get(0, PD67_CHIP_INFO);
+ if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) {
+ val = i365_get(0, PD67_CHIP_INFO);
+ if ((val & PD67_INFO_CHIP_ID) == 0) {
+ if (val & PD67_INFO_SLOTS)
+ name = "Cirrus CL-PD672x";
+ else {
+ name = "Cirrus CL-PD6710";
+ sock = 1;
+ }
+ i365_set(0, PD67_EXT_INDEX, 0xe5);
+ if (i365_get(0, PD67_EXT_INDEX) != 0xe5)
+ name = "VIA VT83C469";
+ }
+ }
+
+ printf("\t%s found, %d sockets.\n", name, sock);
+ return 0;
+
+} /* i365_probe */
+
+/*====================================================================*/
+
+#include "tcic.h"
+
+static u_char tcic_getb(ioaddr_t base, u_char reg)
+{
+ u_char val = inb(base+reg);
+ return val;
+}
+
+static void tcic_setb(ioaddr_t base, u_char reg, u_char data)
+{
+ outb(data, base+reg);
+}
+
+static u_short tcic_getw(ioaddr_t base, u_char reg)
+{
+ u_short val = inw(base+reg);
+ return val;
+}
+
+static void tcic_setw(ioaddr_t base, u_char reg, u_short data)
+{
+ outw(data, base+reg);
+}
+
+static u_short tcic_aux_getw(ioaddr_t base, u_short reg)
+{
+ u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg;
+ tcic_setb(base, TCIC_MODE, mode);
+ return tcic_getw(base, TCIC_AUX);
+}
+
+static void tcic_aux_setw(ioaddr_t base, u_short reg, u_short data)
+{
+ u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg;
+ tcic_setb(base, TCIC_MODE, mode);
+ tcic_setw(base, TCIC_AUX, data);
+}
+
+static int get_tcic_id(ioaddr_t base)
+{
+ u_short id;
+ tcic_aux_setw(base, TCIC_AUX_TEST, TCIC_TEST_DIAG);
+ id = tcic_aux_getw(base, TCIC_AUX_ILOCK);
+ id = (id & TCIC_ILOCKTEST_ID_MASK) >> TCIC_ILOCKTEST_ID_SH;
+ tcic_aux_setw(base, TCIC_AUX_TEST, 0);
+ return id;
+}
+
+int tcic_probe_at(ioaddr_t base)
+{
+ int i;
+ u_short old;
+
+ /* Anything there?? */
+ for (i = 0; i < 0x10; i += 2)
+ if (tcic_getw(base, i) == 0xffff)
+ return -1;
+
+ log_message("\tat %#3.3x: ", base); fflush(stdout);
+
+ /* Try to reset the chip */
+ tcic_setw(base, TCIC_SCTRL, TCIC_SCTRL_RESET);
+ tcic_setw(base, TCIC_SCTRL, 0);
+
+ /* Can we set the addr register? */
+ old = tcic_getw(base, TCIC_ADDR);
+ tcic_setw(base, TCIC_ADDR, 0);
+ if (tcic_getw(base, TCIC_ADDR) != 0) {
+ tcic_setw(base, TCIC_ADDR, old);
+ return -2;
+ }
+
+ tcic_setw(base, TCIC_ADDR, 0xc3a5);
+ if (tcic_getw(base, TCIC_ADDR) != 0xc3a5)
+ return -3;
+
+ return 2;
+}
+
+int tcic_probe(void)
+{
+ int sock, id;
+
+ log_message("PCMCIA: probing for Databook TCIC-2 (ISA).."); fflush(stdout);
+
+ if (ioperm(TCIC_BASE, 16, 1)) {
+ log_perror("PCMCIA: ioperm");
+ return -1;
+ }
+ ioperm(0x80, 1, 1);
+ sock = tcic_probe_at(TCIC_BASE);
+
+ if (sock <= 0) {
+ log_message("\tnot found.");
+ return -ENODEV;
+ }
+
+ id = get_tcic_id(TCIC_BASE);
+ switch (id) {
+ case TCIC_ID_DB86082:
+ log_message("DB86082"); break;
+ case TCIC_ID_DB86082A:
+ log_message("DB86082A"); break;
+ case TCIC_ID_DB86084:
+ log_message("DB86084"); break;
+ case TCIC_ID_DB86084A:
+ log_message("DB86084A"); break;
+ case TCIC_ID_DB86072:
+ log_message("DB86072"); break;
+ case TCIC_ID_DB86184:
+ log_message("DB86184"); break;
+ case TCIC_ID_DB86082B:
+ log_message("DB86082B"); break;
+ default:
+ log_message("Unknown TCIC-2 ID 0x%02x", id);
+ }
+ log_message(" found at %#6x, %d sockets.", TCIC_BASE, sock);
+ return 0;
+
+} /* tcic_probe */
+
+
+char * pcmcia_probe(void)
+{
+ if (!pci_probe())
+ return driver;
+#if !defined(__x86_64__)
+ else if (!i365_probe())
+ return "pd6729";
+ else if (!tcic_probe())
+ return "tcic";
+#endif
+ else
+ return NULL;
+}
diff --git a/mdk-stage1/pcmcia/startup.c b/mdk-stage1/pcmcia/startup.c
new file mode 100644
index 000000000..e9004484a
--- /dev/null
+++ b/mdk-stage1/pcmcia/startup.c
@@ -0,0 +1,271 @@
+/*
+ * Startup tool for non statically mapped PCMCIA sockets
+ *
+ * (C) 2005 Dominik Brodowski <linux@brodo.de>
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
+ *
+ * License: GPL v2
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <syslog.h>
+#include <unistd.h>
+
+#include <sysfs/libsysfs.h>
+
+#include "startup.h"
+
+/* uncomment for debug output */
+#ifdef DEBUG
+#define dprintf printf
+#else
+#define dprintf(...) do { } while(0);
+#endif
+
+/* Linked list of resource adjustments */
+struct adjust_list_t *root_adjust = NULL;
+
+/* path for config file, device scripts */
+static char *configpath = "/etc/pcmcia";
+
+enum {
+ RESOURCE_MEM,
+ RESOURCE_IO,
+ MAX_RESOURCE_FILES
+};
+
+
+static const char *resource_files[MAX_RESOURCE_FILES] = {
+ [RESOURCE_MEM] = "available_resources_mem",
+ [RESOURCE_IO] = "available_resources_io",
+};
+
+#define PATH_TO_SOCKET "/sys/class/pcmcia_socket/"
+
+
+static int add_available_resource(unsigned int socket_no, unsigned int type,
+ unsigned int action,
+ unsigned long start, unsigned long end)
+{
+ char file[SYSFS_PATH_MAX];
+ char content[SYSFS_PATH_MAX];
+ struct sysfs_attribute *attr;
+ int ret;
+ size_t len;
+
+ if (type >= MAX_RESOURCE_FILES)
+ return -EINVAL;
+
+ if (end <= start)
+ return -EINVAL;
+
+ dprintf("%d %d %d 0x%lx 0x%lx\n", socket_no, type, action, start, end);
+
+ snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET "pcmcia_socket%u/%s",
+ socket_no, resource_files[type]);
+
+ switch(action) {
+ case ADD_MANAGED_RESOURCE:
+ len = snprintf(content, SYSFS_PATH_MAX,
+ "0x%08lx - 0x%08lx", start, end);
+ break;
+
+ case REMOVE_MANAGED_RESOURCE:
+ len = snprintf(content, SYSFS_PATH_MAX,
+ "- 0x%08lx - 0x%08lx", start, end);
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ dprintf("content is %s\n", content);
+
+ dprintf("file is %s\n", file);
+
+ attr = sysfs_open_attribute(file);
+ if (!attr)
+ return -ENODEV;
+
+ dprintf("open, len %d\n", len);
+
+ ret = sysfs_write_attribute(attr, content, len);
+
+ dprintf("ret is %d\n", ret);
+
+ sysfs_close_attribute(attr);
+
+ return (ret);
+}
+
+static int setup_done(unsigned int socket_no)
+{
+ int ret;
+ char file[SYSFS_PATH_MAX];
+ struct sysfs_attribute *attr;
+
+ snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET
+ "pcmcia_socket%u/available_resources_setup_done",
+ socket_no);
+
+ attr = sysfs_open_attribute(file);
+ if (!attr)
+ return -ENODEV;
+
+ ret = sysfs_write_attribute(attr, "42", 2);
+
+ sysfs_close_attribute(attr);
+
+ return (ret);
+}
+
+
+static int disallow_irq(unsigned int socket_no, unsigned int irq)
+{
+ char file[SYSFS_PATH_MAX];
+ char content[SYSFS_PATH_MAX];
+ struct sysfs_attribute *attr;
+ unsigned int mask = 0xfff;
+ unsigned int new_mask;
+ int ret;
+ size_t len;
+
+ if (irq >= 32)
+ return -EINVAL;
+
+ len = snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET
+ "pcmcia_socket%u/card_irq_mask",
+ socket_no);
+ dprintf("file is %s\n", file);
+
+ attr = sysfs_open_attribute(file);
+ if (!attr)
+ return -ENODEV;
+
+ dprintf("open, len %d\n", len);
+
+ ret = sysfs_read_attribute(attr);
+ if (ret) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ if (!attr->value || (attr->len < 6)) {
+ ret = -EIO;
+ goto out;
+ }
+
+ ret = sscanf(attr->value, "0x%x\n", &mask);
+
+ new_mask = 1 << irq;
+
+ mask &= ~new_mask;
+
+ len = snprintf(content, SYSFS_PATH_MAX, "0x%04x", mask);
+
+ dprintf("content is %s\n", content);
+
+ ret = sysfs_write_attribute(attr, content, len);
+
+ out:
+ sysfs_close_attribute(attr);
+
+ return (ret);
+}
+
+
+static void load_config(void)
+{
+ if (chdir(configpath) != 0) {
+ syslog(LOG_ERR, "chdir to %s failed: %m", configpath);
+ exit(EXIT_FAILURE);
+ }
+ parse_configfile("config.opts");
+ return;
+}
+
+
+static void adjust_resources(unsigned int socket_no)
+{
+ adjust_list_t *al;
+
+ for (al = root_adjust; al; al = al->next) {
+ switch (al->adj.Resource) {
+ case RES_MEMORY_RANGE:
+ add_available_resource(socket_no, RESOURCE_MEM,
+ al->adj.Action,
+ al->adj.resource.memory.Base,
+ al->adj.resource.memory.Base +
+ al->adj.resource.memory.Size - 1);
+ break;
+ case RES_IO_RANGE:
+ add_available_resource(socket_no, RESOURCE_IO,
+ al->adj.Action,
+ al->adj.resource.io.BasePort,
+ al->adj.resource.io.BasePort +
+ al->adj.resource.io.NumPorts - 1);
+ break;
+ case RES_IRQ:
+ if(al->adj.Action == REMOVE_MANAGED_RESOURCE)
+ disallow_irq(socket_no, al->adj.resource.irq.IRQ);
+ break;
+ }
+ }
+}
+
+/* mdk-stage1
+int main(int argc, char *argv[])
+{
+ char *socket_no;
+ unsigned long socket, i;
+ unsigned int all_sockets = 0;
+
+
+ if ((socket_no = getenv("SOCKET_NO"))) {
+ socket = strtoul(socket_no, NULL, 0);
+ } else if (argc == 2) {
+ socket = strtoul(argv[1], NULL, 0);
+ } else if (argc == 1) {
+ socket = 0;
+ all_sockets = 1;
+ } else {
+ return -EINVAL;
+ }
+
+ load_config();
+
+ for (i = 0; i < MAX_SOCKS; i++) {
+ if ((socket != i) && (!all_sockets))
+ continue;
+
+ adjust_resources(i);
+ setup_done(i);
+ }
+
+ return 0;
+}
+*/
+
+void pcmcia_socket_startup(int socket_no) {
+ unsigned long i;
+ unsigned int all_sockets = 0;
+
+ if (socket_no == -1)
+ all_sockets = 1;
+
+ load_config();
+
+ for (i = 0; i < MAX_SOCKS; i++) {
+ if ((socket_no != i) && (!all_sockets))
+ continue;
+
+ adjust_resources(i);
+ setup_done(i);
+ }
+}
diff --git a/mdk-stage1/pcmcia/startup.h b/mdk-stage1/pcmcia/startup.h
new file mode 100644
index 000000000..ba6af2c15
--- /dev/null
+++ b/mdk-stage1/pcmcia/startup.h
@@ -0,0 +1,54 @@
+/*
+ * Startup tool for non statically mapped PCMCIA sockets
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
+ *
+ * License: GPL v2
+ *
+ */
+
+#define MAX_SOCKS 8
+#define MAX_BINDINGS 4
+#define MAX_MODULES 4
+
+/* for AdjustResourceInfo */
+typedef struct adjust_t {
+ unsigned int Action;
+ unsigned int Resource;
+ unsigned int Attributes;
+ union {
+ struct memory {
+ unsigned long Base;
+ unsigned long Size;
+ } memory;
+ struct io {
+ unsigned long BasePort;
+ unsigned long NumPorts;
+ unsigned int IOAddrLines;
+ } io;
+ struct irq {
+ unsigned int IRQ;
+ } irq;
+ } resource;
+} adjust_t;
+
+
+typedef struct adjust_list_t {
+ adjust_t adj;
+ struct adjust_list_t *next;
+} adjust_list_t;
+
+
+extern adjust_list_t *root_adjust;
+
+int parse_configfile(char *fn);
+
+
+#define RES_MEMORY_RANGE 1
+#define RES_IO_RANGE 2
+#define RES_IRQ 3
+#define RES_RESERVED 0x10
+#define REMOVE_MANAGED_RESOURCE 1
+#define ADD_MANAGED_RESOURCE 2
diff --git a/mdk-stage1/pcmcia/tcic.h b/mdk-stage1/pcmcia/tcic.h
index 92347cef6..cad193885 100644
--- a/mdk-stage1/pcmcia/tcic.h
+++ b/mdk-stage1/pcmcia/tcic.h
@@ -1,5 +1,5 @@
/*
- * tcic.h 1.14 2000/06/12 21:29:37
+ * tcic.h 1.15 2001/08/24 12:15:34
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
diff --git a/mdk-stage1/pcmcia/version.h b/mdk-stage1/pcmcia/version.h
index 7a567ea2c..3be8f28bc 100644
--- a/mdk-stage1/pcmcia/version.h
+++ b/mdk-stage1/pcmcia/version.h
@@ -1,4 +1,4 @@
-/* version.h 1.95 2000/11/07 22:55:28 (David Hinds) */
+/* version.h 1.101 2001/08/09 12:29:14 (David Hinds) */
-#define CS_RELEASE "3.1.23"
-#define CS_RELEASE_CODE 0x3117
+#define CS_RELEASE "3.1.29"
+#define CS_RELEASE_CODE 0x311d
diff --git a/mdk-stage1/pcmcia/vg468.h b/mdk-stage1/pcmcia/vg468.h
index bb5faae87..23890cd07 100644
--- a/mdk-stage1/pcmcia/vg468.h
+++ b/mdk-stage1/pcmcia/vg468.h
@@ -1,5 +1,5 @@
/*
- * vg468.h 1.13 2000/06/12 21:29:37
+ * vg468.h 1.14 2001/08/24 12:15:34
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -16,8 +16,8 @@
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision by
@@ -103,10 +103,4 @@
/* Flags for VG469_EXT_MODE_B */
#define VG469_MODE_B_3V 0x01 /* 3.3v for socket B */
-/* Data structure for tracking vendor-specific state */
-typedef struct vg46x_state_t {
- u_char ctl; /* VG468_CTL */
- u_char ema; /* VG468_EXT_MODE_A */
-} vg46x_state_t;
-
#endif /* _LINUX_VG468_H */
diff --git a/mdk-stage1/pcmcia/yacc_config.c b/mdk-stage1/pcmcia/yacc_config.c
deleted file mode 100644
index e68e17cb3..000000000
--- a/mdk-stage1/pcmcia/yacc_config.c
+++ /dev/null
@@ -1,1017 +0,0 @@
-#define YYBYACC 1
-#define YYMAJOR 1
-#define YYMINOR 9
-#define yyclearin (yychar=(-1))
-#define yyerrok (yyerrflag=0)
-#define YYRECOVERING (yyerrflag!=0)
-#define YYPREFIX "yy"
-#line 2 "yacc_config.y"
-/*
- * yacc_config.y 1.51 2000/06/12 21:33:02
- *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License
- * at http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- * the License for the specific language governing rights and
- * limitations under the License.
- *
- * The initial developer of the original code is David A. Hinds
- * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
- * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
- *
- * Alternatively, the contents of this file may be used under the
- * terms of the GNU Public License version 2 (the "GPL"), in which
- * case the provisions of the GPL are applicable instead of the
- * above. If you wish to allow the use of your version of this file
- * only under the terms of the GPL and not to allow others to use
- * your version of this file under the MPL, indicate your decision by
- * deleting the provisions above and replace them with the notice and
- * other provisions required by the GPL. If you do not delete the
- * provisions above, a recipient may use your version of this file
- * under either the MPL or the GPL.
- */
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-#include <sys/types.h>
-
-#include <pcmcia/cs_types.h>
-#include <pcmcia/cs.h>
-#include <pcmcia/cistpl.h>
-#include <pcmcia/ds.h>
-
-#include "cardmgr.h"
-
-/* If bison: generate nicer error messages */
-#define YYERROR_VERBOSE 1
-
-/* from lex_config, for nice error messages */
-extern char *current_file;
-extern int current_lineno;
-
-void yyerror(char *msg, ...);
-
-static int add_binding(card_info_t *card, char *name, int fn);
-static int add_module(device_info_t *card, char *name);
-
-#line 65 "yacc_config.y"
-typedef union {
- char *str;
- u_long num;
- struct device_info_t *device;
- struct card_info_t *card;
- struct mtd_ident_t *mtd;
- struct adjust_list_t *adjust;
-} YYSTYPE;
-#line 77 "y.tab.c"
-#define DEVICE 257
-#define CARD 258
-#define ANONYMOUS 259
-#define TUPLE 260
-#define MANFID 261
-#define VERSION 262
-#define FUNCTION 263
-#define PCI 264
-#define BIND 265
-#define CIS 266
-#define TO 267
-#define NEEDS_MTD 268
-#define MODULE 269
-#define OPTS 270
-#define CLASS 271
-#define REGION 272
-#define JEDEC 273
-#define DTYPE 274
-#define DEFAULT 275
-#define MTD 276
-#define INCLUDE 277
-#define EXCLUDE 278
-#define RESERVE 279
-#define IRQ_NO 280
-#define PORT 281
-#define MEMORY 282
-#define STRING 283
-#define NUMBER 284
-#define YYERRCODE 256
-short yylhs[] = { -1,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
- 1, 1, 2, 2, 2, 3, 3, 3, 3, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 8, 9,
- 10, 11, 12, 12, 13, 15, 14, 14, 14, 14,
- 4, 21, 5, 5, 5, 6, 16, 16, 16, 16,
- 18, 17, 19, 20, 20, 22,
-};
-short yylen[] = { 2,
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 3, 2, 4, 4, 2, 1, 1, 1, 2,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 7,
- 5, 5, 3, 3, 3, 3, 3, 5, 3, 5,
- 2, 4, 3, 3, 3, 3, 2, 1, 1, 1,
- 3, 4, 2, 3, 3, 4,
-};
-short yydefred[] = { 1,
- 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 17, 0, 19, 0, 21, 22, 23, 24,
- 0, 26, 0, 28, 0, 49, 48, 50, 0, 6,
- 7, 16, 20, 0, 47, 0, 0, 0, 0, 9,
- 10, 11, 0, 41, 0, 0, 0, 0, 29, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 53, 0, 0, 0, 0, 13, 0, 0, 12, 43,
- 46, 44, 45, 0, 0, 33, 35, 0, 0, 36,
- 34, 0, 0, 51, 54, 55, 42, 56, 0, 0,
- 0, 0, 0, 0, 0, 52, 14, 15, 0, 31,
- 32, 38, 40, 0, 30,
-};
-short yydgoto[] = { 1,
- 11, 40, 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31,
-};
-short yysindex[] = { 0,
- -250, 0, -279, -278, -274, -265, -259, -242, -242, -242,
- -10, -248, 0, -44, 0, -249, 0, 0, 0, 0,
- -9, 0, -3, 0, -243, 0, 0, 0, -233, 0,
- 0, 0, 0, -228, 0, -227, -240, -238, -237, 0,
- 0, 0, -242, 0, -235, -232, -231, -230, 0, -234,
- -229, -226, -225, -224, -222, -221, -220, -219, -218, -217,
- 0, -215, -213, -212, -211, 0, 9, 11, 0, 0,
- 0, 0, 0, 14, 21, 0, 0, 30, -192, 0,
- 0, -191, -207, 0, 0, 0, 0, 0, -206, -205,
- -204, -203, -202, -201, -200, 0, 0, 0, 41, 0,
- 0, 0, 0, -197, 0,
-};
-short yyrindex[] = { 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 107, 149, 0, 90, 0, 124, 0, 0, 0, 0,
- 49, 0, 73, 0, 0, 0, 0, 0, 141, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
- 0, 25, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
-};
-short yygindex[] = { 0,
- 0, -7, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,
-};
-#define YYTABLESIZE 428
-short yytable[] = { 48,
- 37, 41, 42, 32, 33, 2, 3, 4, 34, 49,
- 50, 51, 52, 53, 54, 55, 56, 35, 5, 44,
- 45, 6, 46, 36, 39, 7, 8, 9, 10, 59,
- 60, 61, 62, 43, 57, 69, 63, 37, 38, 39,
- 58, 64, 65, 66, 37, 67, 68, 70, 25, 74,
- 71, 72, 73, 89, 75, 90, 76, 91, 77, 78,
- 79, 80, 81, 82, 92, 83, 84, 85, 39, 86,
- 87, 88, 27, 93, 94, 95, 96, 97, 98, 99,
- 100, 101, 102, 103, 104, 105, 0, 0, 0, 18,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 5, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 47, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 37, 37, 37, 37,
- 37, 37, 37, 37, 37, 37, 37, 0, 0, 37,
- 0, 0, 37, 0, 0, 0, 37, 37, 37, 37,
- 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
- 39, 0, 0, 39, 0, 0, 39, 0, 0, 0,
- 39, 39, 39, 39, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 0, 0, 25, 0, 0,
- 25, 0, 0, 0, 25, 25, 25, 25, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 0,
- 0, 27, 0, 0, 27, 18, 18, 18, 27, 27,
- 27, 27, 0, 0, 0, 0, 0, 18, 18, 0,
- 18, 18, 2, 2, 2, 18, 18, 18, 18, 0,
- 0, 0, 0, 0, 0, 2, 0, 0, 2, 5,
- 5, 5, 2, 2, 2, 2, 0, 0, 0, 0,
- 0, 0, 5, 0, 0, 5, 4, 4, 4, 5,
- 5, 5, 5, 0, 3, 3, 3, 0, 0, 4,
- 0, 0, 4, 0, 0, 0, 4, 4, 4, 4,
- 3, 0, 0, 0, 3, 3, 3, 3,
-};
-short yycheck[] = { 44,
- 0, 9, 10, 283, 283, 256, 257, 258, 283, 259,
- 260, 261, 262, 263, 264, 265, 266, 283, 269, 268,
- 269, 272, 271, 283, 0, 276, 277, 278, 279, 273,
- 274, 275, 276, 44, 44, 43, 270, 280, 281, 282,
- 44, 270, 270, 284, 44, 284, 284, 283, 0, 284,
- 283, 283, 283, 45, 284, 45, 283, 44, 284, 284,
- 283, 283, 283, 283, 44, 284, 284, 283, 44, 283,
- 283, 283, 0, 44, 267, 267, 284, 284, 284, 284,
- 284, 284, 284, 284, 44, 283, -1, -1, -1, 0,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 0, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 0, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 0, -1, -1, -1, -1, -1, -1, -1, 0, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 270, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 256, 257, 258, 259,
- 260, 261, 262, 263, 264, 265, 266, -1, -1, 269,
- -1, -1, 272, -1, -1, -1, 276, 277, 278, 279,
- 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
- 266, -1, -1, 269, -1, -1, 272, -1, -1, -1,
- 276, 277, 278, 279, 256, 257, 258, 259, 260, 261,
- 262, 263, 264, 265, 266, -1, -1, 269, -1, -1,
- 272, -1, -1, -1, 276, 277, 278, 279, 256, 257,
- 258, 259, 260, 261, 262, 263, 264, 265, 266, -1,
- -1, 269, -1, -1, 272, 256, 257, 258, 276, 277,
- 278, 279, -1, -1, -1, -1, -1, 268, 269, -1,
- 271, 272, 256, 257, 258, 276, 277, 278, 279, -1,
- -1, -1, -1, -1, -1, 269, -1, -1, 272, 256,
- 257, 258, 276, 277, 278, 279, -1, -1, -1, -1,
- -1, -1, 269, -1, -1, 272, 256, 257, 258, 276,
- 277, 278, 279, -1, 256, 257, 258, -1, -1, 269,
- -1, -1, 272, -1, -1, -1, 276, 277, 278, 279,
- 272, -1, -1, -1, 276, 277, 278, 279,
-};
-#define YYFINAL 1
-#ifndef YYDEBUG
-#define YYDEBUG 0
-#endif
-#define YYMAXTOKEN 284
-#if YYDEBUG
-char *yyname[] = {
-"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,"','","'-'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"DEVICE","CARD",
-"ANONYMOUS","TUPLE","MANFID","VERSION","FUNCTION","PCI","BIND","CIS","TO",
-"NEEDS_MTD","MODULE","OPTS","CLASS","REGION","JEDEC","DTYPE","DEFAULT","MTD",
-"INCLUDE","EXCLUDE","RESERVE","IRQ_NO","PORT","MEMORY","STRING","NUMBER",
-};
-char *yyrule[] = {
-"$accept : list",
-"list :",
-"list : list adjust",
-"list : list device",
-"list : list mtd",
-"list : list card",
-"list : list opts",
-"list : list mtd_opts",
-"list : list error",
-"adjust : INCLUDE resource",
-"adjust : EXCLUDE resource",
-"adjust : RESERVE resource",
-"adjust : adjust ',' resource",
-"resource : IRQ_NO NUMBER",
-"resource : PORT NUMBER '-' NUMBER",
-"resource : MEMORY NUMBER '-' NUMBER",
-"device : DEVICE STRING",
-"device : needs_mtd",
-"device : module",
-"device : class",
-"card : CARD STRING",
-"card : anonymous",
-"card : tuple",
-"card : manfid",
-"card : pci",
-"card : version",
-"card : function",
-"card : bind",
-"card : cis",
-"anonymous : card ANONYMOUS",
-"tuple : card TUPLE NUMBER ',' NUMBER ',' STRING",
-"manfid : card MANFID NUMBER ',' NUMBER",
-"pci : card PCI NUMBER ',' NUMBER",
-"version : card VERSION STRING",
-"version : version ',' STRING",
-"function : card FUNCTION NUMBER",
-"cis : card CIS STRING",
-"bind : card BIND STRING",
-"bind : card BIND STRING TO NUMBER",
-"bind : bind ',' STRING",
-"bind : bind ',' STRING TO NUMBER",
-"needs_mtd : device NEEDS_MTD",
-"opts : MODULE STRING OPTS STRING",
-"module : device MODULE STRING",
-"module : module OPTS STRING",
-"module : module ',' STRING",
-"class : device CLASS STRING",
-"region : REGION STRING",
-"region : dtype",
-"region : jedec",
-"region : default",
-"dtype : region DTYPE NUMBER",
-"jedec : region JEDEC NUMBER NUMBER",
-"default : region DEFAULT",
-"mtd : region MTD STRING",
-"mtd : mtd OPTS STRING",
-"mtd_opts : MTD STRING OPTS STRING",
-};
-#endif
-#ifdef YYSTACKSIZE
-#undef YYMAXDEPTH
-#define YYMAXDEPTH YYSTACKSIZE
-#else
-#ifdef YYMAXDEPTH
-#define YYSTACKSIZE YYMAXDEPTH
-#else
-#define YYSTACKSIZE 500
-#define YYMAXDEPTH 500
-#endif
-#endif
-int yydebug;
-int yynerrs;
-int yyerrflag;
-int yychar;
-short *yyssp;
-YYSTYPE *yyvsp;
-YYSTYPE yyval;
-YYSTYPE yylval;
-short yyss[YYSTACKSIZE];
-YYSTYPE yyvs[YYSTACKSIZE];
-#define yystacksize YYSTACKSIZE
-#line 468 "yacc_config.y"
-void yyerror(char *msg, ...)
-{
- va_list ap;
- char str[256];
-
- va_start(ap, msg);
- sprintf(str, "config error, file '%s' line %d: ",
- current_file, current_lineno);
- vsprintf(str+strlen(str), msg, ap);
-#if YYDEBUG
- fprintf(stderr, "%s\n", str);
-#else
- syslog(LOG_ERR, "%s", str);
-#endif
- va_end(ap);
-}
-
-static int add_binding(card_info_t *card, char *name, int fn)
-{
- device_info_t *dev = root_device;
- if (card->bindings == MAX_BINDINGS) {
- yyerror("too many bindings\n");
- return -1;
- }
- for (; dev; dev = dev->next)
- if (strcmp((char *)dev->dev_info, name) == 0) break;
- if (dev == NULL) {
- yyerror("unknown device: %s", name);
- return -1;
- }
- card->device[card->bindings] = dev;
- card->dev_fn[card->bindings] = fn;
- card->bindings++;
- free(name);
- return 0;
-}
-
-static int add_module(device_info_t *dev, char *name)
-{
- if (dev->modules == MAX_MODULES) {
- yyerror("too many modules");
- return -1;
- }
- dev->module[dev->modules] = name;
- dev->opts[dev->modules] = NULL;
- dev->modules++;
- return 0;
-}
-
-int yylex(void);
-
-#if YYDEBUG
-adjust_list_t *root_adjust = NULL;
-device_info_t *root_device = NULL;
-card_info_t *root_card = NULL, *blank_card = NULL, *root_func = NULL;
-mtd_ident_t *root_mtd = NULL, *default_mtd = NULL;
-
-
-void main(int argc, char *argv[])
-{
- yydebug = 1;
- if (argc > 1)
- parse_configfile(argv[1]);
-}
-#endif
-#line 426 "y.tab.c"
-#define YYABORT goto yyabort
-#define YYREJECT goto yyabort
-#define YYACCEPT goto yyaccept
-#define YYERROR goto yyerrlab
-int
-yyparse(void)
-{
- register int yym, yyn, yystate;
-#if YYDEBUG
- register char *yys;
- extern char *getenv();
-
- if (yys = getenv("YYDEBUG"))
- {
- yyn = *yys;
- if (yyn >= '0' && yyn <= '9')
- yydebug = yyn - '0';
- }
-#endif
-
- yynerrs = 0;
- yyerrflag = 0;
- yychar = (-1);
-
- yyssp = yyss;
- yyvsp = yyvs;
- *yyssp = yystate = 0;
-
-yyloop:
- if ((yyn = yydefred[yystate])) goto yyreduce;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- }
- if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, shifting to state %d\n",
- YYPREFIX, yystate, yytable[yyn]);
-#endif
- if (yyssp >= yyss + yystacksize - 1)
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- yychar = (-1);
- if (yyerrflag > 0) --yyerrflag;
- goto yyloop;
- }
- if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
- yyn = yytable[yyn];
- goto yyreduce;
- }
- if (yyerrflag) goto yyinrecovery;
- yyerror("syntax error");
-#ifdef lint
- goto yyerrlab;
-#endif
-yyerrlab:
- ++yynerrs;
-yyinrecovery:
- if (yyerrflag < 3)
- {
- yyerrflag = 3;
- for (;;)
- {
- if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, error recovery shifting\
- to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
-#endif
- if (yyssp >= yyss + yystacksize - 1)
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- goto yyloop;
- }
- else
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: error recovery discarding state %d\n",
- YYPREFIX, *yyssp);
-#endif
- if (yyssp <= yyss) goto yyabort;
- --yyssp;
- --yyvsp;
- }
- }
- }
- else
- {
- if (yychar == 0) goto yyabort;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- yychar = (-1);
- goto yyloop;
- }
-yyreduce:
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, reducing by rule %d (%s)\n",
- YYPREFIX, yystate, yyn, yyrule[yyn]);
-#endif
- yym = yylen[yyn];
- yyval = yyvsp[1-yym];
- switch (yyn)
- {
-case 2:
-#line 84 "yacc_config.y"
-{
- adjust_list_t **tail = &root_adjust;
- while (*tail != NULL) tail = &(*tail)->next;
- *tail = yyvsp[0].adjust;
- }
-break;
-case 3:
-#line 90 "yacc_config.y"
-{
- yyvsp[0].device->next = root_device;
- root_device = yyvsp[0].device;
- }
-break;
-case 4:
-#line 95 "yacc_config.y"
-{
- if (yyvsp[0].mtd->mtd_type == 0) {
- yyerror("no ID method for this card");
- YYERROR;
- }
- if (yyvsp[0].mtd->module == NULL) {
- yyerror("no MTD module specified");
- YYERROR;
- }
- yyvsp[0].mtd->next = root_mtd;
- root_mtd = yyvsp[0].mtd;
- }
-break;
-case 5:
-#line 108 "yacc_config.y"
-{
- if (yyvsp[0].card->ident_type == 0) {
- yyerror("no ID method for this card");
- YYERROR;
- }
- if (yyvsp[0].card->bindings == 0) {
- yyerror("no function bindings");
- YYERROR;
- }
- if (yyvsp[0].card->ident_type == FUNC_IDENT) {
- yyvsp[0].card->next = root_func;
- root_func = yyvsp[0].card;
- } else {
- yyvsp[0].card->next = root_card;
- root_card = yyvsp[0].card;
- }
- }
-break;
-case 9:
-#line 131 "yacc_config.y"
-{
- yyvsp[0].adjust->adj.Action = ADD_MANAGED_RESOURCE;
- yyval.adjust = yyvsp[0].adjust;
- }
-break;
-case 10:
-#line 136 "yacc_config.y"
-{
- yyvsp[0].adjust->adj.Action = REMOVE_MANAGED_RESOURCE;
- yyval.adjust = yyvsp[0].adjust;
- }
-break;
-case 11:
-#line 141 "yacc_config.y"
-{
- yyvsp[0].adjust->adj.Action = ADD_MANAGED_RESOURCE;
- yyvsp[0].adjust->adj.Attributes |= RES_RESERVED;
- yyval.adjust = yyvsp[0].adjust;
- }
-break;
-case 12:
-#line 147 "yacc_config.y"
-{
- yyvsp[0].adjust->adj.Action = yyvsp[-2].adjust->adj.Action;
- yyvsp[0].adjust->adj.Attributes = yyvsp[-2].adjust->adj.Attributes;
- yyvsp[0].adjust->next = yyvsp[-2].adjust;
- yyval.adjust = yyvsp[0].adjust;
- }
-break;
-case 13:
-#line 156 "yacc_config.y"
-{
- yyval.adjust = calloc(sizeof(adjust_list_t), 1);
- yyval.adjust->adj.Resource = RES_IRQ;
- yyval.adjust->adj.resource.irq.IRQ = yyvsp[0].num;
- }
-break;
-case 14:
-#line 162 "yacc_config.y"
-{
- if ((yyvsp[0].num < yyvsp[-2].num) || (yyvsp[0].num > 0xffff)) {
- yyerror("invalid port range");
- YYERROR;
- }
- yyval.adjust = calloc(sizeof(adjust_list_t), 1);
- yyval.adjust->adj.Resource = RES_IO_RANGE;
- yyval.adjust->adj.resource.io.BasePort = yyvsp[-2].num;
- yyval.adjust->adj.resource.io.NumPorts = yyvsp[0].num - yyvsp[-2].num + 1;
- }
-break;
-case 15:
-#line 173 "yacc_config.y"
-{
- if (yyvsp[0].num < yyvsp[-2].num) {
- yyerror("invalid address range");
- YYERROR;
- }
- yyval.adjust = calloc(sizeof(adjust_list_t), 1);
- yyval.adjust->adj.Resource = RES_MEMORY_RANGE;
- yyval.adjust->adj.resource.memory.Base = yyvsp[-2].num;
- yyval.adjust->adj.resource.memory.Size = yyvsp[0].num - yyvsp[-2].num + 1;
- }
-break;
-case 16:
-#line 186 "yacc_config.y"
-{
- yyval.device = calloc(sizeof(device_info_t), 1);
- yyval.device->refs = 1;
- strcpy(yyval.device->dev_info, yyvsp[0].str);
- free(yyvsp[0].str);
- }
-break;
-case 20:
-#line 198 "yacc_config.y"
-{
- yyval.card = calloc(sizeof(card_info_t), 1);
- yyval.card->refs = 1;
- yyval.card->name = yyvsp[0].str;
- }
-break;
-case 29:
-#line 214 "yacc_config.y"
-{
- if (yyvsp[-1].card->ident_type != 0) {
- yyerror("ID method already defined");
- YYERROR;
- }
- if (blank_card) {
- yyerror("Anonymous card already defined");
- YYERROR;
- }
- yyvsp[-1].card->ident_type = BLANK_IDENT;
- blank_card = yyvsp[-1].card;
- }
-break;
-case 30:
-#line 229 "yacc_config.y"
-{
- if (yyvsp[-6].card->ident_type != 0) {
- yyerror("ID method already defined");
- YYERROR;
- }
- yyvsp[-6].card->ident_type = TUPLE_IDENT;
- yyvsp[-6].card->id.tuple.code = yyvsp[-4].num;
- yyvsp[-6].card->id.tuple.ofs = yyvsp[-2].num;
- yyvsp[-6].card->id.tuple.info = yyvsp[0].str;
- }
-break;
-case 31:
-#line 242 "yacc_config.y"
-{
- if (yyvsp[-4].card->ident_type != 0) {
- yyerror("ID method already defined");
- YYERROR;
- }
- yyvsp[-4].card->ident_type = MANFID_IDENT;
- yyvsp[-4].card->id.manfid.manf = yyvsp[-2].num;
- yyvsp[-4].card->id.manfid.card = yyvsp[0].num;
- }
-break;
-case 32:
-#line 253 "yacc_config.y"
-{
- if (yyvsp[-4].card->ident_type != 0) {
- yyerror("ID method already defined");
- YYERROR;
- }
- yyvsp[-4].card->ident_type = PCI_IDENT;
- yyvsp[-4].card->id.manfid.manf = yyvsp[-2].num;
- yyvsp[-4].card->id.manfid.card = yyvsp[0].num;
- }
-break;
-case 33:
-#line 264 "yacc_config.y"
-{
- if (yyvsp[-2].card->ident_type != 0) {
- yyerror("ID method already defined\n");
- YYERROR;
- }
- yyvsp[-2].card->ident_type = VERS_1_IDENT;
- yyvsp[-2].card->id.vers.ns = 1;
- yyvsp[-2].card->id.vers.pi[0] = yyvsp[0].str;
- }
-break;
-case 34:
-#line 274 "yacc_config.y"
-{
- if (yyvsp[-2].card->id.vers.ns == 4) {
- yyerror("too many version strings");
- YYERROR;
- }
- yyvsp[-2].card->id.vers.pi[yyvsp[-2].card->id.vers.ns] = yyvsp[0].str;
- yyvsp[-2].card->id.vers.ns++;
- }
-break;
-case 35:
-#line 285 "yacc_config.y"
-{
- if (yyvsp[-2].card->ident_type != 0) {
- yyerror("ID method already defined\n");
- YYERROR;
- }
- yyvsp[-2].card->ident_type = FUNC_IDENT;
- yyvsp[-2].card->id.func.funcid = yyvsp[0].num;
- }
-break;
-case 36:
-#line 296 "yacc_config.y"
-{ yyvsp[-2].card->cis_file = strdup(yyvsp[0].str); }
-break;
-case 37:
-#line 300 "yacc_config.y"
-{
- if (add_binding(yyvsp[-2].card, yyvsp[0].str, 0) != 0)
- YYERROR;
- }
-break;
-case 38:
-#line 305 "yacc_config.y"
-{
- if (add_binding(yyvsp[-4].card, yyvsp[-2].str, yyvsp[0].num) != 0)
- YYERROR;
- }
-break;
-case 39:
-#line 310 "yacc_config.y"
-{
- if (add_binding(yyvsp[-2].card, yyvsp[0].str, 0) != 0)
- YYERROR;
- }
-break;
-case 40:
-#line 315 "yacc_config.y"
-{
- if (add_binding(yyvsp[-4].card, yyvsp[-2].str, yyvsp[0].num) != 0)
- YYERROR;
- }
-break;
-case 41:
-#line 322 "yacc_config.y"
-{
- yyvsp[-1].device->needs_mtd = 1;
- }
-break;
-case 42:
-#line 328 "yacc_config.y"
-{
- device_info_t *d;
- int i, found = 0;
- for (d = root_device; d; d = d->next) {
- for (i = 0; i < d->modules; i++)
- if (strcmp(yyvsp[-2].str, d->module[i]) == 0) break;
- if (i < d->modules) {
- if (d->opts[i])
- free(d->opts[i]);
- d->opts[i] = strdup(yyvsp[0].str);
- found = 1;
- }
- }
- free(yyvsp[-2].str); free(yyvsp[0].str);
- if (!found) {
- yyerror("module name not found!");
- YYERROR;
- }
- }
-break;
-case 43:
-#line 350 "yacc_config.y"
-{
- if (add_module(yyvsp[-2].device, yyvsp[0].str) != 0)
- YYERROR;
- }
-break;
-case 44:
-#line 355 "yacc_config.y"
-{
- if (yyvsp[-2].device->opts[yyvsp[-2].device->modules-1] == NULL) {
- yyvsp[-2].device->opts[yyvsp[-2].device->modules-1] = yyvsp[0].str;
- } else {
- yyerror("too many options");
- YYERROR;
- }
- }
-break;
-case 45:
-#line 364 "yacc_config.y"
-{
- if (add_module(yyvsp[-2].device, yyvsp[0].str) != 0)
- YYERROR;
- }
-break;
-case 46:
-#line 371 "yacc_config.y"
-{
- if (yyvsp[-2].device->class != NULL) {
- yyerror("extra class string");
- YYERROR;
- }
- yyvsp[-2].device->class = yyvsp[0].str;
- }
-break;
-case 47:
-#line 381 "yacc_config.y"
-{
- yyval.mtd = calloc(sizeof(mtd_ident_t), 1);
- yyval.mtd->refs = 1;
- yyval.mtd->name = yyvsp[0].str;
- }
-break;
-case 51:
-#line 392 "yacc_config.y"
-{
- if (yyvsp[-2].mtd->mtd_type != 0) {
- yyerror("ID method already defined");
- YYERROR;
- }
- yyvsp[-2].mtd->mtd_type = DTYPE_MTD;
- yyvsp[-2].mtd->dtype = yyvsp[0].num;
- }
-break;
-case 52:
-#line 403 "yacc_config.y"
-{
- if (yyvsp[-3].mtd->mtd_type != 0) {
- yyerror("ID method already defined");
- YYERROR;
- }
- yyvsp[-3].mtd->mtd_type = JEDEC_MTD;
- yyvsp[-3].mtd->jedec_mfr = yyvsp[-1].num;
- yyvsp[-3].mtd->jedec_info = yyvsp[0].num;
- }
-break;
-case 53:
-#line 415 "yacc_config.y"
-{
- if (yyvsp[-1].mtd->mtd_type != 0) {
- yyerror("ID method already defined");
- YYERROR;
- }
- if (default_mtd) {
- yyerror("Default MTD already defined");
- YYERROR;
- }
- yyvsp[-1].mtd->mtd_type = DEFAULT_MTD;
- default_mtd = yyvsp[-1].mtd;
- }
-break;
-case 54:
-#line 430 "yacc_config.y"
-{
- if (yyvsp[-2].mtd->module != NULL) {
- yyerror("extra MTD entry");
- YYERROR;
- }
- yyvsp[-2].mtd->module = yyvsp[0].str;
- }
-break;
-case 55:
-#line 438 "yacc_config.y"
-{
- if (yyvsp[-2].mtd->opts == NULL) {
- yyvsp[-2].mtd->opts = yyvsp[0].str;
- } else {
- yyerror("too many options");
- YYERROR;
- }
- }
-break;
-case 56:
-#line 449 "yacc_config.y"
-{
- mtd_ident_t *m;
- int found = 0;
- for (m = root_mtd; m; m = m->next)
- if (strcmp(yyvsp[-2].str, m->module) == 0) break;
- if (m) {
- if (m->opts) free(m->opts);
- m->opts = strdup(yyvsp[0].str);
- found = 1;
- }
- free(yyvsp[-2].str); free(yyvsp[0].str);
- if (!found) {
- yyerror("MTD name not found!");
- YYERROR;
- }
- }
-break;
-#line 966 "y.tab.c"
- }
- yyssp -= yym;
- yystate = *yyssp;
- yyvsp -= yym;
- yym = yylhs[yyn];
- if (yystate == 0 && yym == 0)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state 0 to\
- state %d\n", YYPREFIX, YYFINAL);
-#endif
- yystate = YYFINAL;
- *++yyssp = YYFINAL;
- *++yyvsp = yyval;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, YYFINAL, yychar, yys);
- }
-#endif
- }
- if (yychar == 0) goto yyaccept;
- goto yyloop;
- }
- if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
- yystate = yytable[yyn];
- else
- yystate = yydgoto[yym];
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state %d \
-to state %d\n", YYPREFIX, *yyssp, yystate);
-#endif
- if (yyssp >= yyss + yystacksize - 1)
- {
- goto yyoverflow;
- }
- *++yyssp = yystate;
- *++yyvsp = yyval;
- goto yyloop;
-yyoverflow:
- yyerror("yacc stack overflow");
-yyabort:
- return (1);
-yyaccept:
- return (0);
-}
diff --git a/mdk-stage1/pcmcia/yacc_config.h b/mdk-stage1/pcmcia/yacc_config.h
deleted file mode 100644
index b4902c8e6..000000000
--- a/mdk-stage1/pcmcia/yacc_config.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#define DEVICE 257
-#define CARD 258
-#define ANONYMOUS 259
-#define TUPLE 260
-#define MANFID 261
-#define VERSION 262
-#define FUNCTION 263
-#define PCI 264
-#define BIND 265
-#define CIS 266
-#define TO 267
-#define NEEDS_MTD 268
-#define MODULE 269
-#define OPTS 270
-#define CLASS 271
-#define REGION 272
-#define JEDEC 273
-#define DTYPE 274
-#define DEFAULT 275
-#define MTD 276
-#define INCLUDE 277
-#define EXCLUDE 278
-#define RESERVE 279
-#define IRQ_NO 280
-#define PORT 281
-#define MEMORY 282
-#define STRING 283
-#define NUMBER 284
-typedef union {
- char *str;
- u_long num;
- struct device_info_t *device;
- struct card_info_t *card;
- struct mtd_ident_t *mtd;
- struct adjust_list_t *adjust;
-} YYSTYPE;
-extern YYSTYPE yylval;
diff --git a/mdk-stage1/pcmcia/yacc_config.y b/mdk-stage1/pcmcia/yacc_config.y
new file mode 100644
index 000000000..c33f397d6
--- /dev/null
+++ b/mdk-stage1/pcmcia/yacc_config.y
@@ -0,0 +1,133 @@
+%{
+/*
+ * Startup tool for non statically mapped PCMCIA sockets - config file parsing
+ *
+ * (C) 2005 Dominik Brodowski <linux@brodo.de>
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
+ *
+ * License: GPL v2
+ */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <syslog.h>
+#include <sys/types.h>
+
+#include "startup.h"
+
+/* If bison: generate nicer error messages */
+#define YYERROR_VERBOSE 1
+
+/* from lex_config, for nice error messages */
+extern char *current_file;
+extern int current_lineno;
+
+extern int yylex(void); /* mdk-stage1 */
+
+void yyerror(const char *msg, ...);
+
+%}
+
+%token DEVICE CARD ANONYMOUS TUPLE MANFID VERSION FUNCTION PCI
+%token BIND CIS TO NEEDS_MTD MODULE OPTS CLASS
+%token REGION JEDEC DTYPE DEFAULT MTD
+%token INCLUDE EXCLUDE RESERVE IRQ_NO PORT MEMORY
+%token STRING NUMBER SOURCE
+
+%union {
+ char *str;
+ u_long num;
+ struct adjust_list_t *adjust;
+}
+
+%type <str> STRING
+%type <num> NUMBER
+%type <adjust> adjust resource
+%%
+list: /* nothing */
+ | list adjust
+ {
+ adjust_list_t **tail = &root_adjust;
+ while (*tail != NULL) tail = &(*tail)->next;
+ *tail = $2;
+ }
+ ;
+
+adjust: INCLUDE resource
+ {
+ $2->adj.Action = ADD_MANAGED_RESOURCE;
+ $$ = $2;
+ }
+ | EXCLUDE resource
+ {
+ $2->adj.Action = REMOVE_MANAGED_RESOURCE;
+ $$ = $2;
+ }
+ | RESERVE resource
+ {
+ $2->adj.Action = ADD_MANAGED_RESOURCE;
+ $2->adj.Attributes |= RES_RESERVED;
+ $$ = $2;
+ }
+ | adjust ',' resource
+ {
+ $3->adj.Action = $1->adj.Action;
+ $3->adj.Attributes = $1->adj.Attributes;
+ $3->next = $1;
+ $$ = $3;
+ }
+ ;
+
+resource: IRQ_NO NUMBER
+ {
+ $$ = calloc(sizeof(adjust_list_t), 1);
+ $$->adj.Resource = RES_IRQ;
+ $$->adj.resource.irq.IRQ = $2;
+ }
+ | PORT NUMBER '-' NUMBER
+ {
+ if (($4 < $2) || ($4 > 0xffff)) {
+ yyerror("invalid port range 0x%x-0x%x", $2, $4);
+ YYERROR;
+ }
+ $$ = calloc(sizeof(adjust_list_t), 1);
+ $$->adj.Resource = RES_IO_RANGE;
+ $$->adj.resource.io.BasePort = $2;
+ $$->adj.resource.io.NumPorts = $4 - $2 + 1;
+ }
+ | MEMORY NUMBER '-' NUMBER
+ {
+ if ($4 < $2) {
+ yyerror("invalid address range 0x%x-0x%x", $2, $4);
+ YYERROR;
+ }
+ $$ = calloc(sizeof(adjust_list_t), 1);
+ $$->adj.Resource = RES_MEMORY_RANGE;
+ $$->adj.resource.memory.Base = $2;
+ $$->adj.resource.memory.Size = $4 - $2 + 1;
+ }
+ ;
+
+%%
+void yyerror(const char *msg, ...)
+{
+ va_list ap;
+ char str[256];
+
+ va_start(ap, msg);
+ sprintf(str, "error in file '%s' line %d: ",
+ current_file, current_lineno);
+ vsprintf(str+strlen(str), msg, ap);
+#if YYDEBUG
+ fprintf(stderr, "%s\n", str);
+#else
+ syslog(LOG_ERR, "%s", str);
+#endif
+ va_end(ap);
+}
+
diff --git a/mdk-stage1/probe-modules.c b/mdk-stage1/probe-modules.c
new file mode 100644
index 000000000..86b383b5e
--- /dev/null
+++ b/mdk-stage1/probe-modules.c
@@ -0,0 +1,69 @@
+/*
+ * Olivier Blin (blino)
+ *
+ * Copyright 2007-2004 Mandriva
+ *
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "log.h"
+#include "modules.h"
+#include "probing.h"
+#include "frontend.h"
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <string.h>
+#include "utils.h"
+
+void stg1_error_message(char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ verror_message(msg, args);
+ va_end(args);
+}
+void fatal_error(char *msg)
+{
+ log_message("FATAL ERROR IN MODULES LOADER: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg);
+ exit(EXIT_FAILURE);
+}
+
+int main(int argc, char **argv, char **env)
+{
+ enum media_bus bus = BUS_ANY;
+ char *module = NULL;
+ char options[500] = "";
+
+ if (argc > 1) {
+ if (streq(argv[1], "--usb")) {
+ bus = BUS_USB;
+ } else if (!ptr_begins_static_str(argv[1], "--")) {
+ int i;
+ module = argv[1];
+ for (i = 2; i < argc; i++) {
+ strcat(options, argv[i]);
+ strcat(options, " ");
+ }
+ }
+ }
+
+ open_log();
+ init_modules_insmoding();
+
+ if (module) {
+ my_modprobe(module, ANY_DRIVER_TYPE, options);
+ } else {
+ find_media(bus);
+ }
+
+ close_log();
+
+ return 0;
+}
diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c
index 46bc79acc..f956bb348 100644
--- a/mdk-stage1/probing.c
+++ b/mdk-stage1/probing.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -22,7 +22,7 @@
/*
* This contains stuff related to probing:
- * (1) any (actually SCSI and NET only) devices (autoprobe for PCI)
+ * (1) any (actually only SCSI, NET, CPQ, USB Controllers) devices (autoprobe for PCI and USB)
* (2) IDE media
* (3) SCSI media
* (4) ETH devices
@@ -35,382 +35,687 @@
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <dirent.h>
#include <fcntl.h>
+#include <fnmatch.h>
#include <sys/socket.h>
#include <net/if.h>
+#include <linux/sockios.h>
+#include <linux/ethtool.h>
#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <pci/pci.h>
+#include <libldetect.h>
+#include <errno.h>
+#include <glob.h>
#include "stage1.h"
#include "log.h"
+#include "utils.h"
#include "frontend.h"
#include "modules.h"
-#include "pci-resource/pci-ids.h"
+#include "pci-ids.h"
+#ifdef ENABLE_USB
+#include "usb-ids.h"
+#endif
+#ifdef ENABLE_PCMCIA
+#include "sysfs/libsysfs.h"
+#include "pcmcia-ids.h"
+#endif
#include "probing.h"
-enum bus_type { IDE, SCSI };
-
struct media_info {
char * name;
char * model;
enum media_type type;
- enum bus_type bus;
};
-static void warning_insmod_failed(void)
+static void warning_insmod_failed(enum insmod_return r)
{
- error_message("Warning, installation of driver failed.");
+ if (IS_AUTOMATIC && r == INSMOD_FAILED_FILE_NOT_FOUND)
+ return;
+ if (r != INSMOD_OK) {
+ if (r == INSMOD_FAILED_FILE_NOT_FOUND)
+ stg1_error_message("This floppy doesn't contain the driver.");
+ else
+ stg1_error_message("Warning, installation of driver failed. (please include msg from <Alt-F3> for bugreports)");
+ }
}
#ifndef DISABLE_NETWORK
-struct net_description_elem
+const char * safe_descr(const char * text) {
+ return text ? text : "unknown";
+}
+
+char * get_net_intf_description(char * intf_name)
{
- char * intf_name;
- char * intf_description;
-};
-static struct net_description_elem net_descriptions[50];
-static int net_descr_number = 0;
-static char * intf_descr_for_discover = NULL;
-static char * net_intf_too_early_name[50]; /* for modules providing more than one net intf */
-static int net_intf_too_early_number = 0;
-static int net_intf_too_early_ptr = 0;
-
-void prepare_intf_descr(const char * intf_descr)
+ struct ifreq ifr;
+ struct ethtool_drvinfo drvinfo;
+ int s = socket(AF_INET, SOCK_DGRAM, 0);
+ char *res;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, intf_name, IFNAMSIZ);
+
+ drvinfo.cmd = ETHTOOL_GDRVINFO;
+ ifr.ifr_data = (caddr_t) &drvinfo;
+
+ if (ioctl(s, SIOCETHTOOL, &ifr) != -1) {
+ res = drvinfo.driver;
+ } else {
+ perror("SIOCETHTOOL");
+ res = "unknown";
+ }
+ close(s);
+ return strdup(res);
+}
+#endif
+
+static int device_match_modules_list(struct pciusb_entry *e, char **modules, unsigned int modules_len) {
+ int i;
+ if (!e->module)
+ return 0;
+ for (i = 0; i < modules_len; i++)
+ if (!strcmp(modules[i], e->module))
+ return 1;
+ return 0;
+}
+
+struct pcitable_entry *detected_devices = NULL;
+int detected_devices_len = 0;
+
+static void detected_devices_destroy(void)
{
- intf_descr_for_discover = strdup(intf_descr);
+ if (detected_devices)
+ free(detected_devices);
}
-void net_discovered_interface(char * intf_name)
+static struct pcitable_entry *detected_device_new(void)
{
- if (!intf_descr_for_discover) {
- net_intf_too_early_name[net_intf_too_early_number++] = strdup(intf_name);
- return;
- }
- if (!intf_name) {
- if (net_intf_too_early_ptr >= net_intf_too_early_number) {
- log_message("NET: was expecting another network interface (broken net module?)");
- return;
- }
- net_descriptions[net_descr_number].intf_name = net_intf_too_early_name[net_intf_too_early_ptr++];
+ static int detected_devices_maxlen = 0;
+ if (detected_devices_len >= detected_devices_maxlen) {
+ detected_devices_maxlen += 32;
+ if (detected_devices == NULL)
+ detected_devices = malloc(detected_devices_maxlen * sizeof(*detected_devices));
+ else
+ detected_devices = realloc(detected_devices, detected_devices_maxlen * sizeof(*detected_devices));
+ if (detected_devices == NULL)
+ log_perror("detected_device_new: could not (re)allocate table. Let it crash, sorry");
}
- else
- net_descriptions[net_descr_number].intf_name = strdup(intf_name);
- net_descriptions[net_descr_number].intf_description = strdup(intf_descr_for_discover);
- intf_descr_for_discover = NULL;
- net_descr_number++;
+ return &detected_devices[detected_devices_len++];
}
-char * get_net_intf_description(char * intf_name)
+/* FIXME: factorize with probe_that_type() */
+
+static void add_detected_device(unsigned short vendor, unsigned short device, unsigned int subvendor, unsigned int subdevice, const char *name, const char *module)
{
- int i;
- for (i = 0; i < net_descr_number ; i++)
- if (!strcmp(net_descriptions[i].intf_name, intf_name))
- return net_descriptions[i].intf_description;
- return strdup("unknown");
+ struct pcitable_entry *dev = detected_device_new();
+ dev->vendor = vendor;
+ dev->device = device;
+ dev->subvendor = subvendor;
+ dev->subdevice = subdevice;
+ strncpy(dev->module, module, sizeof(dev->module) - 1);
+ dev->module[sizeof(dev->module) - 1] = '\0';
+ strncpy(dev->description, safe_descr(name), sizeof(dev->description) - 1);
+ dev->description[sizeof(dev->description) - 1] = '\0';
+ log_message("detected device (%04x, %04x, %04x, %04x, %s, %s)", vendor, device, subvendor, subdevice, name, module);
}
-#endif
-static void probe_that_type(enum driver_type type)
+static int add_detected_device_if_match(struct pciusb_entry *e, char **modules, unsigned int modules_len)
{
- if (IS_EXPERT)
- ask_insmod(type);
- else {
- /* ---- PCI probe */
- FILE * f;
- int len = 0;
- char buf[200];
- struct pci_module_map * pcidb = NULL;
-
- f = fopen("/proc/bus/pci/devices", "rb");
-
- if (!f) {
- log_message("PCI: could not open proc file");
- return;
- }
+ int ret = device_match_modules_list(e, modules, modules_len);
+ if (ret)
+ add_detected_device(e->vendor, e->device, e->subvendor, e->subdevice,
+ e->text, e->module);
+ return ret;
+}
- switch (type) {
- case SCSI_ADAPTERS:
+void probing_detect_devices()
+{
+ static int already_detected_devices = 0;
+ struct pciusb_entries entries;
+ int i;
+
+ if (already_detected_devices)
+ return;
+
+ entries = pci_probe();
+ for (i = 0; i < entries.nb; i++) {
+ struct pciusb_entry *e = &entries.entries[i];
+#ifndef DISABLE_PCIADAPTERS
#ifndef DISABLE_MEDIAS
- pcidb = scsi_pci_ids;
- len = scsi_num_ids;
+ if (add_detected_device_if_match(e, medias_ide_pci_modules, medias_ide_pci_modules_len))
+ continue;
+ if (add_detected_device_if_match(e, medias_other_pci_modules, medias_other_pci_modules_len))
+ continue;
#endif
- break;
- case NETWORK_DEVICES:
+
#ifndef DISABLE_NETWORK
- pcidb = eth_pci_ids;
- len = eth_num_ids;
+ if (add_detected_device_if_match(e, network_pci_modules, network_pci_modules_len))
+ continue;
#endif
- break;
- default:
- return;
+
+#ifdef ENABLE_USB
+ if (add_detected_device_if_match(e, usb_controller_modules, usb_controller_modules_len))
+ continue;
+#endif
+#endif
+ /* device can't be found in built-in pcitables, but keep it */
+ add_detected_device(e->vendor, e->device, e->subvendor, e->subdevice, e->text, e->module);
+ }
+ pciusb_free(&entries);
+
+ already_detected_devices = 1;
+}
+
+void probing_destroy(void)
+{
+ detected_devices_destroy();
+}
+
+#ifndef DISABLE_MEDIAS
+static const char * get_alternate_module(const char * name)
+{
+ struct alternate_mapping {
+ const char * a;
+ const char * b;
+ };
+ static struct alternate_mapping mappings[] = {
+ { "ahci", "ata_piix" },
+ };
+ int mappings_nb = sizeof(mappings) / sizeof(struct alternate_mapping);
+ int i;
+
+ for (i=0; i<mappings_nb; i++) {
+ const char * alternate = NULL;
+ if (streq(name, mappings[i].a))
+ alternate = mappings[i].b;
+ else if (streq(name, mappings[i].b))
+ alternate = mappings[i].a;
+ if (alternate) {
+ log_message("found alternate module %s for driver %s", alternate, name);
+ return alternate;
}
+ }
+ return NULL;
+}
+#endif
- while (1) {
- int i, garb, vendor, device;
-
- if (!fgets(buf, sizeof(buf), f)) break;
-
- sscanf(buf, "%x %x", &garb, &vendor);
- device = vendor & 0xFFFF; /* because scanf from dietlibc does not support %4f */
- vendor = (vendor >> 16) & 0xFFFF;
-
- for (i = 0; i < len; i++) {
- if (pcidb[i].vendor == vendor && pcidb[i].device == device) {
- log_message("PCI: found suggestion for %s (%s)", pcidb[i].name, pcidb[i].module);
+void discovered_device(enum driver_type type, const char * description, const char * driver)
+{
+ description = safe_descr(description);
+
+ enum insmod_return failed = INSMOD_FAILED;
#ifndef DISABLE_MEDIAS
- if (type == SCSI_ADAPTERS) {
- /* insmod takes time, let's use the wait message */
- wait_message("Installing %s", pcidb[i].name);
- garb = my_insmod(pcidb[i].module, SCSI_ADAPTERS, NULL);
- remove_wait_message();
- if (garb)
- warning_insmod_failed();
- }
+ if (type == MEDIA_ADAPTERS) {
+ const char * alternate = NULL;
+ wait_message("Loading driver for media adapter:\n \n%s", description);
+ failed = my_modprobe(driver, MEDIA_ADAPTERS, NULL);
+ alternate = get_alternate_module(driver);
+ if (!IS_NOAUTO && alternate) {
+ failed = failed || my_modprobe(alternate, MEDIA_ADAPTERS, NULL);
+ }
+ remove_wait_message();
+ warning_insmod_failed(failed);
+ }
#endif
#ifndef DISABLE_NETWORK
- if (type == NETWORK_DEVICES) {
- /* insmod is quick, let's use the info message */
- info_message("Found %s", pcidb[i].name);
- prepare_intf_descr(pcidb[i].name);
- if (my_insmod(pcidb[i].module, NETWORK_DEVICES, NULL))
- warning_insmod_failed();
- if (intf_descr_for_discover) /* for modules providing more than one net intf */
- net_discovered_interface(NULL);
- }
+ if (type == NETWORK_DEVICES) {
+ log_message("NET: Loading driver for network device %s", description);
+ wait_message("Loading driver for network device:\n \n%s", description);
+ failed = my_modprobe(driver, NETWORK_DEVICES, NULL);
+ warning_insmod_failed(failed);
+ remove_wait_message();
+ }
#endif
- }
- }
- }
+#ifdef ENABLE_USB
+ if (type == USB_CONTROLLERS)
+ /* we can't allow additional modules floppy since we need usbhid for keystrokes of usb keyboards */
+ failed = my_modprobe(driver, USB_CONTROLLERS, NULL);
+#endif
+}
- fclose(f);
+void probe_pci_modules(enum driver_type type, char **pci_modules, unsigned int pci_modules_len) {
+ struct pciusb_entries entries;
+ int i;
+
+ entries = pci_probe();
+ for (i = 0; i < entries.nb; i++) {
+ struct pciusb_entry *e = &entries.entries[i];
+ if (device_match_modules_list(e, pci_modules, pci_modules_len)) {
+ log_message("PCI: device %04x %04x %04x %04x is \"%s\", driver is %s",
+ e->vendor, e->device, e->subvendor, e->subdevice, safe_descr(e->text), e->module);
+ discovered_device(type, e->text, e->module);
+ }
}
+ pciusb_free(&entries);
}
+/** Loads modules for known virtio devices
+ *
+ * virtio modules are not being loaded using the PCI probing mechanism
+ * because pcitable.gz does not have IDs for these devices.
+ *
+ * The possible correct solution for it is to fix the script which
+ * generates pcitable.gz to handle the virtio_device_id structure.
+ */
+void probe_virtio_modules(void)
+{
+ struct pciusb_entries entries;
+ int i;
+ char *name;
+ char *options;
+ int loaded_pci = 0;
+
+ entries = pci_probe();
+ for (i = 0; i < entries.nb; i++) {
+ struct pciusb_entry *e = &entries.entries[i];
+ if (e->vendor == VIRTIO_PCI_VENDOR) {
+ if (!loaded_pci) {
+ log_message("loading virtio-pci");
+ my_modprobe("virtio_pci", ANY_DRIVER_TYPE, NULL);
+ loaded_pci = 1;
+ }
-#ifndef DISABLE_MEDIAS
-static struct media_info * medias = NULL;
+ name = NULL;
+ options = NULL;
+
+ switch (e->subdevice) {
+ case VIRTIO_ID_NET:
+ name = "virtio_net";
+ options = "csum=0";
+ break;
+ case VIRTIO_ID_BLOCK:
+ name = "virtio_blk";
+ break;
+ case VIRTIO_ID_BALLOON:
+ name = "virtio_balloon";
+ break;
+ default:
+ log_message("warning: unknown virtio device %04x", e->device);
+ }
+ if (name) {
+ log_message("virtio: loading %s", name);
+ my_modprobe(name, ANY_DRIVER_TYPE, options);
+ }
+ }
+ }
+ pciusb_free(&entries);
+}
-static void find_media(void)
+#ifdef ENABLE_USB
+void probe_that_type(enum driver_type type, enum media_bus bus)
+#else
+void probe_that_type(enum driver_type type, enum media_bus bus __attribute__ ((unused)))
+#endif
{
- char b[50];
- char buf[500];
- struct media_info tmp[50];
- int count;
- int fd;
+ static int already_probed_usb_controllers = 0;
+ static int already_loaded_usb_scsi = 0;
+ static int already_probed_virtio_devices = 0;
- if (!medias)
- probe_that_type(SCSI_ADAPTERS);
- else
- free(medias); /* that does not free the strings, by the way */
+ /* ---- PCI probe ---------------------------------------------- */
+ if (bus != BUS_USB) {
+ switch (type) {
+#ifndef DISABLE_PCIADAPTERS
+#ifndef DISABLE_MEDIAS
+ static int already_probed_media_adapters = 0;
+ case MEDIA_ADAPTERS:
+ if (already_probed_media_adapters)
+ break;
+ already_probed_media_adapters = 1;
+ probe_pci_modules(type, medias_ide_pci_modules, medias_ide_pci_modules_len);
+ probe_pci_modules(type, medias_other_pci_modules, medias_other_pci_modules_len);
+ break;
+#endif
+#ifndef DISABLE_NETWORK
+ case NETWORK_DEVICES:
+ probe_pci_modules(type, network_pci_modules, network_pci_modules_len);
+ break;
+#endif
+#endif
+#ifdef ENABLE_USB
+ case USB_CONTROLLERS:
+ if (already_probed_usb_controllers || IS_NOAUTO)
+ break;
+ already_probed_usb_controllers = 1;
+ probe_pci_modules(type, usb_controller_modules, usb_controller_modules_len);
+ break;
+#endif
+ case VIRTIO_DEVICES:
+ if (already_probed_virtio_devices)
+ break;
+ probe_virtio_modules();
+ already_probed_virtio_devices = 1;
+ break;
+ default:
+ break;
+ }
+ }
- /* ----------------------------------------------- */
- log_message("looking for ide media");
- count = 0;
- strcpy(b, "/proc/ide/hd");
- for (b[12] = 'a'; b[12] <= 'h'; b[12]++) {
+#ifdef ENABLE_USB
+ /* ---- USB probe ---------------------------------------------- */
+ if ((bus == BUS_USB || bus == BUS_ANY) && !(IS_NOAUTO)) {
+ static int already_mounted_usbdev = 0;
+ struct pciusb_entries entries;
int i;
-
- /* first, test if file exists (will tell if attached medium exists) */
- b[13] = '\0';
- if (access(b, R_OK))
- continue;
- tmp[count].name = strdup("hda");
- tmp[count].name[2] = b[12];
+ if (!already_probed_usb_controllers)
+ probe_that_type(USB_CONTROLLERS, BUS_ANY);
- /* media type */
- strcpy(b + 13, "/media");
- fd = open(b, O_RDONLY);
- if (fd == -1) {
- log_message("failed to open %s for reading", b);
- continue;
+ if (!already_mounted_usbdev) {
+ already_mounted_usbdev = 1;
+ wait_message("Detecting USB devices.");
+ sleep(4); /* sucking background work */
+ my_modprobe("usbhid", ANY_DRIVER_TYPE, NULL);
+ remove_wait_message();
}
- i = read(fd, buf, sizeof(buf));
- if (i == -1) {
- log_message("failed to read %s", b);
- continue;
+ if (type != NETWORK_DEVICES)
+ goto end_usb_probe;
+
+ entries = usb_probe();
+ for (i = 0; i < entries.nb; i++) {
+ struct pciusb_entry *e = &entries.entries[i];
+ if (device_match_modules_list(e, usb_modules, usb_modules_len)) {
+ log_message("USB: device %04x %04x is \"%s\" (%s)", e->vendor, e->device, safe_descr(e->text), e->module);
+ discovered_device(type, e->text, e->module);
+ }
}
- buf[i] = '\0';
- close(fd);
+ pciusb_free(&entries);
+ end_usb_probe:;
+ }
+#endif
- if (!strncmp(buf, "disk", strlen("disk")))
- tmp[count].type = DISK;
- else if (!strncmp(buf, "cdrom", strlen("cdrom")))
- tmp[count].type = CDROM;
- else if (!strncmp(buf, "tape", strlen("tape")))
- tmp[count].type = TAPE;
- else if (!strncmp(buf, "floppy", strlen("floppy")))
- tmp[count].type = FLOPPY;
- else
- tmp[count].type = UNKNOWN_MEDIA;
+#ifdef ENABLE_PCMCIA
+ /* ---- PCMCIA probe ---------------------------------------------- */
+ if ((bus == BUS_PCMCIA || bus == BUS_ANY) && !(IS_NOAUTO)) {
+ struct pcmcia_alias * pcmciadb = NULL;
+ unsigned int len = 0;
+ char *base = "/sys/bus/pcmcia/devices";
+ DIR *dir;
+ struct dirent *dent;
- /* media model */
- strcpy(b + 13, "/model");
- fd = open(b, O_RDONLY);
- if (fd == -1) {
- log_message("failed to open %s for reading", b);
- continue;
- }
+ dir = opendir(base);
+ if (dir == NULL)
+ goto end_pcmcia_probe;
- i = read(fd, buf, sizeof(buf));
- if (i <= 0) {
- log_message("failed to read %s", b);
- tmp[count].model = strdup("(none)");
- }
- else {
- buf[i-1] = '\0'; /* eat the \n */
- tmp[count].model = strdup(buf);
+ switch (type) {
+#ifndef DISABLE_MEDIAS
+ case MEDIA_ADAPTERS:
+ pcmciadb = medias_pcmcia_ids;
+ len = medias_pcmcia_num_ids;
+ break;
+#endif
+#ifndef DISABLE_NETWORK
+ case NETWORK_DEVICES:
+ pcmciadb = network_pcmcia_ids;
+ len = network_pcmcia_num_ids;
+ break;
+#endif
+ default:
+ goto end_pcmcia_probe;
+ }
+
+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+ struct sysfs_attribute *modalias_attr;
+ char keyfile[300];
+ int i, id;
+
+ if (dent->d_name[0] == '.')
+ continue;
+
+ log_message("PCMCIA: device found %s", dent->d_name);
+
+ snprintf(keyfile, sizeof(keyfile)-1, "%s/%s/modalias", base, dent->d_name);
+ modalias_attr = sysfs_open_attribute(keyfile);
+ if (!modalias_attr)
+ continue;
+ if (sysfs_read_attribute(modalias_attr) != 0 || !modalias_attr->value) {
+ sysfs_close_attribute(modalias_attr);
+ continue;
+ }
+
+ log_message("PCMCIA: device found %s", modalias_attr->value);
+
+ for (i = 0; i < len; i++) {
+ if (!fnmatch(pcmciadb[i].modalias, modalias_attr->value, 0)) {
+ char product[256];
+
+ log_message("PCMCIA: device found %s (%s)", pcmciadb[i].modalias, pcmciadb[i].module);
+ strcpy(product, "");
+ for (id = 1; id <= 4; id++) {
+ struct sysfs_attribute *product_attr;
+ snprintf(keyfile, sizeof(keyfile)-1, "%s/%s/prod_id%d", base, dent->d_name, id);
+ product_attr = sysfs_open_attribute(keyfile);
+ if (!product_attr)
+ continue;
+ if (sysfs_read_attribute(product_attr) || !product_attr->value) {
+ sysfs_close_attribute(product_attr);
+ continue;
+ }
+ snprintf(product + strlen(product), sizeof(product)-strlen(product)-1, "%s%s", product[0] ? " " : "", product_attr->value);
+ if (product[strlen(product)-1] == '\n')
+ product[strlen(product)-1] = '\0';
+ sysfs_close_attribute(product_attr);
+ }
+
+ if (!product[0])
+ strcpy(product, "PCMCIA device");
+
+ log_message("PCMCIA: device found %s (%s)", product, pcmciadb[i].module);
+ discovered_device(type, product, pcmciadb[i].module);
+ }
+ }
+
+ sysfs_close_attribute(modalias_attr);
}
- close(fd);
+ end_pcmcia_probe:;
+ if (dir)
+ closedir(dir);
+ }
+#endif
- log_message("IDE/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model);
- tmp[count].bus = IDE;
- count++;
- }
+ /* be sure to load usb-storage after media adapters, so that they are in
+ same order than reboot, so that naming is the same */
+ if (type == MEDIA_ADAPTERS && (bus == BUS_USB || bus == BUS_SCSI || bus == BUS_ANY) &&
+ already_probed_usb_controllers && !already_loaded_usb_scsi) {
+ already_loaded_usb_scsi = 1;
+ /* we can't allow additional modules floppy since we need usbkbd for keystrokes of usb keyboards */
+ my_modprobe("usb_storage", MEDIA_ADAPTERS, NULL);
+ if (module_already_present("ieee1394"))
+ my_modprobe("sbp2", MEDIA_ADAPTERS, NULL);
+ wait_message("Detecting USB mass-storage devices.");
+#ifndef DEBUG
+ sleep(10); /* sucking background work */
+#endif
+ remove_wait_message();
+ }
+}
- /* ----------------------------------------------- */
- log_message("looking for scsi media");
+static struct media_info * medias = NULL;
+
+// Read a short string from a file and strips it, intended for sysfs attributes
+static ssize_t read_attribute(char *path, char *buf) {
+ ssize_t l = 0;
+ int fd = open(path, O_RDONLY);
+ buf[0] = '\0';
+ if (fd == -1) {
+ log_message("Failed to open %s for reading", path);
+ } else {
+ ssize_t n = read(fd, buf, 32);
+ if (n == -1) {
+ log_message("Couldn't read file (%s)", path);
+ } else {
+ // Strip whitespaces and newline
+ for (int i = n-1; i >= 0; i--) {
+ if (buf[i] == '\n' || buf[i] == ' ')
+ continue;
+ l = i+1;
+ break;
+ }
+ buf[l] = '\0';
+ }
+ close(fd);
+ }
+ log_message("Content of %s was %s", path, buf);
+ return l;
+}
+void find_media(enum media_bus bus)
+{
+ char buf[5000];
+ struct media_info tmp[50];
+ int count = 0;
+
+ if (medias)
+ free(medias); /* that does not free the strings, by the way */
- fd = open("/proc/scsi/scsi", O_RDONLY);
- if (fd != -1) {
- enum { SCSI_TOP, SCSI_HOST, SCSI_VENDOR, SCSI_TYPE } state = SCSI_TOP;
- char * start, * chptr, * next, * end;
- char scsi_disk_count = 'a';
- char scsi_cdrom_count = '0';
- char scsi_tape_count = '0';
+ log_message("looking for media adapters");
+ probe_that_type(MEDIA_ADAPTERS, bus);
- int i = read(fd, &buf, sizeof(buf));
- if (i < 1) {
- close(fd);
- goto end_scsi;
+ /* ----------------------------------------------- */
+ log_message("looking for DAC960");
+ {
+ FILE * f;
+ if ((f = fopen("/tmp/syslog", "rb"))) {
+ while (fgets(buf, sizeof(buf), f)) {
+ char * start;
+ if ((start = strstr(buf, "/dev/rd/"))) {
+ char * end = strchr(start, ':');
+ if (!end)
+ log_message("Inconsistency in syslog, line:\n%s", buf);
+ else {
+ *end = '\0';
+ tmp[count].name = strdup(start+5);
+ tmp[count].type = DISK;
+ start = end + 2;
+ end = strchr(start, ',');
+ if (end) {
+ *end = '\0';
+ tmp[count].model = strdup(start);
+ } else
+ tmp[count].model = "(unknown)";
+ log_message("DAC960: found %s (%s)", tmp[count].name, tmp[count].model);
+ count++;
+ }
+ }
+ }
+ fclose(f);
}
- close(fd);
- buf[i] = '\0';
-
- if (!strncmp(buf, "Attached devices: none", strlen("Attached devices: none")))
- goto end_scsi;
-
- start = buf;
- while (*start) {
- char tmp_model[50];
- char tmp_name[10];
-
- chptr = start;
- while (*chptr != '\n') chptr++;
- *chptr = '\0';
- next = chptr + 1;
-
- switch (state) {
- case SCSI_TOP:
- if (strncmp(start, "Attached devices: ", strlen("Attached devices: ")))
- goto end_scsi;
- state = SCSI_HOST;
- break;
+ }
+ /* ----------------------------------------------- */
+ log_message("looking for other disks");
+ {
+ glob_t globbuf;
+ // TODO: We should switch everything to here, and later switch to ignoring
+ // some types of disks (ram, loop, ...) rather than a list to accept.
+ glob("/sys/block/nvme*", 0, NULL, &globbuf);
+ glob("/sys/block/vd*", GLOB_APPEND, NULL, &globbuf);
+ glob("/sys/block/cciss*", GLOB_APPEND, NULL, &globbuf);
+ glob("/sys/block/fd*", GLOB_APPEND, NULL, &globbuf);
+ glob("/sys/block/sd*", GLOB_APPEND, NULL, &globbuf);
+ glob("/sys/block/st*", GLOB_APPEND, NULL, &globbuf);
+ glob("/sys/block/sr*", GLOB_APPEND, NULL, &globbuf);
+
+ for (int i = 0; i < globbuf.gl_pathc; i++) {
+ char *name, *pathend;
+ char path[64];
+ char model[64];
+ int vendor_length = 0;
+
+ strncpy(path, globbuf.gl_pathv[i], sizeof(path));
+ name = strdup(path + 11);
+
+ // Replace ! with /, for example for cciss!c0d0 devices
+ char * c = name;
+ while((c = strchr(c, '!')) != NULL) {
+ *c = '/';
+ c++;
+ }
- case SCSI_HOST:
- if (strncmp(start, "Host: ", strlen("Host: ")))
- goto end_scsi;
- state = SCSI_VENDOR;
- break;
+ pathend = path + strlen(path);
- case SCSI_VENDOR:
- if (strncmp(start, " Vendor: ", strlen(" Vendor: ")))
- goto end_scsi;
-
- /* (1) Grab Vendor info */
- start += 10;
- end = chptr = strstr(start, "Model:");
- if (!chptr)
- goto end_scsi;
-
- chptr--;
- while (*chptr == ' ')
- chptr--;
- if (*chptr == ':') {
- chptr++;
- *(chptr + 1) = '\0';
- strcpy(tmp_model,"(unknown)");
- } else {
- *(chptr + 1) = '\0';
- strcpy(tmp_model, start);
+ // Check if this device had been handled by other code
+ int exists = 0;
+ for (int j = 0; j < count; j++) {
+ if (!strcmp(name, tmp[j].name)) {
+ exists = 1;
+ break;
}
+ }
+ if (exists) {
+ free(name);
+ continue;
+ }
- /* (2) Grab Model info */
- start = end;
- start += 7;
-
- chptr = strstr(start, "Rev:");
- if (!chptr)
- goto end_scsi;
-
- chptr--;
- while (*chptr == ' ') chptr--;
- *(chptr + 1) = '\0';
-
- strcat(tmp_model, " ");
- strcat(tmp_model, start);
-
- tmp[count].model = strdup(tmp_model);
-
- state = SCSI_TYPE;
+ strcpy(model, "Unknown Disk");
- break;
+ strcpy(pathend, "/device/vendor");
+ vendor_length = read_attribute(path, model);
- case SCSI_TYPE:
- if (strncmp(" Type:", start, 7))
- goto end_scsi;
- *tmp_name = '\0';
-
- if (strstr(start, "Direct-Access")) {
- sprintf(tmp_name, "sd%c", scsi_disk_count++);
- tmp[count].type = DISK;
- } else if (strstr(start, "Sequential-Access")) {
- sprintf(tmp_name, "st%c", scsi_tape_count++);
- tmp[count].type = TAPE;
- } else if (strstr(start, "CD-ROM")) {
- sprintf(tmp_name, "scd%c", scsi_cdrom_count++);
- tmp[count].type = CDROM;
- }
+ if (vendor_length) {
+ strcat(model, " ");
+ vendor_length++;
+ }
- if (*tmp_name) {
- tmp[count].name = strdup(tmp_name);
- log_message("SCSI/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model);
- tmp[count].bus = SCSI;
- count++;
- }
-
- state = SCSI_HOST;
+ strcpy(pathend, "/device/model");
+ read_attribute(path, model+vendor_length);
+
+ strcpy(pathend, "/capability");
+ read_attribute(path, buf);
+ long caps = strtol(buf, NULL, 16);
+
+ // GENHD_FL_UP (0x0010): indicated that the block device is “up†but the kernel has removed that info
+ if (caps && 0) {
+ log_message("Ignoring device %s (not up)", name);
+ free(name);
+ continue;
+ }
+
+ if (caps & 0x0400) {
+ log_message("Ignoring device %s (hidden)", name);
+ free(name);
+ continue;
+ }
+
+ tmp[count].type = DISK;
+ if (caps & 0x0008 || !strncmp(name, "sr", 2)) {
+ tmp[count].type = CDROM;
+ } else if (!strncmp(name, "fd", 2)) {
+ tmp[count].type = FLOPPY;
+ } else if (!strncmp(name, "st", 2)) {
+ tmp[count].type = TAPE;
}
-
- start = next;
+
+ tmp[count].name = name;
+ tmp[count].model = strdup(model);
+ count++;
}
-
- end_scsi:
+ globfree(&globbuf);
}
/* ----------------------------------------------- */
tmp[count].name = NULL;
count++;
- medias = memdup(tmp, sizeof(struct media_info) * count);
+ medias = _memdup(tmp, sizeof(struct media_info) * count);
}
/* Finds by media */
-void get_medias(enum media_type media, char *** names, char *** models)
+void get_medias(enum media_type media, char *** names, char *** models, enum media_bus bus)
{
struct media_info * m;
char * tmp_names[50];
char * tmp_models[50];
int count;
- find_media();
+ find_media(bus);
m = medias;
@@ -425,59 +730,74 @@ void get_medias(enum media_type media, char *** names, char *** models)
tmp_names[count] = NULL;
tmp_models[count++] = NULL;
- *names = memdup(tmp_names, sizeof(char *) * count);
- *models = memdup(tmp_models, sizeof(char *) * count);
+ *names = _memdup(tmp_names, sizeof(char *) * count);
+ *models = _memdup(tmp_models, sizeof(char *) * count);
}
-#endif /* DISABLE_MEDIAS */
#ifndef DISABLE_NETWORK
-int net_device_available(char * device) {
- struct ifreq req;
- int s;
-
- s = socket(AF_INET, SOCK_DGRAM, 0);
- if (s < 0) {
- log_perror(device);
- return 0;
- }
- strcpy(req.ifr_name, device);
- if (ioctl(s, SIOCGIFFLAGS, &req)) {
- /* if we can't get the flags, the networking device isn't available */
- close(s);
- return 0;
+static int is_net_interface_blacklisted(char *intf)
+{
+ /* see detect_devicess::is_lan_interface() */
+ char * blacklist[] = { "lo", "ippp", "isdn", "plip", "ppp", "wifi", "sit", NULL };
+ char ** ptr = blacklist;
+
+ while (ptr && *ptr) {
+ if (!strncmp(intf, *ptr, strlen(*ptr)))
+ return 1;
+ ptr++;
}
- close(s);
- return 1;
-}
+ return 0;
+}
char ** get_net_devices(void)
{
- char * devices[] = {
- "eth0", "eth1", "eth2", "eth3",
- "tr0",
- "plip0", "plip1", "plip2",
- "fddi0",
- NULL
- };
- char ** ptr = devices;
char * tmp[50];
- int i = 0;
static int already_probed = 0;
+ FILE * f;
+ int i = 0;
if (!already_probed) {
- already_probed = 1; /* cut off loop brought by: probe_that_type => my_insmod => get_net_devices */
- probe_that_type(NETWORK_DEVICES);
+ already_probed = 1; /* cut off loop brought by: probe_that_type => my_modprobe => get_net_devices */
+ probe_that_type(NETWORK_DEVICES, BUS_ANY);
}
- while (ptr && *ptr) {
- if (net_device_available(*ptr))
- tmp[i++] = strdup(*ptr);
- ptr++;
+ /* use /proc/net/dev since SIOCGIFCONF doesn't work with some drivers (rt2500) */
+ f = fopen("/proc/net/dev", "rb");
+ if (f) {
+ char line[128];
+
+ /* skip the two first lines */
+ fgets(line, sizeof(line), f);
+ fgets(line, sizeof(line), f);
+
+ while (1) {
+ char *start, *end;
+ if (!fgets(line, sizeof(line), f))
+ break;
+ start = line;
+ while (*start == ' ')
+ start++;
+ end = strchr(start, ':');
+ if (end)
+ end[0] = '\0';
+ if (!is_net_interface_blacklisted(start)) {
+ log_message("found net interface %s", start);
+ tmp[i++] = strdup(start);
+ } else {
+ log_message("found net interface %s, but blacklisted", start);
+ }
+ }
+
+ fclose(f);
+ } else {
+ log_message("net: could not open devices file");
}
+
tmp[i++] = NULL;
- return memdup(tmp, sizeof(char *) * i);
+ return _memdup(tmp, sizeof(char *) * i);
+
}
#endif /* DISABLE_NETWORK */
diff --git a/mdk-stage1/probing.h b/mdk-stage1/probing.h
index ea618b7b1..702c9d056 100644
--- a/mdk-stage1/probing.h
+++ b/mdk-stage1/probing.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -24,13 +24,40 @@
enum media_type { CDROM, DISK, FLOPPY, TAPE, UNKNOWN_MEDIA };
-enum driver_type { SCSI_ADAPTERS, NETWORK_DEVICES, ANY_DRIVER_TYPE };
+enum driver_type { MEDIA_ADAPTERS, NETWORK_DEVICES, USB_CONTROLLERS,
+ VIRTIO_DEVICES, ANY_DRIVER_TYPE };
-void get_medias(enum media_type media, char *** names, char *** models);
+enum media_bus { BUS_IDE, BUS_SCSI, BUS_USB, BUS_PCMCIA, BUS_ANY };
+
+#define VIRTIO_PCI_VENDOR 0x1af4
+#define VIRTIO_ID_NET 0x0001
+#define VIRTIO_ID_BLOCK 0x0002
+#define VIRTIO_ID_BALLOON 0x0005
+
+void find_media(enum media_bus bus);
+void get_medias(enum media_type media, char *** names, char *** models, enum media_bus bus);
char ** get_net_devices(void);
-void net_discovered_interface(char * intf_name);
char * get_net_intf_description(char * intf_name);
-void prepare_intf_descr(const char * intf_descr);
+void probe_that_type(enum driver_type type, enum media_bus bus);
+
+/* Make sure the MATCH_ALL value is greater than all possible values
+ for subvendor & subdevice: this simplifies the orderer */
+#define PCITABLE_MATCH_ALL 0x10000
+struct pcitable_entry {
+ /* some bits stolen from pci-resource/pci-ids.h
+ * FIXME: split pci-ids.h into pci-ids.c and pci-ids.h so that the header can be re-used
+ */
+ unsigned short vendor; /* PCI vendor id */
+ unsigned short device; /* PCI device id */
+ unsigned int subvendor; /* PCI subvendor id */
+ unsigned int subdevice; /* PCI subdevice id */
+ char module[20]; /* module to load */
+ char description[100]; /* PCI human readable description */
+};
+extern struct pcitable_entry *detected_devices;
+extern int detected_devices_len;
+void probing_detect_devices();
+void probing_destroy(void);
#endif
diff --git a/mdk-stage1/rescue-gui.c b/mdk-stage1/rescue-gui.c
new file mode 100644
index 000000000..c7aae6126
--- /dev/null
+++ b/mdk-stage1/rescue-gui.c
@@ -0,0 +1,301 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2001 Mandriva
+ *
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#define _USE_BSD
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/mount.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/unistd.h>
+#include <sys/select.h>
+#include <linux/reboot.h>
+
+#include "config-stage1.h"
+#include "frontend.h"
+#include "utils.h"
+#include "params.h"
+
+#include <sys/syscall.h>
+
+static inline long reboot(void)
+{
+ return (long) syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART, 0);
+}
+
+#if defined(__i386__) || defined(__x86_64__)
+#define ENABLE_RESCUE_MS_BOOT 1
+#endif
+
+char * env[] = {
+ "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin",
+ "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib"
+#if defined(__x86_64__)
+ ":/lib64:/usr/lib64:/mnt/lib64:/mnt/usr/lib64"
+#endif
+ ,
+ "HOME=/",
+ "TERM=linux",
+ "TERMINFO=/etc/terminfo",
+ NULL
+};
+
+/* pause() already exists and causes the invoking process to sleep
+ until a signal is received */
+static void PAUSE(void) {
+ unsigned char t;
+ fflush(stdout);
+ read(0, &t, 1);
+}
+
+
+/* ------ UUURGH this is duplicated from `init.c', don't edit here........ */
+void fatal_error(char *msg)
+{
+ printf("FATAL ERROR IN RESCUE: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg);
+ while (1);
+}
+
+#define LOOP_CLR_FD 0x4C01
+void del_loop(char *device)
+{
+ int fd;
+ if ((fd = open(device, O_RDONLY, 0)) < 0) {
+ printf("del_loop open failed\n");
+ return;
+ }
+
+ if (ioctl(fd, LOOP_CLR_FD, 0) < 0) {
+ printf("del_loop ioctl failed");
+ return;
+ }
+
+ close(fd);
+}
+struct filesystem { char * dev; char * name; char * fs; int mounted; };
+void unmount_filesystems(void)
+{
+ int fd, size;
+ char buf[65535]; /* this should be big enough */
+ char *p;
+ struct filesystem fs[500];
+ int numfs = 0;
+ int i, nb;
+
+ printf("unmounting filesystems...\n");
+
+ fd = open("/proc/mounts", O_RDONLY, 0);
+ if (fd < 1) {
+ printf("ERROR: failed to open /proc/mounts");
+ sleep(2);
+ return;
+ }
+
+ size = read(fd, buf, sizeof(buf) - 1);
+ buf[size] = '\0';
+
+ close(fd);
+
+ p = buf;
+ while (*p) {
+ fs[numfs].mounted = 1;
+ fs[numfs].dev = p;
+ while (*p != ' ') p++;
+ *p++ = '\0';
+ fs[numfs].name = p;
+ while (*p != ' ') p++;
+ *p++ = '\0';
+ fs[numfs].fs = p;
+ while (*p != ' ') p++;
+ *p++ = '\0';
+ while (*p != '\n') p++;
+ p++;
+ if (strcmp(fs[numfs].name, "/") != 0) numfs++; /* skip if root, no need to take initrd root in account */
+ }
+
+ /* Pixel's ultra-optimized sorting algorithm:
+ multiple passes trying to umount everything until nothing moves
+ anymore (a.k.a holy shotgun method) */
+ do {
+ nb = 0;
+ for (i = 0; i < numfs; i++) {
+ /*printf("trying with %s\n", fs[i].name);*/
+ if (fs[i].mounted && umount(fs[i].name) == 0) {
+ if (strncmp(fs[i].dev + sizeof("/dev/") - 1, "loop",
+ sizeof("loop") - 1) == 0)
+ del_loop(fs[i].dev);
+
+ printf("\t%s\n", fs[i].name);
+ fs[i].mounted = 0;
+ nb++;
+ }
+ }
+ } while (nb);
+
+ for (i = nb = 0; i < numfs; i++)
+ if (fs[i].mounted) {
+ printf("\t%s umount failed\n", fs[i].name);
+ if (strcmp(fs[i].fs, "ext4") == 0) nb++; /* don't count not-ext4 umount failed */
+ }
+
+ if (nb) {
+ printf("failed to umount some filesystems\n");
+ while (1);
+ }
+}
+/* ------ UUURGH -- end */
+
+
+/* ------ UUURGH -- this is dirrrrrttttyyyyyy */
+void probe_that_type(void) {}
+
+
+int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)))
+{
+ enum return_type results;
+
+ char install_bootloader[] = "Re-install Boot Loader";
+#if ENABLE_RESCUE_MS_BOOT
+ char restore_ms_boot[] = "Restore Windows Boot Loader";
+#endif
+ char mount_parts[] = "Mount your partitions under /mnt";
+ char go_to_console[] = "Go to console";
+ char reboot_[] = "Reboot";
+ char doc[] = "Doc: what's addressed by this Rescue?";
+
+ char upgrade[] = "Upgrade to New Version";
+ char rootpass[] = "Reset Root Password";
+ char userpass[] = "Reset User Password";
+ char factory[] = "Reset to Factory Defaults";
+ char backup[] = "Backup User Files";
+ char restore[] = "Restore User Files from Backup";
+ char badblocks[] = "Test Key for Badblocks";
+
+ char * actions_default[] = { install_bootloader,
+#if ENABLE_RESCUE_MS_BOOT
+ restore_ms_boot,
+#endif
+ mount_parts, go_to_console, reboot_, doc, NULL };
+ char * actions_flash_rescue[] = { rootpass, userpass, factory, backup, restore,
+ badblocks, go_to_console, reboot_, NULL };
+ char * actions_flash_upgrade[] = { upgrade, go_to_console, reboot_, NULL };
+
+
+ char * flash_mode;
+ char ** actions;
+ char * choice;
+
+ process_cmdline();
+ flash_mode = get_param_valued("flash");
+ actions = !flash_mode ?
+ actions_default :
+ streq(flash_mode, "upgrade") ? actions_flash_upgrade : actions_flash_rescue;
+
+ init_frontend("Welcome to " DISTRIB_NAME " Rescue (" DISTRIB_VERSION ") " __DATE__ " " __TIME__);
+
+ do {
+ int pid;
+ char * binary = NULL;
+
+ choice = "";
+ results = ask_from_list("Please choose the desired action.", actions, &choice);
+
+ if (ptr_begins_static_str(choice, install_bootloader)) {
+ binary = "/usr/bin/install_bootloader";
+ }
+#if ENABLE_RESCUE_MS_BOOT
+ if (ptr_begins_static_str(choice, restore_ms_boot)) {
+ binary = "/usr/bin/restore_ms_boot";
+ }
+#endif
+ if (ptr_begins_static_str(choice, mount_parts)) {
+ binary = "/usr/bin/guessmounts";
+ }
+ if (ptr_begins_static_str(choice, reboot_)) {
+ finish_frontend();
+ sync(); sync();
+ sleep(2);
+ unmount_filesystems();
+ sync(); sync();
+ printf("rebooting system\n");
+ sleep(2);
+ reboot();
+ }
+ if (ptr_begins_static_str(choice, doc)) {
+ binary = "/usr/bin/rescue-doc";
+ }
+
+ /* Mandriva Flash entries */
+ if (ptr_begins_static_str(choice, rootpass)) {
+ binary = "/usr/bin/reset_rootpass";
+ }
+ if (ptr_begins_static_str(choice, userpass)) {
+ binary = "/usr/bin/reset_userpass";
+ }
+ if (ptr_begins_static_str(choice, factory)) {
+ binary = "/usr/bin/clear_systemloop";
+ }
+ if (ptr_begins_static_str(choice, backup)) {
+ binary = "/usr/bin/backup_systemloop";
+ }
+ if (ptr_begins_static_str(choice, restore)) {
+ binary = "/usr/bin/restore_systemloop";
+ }
+ if (ptr_begins_static_str(choice, badblocks)) {
+ binary = "/usr/bin/test_badblocks";
+ }
+ if (ptr_begins_static_str(choice, upgrade)) {
+ binary = "/usr/bin/upgrade";
+ }
+
+ if (binary) {
+ int wait_status;
+ suspend_to_console();
+ if (!(pid = fork())) {
+
+ char * child_argv[2];
+ child_argv[0] = binary;
+ child_argv[1] = NULL;
+
+ execve(child_argv[0], child_argv, env);
+ printf("Can't execute binary (%s)\n<press Enter>\n", binary);
+ PAUSE();
+
+ return 33;
+ }
+ while (wait4(-1, &wait_status, 0, NULL) != pid) {};
+ printf("<press Enter to return to Rescue menu>");
+ PAUSE();
+ resume_from_suspend();
+ if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) {
+ error_message("Program exited abnormally (return code %d).", WEXITSTATUS(wait_status));
+ if (WIFSIGNALED(wait_status))
+ error_message("(received signal %d)", WTERMSIG(wait_status));
+ }
+ }
+
+ } while (results == RETURN_OK && !ptr_begins_static_str(choice, go_to_console));
+
+ finish_frontend();
+ printf("Bye.\n");
+
+ return 0;
+}
diff --git a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 b/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2
deleted file mode 100644
index 56279ae90..000000000
--- a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2
+++ /dev/null
Binary files differ
diff --git a/mdk-stage1/stage1-data/stage1.tar.bz2 b/mdk-stage1/stage1-data/stage1.tar.bz2
deleted file mode 100644
index 98e62b362..000000000
--- a/mdk-stage1/stage1-data/stage1.tar.bz2
+++ /dev/null
Binary files differ
diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c
index 8956a2a7f..94bb1e0df 100644
--- a/mdk-stage1/stage1.c
+++ b/mdk-stage1/stage1.c
@@ -1,9 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
- *
- * View the homepage: http://us.mandrakesoft.com/~gc/html/stage1.html
+ * Copyright 2000-2004 Mandriva
*
*
* This software may be freely redistributed under the terms of the GNU
@@ -22,19 +20,21 @@
*
*/
-#include <sys/mount.h>
+#include <stdlib.h>
+#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <signal.h>
-
-#include <stdlib.h>
#include <stdio.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <linux/unistd.h>
+#include <libldetect.h>
#include "stage1.h"
@@ -43,9 +43,10 @@
#include "frontend.h"
#include "modules.h"
#include "tools.h"
+#include "utils.h"
#include "automatic.h"
#include "mount.h"
-#include "insmod.h"
+#include "thirdparty.h"
#ifdef ENABLE_PCMCIA
#include "pcmcia/pcmcia.h"
@@ -64,9 +65,9 @@
#endif
-/* globals */
+/************************************************************
+ * globals */
-char * method_name;
void fatal_error(char *msg)
@@ -76,12 +77,51 @@ void fatal_error(char *msg)
}
-/* spawns a shell on console #2 */
-static void spawn_shell(void)
+/************************************************************
+ * special frontend functs
+ * (the principle is to not pollute frontend code with stage1-specific stuff) */
+
+void stg1_error_message(char *msg, ...)
{
+ va_list args;
+ va_start(args, msg);
+ unset_automatic();
+ verror_message(msg, args);
+ va_end(args);
+}
+
+void stg1_fatal_message(char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ unset_automatic();
+ verror_message(msg, args);
+ va_end(args);
+ exit(1);
+}
+
+void stg1_info_message(char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ if (IS_AUTOMATIC) {
+ vlog_message(msg, args);
+ return;
+ }
+ vinfo_message(msg, args);
+ va_end(args);
+}
+
+
#ifdef SPAWN_SHELL
+static pid_t shell_pid = 0;
+
+/************************************************************
+ * spawns a shell on console #2 */
+static void spawn_shell(void)
+{
int fd;
- char * shell_name = "/sbin/sash";
+ char * shell_name[] = { "/bin/sh", NULL };
log_message("spawning a shell");
@@ -91,12 +131,12 @@ static void spawn_shell(void)
log_message("cannot open /dev/tty2 -- no shell will be provided");
return;
}
- else if (access(shell_name, X_OK)) {
- log_message("cannot open shell - %s doesn't exist", shell_name);
+ else if (access(shell_name[0], X_OK)) {
+ log_message("cannot open shell - %s doesn't exist", shell_name[0]);
return;
}
- if (!fork()) {
+ if (!(shell_pid = fork())) {
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
@@ -106,23 +146,23 @@ static void spawn_shell(void)
if (ioctl(0, TIOCSCTTY, NULL))
log_perror("could not set new controlling tty");
- execl(shell_name, shell_name, NULL);
- log_message("execl of %s failed: %s", shell_name, strerror(errno));
+ execv(shell_name[0], shell_name);
+ log_message("execve of %s failed: %s", shell_name[0], strerror(errno));
+ exit(-1);
}
close(fd);
}
-#endif
}
+#endif
-
+#ifdef SPAWN_INTERACTIVE
char * interactive_fifo = "/tmp/stage1-fifo";
static pid_t interactive_pid = 0;
/* spawns my small interactive on console #6 */
static void spawn_interactive(void)
{
-#ifdef SPAWN_INTERACTIVE
int fd;
char * dev = "/dev/tty6";
@@ -153,7 +193,7 @@ static void spawn_interactive(void)
perror("could not set new controlling tty");
fif_out = open(interactive_fifo, O_WRONLY);
- printf("Please enter your command (availables: [+,-] [rescue,expert]).\n");
+ printf("Please enter your command (availables: [+,-] [rescue]).\n");
while (1) {
char s[50];
@@ -171,87 +211,53 @@ static void spawn_interactive(void)
close(fd);
}
-#endif
}
+#endif
-static void expert_third_party_modules(void)
+#ifdef ENABLE_PCMCIA
+static void handle_pcmcia(void)
{
- enum return_type results;
- char * floppy_mount_location = "/tmp/floppy";
- char ** modules;
- char final_name[500] = "/tmp/floppy/";
- char * choice;
- int rc;
- char * questions[] = { "Options", NULL };
- static char ** answers = NULL;
-
- results = ask_yes_no("If you want to insert third-party kernel modules, insert "
- "a Linux (ext2fs) formatted floppy containing the modules and confirm. Otherwise, select \"no\".");;
- if (results != RETURN_OK)
- return;
-
- my_insmod("floppy", ANY_DRIVER_TYPE, NULL);
+ char * pcmcia_adapter;
- if (my_mount("/dev/fd0", floppy_mount_location, "ext2") == -1) {
- error_message("I can't find a Linux ext2 floppy in first floppy drive.");
- return expert_third_party_modules();
- }
-
- modules = list_directory(floppy_mount_location);
-
- if (!modules || !*modules) {
- error_message("No modules found on floppy disk.");
- umount(floppy_mount_location);
- return expert_third_party_modules();
- }
-
- results = ask_from_list("Which driver would you like to insmod?", modules, &choice);
- if (results != RETURN_OK) {
- umount(floppy_mount_location);
+ pcmcia_adapter = pcmcia_probe();
+ if (!pcmcia_adapter) {
+ log_message("no pcmcia adapter found");
return;
}
+ my_modprobe("pcmcia_core", ANY_DRIVER_TYPE, NULL);
+ my_modprobe(pcmcia_adapter, ANY_DRIVER_TYPE, NULL);
+ /* ds is an alias for pcmcia in recent 2.6 kernels
+ but we don't have modules.alias in install, so try to load both */
+ my_modprobe("ds", ANY_DRIVER_TYPE, NULL);
+ my_modprobe("pcmcia", ANY_DRIVER_TYPE, NULL);
+
+ /* setup a dynamic resource database for non statically mapped PCMCIA sockets */
+ pcmcia_socket_startup(-1);
- strcat(final_name, choice);
-
- results = ask_from_entries("Please enter the options:", questions, &answers, 24, NULL);
- if (results != RETURN_OK) {
- umount(floppy_mount_location);
- return expert_third_party_modules();
- }
+ add_to_env("PCMCIA", pcmcia_adapter);
+}
+#endif
- rc = insmod_call(final_name, answers[0]);
- umount(floppy_mount_location);
+#ifndef ENABLE_NETWORK_STANDALONE
+static void handle_hid(void)
+{
+ struct hid_entries entry_list;
+ unsigned int i;
- if (rc) {
- log_message("\tfailed");
- error_message("Insmod failed.");
+ entry_list = hid_probe();
+ for (i = 0; i < entry_list.nb; i++) {
+ if (entry_list.entries[i].module != NULL)
+ my_modprobe(entry_list.entries[i].module, ANY_DRIVER_TYPE, NULL);
}
-
- return expert_third_party_modules();
+ my_modprobe("hid_generic", ANY_DRIVER_TYPE, NULL);
}
-static void handle_pcmcia(char ** pcmcia_adapter)
-{
-#ifdef ENABLE_PCMCIA
- *pcmcia_adapter = pcmcia_probe();
- if (!*pcmcia_adapter) {
- log_message("no pcmcia adapter found");
- return;
- }
- my_insmod("pcmcia_core", ANY_DRIVER_TYPE, NULL);
- my_insmod(*pcmcia_adapter, ANY_DRIVER_TYPE, NULL);
- my_insmod("ds", ANY_DRIVER_TYPE, NULL);
-
- /* call to cardmgr takes time, let's use the wait message */
- wait_message("Enabling PCMCIA extension cards...");
- log_message("cardmgr rc: %d", cardmgr_call());
- remove_wait_message();
-#endif
-}
+/************************************************************
+ */
-static enum return_type method_select_and_prepare(void)
+static void method_select_and_prepare(void)
{
enum return_type results;
char * choice;
@@ -268,13 +274,20 @@ static enum return_type method_select_and_prepare(void)
char * network_nfs_install = "NFS server"; char * network_nfs_install_auto = "nfs";
char * network_ftp_install = "FTP server"; char * network_ftp_install_auto = "ftp";
char * network_http_install = "HTTP server"; char * network_http_install_auto = "http";
+#ifndef DISABLE_KA
+ char * network_ka_install = "KA server"; char * network_ka_install_auto = "ka";
#endif
+#endif
+ char * thirdparty_install = "Load third party modules"; char * thirdparty_install_auto = "thirdparty";
i = 0;
#ifndef DISABLE_NETWORK
means[i] = network_nfs_install; means_auto[i++] = network_nfs_install_auto;
means[i] = network_ftp_install; means_auto[i++] = network_ftp_install_auto;
means[i] = network_http_install; means_auto[i++] = network_http_install_auto;
+#ifndef DISABLE_KA
+ means[i] = network_ka_install; means_auto[i++] = network_ka_install_auto;
+#endif
#endif
#ifndef DISABLE_CDROM
means[i] = cdrom_install; means_auto[i++] = cdrom_install_auto;
@@ -282,14 +295,15 @@ static enum return_type method_select_and_prepare(void)
#ifndef DISABLE_DISK
means[i] = disk_install; means_auto[i++] = disk_install_auto;
#endif
+ means[i] = thirdparty_install; means_auto[i++] = thirdparty_install_auto;
means[i] = NULL;
- results = ask_from_list_auto("Please choose the mean of installation.", means, &choice, "method", means_auto);
+ unlink(IMAGE_LOCATION);
- if (results != RETURN_OK)
- return method_select_and_prepare();
+ results = ask_from_list_auto("Please choose the installation method.", means, &choice, "method", means_auto);
- results = RETURN_ERROR;
+ if (results != RETURN_OK)
+ return method_select_and_prepare();
#ifndef DISABLE_CDROM
if (!strcmp(choice, cdrom_install))
@@ -304,92 +318,126 @@ static enum return_type method_select_and_prepare(void)
#ifndef DISABLE_NETWORK
if (!strcmp(choice, network_nfs_install))
results = nfs_prepare();
-
+
if (!strcmp(choice, network_ftp_install))
results = ftp_prepare();
if (!strcmp(choice, network_http_install))
results = http_prepare();
+
+#ifndef DISABLE_KA
+ if (!strcmp(choice, network_ka_install))
+ results = ka_prepare();
+#endif
#endif
+ if (!strcmp(choice, thirdparty_install)) {
+ thirdparty_load_modules();
+ return method_select_and_prepare();
+ }
+
if (results != RETURN_OK)
return method_select_and_prepare();
- return RETURN_OK;
+ /* try to find third party modules on the install media */
+ thirdparty_load_media_modules();
}
+#endif
+void finish_preparing(void)
+{
+#ifdef SPAWN_SHELL
+ if (shell_pid != 0) {
+ int fd;
+ const char *clear = "\033[H\033[J";
+ kill(shell_pid, 9);
+ log_message("killed shell");
+ fd = open("/dev/tty2", O_RDWR);
+ write(fd, clear, strlen(clear));
+ close(fd);
+ }
+#endif
+}
-int main(int argc, char **argv, char **env)
+int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)), char **env)
{
- enum return_type ret;
- char ** argptr;
- char * stage2_args[30];
- char * pcmcia_adapter = NULL;
+#ifdef ENABLE_NETWORK_STANDALONE
+ open_log();
+ init_frontend("");
+
+ unlink("/etc/resolv.conf"); /* otherwise it is read-only */
+ set_param(MODE_AUTOMATIC);
+ grab_automatic_params("network:dhcp");
- if (getpid() > 50)
+ intf_select_and_up();
+ finish_frontend();
+ return 0;
+#else
+ if (getenv("DEBUGSTAGE1")) {
+ set_param(MODE_DEBUGSTAGE1);
set_param(MODE_TESTING);
+ }
+#ifdef SPAWN_INTERACTIVE
spawn_interactive();
+#endif
open_log();
- log_message("welcome to the " DISTRIB_NAME " install (stage1, version " VERSION " built " __DATE__ " " __TIME__")");
+ log_message("welcome to the " DISTRIB_NAME " install (mdk-stage1, version " DISTRIB_VERSION " built " __DATE__ " " __TIME__")");
process_cmdline();
- handle_env(env);
+#ifdef SPAWN_SHELL
spawn_shell();
+#endif
init_modules_insmoding();
- init_frontend();
+ init_frontend("Welcome to " DISTRIB_DESCR ", " __DATE__ " " __TIME__);
- if (IS_EXPERT)
- expert_third_party_modules();
+ probe_that_type(VIRTIO_DEVICES, BUS_ANY);
- handle_pcmcia(&pcmcia_adapter);
+ /* load usb interface as soon as possible, helps usb mouse detection in stage2 */
+ probe_that_type(USB_CONTROLLERS, BUS_USB);
- ret = method_select_and_prepare();
+ if (IS_THIRDPARTY)
+ thirdparty_load_modules();
- finish_frontend();
- close_log();
+#ifdef ENABLE_PCMCIA
+ if (!IS_NOAUTO)
+ handle_pcmcia();
+#endif
+
+ handle_hid();
- if (ret != RETURN_OK)
- fatal_error("could not select an installation method");
+ if (IS_CHANGEDISK)
+ stg1_info_message("You are starting the installation with an alternate booting method. "
+ "Please change your disk, and insert the Installation disk.");
- if (!IS_RAMDISK) {
- if (symlink(IMAGE_LOCATION LIVE_LOCATION, STAGE2_LOCATION) != 0) {
- printf("symlink from " IMAGE_LOCATION LIVE_LOCATION " to " STAGE2_LOCATION " failed");
- fatal_error(strerror(errno));
- }
+ if (IS_RESCUE && total_memory() < MEM_LIMIT_RESCUE) {
+ stg1_error_message("You are starting the rescue with a low memory configuration. "
+ "Our experience shows that your system may crash at any point "
+ "or lock up for no apparent reason. Continue at "
+ "your own risk. Alternatively, you may reboot your system now.");
}
+ method_select_and_prepare();
+
+ thirdparty_destroy();
+
+ if (access(STAGE2_LOCATION, R_OK) != 0)
+ if (symlink(IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL, STAGE2_LOCATION) != 0)
+ log_perror("symlink from " IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL " to " STAGE2_LOCATION " failed");
+
+#ifdef SPAWN_INTERACTIVE
if (interactive_pid != 0)
kill(interactive_pid, 9);
-
- if (IS_RESCUE) {
- int fd = open("/proc/sys/kernel/real-root-dev", O_RDWR);
-#ifdef __sparc__
- write(fd, "0x1030000", sizeof("0x1030000")); /* ram3 or sparc */
-#else
- write(fd, "0x103", sizeof("0x103")); /* ram3 */
#endif
- close(fd);
- return 66;
- }
- if (IS_TESTING)
- return 0;
+ finish_preparing();
- argptr = stage2_args;
- *argptr++ = "/usr/bin/runinstall2";
- *argptr++ = "--method";
- *argptr++ = method_name;
- if (pcmcia_adapter) {
- *argptr++ = "--pcmcia";
- *argptr++ = pcmcia_adapter;
- }
- *argptr++ = NULL;
+ finish_frontend();
+ close_log();
- execve(stage2_args[0], stage2_args, grab_env());
+ if (IS_RESCUE)
+ return 66; /* ask init to exec new init */
- printf("error in exec of stage2 :-(\n");
- fatal_error(strerror(errno));
-
- return 0; /* shut up compiler (we can't get here anyway!) */
+ return 0;
+#endif
}
diff --git a/mdk-stage1/stage1.h b/mdk-stage1/stage1.h
index b99a8fa65..575241323 100644
--- a/mdk-stage1/stage1.h
+++ b/mdk-stage1/stage1.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -23,30 +23,40 @@
#define _STAGE1_H_
#include "config-stage1.h"
-#include "tools.h"
+#include "params.h"
/* Some global stuff */
-enum return_type { RETURN_OK, RETURN_BACK, RETURN_ERROR };
-
-extern char * method_name;
extern char * interactive_fifo;
#define MODE_TESTING (1 << 0)
-#define MODE_EXPERT (1 << 1)
#define MODE_RESCUE (1 << 3)
#define MODE_AUTOMATIC (1 << 4)
-#define MODE_SPECIAL_STAGE2 (1 << 8)
+#define MODE_KEEP_MOUNTED (1 << 5) /* for rescue */
+#define MODE_DEBUGSTAGE1 (1 << 6)
#define MODE_RAMDISK (1 << 9)
+#define MODE_CHANGEDISK (1 << 10)
+#define MODE_THIRDPARTY (1 << 11)
+#define MODE_NOAUTO (1 << 12)
+#define MODE_NETAUTO (1 << 13)
+#define MODE_RECOVERY (1 << 14)
#define IS_TESTING (get_param(MODE_TESTING))
-#define IS_EXPERT (get_param(MODE_EXPERT))
#define IS_RESCUE (get_param(MODE_RESCUE))
#define IS_AUTOMATIC (get_param(MODE_AUTOMATIC))
-#define IS_SPECIAL_STAGE2 (get_param(MODE_SPECIAL_STAGE2))
-#define IS_RAMDISK (get_param(MODE_RAMDISK))
+#define IS_DEBUGSTAGE1 (get_param(MODE_DEBUGSTAGE1))
+#define IS_CHANGEDISK (get_param(MODE_CHANGEDISK))
+#define IS_THIRDPARTY (get_param(MODE_THIRDPARTY))
+#define IS_NOAUTO (get_param(MODE_NOAUTO))
+#define IS_NETAUTO (get_param(MODE_NETAUTO))
+#define IS_RECOVERY (get_param(MODE_RECOVERY))
+#define KEEP_MOUNTED (!IS_RESCUE || get_param(MODE_KEEP_MOUNTED))
+
+void fatal_error(char *msg) __attribute__ ((noreturn));
+
-void fatal_error(char *msg);
+void stg1_error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2)));
+void stg1_info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2)));
#endif
diff --git a/mdk-stage1/stdio-frontend.c b/mdk-stage1/stdio-frontend.c
index 7e3cf9b83..8c09330b5 100644
--- a/mdk-stage1/stdio-frontend.c
+++ b/mdk-stage1/stdio-frontend.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -26,16 +26,16 @@
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termios.h>
-#include "stage1.h"
-#include "log.h"
-#include "newt.h"
-#include "frontend.h"
+#include <probing.h>
+#include "frontend.h"
+#include "utils.h"
-void init_frontend(void)
+void init_frontend(char * welcome_msg)
{
- printf("Welcome to " DISTRIB_NAME " (" VERSION ") " __DATE__ " " __TIME__ "\n");
+ printf(welcome_msg);
+ printf("\n");
}
@@ -46,18 +46,19 @@ void finish_frontend(void)
static void get_any_response(void)
{
unsigned char t;
- printf(" (press <enter> to proceed)");
+ printf("\n\t(press <enter> to proceed)");
fflush(stdout);
read(0, &t, 1);
fcntl(0, F_SETFL, O_NONBLOCK);
while (read(0, &t, 1) > 0);
fcntl(0, F_SETFL, 0);
}
-
+
static int get_int_response(void)
{
char s[50];
- int j = 0, i = 0; /* (0) tied to Cancel */
+ int j = 0;
+ unsigned int i = 0; /* (0) tied to Cancel */
fflush(stdout);
read(0, &(s[i++]), 1);
fcntl(0, F_SETFL, O_NONBLOCK);
@@ -73,16 +74,21 @@ static int get_int_response(void)
static char * get_string_response(char * initial_string)
{
/* I won't use a scanf/%s since I also want the null string to be accepted -- also, I want the initial_string */
- char s[50];
+ char s[500];
int i = 0;
+ int b_index = 0;
+ char b;
+
struct termios t;
-
+
+ memset(s, '\0', sizeof(s));
+
if (initial_string) {
printf(initial_string);
strcpy(s, initial_string);
i = strlen(s);
}
-
+
/* from ncurses/tinfo/lib_raw.c:(cbreak) */
tcgetattr(0, &t);
t.c_lflag &= ~ICANON;
@@ -98,18 +104,50 @@ static char * get_string_response(char * initial_string)
fcntl(0, F_SETFL, O_NONBLOCK);
while (1) {
- if (read(0, &(s[i]), 1) > 0) {
- if (s[i] == 13)
+ if (read(0, &b, 1) > 0) {
+ if (b_index == 1) {
+ if (b == 91) {
+ b_index++;
+ continue;
+ }
+ else
+ b_index = 0;
+ }
+ if (b_index == 2) {
+ if (b == 67) {
+ if (s[i] != '\0') {
+ printf("\033[C");
+ i++;
+ }
+ }
+ if (b == 68) {
+ if (i > 0) {
+ printf("\033[D");
+ i--;
+ }
+ }
+ b_index = 0;
+ continue;
+ }
+
+ if (b == 13)
break;
- if (s[i] == 127) {
+ if (b == 127) {
if (i > 0) {
printf("\033[D");
printf(" ");
printf("\033[D");
+ if (s[i] == '\0')
+ s[i-1] = '\0';
+ else
+ s[i-1] = ' ';
i--;
}
+ } else if (b == 27) {
+ b_index++;
} else {
- printf("%c", s[i]);
+ printf("%c", b);
+ s[i] = b;
i++;
}
}
@@ -123,44 +161,30 @@ static char * get_string_response(char * initial_string)
fcntl(0, F_SETFL, 0);
printf("\n");
- s[i] = '\0';
return strdup(s);
}
-static void blocking_msg(char *type, char *fmt, va_list args)
+static void blocking_msg(char *type, char *fmt, va_list ap)
{
printf(type);
- vprintf(fmt, args);
+ vprintf(fmt, ap);
get_any_response();
}
-void error_message(char *msg, ...)
+void verror_message(char *msg, va_list ap)
{
- va_list args;
- va_start(args, msg);
- va_end(args);
- blocking_msg("> Error! ", msg, args);
- unset_param(MODE_AUTOMATIC);
+ blocking_msg("> Error! ", msg, ap);
}
-void info_message(char *msg, ...)
+void vinfo_message(char *msg, va_list ap)
{
- va_list args;
- va_start(args, msg);
- va_end(args);
- if (!IS_AUTOMATIC)
- blocking_msg("> Notice: ", msg, args);
- else
- vlog_message(msg, args);
+ blocking_msg("> Notice: ", msg, ap);
}
-void wait_message(char *msg, ...)
+void vwait_message(char *msg, va_list ap)
{
- va_list args;
printf("Please wait: ");
- va_start(args, msg);
- vprintf(msg, args);
- va_end(args);
+ vprintf(msg, ap);
fflush(stdout);
}
@@ -172,116 +196,90 @@ void remove_wait_message(void)
static int size_progress;
static int actually_drawn;
-#define PROGRESS_SIZE 60
-void init_progression(char *msg, int size)
+#define PROGRESS_SIZE 45
+void init_progression_raw(char *msg, int size)
{
int i;
size_progress = size;
- printf("%s\n", msg);
+ printf("%s ", msg);
if (size) {
- printf("[");
actually_drawn = 0;
for (i=0; i<PROGRESS_SIZE; i++)
printf(".");
- printf("]\033[G["); /* only works on ANSI-compatibles */
+ printf("]\033[G%s [", msg); /* only works on ANSI-compatibles */
fflush(stdout);
- }
+ } else
+ printf("\n");
}
-void update_progression(int current_size)
+void update_progression_raw(int current_size)
{
if (size_progress) {
- if (current_size <= size_progress)
- while ((int)((current_size*PROGRESS_SIZE)/size_progress) > actually_drawn) {
- printf("*");
- actually_drawn++;
- }
+ if (current_size > size_progress)
+ current_size = size_progress;
+ while ((int)((current_size*PROGRESS_SIZE)/size_progress) > actually_drawn) {
+ printf("*");
+ actually_drawn++;
+ }
} else
- printf("\033[G%d bytes read", current_size);
-
+ printf("\033[GStatus: [%8d] bytes loaded...", current_size);
+
fflush(stdout);
}
-void end_progression(void)
+void end_progression_raw(void)
{
if (size_progress) {
- update_progression(size_progress);
+ update_progression_raw(size_progress);
printf("]\n");
} else
printf(" done.\n");
}
-enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice)
+enum return_type ask_from_list_index(char *msg, char ** elems, char ** elems_comments, int *answer)
{
- char ** sav_elems = elems;
- int i, j;
-
- printf("> %s\n(0) Cancel\n", msg);
- i = 1;
- while (elems && *elems) {
- printf("(%d) %s (%s)\n", i, *elems, *elems_comments);
- i++;
- elems++;
- elems_comments++;
+ int justify_number = 1;
+ void print_choice_number(int i) {
+ char tmp[500];
+ snprintf(tmp, sizeof(tmp), "[%%%dd]", justify_number);
+ printf(tmp, i);
}
+ int i = 1;
+ int j = 0;
- printf("? ");
-
- j = get_int_response();
-
- if (j == 0)
- return RETURN_BACK;
-
- if (j >= 1 && j < i) {
- *choice = strdup(sav_elems[j-1]);
- return RETURN_OK;
- }
-
- return RETURN_ERROR;
-}
+ if (string_array_length(elems) >= 10)
+ justify_number = 2;
+ i = 1;
-enum return_type ask_from_list(char *msg, char ** elems, char ** choice)
-{
- char ** sav_elems = elems;
- int i, j;
+ printf("> %s\n", msg);
+ print_choice_number(0);
+ printf(" Cancel");
- i = 0;
while (elems && *elems) {
- i++;
- elems++;
- }
-
- if (i < 10) {
- printf("> %s\n(0) Cancel\n", msg);
- for (j=0; j<i; j++)
- printf("(%d) %s\n", j+1, sav_elems[j]);
- }
- else {
- printf("> %s\n( 0) Cancel\n", msg);
- if (i < 20)
- for (j=0; j<i; j++)
- printf("(%2d) %s\n", j+1, sav_elems[j]);
- else {
- if (i < 40)
- for (j=0; j<i-1; j += 2)
- printf("(%2d) %-34s (%2d) %s\n", j+1, sav_elems[j], j+2, sav_elems[j+1]);
- else
- for (j=0; j<i-3; j += 4)
- printf("(%2d) %-14s (%2d) %-14s (%2d) %-14s (%2d) %s\n",
- j+1, sav_elems[j], j+2, sav_elems[j+1], j+3, sav_elems[j+2], j+4, sav_elems[j+3]);
- if (j < i) {
- while (j < i) {
- printf("(%2d) %-14s ", j+1, sav_elems[j]);
- j++;
- }
+ if (elems_comments && *elems_comments) {
+ printf("\n");
+ print_choice_number(i);
+ printf(" %s (%s)", *elems, *elems_comments);
+ j = 0;
+ } else {
+ if (j == 0)
printf("\n");
- }
+ print_choice_number(i);
+ printf(" %-14s ", *elems);
+ j++;
}
+ if (j == 4)
+ j = 0;
+
+ if (elems_comments)
+ elems_comments++;
+ i++;
+ elems++;
}
- printf("? ");
+ printf("\n? ");
j = get_int_response();
@@ -289,7 +287,7 @@ enum return_type ask_from_list(char *msg, char ** elems, char ** choice)
return RETURN_BACK;
if (j >= 1 && j <= i) {
- *choice = strdup(sav_elems[j-1]);
+ *answer = j - 1;
return RETURN_OK;
}
@@ -301,7 +299,7 @@ enum return_type ask_yes_no(char *msg)
{
int j;
- printf("> %s\n(0) Yes\n(1) No\n(2) Back\n? ", msg);
+ printf("> %s\n[0] Yes [1] No [2] Back\n? ", msg);
j = get_int_response();
@@ -313,7 +311,7 @@ enum return_type ask_yes_no(char *msg)
}
-enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings))
+enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size UNUSED, void (*callback_func)(char ** strings) UNUSED)
{
int j, i = 0;
char ** already_answers = NULL;
@@ -327,7 +325,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers
}
if (*answers == NULL)
- *answers = (char **) malloc(sizeof(char *) * i);
+ *answers = (char **) calloc(1, sizeof(char *) * i);
else
already_answers = *answers;
@@ -342,7 +340,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers
(*answers)[j] = get_string_response(NULL);
}
- printf("(0) Cancel (1) Accept (2) Re-enter answers\n? ");
+ printf("[0] Cancel [1] Accept [2] Re-enter answers\n? ");
r = get_int_response();
if (r == 0)
return RETURN_BACK;
@@ -350,3 +348,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers
return RETURN_OK;
}
}
+
+
+void suspend_to_console(void) {}
+void resume_from_suspend(void) {}
diff --git a/mdk-stage1/thirdparty.c b/mdk-stage1/thirdparty.c
new file mode 100644
index 000000000..78bbf485a
--- /dev/null
+++ b/mdk-stage1/thirdparty.c
@@ -0,0 +1,460 @@
+/*
+ * Guillaume Cottenceau (gc)
+ * Olivier Blin (oblin)
+ *
+ * Copyright 2005 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/mount.h>
+#include <sys/utsname.h>
+
+#include "stage1.h"
+#include "tools.h"
+#include "utils.h"
+#include "log.h"
+#include "modules.h"
+#include "mount.h"
+#include "frontend.h"
+#include "partition.h"
+#include "automatic.h"
+#include "probing.h"
+
+#include "thirdparty.h"
+
+#define THIRDPARTY_MOUNT_LOCATION "/tmp/thirdparty"
+
+#define N_PCITABLE_ENTRIES 100
+static struct pcitable_entry pcitable[N_PCITABLE_ENTRIES];
+static int pcitable_len = 0;
+
+static enum return_type thirdparty_choose_device(char ** device, int probe_only)
+{
+ char ** medias, ** medias_models;
+ char ** ptr, ** ptr_models;
+#ifndef DISABLE_DISK
+ char ** disk_medias, ** disk_medias_models;
+ int disk_count;
+ char * parts[50];
+ char * parts_comments[50];
+#endif
+#ifndef DISABLE_CDROM
+ char ** cdrom_medias, ** cdrom_medias_models;
+ int cdrom_count;
+#endif
+ char * floppy_dev;
+ enum return_type results;
+ int count = 0;
+
+ wait_message("Looking for floppy, disk and cdrom devices ...");
+
+#ifndef DISABLE_DISK
+ disk_count = get_disks(&disk_medias, &disk_medias_models);
+ count += disk_count;
+#endif
+#ifndef DISABLE_CDROM
+ cdrom_count = get_cdroms(&cdrom_medias, &cdrom_medias_models);
+ count += cdrom_count;
+#endif
+
+ floppy_dev = floppy_device();
+ if (floppy_dev && strstr(floppy_dev, "/dev/") == floppy_dev) {
+ floppy_dev = floppy_dev + 5;
+ }
+ if (floppy_dev)
+ count += 1;
+
+ remove_wait_message();
+
+ if (count == 0) {
+ stg1_error_message("I can't find any floppy, disk or cdrom on this system. "
+ "No third-party kernel modules will be used.");
+ return RETURN_BACK;
+ }
+
+ if (probe_only) {
+#ifndef DISABLE_DISK
+ free(disk_medias);
+ free(disk_medias_models);
+#endif
+#ifndef DISABLE_CDROM
+ free(cdrom_medias);
+ free(cdrom_medias_models);
+#endif
+ return RETURN_OK;
+ }
+
+ ptr = medias = malloc((count + 1) * sizeof(char *));
+ ptr_models =medias_models = malloc((count + 1) * sizeof(char *));
+#ifndef DISABLE_DISK
+ memcpy(ptr, disk_medias, disk_count * sizeof(char *));
+ memcpy(ptr_models, disk_medias_models, disk_count * sizeof(char *));
+ free(disk_medias);
+ free(disk_medias_models);
+ ptr += disk_count;
+ ptr_models += disk_count;
+#endif
+#ifndef DISABLE_CDROM
+ memcpy(ptr, cdrom_medias, cdrom_count * sizeof(char *));
+ memcpy(ptr_models, cdrom_medias_models, cdrom_count * sizeof(char *));
+ free(cdrom_medias);
+ free(cdrom_medias_models);
+ cdrom_medias = ptr; /* used later to know if a cdrom is selected */
+ ptr += cdrom_count;
+ ptr_models += cdrom_count;
+#endif
+ if (floppy_dev) {
+ ptr[0] = floppy_dev;
+ ptr_models[0] = "Floppy device";
+ ptr++;
+ ptr_models++;
+ }
+ ptr[0] = NULL;
+ ptr_models[0] = NULL;
+
+ if (count == 1) {
+ *device = medias[0];
+ } else {
+ results = ask_from_list_comments("If you want to insert third-party kernel modules, "
+ "please select the disk containing the modules.",
+ medias, medias_models, device);
+ if (results != RETURN_OK)
+ return results;
+ }
+
+ if (floppy_dev && streq(*device, floppy_dev)) {
+ /* a floppy is selected, don't try to list partitions */
+ return RETURN_OK;
+ }
+
+#ifndef DISABLE_CDROM
+ for (ptr = cdrom_medias; ptr < cdrom_medias + cdrom_count; ptr++) {
+ if (*device == *ptr) {
+ /* a cdrom is selected, don't try to list partitions */
+ log_message("thirdparty: a cdrom is selected, using it (%s)", *device);
+ return RETURN_OK;
+ }
+ }
+#endif
+
+#ifndef DISABLE_DISK
+ /* a disk or usb key is selected */
+ if (list_partitions(*device, parts, parts_comments)) {
+ stg1_error_message("Could not read partitions information.");
+ return RETURN_ERROR;
+ }
+
+ if (parts[0] == NULL) {
+ stg1_error_message("No partition found.");
+ return RETURN_ERROR;
+ }
+
+ /* only one partition has been discovered, don't ask which one to use */
+ if (parts[1] == NULL) {
+ log_message("thirdparty: found only one partition on device (%s)", parts[0]);
+ *device = parts[0];
+ return RETURN_OK;
+ }
+
+ results = ask_from_list_comments("Please select the partition containing "
+ "the third party modules.",
+ parts, parts_comments, device);
+ if (results == RETURN_OK)
+ return RETURN_OK;
+#endif
+
+ stg1_error_message("Sorry, no third party device can be used.");
+
+ return RETURN_BACK;
+}
+
+
+static enum return_type thirdparty_mount_device(char * device)
+{
+ log_message("third party: trying to mount device %s", device);
+ if (try_mount(device, THIRDPARTY_MOUNT_LOCATION) != 0) {
+ stg1_error_message("I can't mount the selected device (%s).", device);
+ return RETURN_ERROR;
+ }
+ return RETURN_OK;
+}
+
+
+static enum return_type thirdparty_prompt_modules(const char *modules_location, char ** modules_list)
+{
+ enum return_type results;
+ char final_name[500];
+ char *module_name;
+ int rc;
+ char * questions[] = { "Options", NULL };
+ static char ** answers = NULL;
+
+ while (1) {
+ results = ask_from_list("Which driver would you like to insmod?", modules_list, &module_name);
+ if (results != RETURN_OK)
+ break;
+
+ sprintf(final_name, "%s/%s", modules_location, module_name);
+
+ results = ask_from_entries("Please enter the options:", questions, &answers, 24, NULL);
+ if (results != RETURN_OK)
+ continue;
+
+ rc = insmod_local_file(final_name, answers[0]);
+ if (rc) {
+ log_message("\tfailed");
+ stg1_error_message("Insmod failed.");
+ }
+ }
+ return RETURN_OK;
+}
+
+
+static int pcitable_orderer(const void *a, const void *b)
+{
+ int ret;
+ struct pcitable_entry *ap = (struct pcitable_entry *)a;
+ struct pcitable_entry *bp = (struct pcitable_entry *)b;
+
+ if ((ret = ap->vendor - bp->vendor) != 0)
+ return ret;
+ if ((ret = ap->device - bp->device) != 0)
+ return ret;
+ if ((ret = ap->subvendor - bp->subvendor) != 0)
+ return ret;
+ if ((ret = ap->subdevice - bp->subdevice) != 0)
+ return ret;
+
+ return 0;
+}
+
+
+static void thirdparty_load_pcitable(const char *modules_location)
+{
+ char pcitable_filename[100];
+ FILE * f = NULL;
+
+ snprintf(pcitable_filename, sizeof(pcitable_filename), "%s/pcitable", modules_location);
+ if (!(f = fopen(pcitable_filename, "rb"))) {
+ log_message("third_party: no external pcitable found");
+ return;
+ }
+ pcitable_len = 0;
+ while (pcitable_len < N_PCITABLE_ENTRIES) {
+ char buf[200];
+ struct pcitable_entry *e;
+ if (!fgets(buf, sizeof(buf), f)) break;
+ e = &pcitable[pcitable_len++];
+ if (sscanf(buf, "%hx\t%hx\t\"%[^ \"]\"\t\"%[^\"]\"", &e->vendor, &e->device, e->module, e->description) == 4)
+ e->subvendor = e->subdevice = PCITABLE_MATCH_ALL;
+ else
+ sscanf(buf, "%hx\t%hx\t%x\t%x\t\"%[^ \"]\"\t\"%[^\"]\"", &e->vendor, &e->device, &e->subvendor, &e->subdevice, e->module, e->description);
+ }
+ fclose(f);
+
+ /* sort pcitable by most specialised entries first */
+ qsort(pcitable, pcitable_len, sizeof(pcitable[0]), pcitable_orderer);
+}
+
+
+static int thirdparty_is_detected(char *driver) {
+ int i, j;
+
+ for (i = 0; i < detected_devices_len ; i++) {
+ /* first look for the IDs in the third-party pcitable */
+ for (j = 0; j < pcitable_len ; j++) {
+ if (pcitable[j].vendor == detected_devices[i].vendor &&
+ pcitable[j].device == detected_devices[i].device &&
+ !strcmp(pcitable[j].module, driver)) {
+ const int subvendor = pcitable[j].subvendor;
+ const int subdevice = pcitable[j].subdevice;
+ if ((subvendor == PCITABLE_MATCH_ALL && subdevice == PCITABLE_MATCH_ALL) ||
+ (subvendor == detected_devices[i].subvendor && subdevice == detected_devices[i].subdevice)) {
+ log_message("probing: found device for module %s", driver);
+ return 1;
+ }
+ }
+ }
+ /* if not found, compare with the detected driver */
+ if (!strcmp(detected_devices[i].module, driver)) {
+ log_message("probing: found device for module %s", driver);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static enum return_type thirdparty_autoload_modules(const char *modules_location, char ** modules_list, FILE *f, int load_detected_only)
+{
+ while (1) {
+ char final_name[500];
+ char module[500];
+ char * options;
+ char ** entry = modules_list;
+
+ if (!fgets(module, sizeof(module), f)) break;
+ if (module[0] == '#' || strlen(module) == 0)
+ continue;
+
+ while (module[strlen(module)-1] == '\n')
+ module[strlen(module)-1] = '\0';
+ options = strchr(module, ' ');
+ if (options) {
+ options[0] = '\0';
+ options++;
+ }
+
+ if (load_detected_only && !thirdparty_is_detected(module)) {
+ log_message("third party: no device detected for module %s, skipping", module);
+ continue;
+ }
+
+ log_message("third party: auto-loading module (%s) with options (%s)", module, options);
+ while (entry && *entry) {
+ if (!strncmp(*entry, module, strlen(module)) && (*entry)[strlen(module)] == '.') {
+ sprintf(final_name, "%s/%s", modules_location, *entry);
+ if (insmod_local_file(final_name, options)) {
+ log_message("\t%s (third party media): failed", *entry);
+ stg1_error_message("Insmod %s (third party media) failed.", *entry);
+ }
+ break;
+ }
+ entry++;
+ }
+ if (!entry || !*entry) {
+ enum insmod_return ret = my_modprobe(module, ANY_DRIVER_TYPE, options);
+ if (ret != INSMOD_OK) {
+ log_message("\t%s (marfile): failed", module);
+ stg1_error_message("Insmod %s (marfile) failed.", module);
+ }
+ }
+ }
+
+ return RETURN_OK;
+}
+
+static enum return_type thirdparty_try_directory(char * root_directory, int interactive) {
+ char modules_location[100];
+ char modules_location_release[100];
+ char *list_filename;
+ FILE *f_load, *f_detect;
+ char **modules_list, **modules_list_release;
+ struct utsname kernel_uname;
+
+ /* look first in the specific third-party directory */
+ snprintf(modules_location, sizeof(modules_location), "%s" THIRDPARTY_DIRECTORY, root_directory);
+ modules_list = list_directory(modules_location);
+
+ /* if it's empty, look in the root of selected device */
+ if (!modules_list || !modules_list[0]) {
+ modules_location[strlen(root_directory)] = '\0';
+ modules_list = list_directory(modules_location);
+ if (interactive)
+ add_to_env("THIRDPARTY_DIR", "");
+ } else {
+ if (interactive)
+ add_to_env("THIRDPARTY_DIR", THIRDPARTY_DIRECTORY);
+ }
+
+ if (uname(&kernel_uname)) {
+ log_perror("uname failed");
+ return RETURN_ERROR;
+ }
+ snprintf(modules_location_release, sizeof(modules_location_release), "%s/%s", modules_location, kernel_uname.release);
+ modules_list_release = list_directory(modules_location_release);
+ if (modules_list_release && modules_list_release[0]) {
+ strcpy(modules_location, modules_location_release);
+ modules_list = modules_list_release;
+ }
+
+ log_message("third party: using modules location %s", modules_location);
+
+ if (!modules_list || !*modules_list) {
+ log_message("third party: no modules found");
+ if (interactive)
+ stg1_error_message("No modules found on selected device.");
+ return RETURN_ERROR;
+ }
+
+ list_filename = alloca(strlen(modules_location) + 10 /* max: "/to_detect" */ + 1);
+
+ sprintf(list_filename, "%s/to_load", modules_location);
+ f_load = fopen(list_filename, "rb");
+ if (f_load) {
+ thirdparty_autoload_modules(modules_location, modules_list, f_load, 0);
+ fclose(f_load);
+ }
+
+ sprintf(list_filename, "%s/to_detect", modules_location);
+ f_detect = fopen(list_filename, "rb");
+ if (f_detect) {
+ probing_detect_devices();
+ thirdparty_load_pcitable(modules_location);
+ thirdparty_autoload_modules(modules_location, modules_list, f_detect, 1);
+ fclose(f_detect);
+ }
+
+ if (f_load || f_detect)
+ return RETURN_OK;
+ else if (interactive) {
+ if (IS_AUTOMATIC)
+ stg1_error_message("I can't find a \"to_load\" file. Please select the modules manually.");
+ log_message("third party: no \"to_load\" file, prompting for modules");
+ return thirdparty_prompt_modules(modules_location, modules_list);
+ } else {
+ return RETURN_OK;
+ }
+}
+
+void thirdparty_load_media_modules(void)
+{
+ thirdparty_try_directory(IMAGE_LOCATION, 0);
+}
+
+void thirdparty_load_modules(void)
+{
+ enum return_type results;
+ char * device;
+
+ device = NULL;
+ if (IS_AUTOMATIC) {
+ device = get_auto_value("thirdparty");
+ thirdparty_choose_device(NULL, 1); /* probe only to create devices */
+ log_message("third party: trying automatic device %s", device);
+ if (thirdparty_mount_device(device) != RETURN_OK)
+ device = NULL;
+ }
+
+ while (!device || streq(device, "")) {
+ results = thirdparty_choose_device(&device, 0);
+ if (results == RETURN_BACK)
+ return;
+ if (thirdparty_mount_device(device) != RETURN_OK)
+ device = NULL;
+ }
+
+ log_message("third party: using device %s", device);
+ add_to_env("THIRDPARTY_DEVICE", device);
+
+ results = thirdparty_try_directory(THIRDPARTY_MOUNT_LOCATION, 1);
+ umount(THIRDPARTY_MOUNT_LOCATION);
+
+ if (results != RETURN_OK)
+ return thirdparty_load_modules();
+}
+
+void thirdparty_destroy(void)
+{
+ probing_destroy();
+}
diff --git a/mdk-stage1/thirdparty.h b/mdk-stage1/thirdparty.h
new file mode 100644
index 000000000..1c2ac2a05
--- /dev/null
+++ b/mdk-stage1/thirdparty.h
@@ -0,0 +1,35 @@
+/*
+ * Guillaume Cottenceau (gc)
+ * Olivier Blin (oblin)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef _THIRDPARTY_H_
+#define _THIRDPARTY_H_
+
+#define THIRDPARTY_DIRECTORY "/install/thirdparty"
+
+/* load third party modules present on install media
+ * use to_load and to_detect files in /install/thirdparty
+ * do not prompt user
+ */
+void thirdparty_load_media_modules(void);
+
+/* load modules if to_load or to_detect files are present
+ * prompt user if no to_load file is present
+ */
+void thirdparty_load_modules(void);
+
+/* destroy all data structures related to the thirdparty module */
+void thirdparty_destroy(void);
+
+#endif
diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c
index 9d0f083f6..2e27688ea 100644
--- a/mdk-stage1/tools.c
+++ b/mdk-stage1/tools.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -21,16 +21,19 @@
#include <stdlib.h>
#include <unistd.h>
+#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
-#include <ctype.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
-#include <bzlib.h>
#include <sys/mount.h>
+#include <sys/poll.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <linux/fd.h>
#include "stage1.h"
#include "log.h"
#include "mount.h"
@@ -38,373 +41,255 @@
#include "automatic.h"
#include "tools.h"
+#include "utils.h"
+#include "params.h"
+#include "probing.h"
+#include "modules.h"
+#include "lomount.h"
-
-static struct param_elem params[50];
-static int param_number = 0;
-
-void process_cmdline(void)
+int image_has_stage2()
{
- char buf[512];
- int fd, size, i;
-
- log_message("opening /proc/cmdline... ");
-
- if ((fd = open("/proc/cmdline", O_RDONLY)) == -1)
- fatal_error("could not open /proc/cmdline");
-
- size = read(fd, buf, sizeof(buf));
- buf[size-1] = '\0'; // -1 to eat the \n
- close(fd);
-
- log_message("\t%s", buf);
-
- i = 0;
- while (buf[i] != '\0') {
- char *name, *value = NULL;
- int j = i;
- while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0')
- i++;
- if (i == j) {
- i++;
- continue;
- }
- name = memdup(&buf[j], i-j + 1);
- name[i-j] = '\0';
-
- if (buf[i] == '=') {
- int k = i+1;
- i++;
- while (buf[i] != ' ' && buf[i] != '\0')
- i++;
- value = memdup(&buf[k], i-k + 1);
- value[i-k] = '\0';
- }
-
- params[param_number].name = name;
- params[param_number].value = value;
- param_number++;
- if (!strcmp(name, "expert")) set_param(MODE_EXPERT);
- if (!strcmp(name, "rescue")) set_param(MODE_RESCUE);
- if (!strcmp(name, "special_stage2")) set_param(MODE_SPECIAL_STAGE2);
- if (!strcmp(name, "automatic")) {
- set_param(MODE_AUTOMATIC);
- grab_automatic_params(value);
- }
- if (buf[i] == '\0')
- break;
- i++;
- }
-
- log_message("\tgot %d args", param_number);
+ return access(COMPRESSED_FILE_REL(IMAGE_LOCATION "/"), R_OK) == 0 ||
+ access(IMAGE_LOCATION "/" LIVE_LOCATION_REL, R_OK) == 0;
}
-
-int stage1_mode = 0;
-
-int get_param(int i)
+enum return_type create_IMAGE_LOCATION(char *location_full)
{
-#ifdef SPAWN_INTERACTIVE
- static int fd = 0;
- char buf[5000];
- char * ptr;
- int nb;
-
- if (fd <= 0) {
- fd = open(interactive_fifo, O_RDONLY);
- if (fd == -1)
- return (stage1_mode & i);
- fcntl(fd, F_SETFL, O_NONBLOCK);
- }
-
- if (fd > 0) {
- if ((nb = read(fd, buf, sizeof(buf))) > 0) {
- buf[nb] = '\0';
- ptr = buf;
- while ((ptr = strstr(ptr, "+ "))) {
- if (!strncmp(ptr+2, "expert", 6)) set_param(MODE_EXPERT);
- if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE);
- ptr++;
- }
- ptr = buf;
- while ((ptr = strstr(ptr, "- "))) {
- if (!strncmp(ptr+2, "expert", 6)) unset_param(MODE_EXPERT);
- if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE);
- ptr++;
- }
- }
- }
-#endif
-
- return (stage1_mode & i);
-}
+ struct stat statbuf;
+ int offset = strncmp(location_full, IMAGE_LOCATION_DIR, sizeof(IMAGE_LOCATION_DIR) - 1) == 0 ? sizeof(IMAGE_LOCATION_DIR) - 1 : 0;
+ char *with_arch = asprintf_("%s/%s", location_full, ARCH);
-char * get_param_valued(char *param_name)
-{
- int i;
- for (i = 0; i < param_number ; i++)
- if (!strcmp(params[i].name, param_name))
- return params[i].value;
+ log_message("trying %s", with_arch);
- return NULL;
-}
+ if (stat(with_arch, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))
+ location_full = with_arch;
-void set_param_valued(char *param_name, char *param_value)
-{
- params[param_number].name = param_name;
- params[param_number].value = param_value;
- param_number++;
-}
+ log_message("assuming %s is a mirror tree", location_full + offset);
-void set_param(int i)
-{
- stage1_mode |= i;
- if (i == MODE_RESCUE) {
- set_param_valued("special_stage2", "rescue");
- set_param(MODE_SPECIAL_STAGE2);
- }
-}
-
-void unset_param(int i)
-{
- stage1_mode &= ~i;
-}
+ unlink(IMAGE_LOCATION);
+ if (symlink(location_full + offset, IMAGE_LOCATION) != 0)
+ return RETURN_ERROR;
-int charstar_to_int(char * s)
-{
- int number = 0;
- while (*s && isdigit(*s)) {
- number = (number * 10) + (*s - '0');
- s++;
- }
- return number;
+ return RETURN_OK;
}
-int total_memory(void)
+int ramdisk_possible(void)
{
- int value;
- struct stat statr;
- if (stat("/proc/kcore", &statr))
+ if (total_memory() > (IS_RESCUE ? MEM_LIMIT_RESCUE : MEM_LIMIT_DRAKX))
+ return 1;
+ else {
+ log_message("warning, ramdisk is not possible due to low mem!");
return 0;
-
- /* drakx powered: use /proc/kcore and rounds every 4 Mbytes */
- value = 4 * ((int)((float)statr.st_size / 1024 / 1024 / 4 + 0.5));
- log_message("Total Memory: %d Mbytes", value);
-
- return value;
+ }
}
-
-int ramdisk_possible(void)
+int compressed_image_preload(void)
{
- if (total_memory() > MEM_LIMIT_RAMDISK)
+ if (total_memory() > (IS_RESCUE ? MEM_LIMIT_RESCUE_PRELOAD : MEM_LIMIT_DRAKX_PRELOAD))
return 1;
else {
- log_message("warning, ramdisk is not possible due to low mem!");
+ log_message("warning, not preloading compressed due to low mem");
return 0;
}
}
-
-static void save_stuff_for_rescue(void)
+enum return_type save_fd(int from_fd, char * to, void (*callback_func)(int overall))
{
- void save_this_file(char * file) {
- char buf[5000];
- int fd_r, fd_w, i;
- char location[100];
-
- if ((fd_r = open(file, O_RDONLY)) < 0) {
- log_message("can't open %s for read", file);
- return;
- }
- strcpy(location, STAGE2_LOCATION);
- strcat(location, file);
- if ((fd_w = open(location, O_WRONLY)) < 0) {
- log_message("can't open %s for write", location);
- close(fd_r);
- return;
+ FILE * f_to;
+ size_t quantity __attribute__((aligned(16))), overall = 0;
+ char buf[4096] __attribute__((aligned(4096)));
+ int ret = RETURN_ERROR;
+
+ if (!(f_to = fopen(to, "w"))) {
+ log_perror(to);
+ goto close_from;
+ }
+
+ do {
+ quantity = read(from_fd, buf, sizeof(buf));
+ if (quantity > 0) {
+ if (fwrite(buf, 1, quantity, f_to) != quantity) {
+ log_message("short write (%s)", strerror(errno));
+ goto cleanup;
+ }
+ } else if (quantity == -1) {
+ log_message("an error occured: %s", strerror(errno));
+ goto cleanup;
}
- if ((i = read(fd_r, buf, sizeof(buf))) <= 0) {
- log_message("can't read from %s", file);
- close(fd_r); close(fd_w);
- return;
- }
- if (write(fd_w, buf, i) != i)
- log_message("can't write %d bytes to %s", i, location);
- close(fd_r); close(fd_w);
- log_message("saved file %s for rescue (%d bytes)", file, i);
- }
- save_this_file("/etc/resolv.conf");
-}
+ if (callback_func) {
+ overall += quantity;
+ callback_func(overall);
+ }
+ } while (quantity);
-enum return_type load_ramdisk_fd(int ramdisk_fd, int size)
+ ret = RETURN_OK;
+
+ cleanup:
+ fclose(f_to);
+ close_from:
+ close(from_fd);
+
+ return ret;
+}
+
+enum return_type copy_file(char * from, char * to, void (*callback_func)(int overall))
{
- BZFILE * st2;
- char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd (and actually is a ramdisk device file) */
- int ram_fd;
- char buffer[4096];
- int z_errnum;
- char * wait_msg = "Loading program into memory...";
- int bytes_read = 0;
- int actually;
- int seems_ok = 0;
-
- st2 = BZ2_bzdopen(ramdisk_fd, "r");
-
- if (!st2) {
- log_message("Opening compressed ramdisk: %s", BZ2_bzerror(st2, &z_errnum));
- error_message("Could not open compressed ramdisk file.");
- return RETURN_ERROR;
- }
+ int from_fd;
- ram_fd = open(ramdisk, O_WRONLY);
- if (ram_fd == -1) {
- log_perror(ramdisk);
- error_message("Could not open ramdisk device file.");
- return RETURN_ERROR;
- }
-
- init_progression(wait_msg, size);
+ log_message("copy_file: %s -> %s", from, to);
- while ((actually = BZ2_bzread(st2, buffer, sizeof(buffer))) > 0) {
- seems_ok = 1;
- if (write(ram_fd, buffer, actually) != actually) {
- log_perror("writing ramdisk");
- remove_wait_message();
- return RETURN_ERROR;
- }
- update_progression((int)((bytes_read += actually) / RAMDISK_COMPRESSION_RATIO));
- }
+ from_fd = open(from, O_RDONLY);
+ if (from_fd != -1) {
+ return save_fd(from_fd, to, callback_func);
+ } else {
+ log_perror(from);
+ return RETURN_ERROR;
+ }
+}
- if (!seems_ok) {
- log_message("reading compressed ramdisk: %s", BZ2_bzerror(st2, &z_errnum));
- remove_wait_message();
- error_message("Could not uncompress second stage ramdisk.");
- return RETURN_ERROR;
- }
+enum return_type mount_compressed_image(char *compressed_image, char *location_mount)
+{
+ if (lomount(compressed_image, location_mount, NULL, 1)) {
+ stg1_error_message("Could not mount compressed loopback :(.");
+ return RETURN_ERROR;
+ }
+ return RETURN_OK;
+}
+enum return_type preload_mount_compressed_fd(int compressed_fd, int image_size, char *image_name, char *location_mount)
+{
+ int ret;
+ char *compressed_tmpfs = asprintf_("/tmp/%s", image_name);
+ char *buf = "Loading program into memory...";
+ init_progression(buf, image_size);
+ ret = save_fd(compressed_fd, compressed_tmpfs, update_progression);
end_progression();
+ if (ret != RETURN_OK)
+ return ret;
+
+ return mount_compressed_image(compressed_tmpfs, location_mount);
+}
- BZ2_bzclose(st2); /* opened by gzdopen, but also closes the associated fd */
- close(ram_fd);
+enum return_type mount_compressed_image_may_preload(char *image_name, char *location_mount, int preload)
+{
+ char *compressed_image = asprintf_("%s/%s", COMPRESSED_LOCATION, image_name);
- if (my_mount(ramdisk, STAGE2_LOCATION, "ext2"))
- return RETURN_ERROR;
+ log_message("mount_compressed_may_preload: %s into %s (preload = %d)", compressed_image, location_mount, preload);
- set_param(MODE_RAMDISK);
+ if (access(compressed_image, R_OK) != 0) return RETURN_ERROR;
- if (IS_RESCUE) {
- save_stuff_for_rescue();
- if (umount(STAGE2_LOCATION)) {
- log_perror(ramdisk);
+ if (preload) {
+ int compressed_fd = open(compressed_image, O_RDONLY);
+ if (compressed_fd != -1) {
+ return preload_mount_compressed_fd(compressed_fd, file_size(compressed_image), image_name, location_mount);
+ } else {
+ log_perror(compressed_image);
return RETURN_ERROR;
}
- return RETURN_OK; /* fucksike, I lost several hours wondering why the kernel won't see the rescue if it is alreay mounted */
+ } else {
+ return mount_compressed_image(compressed_image, location_mount);
}
-
- return RETURN_OK;
}
+enum return_type may_load_compressed_image(void)
+{
+ if (!IS_RESCUE && access(IMAGE_LOCATION "/" LIVE_LOCATION_REL, R_OK) == 0) {
+ /* LIVE install */
+ return RETURN_OK;
+ } else {
+ /* compressed install */
+ return mount_compressed_image_may_preload(COMPRESSED_NAME(""), STAGE2_LOCATION, compressed_image_preload());
+ }
+}
-char * get_ramdisk_realname(void)
+enum return_type load_compressed_fd(int fd, int size)
{
- char img_name[500];
- char * stg2_name = get_param_valued("special_stage2");
- char * begin_img = RAMDISK_LOCATION;
- char * end_img = "_stage2.bz2";
+ return preload_mount_compressed_fd(fd, size, COMPRESSED_NAME(""), STAGE2_LOCATION);
+}
- if (!stg2_name)
- stg2_name = "mdkinst";
+int try_mount(char * dev, char * location)
+{
+ char device_fullname[50];
+ snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev);
- if (IS_RESCUE)
- stg2_name = "rescue";
-
- strcpy(img_name, begin_img);
- strcat(img_name, stg2_name);
- strcat(img_name, end_img);
+ if (my_mount(device_fullname, location, "auto", 0) == -1) {
+ return 1;
+ }
- return strdup(img_name);
+ return 0;
}
-
-enum return_type load_ramdisk(void)
+#ifndef DISABLE_DISK
+int get_disks(char *** names, char *** models)
{
- int st2_fd;
- struct stat statr;
- char img_name[500];
-
- strcpy(img_name, IMAGE_LOCATION);
- strcat(img_name, get_ramdisk_realname());
+ char ** ptr;
+ int count = 0;
- log_message("trying to load %s as a ramdisk", img_name);
+ my_modprobe("ide_disk", ANY_DRIVER_TYPE, NULL);
+ my_modprobe("sd_mod", ANY_DRIVER_TYPE, NULL);
- st2_fd = open(img_name, O_RDONLY); /* to be able to see the progression */
+ get_medias(DISK, names, models, BUS_ANY);
- if (st2_fd == -1) {
- log_message("open ramdisk file (%s) failed", img_name);
- error_message("Could not open compressed ramdisk file (%s).", img_name);
- return RETURN_ERROR;
+ ptr = *names;
+ while (ptr && *ptr) {
+ count++;
+ ptr++;
}
- if (stat(img_name, &statr))
- return RETURN_ERROR;
- else
- return load_ramdisk_fd(st2_fd, statr.st_size);
+ return count;
}
+#endif
-/* pixel's */
-void * memdup(void *src, size_t size)
+#ifndef DISABLE_CDROM
+int get_cdroms(char *** names, char *** models)
{
- void * r;
- r = malloc(size);
- memcpy(r, src, size);
- return r;
-}
+ char ** ptr;
+ int count = 0;
+ my_modprobe("ide_cd_mod", ANY_DRIVER_TYPE, NULL);
+ my_modprobe("sr_mod", ANY_DRIVER_TYPE, NULL);
-static char ** my_env = NULL;
-static int env_size = 0;
+ get_medias(CDROM, names, models, BUS_ANY);
-void handle_env(char ** env)
-{
- char ** ptr = env;
+ ptr = *names;
while (ptr && *ptr) {
+ count++;
ptr++;
- env_size++;
}
- my_env = malloc(sizeof(char *) * 100);
- memcpy(my_env, env, sizeof(char *) * (env_size+1));
-}
-
-char ** grab_env(void) {
- return my_env;
-}
-void add_to_env(char * name, char * value)
-{
- char tmp[500];
- sprintf(tmp, "%s=%s", name, value);
- my_env[env_size] = strdup(tmp);
- env_size++;
- my_env[env_size] = NULL;
+ return count;
}
+#endif
-
-char ** list_directory(char * direct)
+char * floppy_device(void)
{
- char * tmp[50000]; /* in /dev there can be many many files.. */
- int i = 0;
- struct dirent *ep;
- DIR *dp = opendir(direct);
- while (dp && (ep = readdir(dp))) {
- if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) {
- tmp[i] = strdup(ep->d_name);
- i++;
- }
- }
- if (dp)
- closedir(dp);
- tmp[i] = NULL;
- return memdup(tmp, sizeof(char*) * (i+1));
+ char ** names, ** models;
+ int fd;
+ my_modprobe("floppy", ANY_DRIVER_TYPE, NULL);
+ fd = open("/dev/fd0", O_RDONLY|O_NONBLOCK);
+ if (fd != -1) {
+ char drivtyp[17];
+ if (!ioctl(fd, FDGETDRVTYP, (void *)drivtyp)) {
+ struct floppy_drive_struct ds;
+ log_message("/dev/fd0 type: %s", drivtyp);
+ if (!ioctl(fd, FDPOLLDRVSTAT, &ds)) {
+ log_message("\ttrack: %d", ds.track);
+ if (ds.track >= 0) {
+ close(fd);
+ return "/dev/fd0";
+ }
+ }
+ } else {
+ log_perror("can't FDGETDRVTYP /dev/fd0");
+ }
+ close(fd);
+ }
+ log_message("seems that you don't have a regular floppy drive");
+ my_modprobe("sd_mod", ANY_DRIVER_TYPE, NULL);
+ get_medias(FLOPPY, &names, &models, BUS_ANY);
+ if (names && *names)
+ return asprintf_("/dev/%s", *names);
+ else
+ return NULL;
}
diff --git a/mdk-stage1/tools.h b/mdk-stage1/tools.h
index 8ec084451..87c0c1d49 100644
--- a/mdk-stage1/tools.h
+++ b/mdk-stage1/tools.h
@@ -1,7 +1,8 @@
+
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -24,27 +25,22 @@
#include <stdlib.h>
-void process_cmdline(void);
-int get_param(int i);
-void set_param(int i);
-void unset_param(int i);
-int charstar_to_int(char * s);
-int total_memory(void);
+int image_has_stage2();
+enum return_type create_IMAGE_LOCATION(char *location_full);
int ramdisk_possible(void);
-char * get_ramdisk_realname(void);
-enum return_type load_ramdisk(void);
-enum return_type load_ramdisk_fd(int ramdisk_fd, int size);
-void * memdup(void *src, size_t size);
-void add_to_env(char * name, char * value);
-void handle_env(char ** env);
-char ** grab_env(void);
-char ** list_directory(char * direct);
-
-struct param_elem
-{
- char * name;
- char * value;
-};
-
+enum return_type copy_file(char * from, char * to, void (*callback_func)(int overall));
+enum return_type preload_mount_compressed_fd(int compressed_fd, int image_size, char *image_name, char *location_mount);
+enum return_type mount_compressed_image(char *compressed_image, char *location_mount);
+enum return_type mount_compressed_image_may_preload(char *image_name, char *location_mount, int preload);
+enum return_type load_compressed_fd(int fd, int size);
+enum return_type may_load_compressed_image(void);
+int try_mount(char * dev, char * location);
+#ifndef DISABLE_DISK
+int get_disks(char *** names, char *** models);
+#endif
+#ifndef DISABLE_CDROM
+int get_cdroms(char *** names, char *** models);
+#endif
+char * floppy_device(void);
#endif
diff --git a/mdk-stage1/update-pci-ids.pl b/mdk-stage1/update-pci-ids.pl
new file mode 100755
index 000000000..1b084ea80
--- /dev/null
+++ b/mdk-stage1/update-pci-ids.pl
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use lib '../kernel';
+use strict;
+use MDK::Common;
+
+
+my %t = (
+ network => 'network/main|gigabit|pcmcia|virtual|wireless',
+ medias_ide => 'disk/ide',
+ medias_other => 'disk/scsi|hardware_raid|sata|virtual bus/firewire',
+);
+
+foreach my $type (keys %t) {
+ my @modules = chomp_(`perl ../kernel/modules.pl pci_modules4stage1 "$t{$type}"`)
+ or die "unable to get PCI modules";
+
+ print "#ifndef DISABLE_".uc($type)."
+char* ${type}_pci_modules[] = {
+";
+ printf qq|\t"%s",\n|, $_ foreach @modules;
+ print "};
+unsigned int ${type}_pci_modules_len = sizeof(${type}_pci_modules) / sizeof(char *);
+#endif
+
+";
+}
diff --git a/mdk-stage1/update-pcmcia-ids.pl b/mdk-stage1/update-pcmcia-ids.pl
new file mode 100755
index 000000000..9eb25c66e
--- /dev/null
+++ b/mdk-stage1/update-pcmcia-ids.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/perl
+
+use lib '../kernel';
+use strict;
+use MDK::Common;
+
+my @aliases;
+my ($main) = `ls -t /lib/modules/*/modules.alias`;
+foreach (cat_(chomp_($main))) {
+ push @aliases, [ $1, $2 ] if /^alias\s+(pcmcia:\S+)\s+(\S+)$/; #- modalias, module
+}
+@aliases or die "unable to get PCMCIA aliases";
+
+print '
+struct pcmcia_alias {
+ const char *modalias;
+ const char *module;
+};
+
+';
+
+my %t = (
+ network => 'network/pcmcia',
+ medias => 'disk/pcmcia',
+);
+
+foreach my $type (keys %t) {
+ my @modules = chomp_(`perl ../kernel/modules.pl pci_modules4stage1 "$t{$type}"`)
+ or die "unable to get PCMCIA modules";
+
+ print "#ifndef DISABLE_".uc($type)."
+struct pcmcia_alias ${type}_pcmcia_ids[] = {
+";
+ print qq|\t{ "$_->[0]", "$_->[1]" },\n| foreach grep { member($_->[1], @modules) } @aliases;
+ print "};
+unsigned int ${type}_pcmcia_num_ids = sizeof(${type}_pcmcia_ids) / sizeof(struct pcmcia_alias);
+
+#endif
+
+";
+
+}
diff --git a/mdk-stage1/update-usb-ids.pl b/mdk-stage1/update-usb-ids.pl
new file mode 100755
index 000000000..1ea45f9df
--- /dev/null
+++ b/mdk-stage1/update-usb-ids.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+
+use lib '../kernel';
+use strict;
+use MDK::Common;
+
+my @modules = chomp_(`perl ../kernel/modules.pl pci_modules4stage1 "bus/usb"`)
+ or die "unable to get USB controller modules";
+print "char *usb_controller_modules[] = {
+";
+printf qq|\t"%s",\n|, $_ foreach @modules;
+print "};
+unsigned int usb_controller_modules_len = sizeof(usb_controller_modules) / sizeof(char *);
+";
+
+@modules = chomp_(`perl ../kernel/modules.pl pci_modules4stage1 "network/usb disk/usb"`)
+ or die "unable to get USB modules";
+
+print "char *usb_modules[] = {
+";
+printf qq|\t"%s",\n|, $_ foreach @modules;
+print "};
+unsigned int usb_modules_len = sizeof(usb_modules) / sizeof(char *);
+";
diff --git a/mdk-stage1/url.c b/mdk-stage1/url.c
index 0f919812b..14f1e25d6 100644
--- a/mdk-stage1/url.c
+++ b/mdk-stage1/url.c
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -32,33 +32,36 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <strings.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
+#include <sys/poll.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
-#include "log.h"
#include "dns.h"
+#include "log.h"
#include "tools.h"
+#include "utils.h"
#include "url.h"
#define TIMEOUT_SECS 60
#define BUFFER_SIZE 4096
+#define HTTP_MAX_RECURSION 5
static int ftp_check_response(int sock, char ** str)
{
static char buf[BUFFER_SIZE + 1];
int bufLength = 0;
- fd_set emptySet, readSet;
+ struct pollfd polls;
char * chptr, * start;
- struct timeval timeout;
int bytesRead, rc = 0;
int doesContinue = 1;
char errorCode[4];
@@ -66,21 +69,10 @@ static int ftp_check_response(int sock, char ** str)
errorCode[0] = '\0';
do {
- FD_ZERO(&emptySet);
- FD_ZERO(&readSet);
- FD_SET(sock, &readSet);
-
- timeout.tv_sec = TIMEOUT_SECS;
- timeout.tv_usec = 0;
-
- rc = select(sock + 1, &readSet, &emptySet, &emptySet, &timeout);
- if (rc < 1) {
- if (rc==0)
- return FTPERR_BAD_SERVER_RESPONSE;
- else
- rc = FTPERR_UNKNOWN;
- } else
- rc = 0;
+ polls.fd = sock;
+ polls.events = POLLIN;
+ if (poll(&polls, 1, TIMEOUT_SECS*1000) != 1)
+ return FTPERR_BAD_SERVER_RESPONSE;
bytesRead = read(sock, buf + bufLength, sizeof(buf) - bufLength - 1);
@@ -125,7 +117,7 @@ static int ftp_check_response(int sock, char ** str)
} else {
bufLength = 0;
}
- } while (doesContinue && !rc);
+ } while (doesContinue);
if (*errorCode == '4' || *errorCode == '5') {
if (!strncmp(errorCode, "550", 3)) {
@@ -145,15 +137,9 @@ static int ftp_command(int sock, char * command, char * param)
char buf[500];
int rc;
- strcpy(buf, command);
- if (param) {
- strcat(buf, " ");
- strcat(buf, param);
- }
-
- strcat(buf, "\r\n");
+ snprintf(buf, sizeof(buf), "%s%s%s\r\n", command, param ? " " : "", param ? param : "");
- if (write(sock, buf, strlen(buf)) != strlen(buf)) {
+ if (write(sock, buf, strlen(buf)) != (ssize_t)strlen(buf)) {
return FTPERR_SERVER_IO_ERROR;
}
@@ -163,17 +149,15 @@ static int ftp_command(int sock, char * command, char * param)
return 0;
}
-static int get_host_address(const char * host, struct in_addr * address)
+static int get_host_address(char * host, struct in_addr * address)
{
if (isdigit(host[0])) {
if (!inet_aton(host, address)) {
return FTPERR_BAD_HOST_ADDR;
}
} else {
- if (mygethostbyname((char *) host, address)) {
- errno = h_errno;
+ if (mygethostbyname(host, address))
return FTPERR_BAD_HOSTNAME;
- }
}
return 0;
@@ -184,7 +168,6 @@ int ftp_open_connection(char * host, char * name, char * password, char * proxy)
int sock;
struct in_addr serverAddress;
struct sockaddr_in destPort;
- char * buf;
int rc;
int port = 21;
@@ -194,9 +177,7 @@ int ftp_open_connection(char * host, char * name, char * password, char * proxy)
}
if (strcmp(proxy, "")) {
- buf = alloca(strlen(name) + strlen(host) + 5);
- sprintf(buf, "%s@%s", name, host);
- name = buf;
+ name = asprintf_("%s@%s", name, host);
host = proxy;
}
@@ -325,7 +306,7 @@ int ftp_data_command(int sock, char * command, char * param)
}
-static int ftp_get_filesize(int sock, char * remotename)
+int ftp_get_filesize(int sock, char * remotename)
{
int size = 0;
char buf[2000];
@@ -346,14 +327,14 @@ static int ftp_get_filesize(int sock, char * remotename)
return -1;
}
- fd = ftp_data_command(sock, "LIST", NULL);
+ fd = ftp_data_command(sock, "LIST", file);
if (fd <= 0) {
close(sock);
return -1;
}
ptr = buf;
- while ((tot = read(fd, ptr, sizeof(buf) - (ptr - buf))) != 0)
+ while ((tot = read(fd, ptr, sizeof(buf) - (ptr - buf) - 1)) != 0)
ptr += tot;
*ptr = '\0';
close(fd);
@@ -394,7 +375,6 @@ int ftp_start_download(int sock, char * remotename, int * size)
log_message("FTP: could not get filesize (trying to continue)");
*size = 0;
}
-
return ftp_data_command(sock, "RETR", remotename);
}
@@ -407,40 +387,76 @@ int ftp_end_data_command(int sock)
return 0;
}
-
-int http_download_file(char * hostname, char * remotename, int * size)
+
+char *str_ftp_error(int error)
+{
+ return error == FTPERR_PASSIVE_ERROR ? "error with passive connection" :
+ error == FTPERR_FAILED_CONNECT ? "couldn't connect to server" :
+ error == FTPERR_FILE_NOT_FOUND ? "file not found" :
+ error == FTPERR_BAD_SERVER_RESPONSE ? "bad server response (server too busy?)" :
+ NULL;
+}
+
+
+static int _http_download_file(char * hostport, char * remotename, int * size, char * proxyprotocol, char * proxyname, char * proxyport, int recursion)
{
char * buf;
- struct timeval timeout;
+ char * hostname = strdup(hostport);
char headers[4096];
char * nextChar = headers;
- int checkedCode;
+ int statusCode;
struct in_addr serverAddress;
+ struct pollfd polls;
int sock;
int rc;
struct sockaddr_in destPort;
- fd_set readSet;
- char * header_content_length = "Content-Length: ";
+ const char * header_content_length = "Content-Length: ";
+ const char * header_location = "Location: http://";
+ char * http_server_name;
+ int http_server_port;
+
+ if (proxyprotocol) {
+ http_server_name = proxyname;
+ http_server_port = atoi(proxyport);
+ } else {
+ char *port = strchr(hostname, ':');
+ if (port) {
+ *port = '\0';
+ http_server_name = hostname;
+ http_server_port = atoi(++port);
+ } else {
+ http_server_name = hostname;
+ http_server_port = 80;
+ }
+ }
+
+ log_message("HTTP: connecting to server %s:%i (%s)",
+ http_server_name, http_server_port,
+ proxyprotocol ? "proxy" : "no proxy");
- if ((rc = get_host_address(hostname, &serverAddress))) return rc;
+ if ((rc = get_host_address(http_server_name, &serverAddress))) return rc;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sock < 0) {
+ free(hostname);
return FTPERR_FAILED_CONNECT;
}
destPort.sin_family = AF_INET;
- destPort.sin_port = htons(80);
+ destPort.sin_port = htons(http_server_port);
destPort.sin_addr = serverAddress;
if (connect(sock, (struct sockaddr *) &destPort, sizeof(destPort))) {
close(sock);
+ free(hostname);
return FTPERR_FAILED_CONNECT;
}
- buf = alloca(strlen(remotename) + 20);
- sprintf(buf, "GET %s HTTP/0.9\r\n\r\n", remotename);
+ buf = proxyprotocol ? asprintf_("GET %s://%s%s HTTP/1.0\r\nHost: %s\r\n\r\n", proxyprotocol, hostname, remotename, hostname)
+ : asprintf_("GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", remotename, hostname);
+
write(sock, buf, strlen(buf));
+ free(hostname);
/* This is fun; read the response a character at a time until we:
@@ -448,15 +464,12 @@ int http_download_file(char * hostname, char * remotename, int * size)
2) Get a \r\n\r\n, which means we're done */
*nextChar = '\0';
- checkedCode = 0;
+ statusCode = 0;
while (!strstr(headers, "\r\n\r\n")) {
- FD_ZERO(&readSet);
- FD_SET(sock, &readSet);
+ polls.fd = sock;
+ polls.events = POLLIN;
+ rc = poll(&polls, 1, TIMEOUT_SECS*1000);
- timeout.tv_sec = TIMEOUT_SECS;
- timeout.tv_usec = 0;
-
- rc = select(sock + 1, &readSet, NULL, NULL, &timeout);
if (rc == 0) {
close(sock);
return FTPERR_SERVER_TIMEOUT;
@@ -478,10 +491,9 @@ int http_download_file(char * hostname, char * remotename, int * size)
return FTPERR_SERVER_IO_ERROR;
}
- if (!checkedCode && strstr(headers, "\r\n")) {
+ if (!statusCode && strstr(headers, "\r\n")) {
char * start, * end;
- checkedCode = 1;
start = headers;
while (!isspace(*start) && *start) start++;
if (!*start) {
@@ -498,10 +510,16 @@ int http_download_file(char * hostname, char * remotename, int * size)
}
*end = '\0';
- if (!strcmp(start, "404")) {
+ log_message("HTTP: server response '%s'", start);
+ if (streq(start, "404")) {
close(sock);
return FTPERR_FILE_NOT_FOUND;
- } else if (strcmp(start, "200")) {
+ } else if (streq(start, "302")) {
+ log_message("HTTP: found, but document has moved");
+ statusCode = 302;
+ } else if (streq(start, "200")) {
+ statusCode = 200;
+ } else {
close(sock);
return FTPERR_BAD_SERVER_RESPONSE;
}
@@ -510,6 +528,34 @@ int http_download_file(char * hostname, char * remotename, int * size)
}
}
+ if (statusCode == 302) {
+ if (recursion >= HTTP_MAX_RECURSION) {
+ log_message("HTTP: too many levels of recursion, aborting");
+ close(sock);
+ return FTPERR_UNKNOWN;
+ }
+ if ((buf = strstr(headers, header_location))) {
+ char * found_host;
+ char *found_file;
+ found_host = buf + strlen(header_location);
+ if ((found_file = index(found_host, '/'))) {
+ if ((buf = index(found_file, '\r'))) {
+ buf[0] = '\0';
+ remotename = strdup(found_file);
+ found_file[0] = '\0';
+ hostname = strdup(found_host);
+ log_message("HTTP: redirected to new host \"%s\" and file \"%s\"", hostname, remotename);
+ }
+ }
+
+ }
+ /*
+ * don't fail if new URL can't be parsed,
+ * asking the same URL may work if the DNS server are doing round-robin
+ */
+ return _http_download_file(hostname, remotename, size, proxyprotocol, proxyname, proxyport, recursion + 1);
+ }
+
if ((buf = strstr(headers, header_content_length)))
*size = charstar_to_int(buf + strlen(header_content_length));
else
@@ -517,3 +563,9 @@ int http_download_file(char * hostname, char * remotename, int * size)
return sock;
}
+
+
+int http_download_file(char * hostname, char * remotename, int * size, char * proxyprotocol, char * proxyname, char * proxyport)
+{
+ return _http_download_file(hostname, remotename, size, proxyprotocol, proxyname, proxyport, 0);
+}
diff --git a/mdk-stage1/url.h b/mdk-stage1/url.h
index 5a59bd814..2c80e4432 100644
--- a/mdk-stage1/url.h
+++ b/mdk-stage1/url.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Guillaume Cottenceau (gc)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2000 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -23,10 +23,12 @@
#define _URL_H_
int ftp_open_connection(char * host, char * name, char * password, char * proxy);
+int ftp_get_filesize(int sock, char * remotename);
int ftp_start_download(int sock, char * remotename, int * size);
int ftp_end_data_command(int sock);
+char *str_ftp_error(int error);
-int http_download_file(char * hostname, char * remotename, int * size);
+int http_download_file(char * hostname, char * remotename, int * size, char * proxyprotocol, char * proxyname, char * proxyport);
#define FTPERR_BAD_SERVER_RESPONSE -1
diff --git a/mdk-stage1/utils.c b/mdk-stage1/utils.c
new file mode 100644
index 000000000..6ad3a8f6f
--- /dev/null
+++ b/mdk-stage1/utils.c
@@ -0,0 +1,191 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <sys/sysinfo.h>
+#include <sys/utsname.h>
+
+#include "utils.h"
+#include "log.h"
+
+// warning, many things rely on the fact that:
+// - when failing it returns 0
+// - it stops on first non-digit char
+int charstar_to_int(const char * s)
+{
+ int number = 0;
+ while (*s && isdigit(*s)) {
+ number = (number * 10) + (*s - '0');
+ s++;
+ }
+ return number;
+}
+
+off_t file_size(const char * path)
+{
+ struct stat statr;
+ if (stat(path, &statr))
+ return -1;
+ else
+ return statr.st_size;
+}
+
+char * cat_file(const char * file, struct stat * s) {
+ char * buf;
+ int fd = open(file, O_RDONLY);
+ if (fd == -1) {
+ log_perror(file);
+ return NULL;
+ }
+
+ fstat(fd, s);
+ buf = malloc(s->st_size + 1);
+ if (read(fd, buf, s->st_size) != (ssize_t)s->st_size) {
+ close(fd);
+ free(buf);
+ log_perror(file);
+ return NULL;
+ }
+ buf[s->st_size] = '\0';
+ close(fd);
+
+ return buf;
+}
+
+int line_counts(const char * buf) {
+ const char * ptr = buf;
+ int line = 0;
+ while (ptr) {
+ line++;
+ ptr = strchr(ptr + 1, '\n');
+ }
+ return line;
+}
+
+int total_memory(void)
+{
+ int value;
+ struct sysinfo sys_info;
+ if (sysinfo(&sys_info) < 0) {
+ log_perror("sysinfo");
+ return 0;
+ }
+ value = sys_info.totalram * sys_info.mem_unit / 1024 / 1024;
+ log_message("Total Memory: %d Mbytes", value);
+
+ return value;
+}
+
+/* pixel's */
+void * _memdup(void *src, size_t size)
+{
+ void * r;
+ r = malloc(size);
+ memcpy(r, src, size);
+ return r;
+}
+
+
+void add_to_env(char * name, char * value)
+{
+ FILE* fakeenv = fopen("/tmp/env", "a");
+ if (fakeenv) {
+ char* e = asprintf_("%s=%s\n", name, value);
+ fwrite(e, 1, strlen(e), fakeenv);
+ free(e);
+ fclose(fakeenv);
+ } else
+ log_message("couldn't fopen to fake env");
+}
+
+char ** list_directory(char * direct)
+{
+ char * tmp[50000]; /* in /dev there can be many many files.. */
+ int i = 0;
+ struct dirent *ep;
+ DIR *dp = opendir(direct);
+ while (dp && (ep = readdir(dp))) {
+ if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) {
+ tmp[i] = strdup(ep->d_name);
+ i++;
+ }
+ }
+ if (dp)
+ closedir(dp);
+ tmp[i] = NULL;
+ return _memdup(tmp, sizeof(char*) * (i+1));
+}
+
+
+int string_array_length(char ** a)
+{
+ int i = 0;
+ if (!a)
+ return -1;
+ while (a && *a) {
+ a++;
+ i++;
+ }
+ return i;
+}
+
+char * asprintf_(const char *msg, ...)
+{
+ int n;
+ char * s;
+ char dummy;
+ va_list arg_ptr;
+ va_start(arg_ptr, msg);
+ n = vsnprintf(&dummy, sizeof(dummy), msg, arg_ptr);
+ va_start(arg_ptr, msg);
+ if ((s = malloc(n + 1))) {
+ vsnprintf(s, n + 1, msg, arg_ptr);
+ va_end(arg_ptr);
+ return s;
+ }
+ va_end(arg_ptr);
+ return strdup("");
+}
+
+
+void lowercase(char *s)
+{
+ int i = 0;
+ while (s[i]) {
+ s[i] = tolower(s[i]);
+ i++;
+ }
+}
+
+char *my_dirname(char *path) {
+ char *p = strrchr (path, '/');
+ char *tmp;
+ int len;
+ if (!p)
+ return path;
+ len = p-path+1;
+ tmp = malloc(len);
+ strncpy(tmp, path, len-1);
+ tmp[len-1] = '\0';
+ return tmp;
+}
+
diff --git a/mdk-stage1/utils.h b/mdk-stage1/utils.h
new file mode 100644
index 000000000..b8a77b0ad
--- /dev/null
+++ b/mdk-stage1/utils.h
@@ -0,0 +1,36 @@
+/*
+ * Guillaume Cottenceau (gc)
+ *
+ * Copyright 2000 Mandriva
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef _UTILS_H_
+#define _UTILS_H_
+
+#include <sys/stat.h>
+
+int charstar_to_int(const char * s);
+off_t file_size(const char * path);
+char * cat_file(const char * file, struct stat * s);
+int line_counts(const char * buf);
+int total_memory(void);
+void * _memdup(void *src, size_t size);
+void add_to_env(char * name, char * value);
+char ** list_directory(char * direct);
+int string_array_length(char ** a);
+char * asprintf_(const char *msg, ...);
+char *my_dirname(char *path);
+void lowercase(char *s);
+
+#define ptr_begins_static_str(pointer,static_str) (!strncmp(pointer,static_str,sizeof(static_str)-1))
+#define streq(a,b) (!strcmp(a,b))
+
+#endif
diff --git a/mdk-stage1/wireless.c b/mdk-stage1/wireless.c
new file mode 100644
index 000000000..2fde04f84
--- /dev/null
+++ b/mdk-stage1/wireless.c
@@ -0,0 +1,160 @@
+/*
+ * Olivier Blin (oblin)
+ * Martin Whitaker (martinw)
+ *
+ * Copyright 2005 Mandriva
+ * Copyright 2020 Mageia
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <linux/types.h>
+#include <linux/if.h>
+#include <linux/wireless.h>
+
+#include "automatic.h"
+#include "stage1.h"
+#include "log.h"
+#include "utils.h"
+#include "wireless.h"
+
+#define WPA_SUPPLICANT_CONF "/etc/wpa_supplicant.conf"
+#define WPA_SUPPLICANT_CTRL "/var/run/wpa_supplicant"
+#define WPA_SUPPLICANT_LOG "/var/log/wpa_supplicant.log"
+#define WPA_SUPPLICANT_PID "/var/run/wpa_supplicant.pid"
+
+int wireless_open_socket()
+{
+ return socket(AF_INET, SOCK_DGRAM, 0);
+}
+
+int wireless_close_socket(int socket)
+{
+ return close(socket);
+}
+
+static int wireless_ioctl(int socket, const char *ifname, int request, struct iwreq *wrq)
+{
+ strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
+ return ioctl(socket, request, wrq);
+}
+
+int wireless_is_aware(int socket, const char *ifname)
+{
+ struct iwreq wrq;
+ return wireless_ioctl(socket, ifname, SIOCGIWNAME, &wrq) == 0;
+}
+
+enum return_type configure_wireless(const char *ifname)
+{
+ enum return_type results;
+ char * security[] = { "No security", "WEP", "WPA/WPA2 Personal", NULL };
+ char * security_auto[] = { "none", "wep", "wpa_psk", NULL };
+ char * choice = NULL;
+ char * message = NULL;
+ char * questions[] = { "ESSID", "", NULL };
+ char * questions_auto[] = { "essid", "" };
+ char * key_mgmt = NULL;
+ static char ** answers = NULL;
+ FILE * fd;
+ char cmd[256];
+ int status;
+
+ int wsock = wireless_open_socket();
+ if (!wireless_is_aware(wsock, ifname)) {
+ log_message("interface %s doesn't support wireless", ifname);
+ wireless_close_socket(wsock);
+ return RETURN_OK;
+ }
+ wireless_close_socket(wsock);
+
+ results = ask_from_list_auto("Please select your wireless security mode.",
+ security, &choice, "wireless_security", security_auto);
+ if (results != RETURN_OK) {
+ return RETURN_BACK;
+ }
+
+ if (streq(choice, security[2])) {
+ message = "Please enter your wireless settings. "
+ "The ESSID is your wireless network identifier. "
+ "The passphrase must be a string of between 8 and 63 ASCII characters.";
+ questions[1] = "passphrase";
+ questions_auto[1] = "wpa_psk";
+ key_mgmt = "WPA-PSK";
+ } else if (streq(choice, security[1])) {
+ message = "Please enter your wireless settings. "
+ "The ESSID is your wireless network identifier. "
+ "The WEP key must be either a string of 10 or 26 hexadecimal digits, without any separators, "
+ "or a string of 5 or 13 ASCII characters enclosed in double quote marks (e.g. \"12345\").";
+ questions[1] = "WEP key";
+ questions_auto[1] = "wep_key";
+ key_mgmt = "NONE";
+ } else {
+ message = "Please enter your wireless settings. "
+ "The ESSID is your wireless network identifier.";
+ questions[1] = NULL;
+ questions_auto[1] = NULL;
+ key_mgmt = "NONE";
+ }
+ results = ask_from_entries_auto(message, questions, &answers, 32, questions_auto, NULL);
+ if (results != RETURN_OK) {
+ return RETURN_BACK;
+ }
+
+ fd = fopen(WPA_SUPPLICANT_PID, "r");
+ if (fd) {
+ unsigned pid = 0;
+ unsigned count = fscanf(fd, "%u", &pid);
+ fclose(fd);
+ if (count == 1 && pid > 1) {
+ log_message("terminating wpa_supplicant (pid %u)", pid);
+ kill(pid, SIGQUIT);
+ sleep(1);
+ }
+ }
+
+ fd = fopen(WPA_SUPPLICANT_CONF, "w");
+ if (fd == NULL) {
+ stg1_error_message("unable to create " WPA_SUPPLICANT_CONF ": %s", strerror(errno));
+ return RETURN_ERROR;
+ }
+ fprintf(fd, "ctrl_interface=" WPA_SUPPLICANT_CTRL "\n");
+ fprintf(fd, "ap_scan=1\n");
+ fprintf(fd, "network={\n");
+ fprintf(fd, " key_mgmt=%s\n", key_mgmt);
+ fprintf(fd, " scan_ssid=1\n");
+ fprintf(fd, " ssid=\"%s\"\n", answers[0]);
+ if (streq(choice, security[2])) {
+ fprintf(fd, " psk=\"%s\"\n", answers[1]);
+ } else if (streq(choice, security[1])) {
+ fprintf(fd, " wep_key0=%s\n", answers[1]);
+ }
+ fprintf(fd, "}\n");
+ fclose(fd);
+
+ snprintf(cmd, sizeof(cmd), "/usr/sbin/wpa_supplicant -D nl80211,wext -B -i %s -c %s -f %s -P %s",
+ ifname, WPA_SUPPLICANT_CONF, WPA_SUPPLICANT_LOG, WPA_SUPPLICANT_PID);
+ log_message("running %s", cmd);
+ status = system(cmd);
+ if (status != 0) {
+ stg1_error_message("unable to start wpa_supplicant daemon for interface \"%s\": %d", ifname, status);
+ return RETURN_ERROR;
+ }
+
+ return RETURN_OK;
+}
diff --git a/mdk-stage1/insmod-modutils/insmod-frontend.c b/mdk-stage1/wireless.h
index 2b3aa1acb..7443f5c99 100644
--- a/mdk-stage1/insmod-modutils/insmod-frontend.c
+++ b/mdk-stage1/wireless.h
@@ -1,7 +1,7 @@
/*
- * Guillaume Cottenceau (gc@mandrakesoft.com)
+ * Olivier Blin (oblin)
*
- * Copyright 2000 MandrakeSoft
+ * Copyright 2005 Mandriva
*
* This software may be freely redistributed under the terms of the GNU
* public license.
@@ -12,13 +12,14 @@
*
*/
-#include <stdio.h>
+#ifndef _WIRELESS_H_
+#define _WIRELESS_H_
+#include "frontend.h"
-int insmod_main( int argc, char **argv);
+int wireless_open_socket();
+int wireless_close_socket(int socket);
+int wireless_is_aware(int socket, const char *ifname);
+enum return_type configure_wireless(const char *ifname);
-int main( int argc, char **argv)
-{
- printf("Using insmod provided by modutils.\n");
- return insmod_main(argc, argv);
-}
+#endif
diff --git a/mdk-stage1/zlibsupport.c b/mdk-stage1/zlibsupport.c
new file mode 100644
index 000000000..2b171e72d
--- /dev/null
+++ b/mdk-stage1/zlibsupport.c
@@ -0,0 +1,292 @@
+/* Support for compressed modules. Willy Tarreau <willy@meta-x.org>
+ * did the support for modutils, Andrey Borzenkov <arvidjaar@mail.ru>
+ * ported it to module-init-tools, and I said it was too ugly to live
+ * and rewrote it 8).
+ *
+ * (C) 2003 Rusty Russell, IBM Corporation.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include "zlibsupport.h"
+
+#define CONFIG_USE_LIBLZMA
+#ifdef CONFIG_USE_ZLIB
+#include <zlib.h>
+#ifdef CONFIG_USE_LIBLZMA
+#include <lzma.h>
+
+typedef struct lzma_file {
+ uint8_t buf[1<<14];
+ lzma_stream strm;
+ FILE *fp;
+ lzma_bool eof;
+} lzma_FILE;
+#else
+typedef unsigned char lzma_bool;
+typedef int lzma_ret;
+#define LZMA_OK 0
+#endif
+
+typedef enum xFile_e {
+ XF_NONE,
+ XF_GZIP,
+ XF_XZ,
+ XF_FAIL
+} xFile_t;
+
+typedef struct xFile_s {
+ xFile_t type;
+ lzma_bool eof;
+ union {
+ gzFile gz;
+#ifdef CONFIG_USE_LIBLZMA
+ lzma_FILE *xz;
+#endif
+ } f;
+ FILE *fp;
+} xFile;
+
+#ifdef CONFIG_USE_LIBLZMA
+static lzma_FILE *lzma_open(lzma_ret *lzma_error, FILE *fp)
+{
+ lzma_ret *ret = lzma_error;
+ lzma_FILE *lzma_file;
+ lzma_stream tmp = LZMA_STREAM_INIT;
+
+ lzma_file = calloc(1, sizeof(*lzma_file));
+
+ lzma_file->fp = fp;
+ lzma_file->eof = 0;
+ lzma_file->strm = tmp;
+
+ *ret = lzma_auto_decoder(&lzma_file->strm, -1, 0);
+
+ if (*ret != LZMA_OK) {
+ (void) fclose(lzma_file->fp);
+ free(lzma_file);
+ return NULL;
+ }
+ return lzma_file;
+}
+
+static ssize_t lzma_read(lzma_ret *lzma_error, lzma_FILE *lzma_file, void *buf, size_t len)
+{
+ lzma_ret *ret = lzma_error;
+ lzma_bool eof = 0;
+
+ if (!lzma_file)
+ return -1;
+ if (lzma_file->eof)
+ return 0;
+
+ lzma_file->strm.next_out = buf;
+ lzma_file->strm.avail_out = len;
+ for (;;) {
+ if (!lzma_file->strm.avail_in) {
+ lzma_file->strm.next_in = (uint8_t *)lzma_file->buf;
+ lzma_file->strm.avail_in = fread(lzma_file->buf, 1, sizeof(lzma_file->buf), lzma_file->fp);
+ if (!lzma_file->strm.avail_in)
+ eof = 1;
+ }
+ *ret = lzma_code(&lzma_file->strm, LZMA_RUN);
+ if (*ret == LZMA_STREAM_END) {
+ lzma_file->eof = 1;
+ return len - lzma_file->strm.avail_out;
+ }
+ if (*ret != LZMA_OK)
+ return -1;
+ if (!lzma_file->strm.avail_out)
+ return len;
+ if (eof)
+ return -1;
+ }
+}
+#endif
+
+static xFile xOpen(int fd, const char *filename) {
+ xFile xF = {XF_FAIL, 0, {NULL}, NULL};
+ lzma_ret ret = LZMA_OK;
+ unsigned char buf[8];
+
+ if (fd == -1 && filename != NULL)
+ if ((fd = open(filename, O_RDONLY)) < 0)
+ return xF;
+ if (read(fd, buf, sizeof(buf)) < 0)
+ return xF;
+ lseek(fd, 0, SEEK_SET);
+ if (filename != NULL) {
+ close(fd);
+ fd = -1;
+ }
+ if (buf[0] == 0xFD && buf[1] == '7' && buf[2] == 'z' &&
+ buf[3] == 'X' && buf[4] == 'Z' && buf[5] == 0x00)
+ xF.type = XF_XZ;
+ else if (buf[0] == 0x1F && buf[1] == 0x8B)
+ xF.type = XF_GZIP;
+ else
+ xF.type = XF_NONE;
+
+ switch(xF.type) {
+ case XF_GZIP:
+ xF.f.gz = (fd == -1 && filename != NULL) ? gzopen(filename, "rb") : gzdopen(fd, "rb");
+ if(xF.f.gz == NULL)
+ xF.type = XF_FAIL;
+ break;
+ case XF_NONE:
+ xF.fp = (fd == -1 && filename != NULL) ? fopen(filename, "rb") : fdopen(fd, "rb");
+ break;
+#ifdef CONFIG_USE_LIBLZMA
+ case XF_XZ:
+ xF.fp = (fd == -1 && filename != NULL) ? fopen(filename, "rb") : fdopen(fd, "rb");
+ if(xF.fp == NULL)
+ xF.type = XF_FAIL;
+ if(xF.type == XF_NONE || xF.type == XF_FAIL) break;
+ xF.f.xz = lzma_open(&ret, xF.fp);
+ if(ret != LZMA_OK)
+ xF.type = XF_FAIL;
+ break;
+#endif
+ default:
+ break;
+ }
+
+ return xF;
+}
+
+static int xClose(xFile *xF) {
+ int ret = -1;
+ switch(xF->type) {
+ case XF_GZIP:
+ ret = gzclose(xF->f.gz);
+ break;
+#ifdef CONFIG_USE_LIBLZMA
+ case XF_XZ:
+ lzma_end(&xF->f.xz->strm);
+ free(xF->f.xz);
+#endif
+ case XF_NONE:
+ ret = fclose(xF->fp);
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+static ssize_t xRead(xFile *xF, lzma_ret *ret, void *buf, size_t len) {
+ ssize_t sz;
+ switch(xF->type) {
+ case XF_GZIP:
+ sz = gzread(xF->f.gz, buf, len);
+ xF->eof = gzeof(xF->f.gz);
+ break;
+#ifdef CONFIG_USE_LIBLZMA
+ case XF_XZ:
+ sz = lzma_read(ret, xF->f.xz, buf, len);
+ xF->eof = xF->f.xz->eof;
+ break;
+#endif
+ case XF_NONE:
+ sz = fread(buf, 1, len, xF->fp);
+ xF->eof = feof(xF->fp);
+ break;
+ default:
+ sz = -1;
+ break;
+ }
+ return sz;
+}
+
+void *grab_contents(xFile *xF, unsigned long *size)
+{
+ unsigned int max = 16384;
+ void *buffer = calloc(1, max);
+ lzma_ret ret;
+
+ if (!buffer)
+ return NULL;
+
+ *size = 0;
+ while ((ret = xRead(xF, &ret, buffer + *size, max - *size)) > 0) {
+ *size += ret;
+ if (*size == max) {
+ void *p;
+
+ p = realloc(buffer, max *= 2);
+ if (!p)
+ goto out_err;
+
+ buffer = p;
+ }
+ }
+ if (ret < 0)
+ goto out_err;
+
+ return buffer;
+
+out_err:
+ free(buffer);
+ return NULL;
+}
+
+/* gzopen handles uncompressed files transparently. */
+void *grab_file(const char *filename, unsigned long *size)
+{
+ xFile xF;
+ void *buffer;
+
+ xF = xOpen(-1, filename);
+ if (xF.type == XF_FAIL)
+ return NULL;
+ buffer = grab_contents(&xF, size);
+ xClose(&xF);
+ return buffer;
+}
+
+void release_file(void *data, unsigned long size)
+{
+ free(data);
+}
+#else /* ... !CONFIG_USE_ZLIB */
+
+void *grab_fd(int fd, unsigned long *size)
+{
+ struct stat st;
+ void *map;
+ int ret;
+
+ ret = fstat(fd, &st);
+ if (ret < 0)
+ return NULL;
+ *size = st.st_size;
+ map = mmap(0, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+ if (map == MAP_FAILED)
+ map = NULL;
+ return map;
+}
+
+void *grab_file(const char *filename, unsigned long *size)
+{
+ int fd;
+ void *map;
+
+ fd = open(filename, O_RDONLY, 0);
+ if (fd < 0)
+ return NULL;
+ map = grab_fd(fd, size);
+ close(fd);
+ return map;
+}
+
+void release_file(void *data, unsigned long size)
+{
+ munmap(data, size);
+}
+#endif
diff --git a/mdk-stage1/zlibsupport.h b/mdk-stage1/zlibsupport.h
new file mode 100644
index 000000000..be3c7296a
--- /dev/null
+++ b/mdk-stage1/zlibsupport.h
@@ -0,0 +1,11 @@
+#ifndef _ZLIB_SUPPORT_H
+#define _ZLIB_SUPPORT_H
+
+/* Grab file. Decompresses if that is supported. Returns NULL on error. */
+extern void *grab_file(const char *filename, unsigned long *size);
+extern void *grab_fd(int fd, unsigned long *size);
+
+/* Free it up. */
+extern void release_file(void *data, unsigned long size);
+
+#endif /* _ZLIB_SUPPORT_H */