Historically file flags (schg, uschg, etc) have been converted from
string to u_long and back using two functions, flags_to_string and string_to_flags, which co-existed with 'ls'. As time has progressed more and more other tools have used these private functions to manipulate the file flags. Recently I moved these functions from /usr/src/bin/ls to libutil, but after some discussion with bde it's been decided that they really ought to go in libc. There are two already existing libc functions for manipulating file modes: setmode and getmode. In keeping with these flags_to_string has been renamed getflags and string_to_flags to setflags. The manual page could probably be improved upon ;)
This commit is contained in:
parent
c299f41fd9
commit
18c0eeddf7
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=56692
@ -5,7 +5,5 @@ NOSHARED?=yes
|
||||
|
||||
PROG= chflags
|
||||
CFLAGS+=-Wall
|
||||
DPADD= ${LIBUTIL}
|
||||
LDADD= -lutil
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -56,7 +56,6 @@ static const char rcsid[] =
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
u_long string_to_flags __P((char **, u_long *, u_long *));
|
||||
void usage __P((void));
|
||||
|
||||
int
|
||||
@ -122,7 +121,7 @@ main(argc, argv)
|
||||
set = val;
|
||||
oct = 1;
|
||||
} else {
|
||||
if (string_to_flags(&flags, &set, &clear))
|
||||
if (setflags(&flags, &set, &clear))
|
||||
errx(1, "invalid flag: %s", flags);
|
||||
clear = ~clear;
|
||||
oct = 0;
|
||||
|
@ -4,7 +4,5 @@
|
||||
|
||||
PROG= ls
|
||||
SRCS= cmp.c ls.c print.c util.c
|
||||
DPADD= ${LIBUTIL}
|
||||
LDADD= -lutil
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -543,8 +543,7 @@ display(p, list)
|
||||
if ((glen = strlen(group)) > maxgroup)
|
||||
maxgroup = glen;
|
||||
if (f_flags) {
|
||||
flags =
|
||||
flags_to_string(sp->st_flags, "-");
|
||||
flags = getflags(sp->st_flags, "-");
|
||||
if ((flen = strlen(flags)) > maxflags)
|
||||
maxflags = flen;
|
||||
} else
|
||||
|
@ -2,8 +2,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= rm
|
||||
DPADD= ${LIBUTIL}
|
||||
LDADD= -lutil
|
||||
|
||||
LINKS= ${BINDIR}/rm ${BINDIR}/unlink
|
||||
MLINKS= rm.1 unlink.1
|
||||
|
@ -61,8 +61,6 @@ static const char rcsid[] =
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern char *flags_to_string __P((u_long, char *));
|
||||
|
||||
int dflag, eval, fflag, iflag, Pflag, vflag, Wflag, stdin_ok;
|
||||
uid_t uid;
|
||||
|
||||
@ -442,7 +440,7 @@ check(path, name, sp)
|
||||
(!(sp->st_flags & (UF_APPEND|UF_IMMUTABLE)) || !uid)))
|
||||
return (1);
|
||||
strmode(sp->st_mode, modep);
|
||||
strcpy(flagsp, flags_to_string(sp->st_flags, NULL));
|
||||
strcpy(flagsp, getflags(sp->st_flags, NULL));
|
||||
if (*flagsp)
|
||||
strcat(flagsp, " ");
|
||||
(void)fprintf(stderr, "override %s%s%s/%s %sfor %s? ",
|
||||
|
@ -134,6 +134,7 @@ int ftruncate __P((int, off_t));
|
||||
#endif
|
||||
int getdomainname __P((char *, int));
|
||||
int getdtablesize __P((void));
|
||||
char *getflags __P((u_long, char *));
|
||||
int getgrouplist __P((const char *, int, int *, int *));
|
||||
long gethostid __P((void));
|
||||
int gethostname __P((char *, int));
|
||||
@ -182,6 +183,7 @@ int select __P((int, fd_set *, fd_set *, fd_set *, struct timeval *));
|
||||
int setdomainname __P((const char *, int));
|
||||
int setegid __P((gid_t));
|
||||
int seteuid __P((uid_t));
|
||||
int setflags __P((char **, u_long *, u_long *));
|
||||
int setgroups __P((int, const gid_t *));
|
||||
void sethostid __P((long));
|
||||
int sethostname __P((const char *, int));
|
||||
|
@ -20,7 +20,7 @@ SRCS+= _rand48.c _spinlock_stub.c alarm.c arc4random.c assert.c \
|
||||
nlist.c nrand48.c ntp_gettime.c opendir.c \
|
||||
pause.c popen.c psignal.c pwcache.c raise.c readdir.c rewinddir.c \
|
||||
scandir.c seed48.c seekdir.c semconfig.c semctl.c semget.c semop.c \
|
||||
setdomainname.c sethostname.c setjmperr.c setmode.c shmat.c \
|
||||
setdomainname.c setflags.c sethostname.c setjmperr.c setmode.c shmat.c \
|
||||
shmctl.c shmdt.c shmget.c siginterrupt.c siglist.c signal.c \
|
||||
sigsetops.c sleep.c srand48.c stringlist.c \
|
||||
sysconf.c sysctl.c sysctlbyname.c \
|
||||
|
78
lib/libc/gen/setflags.3
Normal file
78
lib/libc/gen/setflags.3
Normal file
@ -0,0 +1,78 @@
|
||||
.\" Copyright (c) 1989, 1991, 1993
|
||||
.\" The Regents of the University of California. 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. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the University of
|
||||
.\" California, Berkeley and its contributors.
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)setmode.3 8.2 (Berkeley) 4/28/95
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd January 1, 2000
|
||||
.Dt SETFLAGS 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm getflags ,
|
||||
.Nm setflags
|
||||
.Nd modify file flag bits
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <unistd.h>
|
||||
.Ft char *
|
||||
.Fn getflags "u_long flags" "char *def"
|
||||
.Ft int
|
||||
.Fn setflags "char **stringp" "u_long *setp" "u_long *clrp"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn getflags
|
||||
function returns a comma separated string of the file flags represented by
|
||||
.Fa flags .
|
||||
If no flags are set the string
|
||||
.Fa def
|
||||
is returned instead.
|
||||
.Pp
|
||||
The
|
||||
.Fn setflags
|
||||
function takes a string of file flags, as described in
|
||||
.Xr chflags 1 ,
|
||||
parses it, and returns the 'set' flags and 'clear' flags
|
||||
such as would be given as arguments to
|
||||
.Xr chflags 2 .
|
||||
On success
|
||||
.Fn setflags
|
||||
returns 0, otherwise it returns non-zero and
|
||||
.Fa stringp
|
||||
is left pointing to the offending token.
|
||||
.Sh SEE ALSO
|
||||
.Xr chflags 1 ,
|
||||
.Xr chflags 2 ,
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn getflags
|
||||
and
|
||||
.Fn setflags
|
||||
functions first appeared in
|
||||
.Fx 4.0 .
|
@ -69,12 +69,12 @@ static struct {
|
||||
#define nmappings (sizeof(mapping) / sizeof(mapping[0]))
|
||||
|
||||
/*
|
||||
* flags_to_string --
|
||||
* getflags --
|
||||
* Convert stat flags to a comma-separated string. If no flags
|
||||
* are set, return the default string.
|
||||
*/
|
||||
char *
|
||||
flags_to_string(flags, def)
|
||||
getflags(flags, def)
|
||||
u_long flags;
|
||||
char *def;
|
||||
{
|
||||
@ -99,13 +99,13 @@ flags_to_string(flags, def)
|
||||
}
|
||||
|
||||
/*
|
||||
* string_to_flags --
|
||||
* setflags --
|
||||
* Take string of arguments and return stat flags. Return 0 on
|
||||
* success, 1 on failure. On failure, stringp is set to point
|
||||
* to the offending token.
|
||||
*/
|
||||
int
|
||||
string_to_flags(stringp, setp, clrp)
|
||||
setflags(stringp, setp, clrp)
|
||||
char **stringp;
|
||||
u_long *setp, *clrp;
|
||||
{
|
||||
|
78
lib/libc/gen/setflagsbyname.3
Normal file
78
lib/libc/gen/setflagsbyname.3
Normal file
@ -0,0 +1,78 @@
|
||||
.\" Copyright (c) 1989, 1991, 1993
|
||||
.\" The Regents of the University of California. 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. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the University of
|
||||
.\" California, Berkeley and its contributors.
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)setmode.3 8.2 (Berkeley) 4/28/95
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd January 1, 2000
|
||||
.Dt SETFLAGS 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm getflags ,
|
||||
.Nm setflags
|
||||
.Nd modify file flag bits
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <unistd.h>
|
||||
.Ft char *
|
||||
.Fn getflags "u_long flags" "char *def"
|
||||
.Ft int
|
||||
.Fn setflags "char **stringp" "u_long *setp" "u_long *clrp"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn getflags
|
||||
function returns a comma separated string of the file flags represented by
|
||||
.Fa flags .
|
||||
If no flags are set the string
|
||||
.Fa def
|
||||
is returned instead.
|
||||
.Pp
|
||||
The
|
||||
.Fn setflags
|
||||
function takes a string of file flags, as described in
|
||||
.Xr chflags 1 ,
|
||||
parses it, and returns the 'set' flags and 'clear' flags
|
||||
such as would be given as arguments to
|
||||
.Xr chflags 2 .
|
||||
On success
|
||||
.Fn setflags
|
||||
returns 0, otherwise it returns non-zero and
|
||||
.Fa stringp
|
||||
is left pointing to the offending token.
|
||||
.Sh SEE ALSO
|
||||
.Xr chflags 1 ,
|
||||
.Xr chflags 2 ,
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn getflags
|
||||
and
|
||||
.Fn setflags
|
||||
functions first appeared in
|
||||
.Fx 4.0 .
|
@ -69,12 +69,12 @@ static struct {
|
||||
#define nmappings (sizeof(mapping) / sizeof(mapping[0]))
|
||||
|
||||
/*
|
||||
* flags_to_string --
|
||||
* getflags --
|
||||
* Convert stat flags to a comma-separated string. If no flags
|
||||
* are set, return the default string.
|
||||
*/
|
||||
char *
|
||||
flags_to_string(flags, def)
|
||||
getflags(flags, def)
|
||||
u_long flags;
|
||||
char *def;
|
||||
{
|
||||
@ -99,13 +99,13 @@ flags_to_string(flags, def)
|
||||
}
|
||||
|
||||
/*
|
||||
* string_to_flags --
|
||||
* setflags --
|
||||
* Take string of arguments and return stat flags. Return 0 on
|
||||
* success, 1 on failure. On failure, stringp is set to point
|
||||
* to the offending token.
|
||||
*/
|
||||
int
|
||||
string_to_flags(stringp, setp, clrp)
|
||||
setflags(stringp, setp, clrp)
|
||||
char **stringp;
|
||||
u_long *setp, *clrp;
|
||||
{
|
||||
|
78
lib/libc/gen/strtofflags.3
Normal file
78
lib/libc/gen/strtofflags.3
Normal file
@ -0,0 +1,78 @@
|
||||
.\" Copyright (c) 1989, 1991, 1993
|
||||
.\" The Regents of the University of California. 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. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the University of
|
||||
.\" California, Berkeley and its contributors.
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)setmode.3 8.2 (Berkeley) 4/28/95
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd January 1, 2000
|
||||
.Dt SETFLAGS 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm getflags ,
|
||||
.Nm setflags
|
||||
.Nd modify file flag bits
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <unistd.h>
|
||||
.Ft char *
|
||||
.Fn getflags "u_long flags" "char *def"
|
||||
.Ft int
|
||||
.Fn setflags "char **stringp" "u_long *setp" "u_long *clrp"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn getflags
|
||||
function returns a comma separated string of the file flags represented by
|
||||
.Fa flags .
|
||||
If no flags are set the string
|
||||
.Fa def
|
||||
is returned instead.
|
||||
.Pp
|
||||
The
|
||||
.Fn setflags
|
||||
function takes a string of file flags, as described in
|
||||
.Xr chflags 1 ,
|
||||
parses it, and returns the 'set' flags and 'clear' flags
|
||||
such as would be given as arguments to
|
||||
.Xr chflags 2 .
|
||||
On success
|
||||
.Fn setflags
|
||||
returns 0, otherwise it returns non-zero and
|
||||
.Fa stringp
|
||||
is left pointing to the offending token.
|
||||
.Sh SEE ALSO
|
||||
.Xr chflags 1 ,
|
||||
.Xr chflags 2 ,
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn getflags
|
||||
and
|
||||
.Fn setflags
|
||||
functions first appeared in
|
||||
.Fx 4.0 .
|
@ -69,12 +69,12 @@ static struct {
|
||||
#define nmappings (sizeof(mapping) / sizeof(mapping[0]))
|
||||
|
||||
/*
|
||||
* flags_to_string --
|
||||
* getflags --
|
||||
* Convert stat flags to a comma-separated string. If no flags
|
||||
* are set, return the default string.
|
||||
*/
|
||||
char *
|
||||
flags_to_string(flags, def)
|
||||
getflags(flags, def)
|
||||
u_long flags;
|
||||
char *def;
|
||||
{
|
||||
@ -99,13 +99,13 @@ flags_to_string(flags, def)
|
||||
}
|
||||
|
||||
/*
|
||||
* string_to_flags --
|
||||
* setflags --
|
||||
* Take string of arguments and return stat flags. Return 0 on
|
||||
* success, 1 on failure. On failure, stringp is set to point
|
||||
* to the offending token.
|
||||
*/
|
||||
int
|
||||
string_to_flags(stringp, setp, clrp)
|
||||
setflags(stringp, setp, clrp)
|
||||
char **stringp;
|
||||
u_long *setp, *clrp;
|
||||
{
|
||||
|
@ -8,8 +8,7 @@ CFLAGS+=-Wall -DLIBC_SCCS -I${.CURDIR} -I${.CURDIR}/../../sys
|
||||
CFLAGS+=-DINET6
|
||||
SRCS= login.c login_tty.c logout.c logwtmp.c pty.c setproctitle.c \
|
||||
login_cap.c login_class.c login_auth.c login_times.c login_ok.c \
|
||||
_secure_path.c uucplock.c property.c auth.c realhostname.c fparseln.c \
|
||||
stat_flags.c
|
||||
_secure_path.c uucplock.c property.c auth.c realhostname.c fparseln.c
|
||||
INCS= libutil.h login_cap.h
|
||||
MAN3+= login.3 login_auth.3 login_tty.3 logout.3 logwtmp.3 pty.3 \
|
||||
setproctitle.3 login_cap.3 login_class.3 login_times.3 login_ok.3 \
|
||||
|
@ -1,149 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1993
|
||||
* The Regents of the University of California. 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)stat_flags.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
static const char rcsid[] =
|
||||
"$FreeBSD$";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
static struct {
|
||||
char *name;
|
||||
u_long flag;
|
||||
int invert;
|
||||
} mapping[] = {
|
||||
/* shorter names per flag first, all prefixed by "no" */
|
||||
{ "nosappnd", SF_APPEND, 0 },
|
||||
{ "nosappend", SF_APPEND, 0 },
|
||||
{ "noarch", SF_ARCHIVED, 0 },
|
||||
{ "noarchived", SF_ARCHIVED, 0 },
|
||||
{ "noschg", SF_IMMUTABLE, 0 },
|
||||
{ "nosimmutable", SF_IMMUTABLE, 0 },
|
||||
{ "noschange", SF_IMMUTABLE, 0 },
|
||||
{ "nouappnd", UF_APPEND, 0 },
|
||||
{ "nouappend", UF_APPEND, 0 },
|
||||
{ "nouchg", UF_IMMUTABLE, 0 },
|
||||
{ "nouchange", UF_IMMUTABLE, 0 },
|
||||
{ "nouimmutable", UF_IMMUTABLE, 0 },
|
||||
{ "nodump", UF_NODUMP, 1 }
|
||||
};
|
||||
#define nmappings (sizeof(mapping) / sizeof(mapping[0]))
|
||||
|
||||
/*
|
||||
* flags_to_string --
|
||||
* Convert stat flags to a comma-separated string. If no flags
|
||||
* are set, return the default string.
|
||||
*/
|
||||
char *
|
||||
flags_to_string(flags, def)
|
||||
u_long flags;
|
||||
char *def;
|
||||
{
|
||||
static char string[128];
|
||||
char *sp, *dp;
|
||||
u_long setflags;
|
||||
int i;
|
||||
|
||||
setflags = flags;
|
||||
dp = string;
|
||||
for (i = 0; i < nmappings; i++) {
|
||||
if (setflags & mapping[i].flag) {
|
||||
if (dp > string)
|
||||
*dp++ = ',';
|
||||
for (sp = mapping[i].invert ? mapping[i].name :
|
||||
mapping[i].name + 2; *sp; *dp++ = *sp++) ;
|
||||
setflags &= ~mapping[i].flag;
|
||||
}
|
||||
}
|
||||
*dp = '\0';
|
||||
return (dp == string && def != NULL ? def : string);
|
||||
}
|
||||
|
||||
/*
|
||||
* string_to_flags --
|
||||
* Take string of arguments and return stat flags. Return 0 on
|
||||
* success, 1 on failure. On failure, stringp is set to point
|
||||
* to the offending token.
|
||||
*/
|
||||
int
|
||||
string_to_flags(stringp, setp, clrp)
|
||||
char **stringp;
|
||||
u_long *setp, *clrp;
|
||||
{
|
||||
char *string, *p;
|
||||
int i;
|
||||
|
||||
if (setp)
|
||||
*setp = 0;
|
||||
if (clrp)
|
||||
*clrp = 0;
|
||||
string = *stringp;
|
||||
while ((p = strsep(&string, "\t ,")) != NULL) {
|
||||
*stringp = p;
|
||||
if (*p == '\0')
|
||||
continue;
|
||||
for (i = 0; i < nmappings; i++) {
|
||||
if (strcmp(p, mapping[i].name + 2) == 0) {
|
||||
if (mapping[i].invert) {
|
||||
if (clrp)
|
||||
*clrp |= mapping[i].flag;
|
||||
} else {
|
||||
if (setp)
|
||||
*setp |= mapping[i].flag;
|
||||
}
|
||||
break;
|
||||
} else if (strcmp(p, mapping[i].name) == 0) {
|
||||
if (mapping[i].invert) {
|
||||
if (setp)
|
||||
*setp |= mapping[i].flag;
|
||||
} else {
|
||||
if (clrp)
|
||||
*clrp |= mapping[i].flag;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == nmappings)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -5,7 +5,5 @@ NOSHARED?=yes
|
||||
|
||||
PROG= chflags
|
||||
CFLAGS+=-Wall
|
||||
DPADD= ${LIBUTIL}
|
||||
LDADD= -lutil
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -56,7 +56,6 @@ static const char rcsid[] =
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
u_long string_to_flags __P((char **, u_long *, u_long *));
|
||||
void usage __P((void));
|
||||
|
||||
int
|
||||
@ -122,7 +121,7 @@ main(argc, argv)
|
||||
set = val;
|
||||
oct = 1;
|
||||
} else {
|
||||
if (string_to_flags(&flags, &set, &clear))
|
||||
if (setflags(&flags, &set, &clear))
|
||||
errx(1, "invalid flag: %s", flags);
|
||||
clear = ~clear;
|
||||
oct = 0;
|
||||
|
@ -3,7 +3,5 @@
|
||||
|
||||
PROG= find
|
||||
SRCS= find.c function.c ls.c main.c misc.c operator.c option.c
|
||||
DPADD= ${LIBUTIL}
|
||||
LDADD= -lutil
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -58,8 +58,6 @@ static char rcsid[] = "$FreeBSD$";
|
||||
|
||||
#include "find.h"
|
||||
|
||||
int string_to_flags __P((char **, u_long *, u_long *));
|
||||
|
||||
#define COMPARE(a, b) { \
|
||||
switch (plan->flags) { \
|
||||
case F_EQUAL: \
|
||||
@ -994,7 +992,7 @@ c_flags(flags_str)
|
||||
new->flags = F_ATLEAST;
|
||||
flags_str++;
|
||||
}
|
||||
if (string_to_flags(&flags_str, &flags, ¬flags) == 1)
|
||||
if (setflags(&flags_str, &flags, ¬flags) == 1)
|
||||
errx(1, "-flags: %s: illegal flags string", flags_str);
|
||||
|
||||
new->fl_flags = flags;
|
||||
|
@ -3,8 +3,6 @@
|
||||
|
||||
PROG= xinstall
|
||||
MAN1= install.1
|
||||
DPADD= ${LIBUTIL}
|
||||
LDADD= -lutil
|
||||
|
||||
install: maninstall
|
||||
${INSTALL} ${COPY} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
|
||||
|
@ -101,7 +101,6 @@ int compare __P((int, const char *, int, const char *,
|
||||
const struct stat *, const struct stat *));
|
||||
void install __P((char *, char *, u_long, u_int));
|
||||
void install_dir __P((char *));
|
||||
u_long string_to_flags __P((char **, u_long *, u_long *));
|
||||
void strip __P((char *));
|
||||
void usage __P((void));
|
||||
int trymmap __P((int));
|
||||
@ -152,7 +151,7 @@ main(argc, argv)
|
||||
break;
|
||||
case 'f':
|
||||
flags = optarg;
|
||||
if (string_to_flags(&flags, &fset, NULL))
|
||||
if (setflags(&flags, &fset, NULL))
|
||||
errx(EX_USAGE, "%s: invalid flag", flags);
|
||||
iflags |= SETFLAGS;
|
||||
break;
|
||||
|
@ -4,8 +4,6 @@
|
||||
PROG= mtree
|
||||
SRCS= compare.c crc.c create.c misc.c mtree.c spec.c verify.c
|
||||
MAN8= mtree.8
|
||||
DPADD= ${LIBUTIL}
|
||||
LDADD= -lutil
|
||||
.PATH: ${.CURDIR}/../../usr.bin/cksum
|
||||
|
||||
.if !defined(WORLD)
|
||||
|
@ -225,9 +225,9 @@ typeerr: LABEL;
|
||||
if ((s->flags & F_FLAGS) && s->st_flags != p->fts_statp->st_flags) {
|
||||
LABEL;
|
||||
(void)printf("%sflags (\"%s\" is not ", tab,
|
||||
flags_to_string(s->st_flags, "none"));
|
||||
getflags(s->st_flags, "none"));
|
||||
(void)printf("\"%s\"",
|
||||
flags_to_string(p->fts_statp->st_flags, "none"));
|
||||
getflags(p->fts_statp->st_flags, "none"));
|
||||
if (uflag)
|
||||
if (chflags(p->fts_accpath, s->st_flags))
|
||||
(void)printf(", not modified: %s)\n",
|
||||
|
@ -254,7 +254,7 @@ statf(indent, p)
|
||||
output(indent, &offset, "link=%s", rlink(p->fts_accpath));
|
||||
if (keys & F_FLAGS && p->fts_statp->st_flags != flags)
|
||||
output(indent, &offset, "flags=%s",
|
||||
flags_to_string(p->fts_statp->st_flags, "none"));
|
||||
getflags(p->fts_statp->st_flags, "none"));
|
||||
(void)putchar('\n');
|
||||
}
|
||||
|
||||
@ -372,7 +372,7 @@ statd(t, parent, puid, pgid, pmode, pflags)
|
||||
(void)printf(" nlink=1");
|
||||
if (keys & F_FLAGS && saveflags)
|
||||
(void)printf(" flags=%s",
|
||||
flags_to_string(saveflags, "none"));
|
||||
getflags(saveflags, "none"));
|
||||
(void)printf("\n");
|
||||
*puid = saveuid;
|
||||
*pgid = savegid;
|
||||
|
@ -214,7 +214,7 @@ set(t, ip)
|
||||
case F_FLAGS:
|
||||
if (strcmp("none", val) == 0)
|
||||
ip->st_flags = 0;
|
||||
else if (string_to_flags(&val, &ip->st_flags,NULL) != 0)
|
||||
else if (setflags(&val, &ip->st_flags, NULL) != 0)
|
||||
errx(1, "line %d: invalid flag %s",lineno, val);
|
||||
break;
|
||||
case F_GID:
|
||||
|
Loading…
Reference in New Issue
Block a user