add/remove-shell: copy /etc/shells mode to new file
function old new delta add_remove_shell_main 259 300 +41 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
f547041940
commit
13d72c3fd9
@ -43,10 +43,7 @@
|
|||||||
#define REMOVE_SHELL (ENABLE_REMOVE_SHELL && (!ENABLE_ADD_SHELL || applet_name[0] == 'r'))
|
#define REMOVE_SHELL (ENABLE_REMOVE_SHELL && (!ENABLE_ADD_SHELL || applet_name[0] == 'r'))
|
||||||
#define ADD_SHELL (ENABLE_ADD_SHELL && (!ENABLE_REMOVE_SHELL || applet_name[0] == 'a'))
|
#define ADD_SHELL (ENABLE_ADD_SHELL && (!ENABLE_REMOVE_SHELL || applet_name[0] == 'a'))
|
||||||
|
|
||||||
/* NB: we use the _address_, not the value, of this string
|
#define dont_add ((char*)(uintptr_t)1)
|
||||||
* as a "special value of pointer" in the code.
|
|
||||||
*/
|
|
||||||
static const char dont_add[] ALIGN1 = "\n";
|
|
||||||
|
|
||||||
int add_remove_shell_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int add_remove_shell_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int add_remove_shell_main(int argc UNUSED_PARAM, char **argv)
|
int add_remove_shell_main(int argc UNUSED_PARAM, char **argv)
|
||||||
@ -54,6 +51,9 @@ int add_remove_shell_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
FILE *orig_fp;
|
FILE *orig_fp;
|
||||||
char *orig_fn;
|
char *orig_fn;
|
||||||
char *new_fn;
|
char *new_fn;
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
sb.st_mode = 0666;
|
||||||
|
|
||||||
argv++;
|
argv++;
|
||||||
|
|
||||||
@ -61,6 +61,8 @@ int add_remove_shell_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
if (!orig_fn)
|
if (!orig_fn)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
orig_fp = fopen_for_read(orig_fn);
|
orig_fp = fopen_for_read(orig_fn);
|
||||||
|
if (orig_fp)
|
||||||
|
xfstat(fileno(orig_fp), &sb, orig_fn);
|
||||||
|
|
||||||
new_fn = xasprintf("%s.tmp", orig_fn);
|
new_fn = xasprintf("%s.tmp", orig_fn);
|
||||||
/*
|
/*
|
||||||
@ -71,13 +73,9 @@ int add_remove_shell_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
* after which it should revert to O_TRUNC.
|
* after which it should revert to O_TRUNC.
|
||||||
* For now, I settle for O_TRUNC instead.
|
* For now, I settle for O_TRUNC instead.
|
||||||
*/
|
*/
|
||||||
xmove_fd(xopen(new_fn, O_WRONLY | O_CREAT | O_TRUNC), STDOUT_FILENO);
|
xmove_fd(xopen3(new_fn, O_WRONLY | O_CREAT | O_TRUNC, sb.st_mode), STDOUT_FILENO);
|
||||||
|
/* TODO?
|
||||||
/* TODO:
|
|
||||||
struct stat sb;
|
|
||||||
xfstat(fileno(orig_fp), &sb);
|
|
||||||
xfchown(STDOUT_FILENO, sb.st_uid, sb.st_gid);
|
xfchown(STDOUT_FILENO, sb.st_uid, sb.st_gid);
|
||||||
xfchmod(STDOUT_FILENO, sb.st_mode);
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (orig_fp) {
|
if (orig_fp) {
|
||||||
@ -95,7 +93,7 @@ int add_remove_shell_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
}
|
}
|
||||||
/* we are add-shell */
|
/* we are add-shell */
|
||||||
/* mark this name as "do not add" */
|
/* mark this name as "do not add" */
|
||||||
*cpp = (char*)dont_add;
|
*cpp = dont_add;
|
||||||
}
|
}
|
||||||
cpp++;
|
cpp++;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user