Mercurial > hg > toybox
annotate toys/other/lsattr.c @ 1736:5892daac85ab draft
Switch nsenter to default y.
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 12 Mar 2015 15:34:03 -0500 |
parents | ffc7f606ce5b |
children |
rev | line source |
---|---|
1272
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
1 /* lsattr.c - List file attributes on a Linux second extended file system. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
2 * |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
3 * Copyright 2013 Ranjan Kumar <ranjankumar.bth@gmail.com> |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
5 * |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
6 * No Standard. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
7 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
8 USE_LSATTR(NEWTOY(lsattr, "vldaR", TOYFLAG_BIN)) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
9 USE_CHATTR(NEWTOY(chattr, NULL, TOYFLAG_BIN)) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
10 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
11 config LSATTR |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
12 bool "lsattr" |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
13 default y |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
14 help |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
15 usage: lsattr [-Radlv] [Files...] |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
16 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
17 List file attributes on a Linux second extended file system. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
18 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
19 -R Recursively list attributes of directories and their contents. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
20 -a List all files in directories, including files that start with '.'. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
21 -d List directories like other files, rather than listing their contents. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
22 -l List long flag names. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
23 -v List the file's version/generation number. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
24 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
25 config CHATTR |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
26 bool "chattr" |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
27 default y |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
28 help |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
29 usage: chattr [-R] [-+=AacDdijsStTu] [-v version] [File...] |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
30 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
31 Change file attributes on a Linux second extended file system. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
32 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
33 Operators: |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
34 '-' Remove attributes. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
35 '+' Add attributes. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
36 '=' Set attributes. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
37 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
38 Attributes: |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
39 A Don't track atime. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
40 a Append mode only. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
41 c Enable compress. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
42 D Write dir contents synchronously. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
43 d Don't backup with dump. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
44 i Cannot be modified (immutable). |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
45 j Write all data to journal first. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
46 s Zero disk storage when deleted. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
47 S Write file contents synchronously. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
48 t Disable tail-merging of partial blocks with other files. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
49 u Allow file to be undeleted. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
50 -R Recurse. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
51 -v Set the file's version/generation number. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
52 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
53 */ |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
54 #define FOR_lsattr |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
55 #include "toys.h" |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
56 #include <linux/fs.h> |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
57 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
58 static struct ext2_attr { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
59 char *name; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
60 unsigned long flag; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
61 char opt; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
62 } e2attrs[] = { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
63 {"Secure_Deletion", FS_SECRM_FL, 's'}, // Secure deletion |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
64 {"Undelete", FS_UNRM_FL, 'u'}, // Undelete |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
65 {"Compression_Requested", FS_COMPR_FL, 'c'}, // Compress file |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
66 {"Synchronous_Updates", FS_SYNC_FL, 'S'}, // Synchronous updates |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
67 {"Immutable", FS_IMMUTABLE_FL, 'i'}, // Immutable file |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
68 {"Append_Only", FS_APPEND_FL, 'a'}, // writes to file may only append |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
69 {"No_Dump", FS_NODUMP_FL, 'd'}, // do not dump file |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
70 {"No_Atime", FS_NOATIME_FL, 'A'}, // do not update atime |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
71 {"Indexed_directory", FS_INDEX_FL, 'I'}, // hash-indexed directory |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
72 {"Journaled_Data", FS_JOURNAL_DATA_FL, 'j'}, // file data should be journaled |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
73 {"No_Tailmerging", FS_NOTAIL_FL, 't'}, // file tail should not be merged |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
74 {"Synchronous_Directory_Updates", FS_DIRSYNC_FL, 'D'}, // dirsync behaviour (directories only) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
75 {"Top_of_Directory_Hierarchies", FS_TOPDIR_FL, 'T'}, // Top of directory hierarchies |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
76 {NULL, -1, 0}, |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
77 }; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
78 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
79 // Get file flags on a Linux second extended file system. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
80 static int ext2_getflag(int fd, struct stat *sb, unsigned long *flag) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
81 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
82 if(!S_ISREG(sb->st_mode) && !S_ISDIR(sb->st_mode)) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
83 errno = EOPNOTSUPP; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
84 return -1; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
85 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
86 return (ioctl(fd, FS_IOC_GETFLAGS, (void*)flag)); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
87 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
88 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
89 static void print_file_attr(char *path) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
90 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
91 unsigned long flag = 0, version = 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
92 int fd; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
93 struct stat sb; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
94 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
95 if (!stat(path, &sb) && !S_ISREG(sb.st_mode) && !S_ISDIR(sb.st_mode)) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
96 errno = EOPNOTSUPP; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
97 goto LABEL1; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
98 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
99 if (-1 == (fd=open(path, O_RDONLY | O_NONBLOCK))) goto LABEL1; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
100 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
101 if (toys.optflags & FLAG_v) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
102 if (ioctl(fd, FS_IOC_GETVERSION, (void*)&version) < 0) goto LABEL2; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
103 xprintf("%5lu ", version); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
104 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
105 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
106 if (ext2_getflag(fd, &sb, &flag) < 0) perror_msg("reading flags '%s'", path); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
107 else { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
108 struct ext2_attr *ptr = e2attrs; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
109 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
110 if (toys.optflags & FLAG_l) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
111 int name_found = 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
112 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
113 xprintf("%-50s ", path); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
114 for (; ptr->name; ptr++) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
115 if (flag & ptr->flag) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
116 if (name_found) xprintf(", "); //for formatting. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
117 xprintf("%s", ptr->name); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
118 name_found = 1; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
119 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
120 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
121 if (!name_found) xprintf("---"); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
122 xputc('\n'); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
123 } else { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
124 int index = 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
125 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
126 for (; ptr->name; ptr++) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
127 toybuf[index++] = (flag & ptr->flag) ? ptr->opt : '-'; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
128 toybuf[index] = '\0'; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
129 xprintf("%s %s\n", toybuf, path); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
130 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
131 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
132 xclose(fd); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
133 return; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
134 LABEL2: xclose(fd); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
135 LABEL1: perror_msg("reading '%s'", path); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
136 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
137 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
138 // Get directory information. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
139 static int retell_dir(struct dirtree *root) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
140 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
141 char *fpath = NULL; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
142 |
1404
ffc7f606ce5b
Move DIRTREE_COMEAGAIN second callback up to when the filehandle is still open, and add dir->again variable to distinguish second call instead of checking for -1 filehandle.
Rob Landley <rob@landley.net>
parents:
1272
diff
changeset
|
143 if (root->again) { |
1272
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
144 xputc('\n'); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
145 return 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
146 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
147 if (S_ISDIR(root->st.st_mode) && !root->parent) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
148 return (DIRTREE_RECURSE | DIRTREE_COMEAGAIN); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
149 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
150 fpath = dirtree_path(root, NULL); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
151 //Special case: with '-a' option and '.'/'..' also included in printing list. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
152 if ((root->name[0] != '.') || (toys.optflags & FLAG_a)) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
153 print_file_attr(fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
154 if (S_ISDIR(root->st.st_mode) && (toys.optflags & FLAG_R) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
155 && dirtree_notdotdot(root)) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
156 xprintf("\n%s:\n", fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
157 free(fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
158 return (DIRTREE_RECURSE | DIRTREE_COMEAGAIN); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
159 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
160 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
161 free(fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
162 return 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
163 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
164 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
165 void lsattr_main(void) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
166 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
167 if (!*toys.optargs) dirtree_read(".", retell_dir); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
168 else |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
169 for (; *toys.optargs; toys.optargs++) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
170 struct stat sb; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
171 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
172 if (lstat(*toys.optargs, &sb)) perror_msg("stat '%s'", *toys.optargs); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
173 else if (S_ISDIR(sb.st_mode) && !(toys.optflags & FLAG_d)) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
174 dirtree_read(*toys.optargs, retell_dir); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
175 else print_file_attr(*toys.optargs);// to handle "./Filename" or "./Dir" |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
176 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
177 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
178 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
179 // Switch gears from lsattr to chattr. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
180 #define CLEANUP_lsattr |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
181 #define FOR_chattr |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
182 #include "generated/flags.h" |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
183 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
184 static struct _chattr { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
185 unsigned long add, rm, set, version; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
186 unsigned char vflag, recursive; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
187 } chattr; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
188 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
189 static inline void chattr_help(void) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
190 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
191 toys.exithelp++; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
192 error_exit("Invalid Argument"); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
193 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
194 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
195 // Set file flags on a Linux second extended file system. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
196 static inline int ext2_setflag(int fd, struct stat *sb, unsigned long flag) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
197 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
198 if (!S_ISREG(sb->st_mode) && !S_ISDIR(sb->st_mode)) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
199 errno = EOPNOTSUPP; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
200 return -1; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
201 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
202 return (ioctl(fd, FS_IOC_SETFLAGS, (void*)&flag)); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
203 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
204 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
205 static unsigned long get_flag_val(char ch) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
206 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
207 struct ext2_attr *ptr = e2attrs; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
208 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
209 for (; ptr->name; ptr++) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
210 if (ptr->opt == ch) return ptr->flag; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
211 chattr_help(); // if no match found then Show help |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
212 return 0; // silent warning. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
213 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
214 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
215 // Parse command line argument and fill the chattr structure. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
216 static void parse_cmdline_arg(char ***argv) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
217 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
218 char *arg = **argv, *ptr = NULL; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
219 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
220 while (arg) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
221 switch (arg[0]) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
222 case '-': |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
223 for (ptr = ++arg; *ptr; ptr++) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
224 if (*ptr == 'R') { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
225 chattr.recursive = 1; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
226 continue; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
227 } else if (*ptr == 'v') {// get version from next argv. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
228 char *endptr; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
229 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
230 errno = 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
231 arg = *(*argv += 1); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
232 if (!arg) chattr_help(); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
233 if (*arg == '-') perror_exit("Invalid Number '%s'", arg); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
234 chattr.version = strtoul(arg, &endptr, 0); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
235 if (errno || *endptr) perror_exit("bad version '%s'", arg); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
236 chattr.vflag = 1; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
237 continue; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
238 } else chattr.rm |= get_flag_val(*ptr); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
239 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
240 break; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
241 case '+': |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
242 for (ptr = ++arg; *ptr; ptr++) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
243 chattr.add |= get_flag_val(*ptr); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
244 break; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
245 case '=': |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
246 for (ptr = ++arg; *ptr; ptr++) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
247 chattr.set |= get_flag_val(*ptr); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
248 break; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
249 default: return; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
250 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
251 arg = *(*argv += 1); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
252 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
253 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
254 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
255 // Update attribute of given file. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
256 static int update_attr(struct dirtree *root) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
257 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
258 unsigned long fval = 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
259 char *fpath = NULL; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
260 int fd; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
261 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
262 if (!dirtree_notdotdot(root)) return 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
263 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
264 /* |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
265 * if file is a link and recursive is set or file is not regular+link+dir |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
266 * (like fifo or dev file) then escape the file. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
267 */ |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
268 if ((S_ISLNK(root->st.st_mode) && chattr.recursive) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
269 || (!S_ISREG(root->st.st_mode) && !S_ISLNK(root->st.st_mode) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
270 && !S_ISDIR(root->st.st_mode))) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
271 return 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
272 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
273 fpath = dirtree_path(root, NULL); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
274 if (-1 == (fd=open(fpath, O_RDONLY | O_NONBLOCK))) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
275 free(fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
276 return DIRTREE_ABORT; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
277 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
278 // Get current attr of file. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
279 if (ext2_getflag(fd, &(root->st), &fval) < 0) { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
280 perror_msg("read flags of '%s'", fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
281 free(fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
282 xclose(fd); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
283 return DIRTREE_ABORT; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
284 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
285 if (chattr.set) { // for '=' operator. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
286 if (ext2_setflag(fd, &(root->st), chattr.set) < 0) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
287 perror_msg("setting flags '%s'", fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
288 } else { // for '-' / '+' operator. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
289 fval &= ~(chattr.rm); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
290 fval |= chattr.add; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
291 if (!S_ISDIR(root->st.st_mode)) fval &= ~FS_DIRSYNC_FL; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
292 if (ext2_setflag(fd, &(root->st), fval) < 0) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
293 perror_msg("setting flags '%s'", fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
294 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
295 if (chattr.vflag) { // set file version |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
296 if (ioctl(fd, FS_IOC_SETVERSION, (void*)&chattr.version) < 0) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
297 perror_msg("while setting version on '%s'", fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
298 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
299 free(fpath); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
300 xclose(fd); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
301 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
302 if (S_ISDIR(root->st.st_mode) && chattr.recursive) return DIRTREE_RECURSE; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
303 return 0; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
304 } |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
305 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
306 void chattr_main(void) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
307 { |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
308 char **argv = toys.optargs; |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
309 |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
310 memset(&chattr, 0, sizeof(struct _chattr)); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
311 parse_cmdline_arg(&argv); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
312 if (!*argv) chattr_help(); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
313 if (chattr.set && (chattr.add || chattr.rm)) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
314 error_exit("'=' is incompatible with '-' and '+'"); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
315 if (chattr.rm & chattr.add) error_exit("Can't set and unset same flag."); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
316 if (!(chattr.add || chattr.rm || chattr.set || chattr.vflag)) |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
317 error_exit(("Must use '-v', '=', '-' or '+'")); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
318 for (; *argv; argv++) dirtree_read(*argv, update_attr); |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
319 toys.exitval = 0; //always set success at this point. |
17935382d2c1
Attached is the patch for lsattr and chattr implementation.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
320 } |