summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-01-04 15:40:17 +0000
committerkib <kib@FreeBSD.org>2010-01-04 15:40:17 +0000
commitd061de008ac2d14466eefecb47b69b59e5e79408 (patch)
treeb365b59af8b0b68bad0041e490012bdb8c25eace
parent16db58ba54bd23cade57dc720cf9bd57f5487f3e (diff)
downloadFreeBSD-src-d061de008ac2d14466eefecb47b69b59e5e79408.zip
FreeBSD-src-d061de008ac2d14466eefecb47b69b59e5e79408.tar.gz
Modernize scandir(3) and alphasort(3) interfaces according to the IEEE
Std 1003.1-2008. Both Linux and Solaris conforms to the new definitions, so we better follow too (older glibc used old BSDish alphasort prototype and corresponding type of the comparision function for scandir). While there, change the definitions of the functions to ANSI C and fix several style issues nearby. Remove requirement for "sys/types.h" include for functions from manpage. POSIX also requires that alphasort(3) sorts as if strcoll(3) was used, but leave the strcmp(3) call in the function for now. Adapt in-tree callers of scandir(3) to new declaration. The fact that select_sections() from catman(1) could modify supplied struct dirent is a bug. PR: standards/142255 MFC after: 2 weeks
-rw-r--r--include/dirent.h5
-rw-r--r--lib/libc/gen/opendir.c3
-rw-r--r--lib/libc/gen/scandir.37
-rw-r--r--lib/libc/gen/scandir.c23
-rw-r--r--usr.bin/catman/catman.c10
-rw-r--r--usr.bin/makewhatis/makewhatis.c4
-rw-r--r--usr.sbin/lpr/common_source/lp.h2
-rw-r--r--usr.sbin/lpr/common_source/rmjob.c2
8 files changed, 30 insertions, 26 deletions
diff --git a/include/dirent.h b/include/dirent.h
index 63626b5..8d7e5c1 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -95,7 +95,7 @@ typedef void * DIR;
__BEGIN_DECLS
#if __BSD_VISIBLE
DIR *__opendir2(const char *, int);
-int alphasort(const void *, const void *);
+int alphasort(const struct dirent **, const struct dirent **);
int getdents(int, char *, int);
int getdirentries(int, char *, int, long *);
#endif
@@ -109,7 +109,8 @@ int readdir_r(DIR *, struct dirent *, struct dirent **);
void rewinddir(DIR *);
#if __BSD_VISIBLE
int scandir(const char *, struct dirent ***,
- int (*)(struct dirent *), int (*)(const void *, const void *));
+ int (*)(const struct dirent *), int (*)(const struct dirent **,
+ const struct dirent **));
#endif
#if __XSI_VISIBLE
void seekdir(DIR *, long);
diff --git a/lib/libc/gen/opendir.c b/lib/libc/gen/opendir.c
index 9625ec6..631c4d6 100644
--- a/lib/libc/gen/opendir.c
+++ b/lib/libc/gen/opendir.c
@@ -240,7 +240,8 @@ __opendir_common(int fd, const char *name, int flags)
/*
* This sort must be stable.
*/
- mergesort(dpv, n, sizeof(*dpv), alphasort);
+ mergesort(dpv, n, sizeof(*dpv), (int (*)(const
+ void *, const void *))alphasort);
dpv[n] = NULL;
xp = NULL;
diff --git a/lib/libc/gen/scandir.3 b/lib/libc/gen/scandir.3
index 42ccac2..5e177b9 100644
--- a/lib/libc/gen/scandir.3
+++ b/lib/libc/gen/scandir.3
@@ -28,7 +28,7 @@
.\" @(#)scandir.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd June 4, 1993
+.Dd January 3, 2010
.Dt SCANDIR 3
.Os
.Sh NAME
@@ -38,12 +38,11 @@
.Sh LIBRARY
.Lb libc
.Sh SYNOPSIS
-.In sys/types.h
.In dirent.h
.Ft int
-.Fn scandir "const char *dirname" "struct dirent ***namelist" "int \\*(lp*select\\*(rp\\*(lpstruct dirent *\\*(rp" "int \\*(lp*compar\\*(rp\\*(lpconst void *, const void *\\*(rp"
+.Fn scandir "const char *dirname" "struct dirent ***namelist" "int \\*(lp*select\\*(rp\\*(lpconst struct dirent *\\*(rp" "int \\*(lp*compar\\*(rp\\*(lpconst struct dirent **, const struct dirent **\\*(rp"
.Ft int
-.Fn alphasort "const void *d1" "const void *d2"
+.Fn alphasort "const struct dirent **d1" "const struct dirent **d2"
.Sh DESCRIPTION
The
.Fn scandir
diff --git a/lib/libc/gen/scandir.c b/lib/libc/gen/scandir.c
index 1dae85d..47fad1d 100644
--- a/lib/libc/gen/scandir.c
+++ b/lib/libc/gen/scandir.c
@@ -58,11 +58,9 @@ __FBSDID("$FreeBSD$");
(((dp)->d_namlen + 1 + 3) &~ 3))
int
-scandir(dirname, namelist, select, dcomp)
- const char *dirname;
- struct dirent ***namelist;
- int (*select)(struct dirent *);
- int (*dcomp)(const void *, const void *);
+scandir(const char *dirname, struct dirent ***namelist,
+ int (*select)(const struct dirent *), int (*dcomp)(const struct dirent **,
+ const struct dirent **))
{
struct dirent *d, *p, **names = NULL;
size_t nitems = 0;
@@ -111,26 +109,25 @@ scandir(dirname, namelist, select, dcomp)
}
closedir(dirp);
if (nitems && dcomp != NULL)
- qsort(names, nitems, sizeof(struct dirent *), dcomp);
+ qsort(names, nitems, sizeof(struct dirent *),
+ (int (*)(const void *, const void *))dcomp);
*namelist = names;
- return(nitems);
+ return (nitems);
fail:
while (nitems > 0)
free(names[--nitems]);
free(names);
closedir(dirp);
- return -1;
+ return (-1);
}
/*
* Alphabetic order comparison routine for those who want it.
*/
int
-alphasort(d1, d2)
- const void *d1;
- const void *d2;
+alphasort(const struct dirent **d1, const struct dirent **d2)
{
- return(strcmp((*(struct dirent **)d1)->d_name,
- (*(struct dirent **)d2)->d_name));
+
+ return (strcmp((*d1)->d_name, (*d2)->d_name));
}
diff --git a/usr.bin/catman/catman.c b/usr.bin/catman/catman.c
index ba3ad24..c17a091 100644
--- a/usr.bin/catman/catman.c
+++ b/usr.bin/catman/catman.c
@@ -589,9 +589,15 @@ process_section(char *mandir, char *section)
}
static int
-select_sections(struct dirent *entry)
+select_sections(const struct dirent *entry)
{
- return directory_type(entry->d_name) == MAN_SECTION_DIR;
+ char *name;
+ int ret;
+
+ name = strdup(entry->d_name);
+ ret = directory_type(name) == MAN_SECTION_DIR;
+ free(name);
+ return (ret);
}
/*
diff --git a/usr.bin/makewhatis/makewhatis.c b/usr.bin/makewhatis/makewhatis.c
index 6b2dce4..f2ae370 100644
--- a/usr.bin/makewhatis/makewhatis.c
+++ b/usr.bin/makewhatis/makewhatis.c
@@ -879,9 +879,9 @@ process_section(char *section_dir)
* Returns whether the directory entry is a man page section.
*/
static int
-select_sections(struct dirent *entry)
+select_sections(const struct dirent *entry)
{
- char *p = &entry->d_name[3];
+ const char *p = &entry->d_name[3];
if (strncmp(entry->d_name, "man", 3) != 0)
return 0;
diff --git a/usr.sbin/lpr/common_source/lp.h b/usr.sbin/lpr/common_source/lp.h
index 891ed2f..63f2ff1 100644
--- a/usr.sbin/lpr/common_source/lp.h
+++ b/usr.sbin/lpr/common_source/lp.h
@@ -280,7 +280,7 @@ void inform(const struct printer *_pp, char *_cf);
void init_printer(struct printer *_pp);
void init_request(struct request *_rp);
int inlist(char *_uname, char *_cfile);
-int iscf(struct dirent *_d);
+int iscf(const struct dirent *_d);
void ldump(const char *_nfile, const char *_datafile, int _copies);
void lastprinter(void);
int lockchk(struct printer *_pp, char *_slockf);
diff --git a/usr.sbin/lpr/common_source/rmjob.c b/usr.sbin/lpr/common_source/rmjob.c
index d6fd614..33fcdac 100644
--- a/usr.sbin/lpr/common_source/rmjob.c
+++ b/usr.sbin/lpr/common_source/rmjob.c
@@ -384,7 +384,7 @@ rmremote(const struct printer *pp)
* Return 1 if the filename begins with 'cf'
*/
int
-iscf(struct dirent *d)
+iscf(const struct dirent *d)
{
return(d->d_name[0] == 'c' && d->d_name[1] == 'f');
}
OpenPOWER on IntegriCloud