diff --git a/Makefile.am b/Makefile.am index c4b250f..25c16eb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,13 +2,24 @@ bin_PROGRAMS = lsyncd lsyncd_SOURCES = lsyncd.c TESTS = tests/help.sh \ + tests/pidfile.sh \ tests/version.sh \ tests/wrong-logfile.sh \ tests/wrong-rsync.sh datarootdir = @datarootdir@ -EXTRA_DIST = config.h.in inotify-nosys.h +EXTRA_DIST = config.h.in inotify-nosys.h manpage.xml + +nodist_man1_MANS = lsyncd.1 check-syntax: $(CC) -c -O2 -Wall $(CHK_SOURCES) -o/dev/null + +lsyncd.1: manpage.xml + xsltproc -''-nonet \ + -''-param man.charmap.use.subset "0" \ + -''-param make.year.ranges "1" \ + -''-param make.single.year.ranges "1" \ + /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \ + manpage.xml diff --git a/lsyncd.c b/lsyncd.c index b32c019..71fe59c 100644 --- a/lsyncd.c +++ b/lsyncd.c @@ -73,6 +73,11 @@ char * rsync_binary = "/usr/bin/rsync"; */ char * exclude_file = NULL; +/** + * Option: pidfile, which holds the PID of the running daemon process + */ +char * pidfile = NULL; + /** * The maximum character length paths may take */ @@ -820,6 +825,7 @@ void print_help(char *arg0) printf(" --no-daemon Do not detach, log to stdout/stderr\n"); printf(" --rsync-binary FILE Call this binary to sync (DEFAULT: %s)\n", rsync_binary); + printf(" --pidfile FILE Create a file containing pid of the daemon\n"); printf(" --scarce Only log errors\n"); printf(" --version Print version an exit.\n"); printf("\n"); @@ -852,6 +858,7 @@ bool parse_options(int argc, char **argv) {"logfile", 1, NULL, 0}, {"no-daemon", 0, &flag_nodaemon, 1}, {"rsync-binary", 1, NULL, 0}, + {"pidfile", 1, NULL, 0}, {"scarce", 0, &loglevel, 3}, {"version", 0, NULL, 0}, {0, 0, 0, 0} @@ -893,6 +900,10 @@ bool parse_options(int argc, char **argv) rsync_binary = s_strdup(optarg); } + if (!strcmp("pidfile", long_options[oi].name)) { + pidfile = s_strdup(optarg); + } + } } @@ -982,6 +993,17 @@ bool parse_exclude_file() return true; } +void write_pidfile() { + FILE* f = fopen(pidfile, "w"); + if (!f) { + printlogf(LOG_ERROR, "Error: cannot write pidfile [%s]\n", pidfile); + exit(-1); + } + + fprintf(f, "%i\n", getpid()); + fclose(f); +} + /** * main */ @@ -1009,6 +1031,10 @@ int main(int argc, char **argv) printlogf(LOG_NORMAL, "Starting up"); + if (pidfile) { + write_pidfile(); + } + dir_watch_size = 2; dir_watches = s_calloc(dir_watch_size, sizeof(struct dir_watch)); diff --git a/manpage.xml b/manpage.xml new file mode 100644 index 0000000..2883bd5 --- /dev/null +++ b/manpage.xml @@ -0,0 +1,281 @@ + +.
will be generated. You may view the +manual page with: nroff -man .
| less'. A typical entry +in a Makefile or Makefile.am is: + +DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl +XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0" + +manpage.1: manpage.xml + $(XP) $(DB2MAN) $< + +The xsltproc binary is found in the xsltproc package. The XSL files are in +docbook-xsl. A description of the parameters you can use can be found in the +docbook-xsl-doc-* packages. Please remember that if you create the nroff +version in one of the debian/rules file targets (such as build), you will need +to include xsltproc and docbook-xsl in your Build-Depends control field. +Alternatively use the xmlto command/package. That will also automatically +pull in xsltproc and docbook-xsl. + +Notes for using docbook2x: docbook2x-man does not automatically create the +AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as + ... . + +To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections +read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be +found in the docbook-xsl-doc-html package. + +Validation can be done using: `xmllint -''-noout -''-valid manpage.xml` + +General documentation about man-pages and man-page-formatting: +man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/ + +--> + + + + + + + + + + + + + +]> + + + + &dhtitle; + &dhpackage; + + + &dhfirstname; + &dhsurname; + Wrote this manpage for the Debian system. +
+ &dhemail; +
+
+
+ + 2008 + &dhusername; + + + This manual page was written for the Debian system + (but may be used by others). + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU General Public License, + Version 2 or (at your option) any later version published by + the Free Software Foundation. + On Debian systems, the complete text of the GNU General Public + License can be found in + /usr/share/common-licenses/GPL. + +
+ + &dhucpackage; + &dhsection; + + + &dhpackage; + A rsync-based tool to monitor a directory and update modifications + + + + &dhpackage; + + + + + + + + + + source + target + + + &dhpackage; + + + + + + + + + + + + + + + + + DESCRIPTION + This manual page documents briefly the + &dhpackage; + command. + This manual page was written for the Debian distribution + because the original program does not have a manual page. + Instead, it has a README documentation in plain text. + + &dhpackage; is a program that uses rsync + to synchronize local directories with a remote machine running + rsyncd. Lsyncd watches multiple directory trees through + inotify. It will first rsync all directories with the remote + host, and then sync single files by collecting the inotify + events. This tool is a light-weight live mirror solution. + + + + OPTIONS + The program takes options starting with two dashes (`-'). A summary of + options is included below. + + + + + + Log debug messages + + + + + + Do not call rsync, run dry only + + + + + + Exclude file handlet to rsync (DEFAULT: None). + + + + + + Put log here (DEFAULT: /var/log/lsyncd). + + + + + + Do not detach, log to stdout/stderr. + + + + + + Call this binary to sync (DEFAULT: /usr/bin/rsync). + + + + + + Create a file with pid of application. + + + + + + Only log errors. + + + + + + + Show summary of options. + + + + + + Show version of program. + + + + + + FILES + + + /var/log/lsyncd + + The default location of log file. Make sure the + running user has write access to this file, or specify a + different log file name. + + + + + + DIAGNOSTICS + The following diagnostics may be issued + on stderr: + + + Out of memory! + + It might get out of memory. + + + + + &dhpackage; provides some return codes, that can + be used in scripts: + + Code + Diagnostic + + 0 + Program exited successfully. + + + -1 (255) + Something bad has happened. + + + + + + BUGS + TBD. + + + SEE ALSO + + + rsync + 1 + + + The programs are documented fully in README file available + in /usr/share/doc/lsyncd/README.gz. + +
+ diff --git a/tests/pidfile.sh b/tests/pidfile.sh new file mode 100755 index 0000000..9371be8 --- /dev/null +++ b/tests/pidfile.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +WORKTARGET=$(mktemp -d) +PIDFILE=$(mktemp) +LOGFILE=$(mktemp) + +./lsyncd --logfile "${LOGFILE}" --pidfile "${PIDFILE}" . "${WORKTARGET}" +sleep 1s +LSYNCPID=$(cat "${PIDFILE}") +if ! kill "${LSYNCPID}"; then + echo "kill failed" + exit 1 +fi +sleep 1s +if kill "${LSYNCPID}"; then + echo process still exists after kill + exit 1 +fi +rm "${PIDFILE}" +rm "${LOGFILE}" +rm -rf "${WORKTARGET}" +