maximilian attems
2007-Aug-24 22:03 UTC
[klibc] [git patch] klibc bzero, mount fixes + random stuff
hello hpa, please pull for the latest git pull git://brane.itp.tuwien.ac.at/~mattems/klibc.git maks with the following shortlog: maximilian attems (9): mount: add nodev, noexec and nosuid options mount: add -n option cpio: small cleanups readlink: s/link/link_name/ kinit, mknod: s/(major|minor)/\1_num/ klibc: strcspn, strpbrk, strspn include string.h resume, kill: axe unused envp usage devname.c: include kinit.h add bzero() and diffstat usr/include/string.h | 1 usr/kinit/devname.c | 2 + usr/kinit/do_mounts_md.c | 18 +++++------ usr/kinit/name_to_dev.c | 16 +++++----- usr/kinit/resume/resume.c | 2 - usr/klibc/Kbuild | 2 - usr/klibc/bzero.c | 9 +++++ usr/klibc/strcspn.c | 1 usr/klibc/strpbrk.c | 1 usr/klibc/strspn.c | 1 usr/utils/cpio.c | 55 +++++++++++++----------------------- usr/utils/kill.c | 2 - usr/utils/mknod.c | 8 ++--- usr/utils/mount_main.c | 7 +++- usr/utils/mount_opts.c | 3 + usr/utils/readlink.c | 10 +++--- 16 files changed, 73 insertions(+), 65 deletions(-) the mount fixes allow thanks to latest dash merge to run latest bare initramfs-tools without busybox itself. :) while compiling with -Wnested i get those usr/klibc/../include/unistd.h: In function 'getpagesize': usr/klibc/../include/unistd.h:145: warning: nested extern declaration of '__page_size' usr/klibc/../include/unistd.h: In function '__getpageshift': usr/klibc/../include/unistd.h:150: warning: nested extern declaration of '__page_shift' they also appear when compiling udev against klibc, as udev sets aboves gcc warning. can you enlight me on what's going on, tried to compile with -E to see if any preprocessor trick was going on, but..? -- maks commit 63310d84839af47b0beb304d9722f26a379ff7dd Author: maximilian attems <max at stro.at> Date: Fri Aug 24 23:24:07 2007 +0200 add bzero() bzero() contra memset() saves an argument, which is about 4 bytes per call on x86. "In fact, one could argue for making memset() an inline function which collapses to bzero if the middle argument is zero." -hpa left for a later exercise. Signed-off-by: maximilian attems <max at stro.at> diff --git a/usr/include/string.h b/usr/include/string.h index 1a6072c..ae8270e 100644 --- a/usr/include/string.h +++ b/usr/include/string.h @@ -17,6 +17,7 @@ __extern void *memmove(void *, const void *, size_t); __extern void *memset(void *, int, size_t); __extern void *memmem(const void *, size_t, const void *, size_t); __extern void memswap(void *, void *, size_t); +__extern void bzero(void *, size_t); __extern int strcasecmp(const char *, const char *); __extern int strncasecmp(const char *, const char *, size_t); __extern char *strcat(char *, const char *); diff --git a/usr/klibc/Kbuild b/usr/klibc/Kbuild index ad72116..c8eabf9 100644 --- a/usr/klibc/Kbuild +++ b/usr/klibc/Kbuild @@ -30,7 +30,7 @@ klib-y := vsnprintf.o snprintf.o vsprintf.o sprintf.o \ brk.o sbrk.o malloc.o realloc.o calloc.o \ mmap.o shm_open.o shm_unlink.o \ memcpy.o memcmp.o memset.o memccpy.o memmem.o memswap.o \ - memmove.o memchr.o memrchr.o \ + memmove.o memchr.o memrchr.o bzero.o \ strcasecmp.o strncasecmp.o strndup.o strerror.o strsignal.o \ strcat.o strchr.o strcmp.o strcpy.o strdup.o strlen.o strnlen.o \ strncat.o strlcpy.o strlcat.o \ diff --git a/usr/klibc/bzero.c b/usr/klibc/bzero.c new file mode 100644 index 0000000..a2155e3 --- /dev/null +++ b/usr/klibc/bzero.c @@ -0,0 +1,9 @@ +#include <string.h> + +void bzero(void *dst, size_t n) +{ + char *q = dst; + + while (n--) + *q++ = 0; +} commit 9066a0392b2f1f52814cf38a29070866fe0181c9 Author: maximilian attems <max at stro.at> Date: Fri Aug 24 23:09:03 2007 +0200 devname.c: include kinit.h include the header file that prototypes bdevname() Signed-off-by: maximilian attems <max at stro.at> diff --git a/usr/kinit/devname.c b/usr/kinit/devname.c index aeb2135..03f360e 100644 --- a/usr/kinit/devname.c +++ b/usr/kinit/devname.c @@ -6,6 +6,8 @@ #include <sys/types.h> #include <sys/sysmacros.h> +#include "kinit.h" + /* * Print the name of a block device. */ commit 15d1d56ef9ad64c8e7d19553eb8f56d4ba4fb993 Author: maximilian attems <max at stro.at> Date: Fri Aug 24 22:45:46 2007 +0200 resume, kill: axe unused envp usage makes main() more familiar ;) Signed-off-by: maximlian attems <max at stro.at> diff --git a/usr/kinit/resume/resume.c b/usr/kinit/resume/resume.c index 80099f9..2138078 100644 --- a/usr/kinit/resume/resume.c +++ b/usr/kinit/resume/resume.c @@ -15,7 +15,7 @@ static __noreturn usage(void) exit(1); } -int main(int argc, char *argv[], char *envp[]) +int main(int argc, char *argv[]) { progname = argv[0]; if (argc < 2 || argc > 3) diff --git a/usr/utils/kill.c b/usr/utils/kill.c index 8e68faa..188f1b5 100644 --- a/usr/utils/kill.c +++ b/usr/utils/kill.c @@ -10,7 +10,7 @@ static __noreturn usage(void) fprintf(stderr, "Usage: %s pid\n", progname); exit(1); } -int main(int argc, char *argv[], char *envp[]) +int main(int argc, char *argv[]) { long pid; char *endp; commit a8faf56f7ec338df134c3b121557573720fea5f4 Author: maximilian attems <max at stro.at> Date: Fri Aug 24 22:34:49 2007 +0200 klibc: strcspn, strpbrk, strspn include string.h include the header file that prototype their function. Signed-off-by: maximilian attems <max at stro.at> diff --git a/usr/klibc/strcspn.c b/usr/klibc/strcspn.c index bb3ac72..c9cbb67 100644 --- a/usr/klibc/strcspn.c +++ b/usr/klibc/strcspn.c @@ -2,6 +2,7 @@ * strcspn */ +#include "string.h" #include "strxspn.h" size_t strcspn(const char *s, const char *reject) diff --git a/usr/klibc/strpbrk.c b/usr/klibc/strpbrk.c index ba53d02..271a338 100644 --- a/usr/klibc/strpbrk.c +++ b/usr/klibc/strpbrk.c @@ -2,6 +2,7 @@ * strpbrk */ +#include "string.h" #include "strxspn.h" char *strpbrk(const char *s, const char *accept) diff --git a/usr/klibc/strspn.c b/usr/klibc/strspn.c index 1222ce4..35582b3 100644 --- a/usr/klibc/strspn.c +++ b/usr/klibc/strspn.c @@ -2,6 +2,7 @@ * strspn */ +#include "string.h" #include "strxspn.h" size_t strspn(const char *s, const char *accept) commit 083a250727809c1a59a6ca5160279b06def8c404 Author: maximilian attems <max at stro.at> Date: Fri Aug 24 22:31:38 2007 +0200 kinit, mknod: s/(major|minor)/\1_num/ don't shadow major(), minor() Signed-off-by: maximilian attems <max at stro.at> diff --git a/usr/kinit/do_mounts_md.c b/usr/kinit/do_mounts_md.c index 696ffbd..6d4facc 100644 --- a/usr/kinit/do_mounts_md.c +++ b/usr/kinit/do_mounts_md.c @@ -142,7 +142,7 @@ static int mdp_major(void) */ static int md_setup(char *str) { - int minor, level, factor, fault, partitioned = 0; + int minor_num, level, factor, fault, partitioned = 0; char *pername = ""; char *str1; int ent; @@ -151,28 +151,28 @@ static int md_setup(char *str) partitioned = 1; str++; } - if (get_option(&str, &minor) != 2) { /* MD Number */ + if (get_option(&str, &minor_num) != 2) { /* MD Number */ fprintf(stderr, "md: Too few arguments supplied to md=.\n"); return 0; } str1 = str; - if (minor >= MAX_MD_DEVS) { + if (minor_num >= MAX_MD_DEVS) { fprintf(stderr, "md: md=%d, Minor device number too high.\n", - minor); + minor_num); return 0; } for (ent = 0; ent < md_setup_ents; ent++) - if (md_setup_args[ent].minor == minor && + if (md_setup_args[ent].minor == minor_num && md_setup_args[ent].partitioned == partitioned) { fprintf(stderr, "md: md=%s%d, Specified more than once. " "Replacing previous definition.\n", - partitioned ? "d" : "", minor); + partitioned ? "d" : "", minor_num); break; } if (ent >= MAX_MD_DEVS) { fprintf(stderr, "md: md=%s%d - too many md initialisations\n", - partitioned ? "d" : "", minor); + partitioned ? "d" : "", minor_num); return 0; } if (ent >= md_setup_ents) @@ -204,10 +204,10 @@ static int md_setup(char *str) } fprintf(stderr, "md: Will configure md%s%d (%s) from %s, below.\n", - partitioned?"_d":"", minor, pername, str); + partitioned?"_d":"", minor_num, pername, str); md_setup_args[ent].device_names = str; md_setup_args[ent].partitioned = partitioned; - md_setup_args[ent].minor = minor; + md_setup_args[ent].minor = minor_num; return 1; } diff --git a/usr/kinit/name_to_dev.c b/usr/kinit/name_to_dev.c index 593bc12..e5ad1cc 100644 --- a/usr/kinit/name_to_dev.c +++ b/usr/kinit/name_to_dev.c @@ -20,7 +20,7 @@ static dev_t try_name(char *name, int part) char path[BUF_SZ]; char buf[BUF_SZ]; int range; - unsigned int major, minor; + unsigned int major_num, minor_num; dev_t res; char *s; int len; @@ -37,13 +37,13 @@ static dev_t try_name(char *name, int part) if (len <= 0 || len == BUF_SZ || buf[len - 1] != '\n') goto fail; buf[len - 1] = '\0'; - major = strtoul(buf, &s, 10); + major_num = strtoul(buf, &s, 10); if (*s != ':') goto fail; - minor = strtoul(s + 1, &s, 10); + minor_num = strtoul(s + 1, &s, 10); if (*s) goto fail; - res = makedev(major, minor); + res = makedev(major_num, minor_num); /* if it's there and we are not looking for a partition - that's it */ if (!part) @@ -105,7 +105,7 @@ static inline dev_t name_to_dev_t_real(const char *name) int len; const char *devname; char *cptr, *e1, *e2; - int major, minor; + int major_num, minor_num; if (name[0] == '/') { @@ -124,10 +124,10 @@ static inline dev_t name_to_dev_t_real(const char *name) cptr[1] != '\0') { /* Colon-separated decimal device number */ *cptr = '\0'; - major = strtoul(devname+5, &e1, 10); - minor = strtoul(cptr+1, &e2, 10); + major_num = strtoul(devname+5, &e1, 10); + minor_num = strtoul(cptr+1, &e2, 10); if (!*e1 && !*e2) - return makedev(major, minor); + return makedev(major_num, minor_num); *cptr = ':'; } else { /* Hexadecimal device number */ diff --git a/usr/utils/mknod.c b/usr/utils/mknod.c index 3145450..89f0da4 100644 --- a/usr/utils/mknod.c +++ b/usr/utils/mknod.c @@ -13,7 +13,7 @@ static __noreturn usage(void) int main(int argc, char *argv[]) { char *name, *type, typec, *endp; - unsigned int major, minor; + unsigned int major_num, minor_num; mode_t mode; dev_t dev; @@ -49,13 +49,13 @@ int main(int argc, char *argv[]) if (!argv[0] || !argv[1]) usage(); - major = strtol(*argv++, &endp, 0); + major_num = strtol(*argv++, &endp, 0); if (*endp != '\0') usage(); - minor = strtol(*argv++, &endp, 0); + minor_num = strtol(*argv++, &endp, 0); if (*endp != '\0') usage(); - dev = makedev(major, minor); + dev = makedev(major_num, minor_num); } if (*argv) commit 4f5bf37b7362ab4d203ad92ae678cdad09684f0a Author: maximilian attems <max at stro.at> Date: Fri Aug 24 22:28:08 2007 +0200 readlink: s/link/link_name/ don't shadow link() with this char* Signed-off-by: maximilian attems <max at stro.at> diff --git a/usr/utils/readlink.c b/usr/utils/readlink.c index 00c2a1e..50c1a34 100644 --- a/usr/utils/readlink.c +++ b/usr/utils/readlink.c @@ -13,7 +13,7 @@ static __noreturn usage(void) int main(int argc, char *argv[]) { - char *name, *link = NULL; + char *name, *link_name = NULL; size_t max_siz = 128; progname = *argv++; @@ -22,17 +22,17 @@ int main(int argc, char *argv[]) if (!name) usage(); - link = malloc(max_siz); - if (!link) { + link_name = malloc(max_siz); + if (!link_name) { perror("malloc"); exit(1); } - if (readlink(name, link, max_siz) == -1) { + if (readlink(name, link_name, max_siz) == -1) { perror("readlink"); exit(1); } - printf("%s\n", link); + printf("%s\n", link_name); exit(0); } commit 2dd5d9a16eb83d32f7ef604091d541959979282a Author: maximilian attems <max at stro.at> Date: Fri Aug 24 22:26:13 2007 +0200 cpio: small cleanups * declare bunch of function as static * axe unused xrealloc() Signed-off-by: maximilian attems <max at stro.at> diff --git a/usr/utils/cpio.c b/usr/utils/cpio.c index a41f40a..db626a3 100644 --- a/usr/utils/cpio.c +++ b/usr/utils/cpio.c @@ -123,7 +123,7 @@ long input_bytes, output_bytes; /* Allocate N bytes of memory dynamically, with error checking. */ -void *xmalloc(size_t n) +static void *xmalloc(size_t n) { void *p; if (xalloc_oversized(n, 1) || (!(p = malloc(n)) && n != 0)) { @@ -134,22 +134,9 @@ void *xmalloc(size_t n) /* return xnmalloc_inline (n, 1); */ } -/* Change the size of an allocated block of memory P to N bytes, - with error checking. */ - -void *xrealloc(void *p, size_t n) -{ - if (xalloc_oversized(n, 1) || (!(p = realloc(p, n)) && n != 0)) { - fprintf(stderr, "%s: memory exhausted\n", progname); - exit(1); - } - return p; -/* return xnrealloc_inline (p, n, 1); */ -} - /* Clone STRING. */ -char *xstrdup(char const *string) +static char *xstrdup(char const *string) { size_t s = strlen(string) + 1; return memcpy(xmalloc(s), string, s); @@ -187,7 +174,7 @@ static void tape_fill_input_buffer(int in_des, int num_bytes) must always be a multiple of 4 helps us (and our callers) insure this. */ -void disk_empty_output_buffer(int out_des) +static void disk_empty_output_buffer(int out_des) { int bytes_written; @@ -206,7 +193,7 @@ void disk_empty_output_buffer(int out_des) /* Copy NUM_BYTES of buffer IN_BUF to `out_buff', which may be partly full. When `out_buff' fills up, flush it to file descriptor OUT_DES. */ -void disk_buffered_write(char *in_buf, int out_des, long num_bytes) +static void disk_buffered_write(char *in_buf, int out_des, long num_bytes) { register long bytes_left = num_bytes; /* Bytes needing to be copied. */ register long space_left; /* Room left in output buffer. */ @@ -235,7 +222,7 @@ void disk_buffered_write(char *in_buf, int out_des, long num_bytes) OUT_DES is the file descriptor for output; NUM_BYTES is the number of bytes to copy. */ -void copy_files_tape_to_disk(int in_des, int out_des, long num_bytes) +static void copy_files_tape_to_disk(int in_des, int out_des, long num_bytes) { long size; @@ -251,7 +238,7 @@ void copy_files_tape_to_disk(int in_des, int out_des, long num_bytes) } /* if IN_BUF is NULL, Skip the next NUM_BYTES bytes of file descriptor IN_DES. */ -void tape_buffered_read(char *in_buf, int in_des, long num_bytes) +static void tape_buffered_read(char *in_buf, int in_des, long num_bytes) { register long bytes_left = num_bytes; /* Bytes needing to be copied. */ register long space_left; /* Bytes to copy from input buffer. */ @@ -282,7 +269,7 @@ struct deferment { struct new_cpio_header header; }; -struct deferment *create_deferment(struct new_cpio_header *file_hdr) +static struct deferment *create_deferment(struct new_cpio_header *file_hdr) { struct deferment *d; d = (struct deferment *)xmalloc(sizeof(struct deferment)); @@ -292,13 +279,13 @@ struct deferment *create_deferment(struct new_cpio_header *file_hdr) return d; } -void free_deferment(struct deferment *d) +static void free_deferment(struct deferment *d) { free(d->header.c_name); free(d); } -int link_to_name(char *link_name, char *link_target) +static int link_to_name(char *link_name, char *link_target) { int res = link(link_target, link_name); return res; @@ -352,7 +339,7 @@ static void hash_insert(struct inode_val *new_value) /* Associate FILE_NAME with the inode NODE_NUM. (Insert into hash table.) */ -void +static void add_inode(unsigned long node_num, char *file_name, unsigned long major_num, unsigned long minor_num) { @@ -399,7 +386,7 @@ add_inode(unsigned long node_num, char *file_name, unsigned long major_num, hash_num++; } -char *find_inode_file(unsigned long node_num, unsigned long major_num, +static char *find_inode_file(unsigned long node_num, unsigned long major_num, unsigned long minor_num) { int start; /* Initial hash location. */ @@ -439,7 +426,7 @@ char *find_inode_file(unsigned long node_num, unsigned long major_num, numbers is found, try and create another link to it using link_to_name, and return 0 for success and -1 for failure. */ -int +static int link_to_maj_min_ino(char *file_name, int st_dev_maj, int st_dev_min, int st_ino) { int link_res; @@ -457,7 +444,7 @@ link_to_maj_min_ino(char *file_name, int st_dev_maj, int st_dev_min, int st_ino) static void copyin_regular_file(struct new_cpio_header *file_hdr, int in_file_des); -void warn_junk_bytes(long bytes_skipped) +static void warn_junk_bytes(long bytes_skipped) { fprintf(stderr, "%s: warning: skipped %ld byte(s) of junk\n", progname, bytes_skipped); @@ -578,7 +565,7 @@ static void create_defered_links(struct new_cpio_header *file_hdr) we are done reading the whole archive. Write out all of these empty links that are still on the deferments list. */ -static void create_final_defers() +static void create_final_defers(void) { struct deferment *d; int link_res; @@ -720,7 +707,7 @@ copyin_regular_file(struct new_cpio_header *file_hdr, int in_file_des) NAME has no file name components because it is all slashes, return NAME if it is empty, the address of its last slash otherwise. */ -char *base_name(char const *name) +static char *base_name(char const *name) { char const *base = name + FILE_SYSTEM_PREFIX_LEN(name); char const *p; @@ -752,7 +739,7 @@ char *base_name(char const *name) value returned by base_name. Act like strlen (NAME), except omit redundant trailing slashes. */ -size_t base_len(char const *name) +static size_t base_len(char const *name) { size_t len; @@ -769,7 +756,7 @@ size_t base_len(char const *name) the Unix rename and rmdir system calls return an "Invalid argument" error when given a path that ends in "/" (except for the root directory). */ -bool strip_trailing_slashes(char *path) +static bool strip_trailing_slashes(char *path) { char *base = base_name(path); char *base_lim = base + base_len(base); @@ -930,7 +917,7 @@ static void copyin_file(struct new_cpio_header *file_hdr, int in_file_des) file descriptor IN_DES, except for the magic number, which is already filled in. */ -void read_in_new_ascii(struct new_cpio_header *file_hdr, int in_des) +static void read_in_new_ascii(struct new_cpio_header *file_hdr, int in_des) { char ascii_header[112]; @@ -963,7 +950,7 @@ void read_in_new_ascii(struct new_cpio_header *file_hdr, int in_des) /* Read the header, including the name of the file, from file descriptor IN_DES into FILE_HDR. */ -void read_in_header(struct new_cpio_header *file_hdr, int in_des) +static void read_in_header(struct new_cpio_header *file_hdr, int in_des) { long bytes_skipped = 0; /* Bytes of junk found before magic number. */ @@ -991,7 +978,7 @@ void read_in_header(struct new_cpio_header *file_hdr, int in_des) /* Read the collection from standard input and create files in the file system. */ -void process_copy_in() +static void process_copy_in(void) { char done = false; /* True if trailer reached. */ struct new_cpio_header file_hdr; /* Output header information. */ @@ -1033,7 +1020,7 @@ void process_copy_in() initialize all variables associated with the input and output buffers. */ -void initialize_buffers() +static void initialize_buffers(void) { int in_buf_size, out_buf_size; commit 65b514c265f9999663dd1e3e6a9de21eda2d0d2c Author: maximilian attems <max at stro.at> Date: Wed Aug 22 09:30:20 2007 +0200 mount: add -n option klibc mount ignores mtab anyway. so there is nothing special to be done. Signed-off-by: maximilian attems <max at stro.at> diff --git a/usr/utils/mount_main.c b/usr/utils/mount_main.c index e8e22cd..fd62000 100644 --- a/usr/utils/mount_main.c +++ b/usr/utils/mount_main.c @@ -64,10 +64,13 @@ int main(int argc, char *argv[]) rwflag = MS_VERBOSE; do { - c = getopt(argc, argv, "o:rt:w"); + c = getopt(argc, argv, "no:rt:w"); if (c == EOF) break; switch (c) { + case 'n': + /* no mtab writing */ + break; case 'o': rwflag = parse_mount_options(optarg, rwflag, &extra); break; @@ -96,7 +99,7 @@ int main(int argc, char *argv[]) if (optind + 2 != argc || type == NULL) { fprintf(stderr, "Usage: %s [-r] [-w] [-o options] [-t type] " - "device directory\n", progname); + "[-n] device directory\n", progname); exit(1); } commit a00d84e64e2aef6ca4b58df02681b9cd39d5f101 Author: maximilian attems <max at stro.at> Date: Wed Aug 22 09:24:46 2007 +0200 mount: add nodev, noexec and nosuid options options are used by init of initramfs-tools. Signed-off-by: maximilian attems <max at stro.at> diff --git a/usr/utils/mount_opts.c b/usr/utils/mount_opts.c index 98f58cf..05d1729 100644 --- a/usr/utils/mount_opts.c +++ b/usr/utils/mount_opts.c @@ -21,6 +21,9 @@ static const struct mount_opts options[] = { {"dirsync", MS_DIRSYNC, MS_DIRSYNC, 0}, {"exec", MS_NOEXEC, 0, MS_NOEXEC}, {"move", MS_TYPE, MS_MOVE, 0}, + {"nodev", MS_NODEV, MS_NODEV, 0}, + {"noexec", MS_NOEXEC, MS_NOEXEC, 0}, + {"nosuid", MS_NOSUID, MS_NOSUID, 0}, {"recurse", MS_REC, MS_REC, 0}, {"remount", MS_TYPE, MS_REMOUNT, 0}, {"ro", MS_RDONLY, MS_RDONLY, 0},
H. Peter Anvin
2007-Aug-24 22:59 UTC
[klibc] [git patch] klibc bzero, mount fixes + random stuff
maximilian attems wrote:> hello hpa, > > please pull for the latest > git pull git://brane.itp.tuwien.ac.at/~mattems/klibc.git maks >Hi there, Please implement bzero() as memset(x, 0, y); instead of open-coding it as a zero loop. strcspn/strpbrk/strspn: use "" quotes for files in usr/klibc; but <string.h> comes from usr/include and should be in <>. Also, I would appreciate it if you would add [klibc] to the checkin descriptions. The warnings you get come from these declarations: static __inline__ int getpagesize(void) { extern unsigned int __page_size; return __page_size; } -Wnested outlaws these kinds of constructs. There is a __nowarn__ keyword being added in gcc 4.3 or 4.4 to shut up these kinds of warnings, but the only other way to deal with this is to export __page_size and __page_shift into the global namespace, which kind of defeats the purpose of an accessor function. -hpa
H. Peter Anvin
2007-Aug-24 23:05 UTC
[klibc] [git patch] klibc bzero, mount fixes + random stuff
maximilian attems wrote:> > the mount fixes allow thanks to latest dash merge > to run latest bare initramfs-tools without busybox itself. :) > > while compiling with -Wnested i get those > usr/klibc/../include/unistd.h: In function 'getpagesize': > usr/klibc/../include/unistd.h:145: warning: nested extern declaration of '__page_size' > usr/klibc/../include/unistd.h: In function '__getpageshift': > usr/klibc/../include/unistd.h:150: warning: nested extern declaration of '__page_shift' > > they also appear when compiling udev against klibc, as udev > sets aboves gcc warning. can you enlight me on what's going > on, tried to compile with -E to see if any preprocessor trick > was going on, but..? >I decided to go ahead and export the symbols; they're double-underscore, after all, and the user wouldn't be able to use them in conflict anyway. -hpa