On Wednesday 20 October 2010 01:49, Denys Vlasenko wrote:
> On Wednesday 20 October 2010 01:23, Alexander Shishkin wrote:
> > On Tue, Oct 19, 2010 at 11:18:43 +0200, Denys Vlasenko wrote:
> > > On Tuesday 19 October 2010 22:33, Alexander Shishkin wrote:
> > > > [Sorry, the previous mail seems to have been eaten by the smarthost,
> > > > apologies if it comes twice.]
> > > > 
> > > > function                                             old     new   delta
> > > > add_shell_main                                         -     459    +459
> > > > .rodata                                            50375   50495    +120
> > > > chomp                                                  -      24     +24
> > > > applet_names                                         920     943     +23
> > > > packed_usage                                        1640    1661     +21
> > > > applet_main                                         1232    1248     +16
> > > > applet_nameofs                                       308     312      +4
> > > > ------------------------------------------------------------------------------
> > > > (add/remove: 4/0 grow/shrink: 5/0 up/down: 667/0)             Total: 
> > > > 667 bytes
> > > > 
> > > > Signed-off-by: Alexander Shishkin <[email protected]>
> > > 
> > > This seems to be trivially scriptable in sh.
> > > 
> > > Why do you need it? (I ask because sometimes there _is_ a valid,
> > > but unknown to me, reason to have this or that tool in bbox).
> > 
> > Well, I like my busybox to be a real swiss army knife, so that I can
> > grab it, compile it and put a single binary to where I need it and
> > have all the tools that I need in that binary. (as opposed to dragging
> > scripts and their dependencies around) And sometimes the only thing
> > that you can rely on a system is a statically linked busybox.
> > 
> > Also, I would like to see busybox as a potential replacement for the
> > base GNU tools in a desktop system one day. Adding applets that you
> > don't necessarily have to compile in, but that get busybox closer to
> > being all-in-one drop-in replacement is something worth doing, imo.
> > 
> > Other than that, I try to avoid shell scripting if I can help it and
> > my script-foo is not good enough to produce a tolerably good version
> > of add/remove-shell in 667 bytes. A C implementation is something
> > that I'm willing to work on, though.
> 
> Ah, so there _are_ such tools (add-shell and remove-shell)
> in standard Linux repertoire! I didn't know it.
> 
> Do you provide compatible behavior?
> 
> Maybe it makes sense to do
> 
>       default y if DESKTOP
> 
> (IIRC this syntax is supported in Config files)
> to placate "true" embedded guys who undoubtedly won't like proliferation
> of "stupid applets which should be shell scripts"?
> 

Randonly googled up page, http://man.he.net/man8/add-shell, says:

       add-shell  copy /etc/shells to /etc/shells.tmp, add the given shells to
       this file if they are not already present, and copy this temporary file
       back to /etc/shells.

This seems to be much saner way to update the file atomically than
messing with locking stuff:

+               lock.l_type = F_WRLCK;
+               lock.l_whence = SEEK_SET;
+               lock.l_start = 0;
+               lock.l_len = 0;
+               if (fcntl(fileno(orig), F_SETLK, &lock) < 0)
+                       bb_perror_msg("warning: can't lock '%s'", orig_fn);
+               lock.l_type = F_UNLCK;


Don't forget to use xmalloc_follow_symlinks, to care for people
whose /etc/shells is a symlink. Basically:

        filename = xmalloc_follow_symlinks("/etc/shells");
        if (filename == NULL)
                BOOM;
        fnamesfx = xasprintf("%s.tmp", filename);
        fd = xopen(fnamesfx, O_WRONLY | O_CREAT | O_EXCL);
        ...
        rename(fnamesfx, filename);

-- 
vda
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to