start_stop_daemon: stat executable only once

function                                             old     new   delta
start_stop_daemon_main                               954     976     +22
check                                               1661    1632     -29
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 22/-29)             Total: -7 bytes
This commit is contained in:
Denis Vlasenko 2008-04-20 14:25:26 +00:00
parent 25cfe4996e
commit fe493479e2

View File

@ -32,6 +32,7 @@ struct globals {
int user_id; int user_id;
smallint quiet; smallint quiet;
smallint signal_nr; smallint signal_nr;
struct stat execstat;
}; };
#define G (*(struct globals*)&bb_common_bufsiz1) #define G (*(struct globals*)&bb_common_bufsiz1)
#define found (G.found ) #define found (G.found )
@ -42,6 +43,7 @@ struct globals {
#define user_id (G.user_id ) #define user_id (G.user_id )
#define quiet (G.quiet ) #define quiet (G.quiet )
#define signal_nr (G.signal_nr ) #define signal_nr (G.signal_nr )
#define execstat (G.execstat )
#define INIT_G() \ #define INIT_G() \
do { \ do { \
user_id = -1; \ user_id = -1; \
@ -51,13 +53,12 @@ struct globals {
static int pid_is_exec(pid_t pid) static int pid_is_exec(pid_t pid)
{ {
struct stat st, execstat; struct stat st;
char buf[sizeof("/proc//exe") + sizeof(int)*3]; char buf[sizeof("/proc//exe") + sizeof(int)*3];
sprintf(buf, "/proc/%u/exe", pid); sprintf(buf, "/proc/%u/exe", pid);
if (stat(buf, &st) < 0) if (stat(buf, &st) < 0)
return 0; return 0;
xstat(execname, &execstat);
if (st.st_dev == execstat.st_dev if (st.st_dev == execstat.st_dev
&& st.st_ino == execstat.st_ino) && st.st_ino == execstat.st_ino)
return 1; return 1;
@ -299,6 +300,8 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
if (errno) if (errno)
user_id = xuname2uid(userspec); user_id = xuname2uid(userspec);
} }
if (execname)
xstat(execname, &execstat);
do_procinit(); /* Both start and stop needs to know current processes */ do_procinit(); /* Both start and stop needs to know current processes */