make pidfile writing configurable.

[ui]toa_to_buf: change API. No users yet.
This commit is contained in:
Denis Vlasenko 2007-03-27 22:01:31 +00:00
parent f4d40c87d3
commit 10457b90db
9 changed files with 51 additions and 50 deletions

View File

@ -141,6 +141,13 @@ config FEATURE_CLEAN_UP
Don't enable this unless you have a really good reason to clean Don't enable this unless you have a really good reason to clean
things up manually. things up manually.
config FEATURE_PIDFILE
bool "Support writing pidfiles"
default n
help
This option makes some applets (crond, syslogd and inetd) write
a pidfile in /var/run. Some applications rely on them
config FEATURE_SUID config FEATURE_SUID
bool "Support for SUID/SGID handling" bool "Support for SUID/SGID handling"
default n default n

View File

@ -408,10 +408,11 @@ extern FILE *fopen_or_warn(const char *filename, const char *mode);
extern FILE *fopen_or_warn_stdin(const char *filename); extern FILE *fopen_or_warn_stdin(const char *filename);
extern void utoa_to_buf(unsigned n, char *buf, unsigned buflen);
extern char *utoa(unsigned n); extern char *utoa(unsigned n);
extern void itoa_to_buf(int n, char *buf, unsigned buflen);
extern char *itoa(int n); extern char *itoa(int n);
/* Returns a pointer past the formatted number, does NOT null-terminate */
extern char *utoa_to_buf(unsigned n, char *buf, unsigned buflen);
extern char *itoa_to_buf(int n, char *buf, unsigned buflen);
extern void smart_ulltoa5(unsigned long long ul, char buf[5]); extern void smart_ulltoa5(unsigned long long ul, char buf[5]);
/* Put a string of hex bytes (ala "1b"), return advanced pointer */ /* Put a string of hex bytes (ala "1b"), return advanced pointer */
extern char *bin2hex(char *buf, const char *cp, int count); extern char *bin2hex(char *buf, const char *cp, int count);
@ -542,6 +543,14 @@ extern void llist_unlink(llist_t **head, llist_t *elm);
extern void llist_free(llist_t *elm, void (*freeit)(void *data)); extern void llist_free(llist_t *elm, void (*freeit)(void *data));
extern llist_t* llist_rev(llist_t *list); extern llist_t* llist_rev(llist_t *list);
#if ENABLE_FEATURE_PIDFILE
int write_pidfile(const char *path);
#define remove_pidfile(f) ((void)unlink(f))
#else
#define write_pidfile(f) 1
#define remove_pidfile(f) ((void)0)
#endif
enum { enum {
LOGMODE_NONE = 0, LOGMODE_NONE = 0,
LOGMODE_STDIO = 1<<0, LOGMODE_STDIO = 1<<0,

View File

@ -61,6 +61,7 @@ lib-y += perror_msg.o
lib-y += perror_msg_and_die.o lib-y += perror_msg_and_die.o
lib-y += perror_nomsg.o lib-y += perror_nomsg.o
lib-y += perror_nomsg_and_die.o lib-y += perror_nomsg_and_die.o
lib-y += pidfile.o
lib-y += process_escape_sequence.o lib-y += process_escape_sequence.o
lib-y += procps.o lib-y += procps.o
lib-y += read.o lib-y += read.o

View File

@ -257,7 +257,7 @@ void smart_ulltoa5(unsigned long long ul, char buf[5])
// truncated result is always null terminated (unless buflen is 0), and // truncated result is always null terminated (unless buflen is 0), and
// contains the first few digits of the result ala strncpy. // contains the first few digits of the result ala strncpy.
void BUG_sizeof_unsigned_not_4(void); void BUG_sizeof_unsigned_not_4(void);
void utoa_to_buf(unsigned n, char *buf, unsigned buflen) char *utoa_to_buf(unsigned n, char *buf, unsigned buflen)
{ {
unsigned i, out, res; unsigned i, out, res;
if (sizeof(unsigned) != 4) if (sizeof(unsigned) != 4)
@ -273,19 +273,19 @@ void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
*buf++ = '0' + res; *buf++ = '0' + res;
} }
} }
*buf = '\0';
} }
return buf;
} }
// Convert signed integer to ascii, like utoa_to_buf() // Convert signed integer to ascii, like utoa_to_buf()
void itoa_to_buf(int n, char *buf, unsigned buflen) char *itoa_to_buf(int n, char *buf, unsigned buflen)
{ {
if (buflen && n<0) { if (buflen && n<0) {
n = -n; n = -n;
*buf++ = '-'; *buf++ = '-';
buflen--; buflen--;
} }
utoa_to_buf((unsigned)n, buf, buflen); return utoa_to_buf((unsigned)n, buf, buflen);
} }
// The following two functions use a static buffer, so calling either one a // The following two functions use a static buffer, so calling either one a
@ -300,7 +300,7 @@ static char local_buf[12];
// Convert unsigned integer to ascii using a static buffer (returned). // Convert unsigned integer to ascii using a static buffer (returned).
char *utoa(unsigned n) char *utoa(unsigned n)
{ {
utoa_to_buf(n, local_buf, sizeof(local_buf)); *(utoa_to_buf(n, local_buf, sizeof(local_buf))) = '\0';
return local_buf; return local_buf;
} }
@ -308,7 +308,7 @@ char *utoa(unsigned n)
// Convert signed integer to ascii using a static buffer (returned). // Convert signed integer to ascii using a static buffer (returned).
char *itoa(int n) char *itoa(int n)
{ {
itoa_to_buf(n, local_buf, sizeof(local_buf)); *(itoa_to_buf(n, local_buf, sizeof(local_buf))) = '\0';
return local_buf; return local_buf;
} }

View File

@ -185,6 +185,7 @@ int crond_main(int ac, char **av)
int rescan = 60; int rescan = 60;
short sleep_time = 60; short sleep_time = 60;
write_pidfile("/var/run/crond.pid");
for (;;) { for (;;) {
sleep((sleep_time + 1) - (short) (time(NULL) % sleep_time)); sleep((sleep_time + 1) - (short) (time(NULL) % sleep_time));

View File

@ -1212,7 +1212,7 @@ static void goaway(int sig ATTRIBUTE_UNUSED)
} }
(void) close(sep->se_fd); (void) close(sep->se_fd);
} }
(void) unlink(_PATH_INETDPID); remove_pidfile(_PATH_INETDPID);
exit(0); exit(0);
} }
@ -1301,13 +1301,7 @@ int inetd_main(int argc, char *argv[])
setgroups(1, &gid); setgroups(1, &gid);
} }
{ write_pidfile(_PATH_INETDPID);
FILE *fp = fopen(_PATH_INETDPID, "w");
if (fp != NULL) {
fprintf(fp, "%u\n", getpid());
fclose(fp);
}
}
if (getrlimit(RLIMIT_NOFILE, &rlim_ofile) < 0) { if (getrlimit(RLIMIT_NOFILE, &rlim_ofile) < 0) {
bb_perror_msg("getrlimit"); bb_perror_msg("getrlimit");

View File

@ -22,47 +22,35 @@ long uptime(void)
return info.uptime; return info.uptime;
} }
#if ENABLE_FEATURE_PIDFILE
static const char *saved_pidfile; static const char *saved_pidfile;
static void pidfile_delete(void) static void pidfile_delete(void)
{ {
if (saved_pidfile) if (saved_pidfile)
unlink(saved_pidfile); remove_pidfile(saved_pidfile);
} }
#endif
static int pidfile_acquire(const char *pidfile) static void create_pidfile(const char *pidfile)
{ {
int pid_fd; if (!pidfile)
if (!pidfile) return -1; return;
pid_fd = open(pidfile, O_CREAT|O_WRONLY|O_TRUNC, 0644); if (!write_pidfile(pidfile)) {
if (pid_fd < 0) { bb_perror_msg("cannot create pidfile %s", pidfile);
bb_perror_msg("cannot open pidfile %s", pidfile); return;
} else { }
#if ENABLE_FEATURE_PIDFILE
/* lockf(pid_fd, F_LOCK, 0); */ /* lockf(pid_fd, F_LOCK, 0); */
if (!saved_pidfile) if (!saved_pidfile)
atexit(pidfile_delete); atexit(pidfile_delete);
saved_pidfile = pidfile; saved_pidfile = pidfile;
} #endif
return pid_fd;
} }
static void pidfile_write_release(int pid_fd)
{
if (pid_fd < 0) return;
fdprintf(pid_fd, "%d\n", getpid());
/* lockf(pid_fd, F_UNLCK, 0); */
close(pid_fd);
}
void udhcp_make_pidfile(const char *pidfile) void udhcp_make_pidfile(const char *pidfile)
{ {
int pid_fd;
/* Make sure fd 0,1,2 are open */ /* Make sure fd 0,1,2 are open */
bb_sanitize_stdio(); bb_sanitize_stdio();
@ -70,8 +58,7 @@ void udhcp_make_pidfile(const char *pidfile)
setlinebuf(stdout); setlinebuf(stdout);
/* Create pidfile */ /* Create pidfile */
pid_fd = pidfile_acquire(pidfile); create_pidfile(pidfile);
pidfile_write_release(pid_fd);
bb_info_msg("%s (v%s) started", applet_name, BB_VER); bb_info_msg("%s (v%s) started", applet_name, BB_VER);
} }

View File

@ -49,7 +49,7 @@ static char *find_applet_by_name(const char *applet)
{ {
return NULL; return NULL;
} }
static void utoa_to_buf(unsigned n, char *buf, unsigned buflen) static char *utoa_to_buf(unsigned n, char *buf, unsigned buflen)
{ {
unsigned i, out, res; unsigned i, out, res;
assert(sizeof(unsigned) == 4); assert(sizeof(unsigned) == 4);
@ -64,22 +64,22 @@ static void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
*buf++ = '0' + res; *buf++ = '0' + res;
} }
} }
*buf = '\0';
} }
return buf;
} }
static void itoa_to_buf(int n, char *buf, unsigned buflen) static char *itoa_to_buf(int n, char *buf, unsigned buflen)
{ {
if (buflen && n < 0) { if (buflen && n < 0) {
n = -n; n = -n;
*buf++ = '-'; *buf++ = '-';
buflen--; buflen--;
} }
utoa_to_buf((unsigned)n, buf, buflen); return utoa_to_buf((unsigned)n, buf, buflen);
} }
static char local_buf[12]; static char local_buf[12];
static char *itoa(int n) static char *itoa(int n)
{ {
itoa_to_buf(n, local_buf, sizeof(local_buf)); *(itoa_to_buf(n, local_buf, sizeof(local_buf))) = '\0';
return local_buf; return local_buf;
} }
#else #else

View File

@ -519,6 +519,7 @@ static void do_syslogd(void)
signal(SIGALRM, do_mark); signal(SIGALRM, do_mark);
alarm(G.markInterval); alarm(G.markInterval);
#endif #endif
remove_pidfile("/var/run/syslogd.pid");
memset(&sunx, 0, sizeof(sunx)); memset(&sunx, 0, sizeof(sunx));
sunx.sun_family = AF_UNIX; sunx.sun_family = AF_UNIX;
@ -645,6 +646,7 @@ int syslogd_main(int argc, char **argv)
bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv); bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv);
} }
umask(0); umask(0);
write_pidfile("/var/run/syslogd.pid");
do_syslogd(); do_syslogd();
/* return EXIT_SUCCESS; */ /* return EXIT_SUCCESS; */
} }