>From de69c5474ec016d405f3d98a71724b88f853c61c Mon Sep 17 00:00:00 2001 From: Collin Funk Date: Tue, 6 Aug 2024 20:31:11 -0700 Subject: [PATCH 3/5] maint: Use filemode from Gnulib. * gnulib.modules: Add filemode. * src/Makefile.am (cpio_SOURCES): Remove filemode.c. * src/copyin.c: Include filemode.h. (long_format): Use strmode instead of mode_string. * src/extern.h (mode_string): Remove declaration. * src/filemode.c: Remove file. --- gnulib.modules | 1 + src/Makefile.am | 1 - src/copyin.c | 8 +- src/extern.h | 3 - src/filemode.c | 242 ------------------------------------------------ 5 files changed, 5 insertions(+), 250 deletions(-) delete mode 100644 src/filemode.c diff --git a/gnulib.modules b/gnulib.modules index 701abf9..40e8087 100644 --- a/gnulib.modules +++ b/gnulib.modules @@ -9,6 +9,7 @@ dirname error fdutimensat fileblocks +filemode fnmatch-gnu full-write getline diff --git a/src/Makefile.am b/src/Makefile.am index 739cb83..b469aa5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -36,7 +36,6 @@ cpio_SOURCES = \ main.c\ tar.c\ util.c\ - filemode.c\ idcache.c\ makepath.c\ userspec.c diff --git a/src/copyin.c b/src/copyin.c index ace0a02..467d86d 100644 --- a/src/copyin.c +++ b/src/copyin.c @@ -31,6 +31,7 @@ # include #endif #include +#include #ifndef HAVE_LCHOWN # define lchown(f,u,g) 0 @@ -873,7 +874,7 @@ static struct timespec current_time; void long_format (struct cpio_file_stat *file_hdr, char const *link_name) { - char mbuf[11]; + char mbuf[12]; time_t when; char *tbuf; struct timespec when_timespec; @@ -885,10 +886,9 @@ long_format (struct cpio_file_stat *file_hdr, char const *link_name) .tv_nsec = current_time.tv_nsec }; - mode_string (file_hdr->c_mode, mbuf); - mbuf[10] = '\0'; + strmode (file_hdr->c_mode, mbuf); - printf ("%s %3ju ", mbuf, (uintmax_t) file_hdr->c_nlink); + printf ("%s%3ju ", mbuf, (uintmax_t) file_hdr->c_nlink); if (numeric_uid) printf ("%-8ju %-8ju ", diff --git a/src/extern.h b/src/extern.h index fb83b1e..1cb99fc 100644 --- a/src/extern.h +++ b/src/extern.h @@ -135,9 +135,6 @@ int link_to_name (char const *link_name, char const *link_target); /* dirname.c */ char *dirname (char *path); -/* filemode.c */ -void mode_string (unsigned int mode, char *str); - /* idcache.c */ char *getgroup (gid_t gid); char *getuser (uid_t uid); diff --git a/src/filemode.c b/src/filemode.c deleted file mode 100644 index 13dfaaf..0000000 --- a/src/filemode.c +++ /dev/null @@ -1,242 +0,0 @@ -/* filemode.c -- make a string describing file modes - Copyright (C) 1985-2024 Free Software Foundation, Inc. - - 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 3, 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., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301 USA. */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#if !S_IRUSR -# if S_IREAD -# define S_IRUSR S_IREAD -# else -# define S_IRUSR 00400 -# endif -#endif - -#if !S_IWUSR -# if S_IWRITE -# define S_IWUSR S_IWRITE -# else -# define S_IWUSR 00200 -# endif -#endif - -#if !S_IXUSR -# if S_IEXEC -# define S_IXUSR S_IEXEC -# else -# define S_IXUSR 00100 -# endif -#endif - -#ifdef STAT_MACROS_BROKEN -#undef S_ISBLK -#undef S_ISCHR -#undef S_ISDIR -#undef S_ISFIFO -#undef S_ISLNK -#undef S_ISMPB -#undef S_ISMPC -#undef S_ISNWK -#undef S_ISREG -#undef S_ISSOCK -#endif /* STAT_MACROS_BROKEN. */ - -#if !defined(S_ISBLK) && defined(S_IFBLK) -#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) -#endif -#if !defined(S_ISCHR) && defined(S_IFCHR) -#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) -#endif -#if !defined(S_ISDIR) && defined(S_IFDIR) -#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -#endif -#if !defined(S_ISREG) && defined(S_IFREG) -#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -#endif -#if !defined(S_ISFIFO) && defined(S_IFIFO) -#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) -#endif -#if !defined(S_ISLNK) && defined(S_IFLNK) -#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) -#endif -#if !defined(S_ISSOCK) && defined(S_IFSOCK) -#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) -#endif -#if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */ -#define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) -#define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) -#endif -#if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */ -#define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) -#endif - -/* Return a character indicating the type of file described by - file mode BITS: - 'd' for directories - 'b' for block special files - 'c' for character special files - 'm' for multiplexor files - 'l' for symbolic links - 's' for sockets - 'p' for fifos - '-' for regular files - '?' for any other file type. */ - -static char -ftypelet (long bits) -{ -#ifdef S_ISBLK - if (S_ISBLK (bits)) - return 'b'; -#endif - if (S_ISCHR (bits)) - return 'c'; - if (S_ISDIR (bits)) - return 'd'; - if (S_ISREG (bits)) - return '-'; -#ifdef S_ISFIFO - if (S_ISFIFO (bits)) - return 'p'; -#endif -#ifdef S_ISLNK - if (S_ISLNK (bits)) - return 'l'; -#endif -#ifdef S_ISSOCK - if (S_ISSOCK (bits)) - return 's'; -#endif -#ifdef S_ISMPC - if (S_ISMPC (bits)) - return 'm'; -#endif -#ifdef S_ISNWK - if (S_ISNWK (bits)) - return 'n'; -#endif - return '?'; -} - -/* Look at read, write, and execute bits in BITS and set - flags in CHARS accordingly. */ - -static void -rwx (unsigned short bits, char *chars) -{ - chars[0] = (bits & S_IRUSR) ? 'r' : '-'; - chars[1] = (bits & S_IWUSR) ? 'w' : '-'; - chars[2] = (bits & S_IXUSR) ? 'x' : '-'; -} - -/* Set the 's' and 't' flags in file attributes string CHARS, - according to the file mode BITS. */ - -static void -setst (unsigned short bits, char *chars) -{ -#ifdef S_ISUID - if (bits & S_ISUID) - { - if (chars[3] != 'x') - /* Set-uid, but not executable by owner. */ - chars[3] = 'S'; - else - chars[3] = 's'; - } -#endif -#ifdef S_ISGID - if (bits & S_ISGID) - { - if (chars[6] != 'x') - /* Set-gid, but not executable by group. */ - chars[6] = 'S'; - else - chars[6] = 's'; - } -#endif -#ifdef S_ISVTX - if (bits & S_ISVTX) - { - if (chars[9] != 'x') - /* Sticky, but not executable by others. */ - chars[9] = 'T'; - else - chars[9] = 't'; - } -#endif -} - -/* Like filemodestring (see below), but only the relevant part of the - `struct stat' is given as an argument. */ - -void -mode_string (unsigned int mode, char *str) -{ - str[0] = ftypelet ((long) mode); - rwx ((mode & 0700) << 0, &str[1]); - rwx ((mode & 0070) << 3, &str[4]); - rwx ((mode & 0007) << 6, &str[7]); - setst (mode, str); -} - -/* filemodestring - fill in string STR with an ls-style ASCII - representation of the st_mode field of file stats block STATP. - 10 characters are stored in STR; no terminating null is added. - The characters stored in STR are: - - 0 File type. 'd' for directory, 'c' for character - special, 'b' for block special, 'm' for multiplex, - 'l' for symbolic link, 's' for socket, 'p' for fifo, - '-' for regular, '?' for any other file type - - 1 'r' if the owner may read, '-' otherwise. - - 2 'w' if the owner may write, '-' otherwise. - - 3 'x' if the owner may execute, 's' if the file is - set-user-id, '-' otherwise. - 'S' if the file is set-user-id, but the execute - bit isn't set. - - 4 'r' if group members may read, '-' otherwise. - - 5 'w' if group members may write, '-' otherwise. - - 6 'x' if group members may execute, 's' if the file is - set-group-id, '-' otherwise. - 'S' if it is set-group-id but not executable. - - 7 'r' if any user may read, '-' otherwise. - - 8 'w' if any user may write, '-' otherwise. - - 9 'x' if any user may execute, 't' if the file is "sticky" - (will be retained in swap space after execution), '-' - otherwise. - 'T' if the file is sticky but not executable. */ - -void -filemodestring (struct stat *statp, char *str) -{ - mode_string (statp->st_mode, str); -} -- 2.45.2