6 years agoMerge branch 'maint'
Andre Noll [Mon, 13 Nov 2017 16:23:14 +0000 (17:23 +0100)]
Merge branch 'maint'

* maint:
  Fix snapshot removal reason.

6 years agoFix snapshot removal reason. maint
Andre Noll [Sat, 11 Nov 2017 05:16:51 +0000 (06:16 +0100)]
Fix snapshot removal reason.

If the oldest snapshot has to be removed because disk space is low,
we currently log "orphaned" as the reason, which is incorrect.

6 years agoUpdate .gitignore.
Andre Noll [Mon, 6 Nov 2017 09:54:44 +0000 (10:54 +0100)]
Update .gitignore.

We never had .a files in the tree, and the .cmdline.[ch] files went
away when we switched to lopsub. The generated index.html was always

Moreover, let's add *.swp, the swap files created by vim to recover
crashed editing sessions.

6 years agoREADME/INSTALL: Fix typo: snaphot.
Andre Noll [Mon, 6 Nov 2017 02:34:39 +0000 (03:34 +0100)]
README/INSTALL: Fix typo: snaphot.

The typo in README was introduced two years ago in commit 05e75054
(README: Explain that there are no incremental backups) while the
one in INSTALL is more than five years old, see commit a0b6810b (doc:
Add a second example config file).

6 years agoINSTALL: Switch to https for rsync link.
Andre Noll [Mon, 6 Nov 2017 02:20:24 +0000 (03:20 +0100)]
INSTALL: Switch to https for rsync link.

The http link gives 502 (Couldn't parse server headers) at the moment
while https works.

6 years agoNEWS: Fix lopsub link.
Andre Noll [Mon, 6 Nov 2017 02:12:14 +0000 (03:12 +0100)]
NEWS: Fix lopsub link.

The tilde caused the URL to 404.

6 years agoMerge branch 'refs/heads/t/im-logo'
Andre Noll [Mon, 6 Nov 2017 00:27:30 +0000 (01:27 +0100)]
Merge branch 'refs/heads/t/im-logo'

One commit which changes the way dss.png is built and another one
which adds the generated dss.png to .gitignore.

* refs/heads/t/im-logo:
  Add dss.png to .gitignore.
  Replace dss.dia by a shell script.

6 years agoMerge branch 'refs/heads/t/lopsub'
Andre Noll [Sun, 15 Oct 2017 12:51:29 +0000 (14:51 +0200)]
Merge branch 'refs/heads/t/lopsub'

Conversion to lopsub and a few other improvements on top of it.

* refs/heads/t/lopsub:
  INSTALL: Explain how to use CPPFLAGS and LDFLAGS.
  build: Introduce DSS_CPPFLAGS.
  build: Fix cc command which creates dependencies,
  build: Combine CFLAGS and DEBUG_CFLAGS.
  Implement --checksum.
  run: Improve error diagnostics for chdir(2) failure.
  run: Improve error message if dss is already running.
  run: Fix exit status in case another dss process is running.
  build: Add target install and install-strip.
  Convert dss to lopsub.
  Remove --no-resume.

6 years agoRevert "ipc.c: Use ftok() instead of SuperFastHash."
Andre Noll [Wed, 6 Sep 2017 12:57:28 +0000 (14:57 +0200)]
Revert "ipc.c: Use ftok() instead of SuperFastHash."

This reverts commit c92370affe722f38a85a41d1b5524e4a102b8f4d.

This was not a good idea because ftok(3) hashes, among other
information, the inode number of the file, and this number changes
every time the configuration file is edited.

The revert conflicted slightly to the commit which renamed
get_key_or_die() to get_key() and changed the type of the return
value to key_t, but the conflict was easy to resolve.

6 years agoipc: Improve error diagnostics for kill.
Andre Noll [Sun, 16 Apr 2017 10:48:58 +0000 (12:48 +0200)]
ipc: Improve error diagnostics for kill.

If dss is not running, the kill command prints "No such file or
directory" because the call to semget(2) fails with ENOENT. This
message is a bit misleading, so let's return -E_NOT_RUNNING in this
case instead.

6 years agoAdd dss.png to .gitignore.
Andre Noll [Thu, 13 Jul 2017 19:03:48 +0000 (21:03 +0200)]
Add dss.png to .gitignore.

It's a generated file which should never be under version control.

6 years agoReplace dss.dia by a shell script.
Andre Noll [Sun, 30 Apr 2017 00:33:57 +0000 (02:33 +0200)]
Replace dss.dia by a shell script.

The dia command line tool misaligns the text on the dss logo, and the
dia application started to segfault on my home box after a library

This patch replaces the dia source file by the mklogo bash script
which runs the convert utility of ImageMagick to write the dss logo
in png format to stdout.

The result looks almost identical.

6 years agoINSTALL: Explain how to use CPPFLAGS and LDFLAGS.
Andre Noll [Thu, 13 Jul 2017 20:51:45 +0000 (22:51 +0200)]
INSTALL: Explain how to use CPPFLAGS and LDFLAGS.

6 years agobuild: Introduce DSS_CPPFLAGS.
Andre Noll [Thu, 13 Jul 2017 17:43:04 +0000 (19:43 +0200)]
build: Introduce DSS_CPPFLAGS.

As with CFLAGS, it is good practice to leave CPPFLAGS unset in the
Makefile and append it to the cc command after our own flags, to give
the user a chance to override our settings.

This patch initializes DSS_CPPFLAGS with the VERSION_STRING define
which was part of the receipe and adds -Wunused macros, which is a
preprocessor flag rather than a compiler flag.

DSS_CPPFLAGS and CPPFLAGS are added to the two relevant commands,
in addition to the existing DSS_CFLAGS and CFLAGS.

6 years agobuild: Fix cc command which creates dependencies,
Andre Noll [Thu, 13 Jul 2017 17:33:52 +0000 (19:33 +0200)]
build: Fix cc command which creates dependencies,

The command to create Makefile.deps was hardcoded as gcc in Makefile.
This patch changes the command to $(CC) and adds the usual set of
flags which we use for compiling.

6 years agobuild: Combine CFLAGS and DEBUG_CFLAGS.
Andre Noll [Thu, 13 Jul 2017 17:21:11 +0000 (19:21 +0200)]
build: Combine CFLAGS and DEBUG_CFLAGS.

We needed two sets of flags for gengetopt because the C code generated
by gengetopt would not compile cleanly with our rather strict set of
flags. With lopsub this is no longer necessary.

Moreover, it is considered good practice to not set CFLAGS at all but
to append the contents of this variable to the compile command. This
way the user may set the variable to override some of the options.

This commit gets rid of CFLAGS in favor of DSS_CFLAGS, which is just
the union of the CFLAGS and the DEBUG_CFLAGS variables we had before.

6 years agoImplement --checksum.
Andre Noll [Mon, 17 Apr 2017 17:06:37 +0000 (19:06 +0200)]
Implement --checksum.

It is considered good practice to run rsync with --checksum from time
to time. This patch implements the feature via the new --checksum

The probabilistic approach was chosen so that dss does not need to
remember which snapshots were created with --checksum.

6 years agorun: Improve error diagnostics for chdir(2) failure.
Andre Noll [Sun, 16 Apr 2017 10:01:42 +0000 (12:01 +0200)]
run: Improve error diagnostics for chdir(2) failure.

In run mode, if the destination directory does not exist, dss prints
"No such file or directory" and exits, without telling the user (a)
it was a failed chdir(2) call that caused the error, and (b) the name
of the directory. This patch adds an error message containing this

Since there is only one caller of dss_chdir(), let's get rid
of this public function in file.c and call chdir() directly from
change_to_dest_dir() of dss.c.

6 years agorun: Improve error message if dss is already running.
Andre Noll [Fri, 17 Jun 2016 07:29:12 +0000 (09:29 +0200)]
run: Improve error message if dss is already running.

The current error message, "child terminated unexpectedly", is not
very comprehensive.

The most likely reason for the child to terminate is that it could not
obtain the semaphore lock because another dss process is running. This
commit adds a test to com_run() that check this condition in the
parent before the child process is born. This way, if another process
is holding the lock, we can fail with a nice error message that also
includes the pid of the process that holds the lock.

6 years agorun: Fix exit status in case another dss process is running.
Andre Noll [Thu, 16 Jun 2016 21:21:08 +0000 (23:21 +0200)]
run: Fix exit status in case another dss process is running.

In daemon mode, we must acquire the semaphore lock in the child process
because the child does not inherit semaphore adjustments. Currently
the parent exits successfully after the fork, so the command appears
to succeed even if the child dies immediately because it was unable
to acquire the lock because another dss process is holding the lock.

This commit introduces a mechanism which enables the parent to tell
whether the child completed its setup successfully. We create a
pipe prior to calling fork(2), and let the child write to one end
of the pipe after setup is complete and just before it enters the
main select loop. The parent reads from the other end of the pipe
and exits once the read(2) call returns. If the child dies early,
read(2) returns zero, indicating failure.

6 years agobuild: Add target install and install-strip.
Andre Noll [Sun, 16 Apr 2017 11:56:09 +0000 (13:56 +0200)]
build: Add target install and install-strip.

It has always been a bit clumsy to copy the executable and the
manual page to their proper locations by hand, so this commit adds
the two standard targets "install" and "install-strip" which install
both files.

The installation prefix defaults to /usr/local and can be set with
PREFIX. Moreover, there is DESTDIR which may be given to prepend
another directory (useful for for "staged installs", where the
installed files are not placed directly into their expected location
but are instead copied into a temporary location).

6 years agoConvert dss to lopsub.
Andre Noll [Fri, 6 May 2016 14:18:24 +0000 (16:18 +0200)]
Convert dss to lopsub.

This commit ditches gengetopt for the command line and config file
parsers in favor of the lopsub library. Hence from now on, lopsub
must be installed in order to compile dss while gengetopt is no
longer needed.

The mutually exclusive gengetopt group options --create, --prune, --ls,
--run, --kill and --reload are replaced by lopsub subcommands. However,
the --reload and --kill options have been combined to the new "kill"
subcommand which allows to send arbitrary signals to a running dss

Due to the conversion, the syntax of the dss command changes
slightly. For example,

dss --run


dss run


dss -Rdc foo

needs to be spelled as

dss -c foo -- run -d

so that -d is regarded as an option to the "run" subcommand rather
than an option to dss.

With lopsub each subcommand has its own command line and config file
parser. Options to subcommands can be added to the configuration file
like this:


As for the implementation, the bulk of the changes is the conversion
of dss.ggo to the new dss.suite. The necessary adjustments to the
code are relatively simple. In particular, only dss.c needs to be
changed while all other .c files don't require any modifications.

The examples in INSTALL are adjusted to the new syntax. The commit also
drops support for Mac OS and Solaris, since lopsub is not supported
on these platforms yet.

6 years agoipc: Combine mutex_lock() and lock_dss().
Andre Noll [Sun, 16 Apr 2017 10:37:01 +0000 (12:37 +0200)]
ipc: Combine mutex_lock() and lock_dss().

The former function is only called by the latter, and both are short,
so let's combine them.

6 years agoipc: Prefer key_t over int for System V IPC keys.
Andre Noll [Fri, 17 Feb 2017 14:40:58 +0000 (15:40 +0100)]
ipc: Prefer key_t over int for System V IPC keys.

get_key() calls ftok(3), which returns a key_t value. key_t is also
the type which semget(2), the only function which receives the key via
mutex_get(), expects. It's stupid to convert the key_t from ftok(3)
into an int, only to convert it back to key_t later.

This patch changes ipc.c to use key_t everywhere. However, in
mutex_get() we print a log message containing the value of the key,
so the format string must be adjusted accordingly. Unfortunately,
on Linux, key_t is the same as int while on FreeBSD and NetBSD it is
defined as long. To avoid a warning from the compiler we use "%lx"
in the format string and cast the value to long.

6 years agoipc.c: Use ftok() instead of SuperFastHash.
Andre Noll [Fri, 17 Feb 2017 14:29:52 +0000 (15:29 +0100)]
ipc.c: Use ftok() instead of SuperFastHash.

ftok(3) uses the identity of the named file to generate a key_t type
System V IPC key, which is easier than computing the key by hashing
the (resolved) pathname of the config file. This change allows to
get rid of the realpath() and the super_fast_hash() implementation.

If ftok(3) fails, presumably because the underlying call to stat(2)
fails, we now simply return a phony identifier, similar to what we did
before in this case. This eliminates the only possible failure path
in get_key_or_die(), so this function is renamed to get_key().

6 years agoRemove --no-resume.
Andre Noll [Mon, 9 May 2016 09:03:45 +0000 (11:03 +0200)]
Remove --no-resume.

There is no real reason for this option. Resuming a previously
cancelled snapshot is generally a very good idea, so the option is
kind of pointless. Remove it.

6 years agodss-0.1.7. v0.1.7
Andre Noll [Sun, 16 Apr 2017 11:43:20 +0000 (13:43 +0200)]

A couple of fixes and improvements have accumulated over the last
year, so here's dss-0.1.7. Most likely this is going to be the last
0.1.x release.

6 years agoDon't shadow cmdline_parser_params in main().
Andre Noll [Sun, 16 Apr 2017 11:25:10 +0000 (13:25 +0200)]
Don't shadow cmdline_parser_params in main().

This avoids

dss.c:1519:32: warning: declaration of 'params' shadows a previous local [-Wshadow]

The warning is harmless, though.

6 years agoipc.c: Uninline get_key_or_die().
Andre Noll [Fri, 17 Feb 2017 14:36:50 +0000 (15:36 +0100)]
ipc.c: Uninline get_key_or_die().

This function is rather big, so it's not clear whether it should
be inlined or not. Without the inline attribute, that's up to the
compiler to decide.

6 years agoipc.c: Constify parameter of get_key_or_die().
Andre Noll [Fri, 17 Feb 2017 14:15:10 +0000 (15:15 +0100)]
ipc.c: Constify parameter of get_key_or_die().

The function only reads from the location pointed at by the config_file

6 years agoipc: Fix error code returned by mutex_lock().
Andre Noll [Sun, 16 Apr 2017 10:18:11 +0000 (12:18 +0200)]
ipc: Fix error code returned by mutex_lock().

In the error case do_semop() already returns the error code which
corresponds to errno.

7 years agoImprove log message for snapshot creation.
Andre Noll [Tue, 23 Aug 2016 11:26:25 +0000 (13:26 +0200)]
Improve log message for snapshot creation.

The log message that prints the name of the snapshot which is going to
be recycled is kind of interesting and deserves the "notice" severity.

The "creating new snapshot" message is a bit misleading in case we
decided to recycle a snapshot, so drop the word "new".

7 years agoipc: Simplify mutex_try_lock().
Andre Noll [Fri, 17 Jun 2016 07:18:40 +0000 (09:18 +0200)]
ipc: Simplify mutex_try_lock().

There is no need to actually obtain the lock. A single semaphore
operation will do just fine. With sem_op equal to zero and IPC_NOWAIT
the semop() call returns immediately, and the return value tells
whether the semaphore value was zero.

Rename the (static) function to mutex_is_locked() to indicate that
it performs only read-only operations on the semaphore set.

7 years agoipc: Make pid pointer optional.
Andre Noll [Thu, 16 Jun 2016 21:06:29 +0000 (23:06 +0200)]
ipc: Make pid pointer optional.

This changes get_dss_pid() to handle the case where the caller passed
a NULL pid pointer. Conversely, if pid is not NULL, we now make sure
to initialize the given address in all cases.

The single caller currently never passes NULL, so this change is just
defensive programming, protecting against future users. Be liberal
in what you accept, be strict in what you return..

7 years agodaemon: Do not change to /.
Andre Noll [Tue, 14 Jun 2016 08:40:22 +0000 (10:40 +0200)]
daemon: Do not change to /.

This is pointless because we immediately cd back into the destination
dir anyway.

7 years agobuild: Add two more warning options.
Andre Noll [Tue, 7 Jun 2016 14:23:36 +0000 (16:23 +0200)]
build: Add two more warning options.

Both -Wunused-parameter and -Wshadow were added to gcc long ago. In
particular gcc-4.6.3, which ships with Ubuntu-12.04, supports them. It
should thus be safe to enable both warnings unconditionally.

7 years agodss.c: Add missing inclusion of <stdio.h>.
Andre Noll [Tue, 7 Jun 2016 14:29:38 +0000 (16:29 +0200)]
dss.c: Add missing inclusion of <stdio.h>.

This is required for example for rename(2). Compilation succeeds without
the include only because the gengetopt header includes stdio.h as well and
we happen to include this header before fd.h.

7 years agodss: Make argument of parse_config_file() a boolean.
Andre Noll [Mon, 16 May 2016 12:55:28 +0000 (14:55 +0200)]
dss: Make argument of parse_config_file() a boolean.

It is used as such, so there is no point to have an int here. Also
rename the argument from override to sighup to indicate that we
need to distinguish whether the function is called at startup or
because the dss process received SIGHUP.

7 years agoMerge branch 'refs/heads/t/shadow-fix'
Andre Noll [Sun, 21 Aug 2016 19:10:56 +0000 (21:10 +0200)]
Merge branch 'refs/heads/t/shadow-fix'

started 6 weeks ago, cooking for two weeks.

* refs/heads/t/shadow-fix:
  dss: Do not shadow a global declaration.

7 years agodss: Do not shadow a global declaration.
Andre Noll [Fri, 17 Jun 2016 08:17:28 +0000 (10:17 +0200)]
dss: Do not shadow a global declaration.

num_complete_snapshots is a local variable in
compute_next_snapshot_time(), but also the name of a public function
declared in snap.h, causing a warning on some (old) gcc versions.

This patch avoids the ambiguity and thus the warning by renaming the
variable. It was unusually long anyway.

7 years agoCreate html version of the man page with groff.
Andre Noll [Mon, 20 Jun 2016 14:34:37 +0000 (16:34 +0200)]
Create html version of the man page with groff.

The html post processor of groff can directly create html, which is
expected to be of higher quality than the html generated by man2html. A
brief look at the "official" web site of man2html (as mentioned in the
description of the Ubuntu-14.04 package)


shows why.

7 years agoConvert INSTALL and NEWS to markdown format.
Andre Noll [Mon, 20 Jun 2016 14:05:31 +0000 (16:05 +0200)]
Convert INSTALL and NEWS to markdown format.

The grutatxt project is dead, so we have to switch to something else
eventually. Fortunately, there are only three files in grutatxt format,
one of which (README) does not need any changes. The other two are
converted to markdown format in this commit. This is a rather simple
matter since only section headings, links and preformatted text need
slight adjustments.

The commands in the Makefile are modified to run markdown(1) instead
of grutatxt(1).

7 years agoFix rsync exit handling in create mode.
Andre Noll [Mon, 13 Jun 2016 15:54:37 +0000 (17:54 +0200)]
Fix rsync exit handling in create mode.

The logic in handle_rsync_exit() is horribly broken in case dss is
run in create mode and the rsync process terminates unsuccessfully.

First we claim to restart rsync, which is wrong. Next we call the
post-create hook despite the documentation says that this hook is
only run on *successful* termination. Finally, we dereference a NULL
pointer to print the path of the snapshot.

Fortunately, all three issues are easy to fix by special casing create
mode in handle_rsync_exit().

7 years agodss.c: Remove pointless comment for main().
Andre Noll [Sat, 11 Jun 2016 13:01:07 +0000 (15:01 +0200)]
dss.c: Remove pointless comment for main().

Clear case of "stating the obvious".

7 years agoRemove orphaned snapshots even if disk space is not low.
Andre Noll [Tue, 29 Dec 2015 15:33:11 +0000 (15:33 +0000)]
Remove orphaned snapshots even if disk space is not low.

Due to the previous patch, this is only executed if we have too many
snapshot anyway.

7 years agoAlways try to keep one snapshot for recycling.
Andre Noll [Tue, 29 Dec 2015 15:28:02 +0000 (15:28 +0000)]
Always try to keep one snapshot for recycling.

Currently, if --keep-redundant is not given, we try to get rid of
outdated and redundant snapshots quickly, even if there is plenty of
free disk space available. However, as these snapshots can be used
for recycling, it seems to be worth to keep them around as long as
there are fewer snapshots available as configured.

This commit changes try_to_free_disk_space() to not remove snapshots
any more in this case. This patch should reduce disk I/O in the common
case where no snapshots need to be removed due to low disk space.

7 years agotry_to_free_disk_space(): Explain what is going on.
Andre Noll [Tue, 29 Dec 2015 15:27:06 +0000 (15:27 +0000)]
try_to_free_disk_space(): Explain what is going on.

This adds a comment which explains the conditions that must be
satisfied to get to this point in the function.

7 years agoAllow to run in daemon mode without log file.
Andre Noll [Tue, 29 Dec 2015 16:10:05 +0000 (16:10 +0000)]
Allow to run in daemon mode without log file.

It's kind of silly to insist in having a log file in daemon mode.

This commit removes the dependency of --daemon on --logfile and makes
/dev/null the default log file. Consequently, running dss --daemon
--run without specifying --logfile no longer fails, and nothing will
be logged by default.

The documentation is updated accordingly.

7 years agoImprove documentation of --keep-redundant.
Andre Noll [Tue, 29 Dec 2015 16:42:18 +0000 (16:42 +0000)]
Improve documentation of --keep-redundant.

The help text for --keep-redundant was rather convoluted. This commit
shortens the text with no essential semantic change.

The patch also removes the sentence that encourages to specify this
option if the destination directory is only used for snapshots. After
all, most file systems allow to create an insane number of files,
so keeping snapshots around forever can result in a file system that
can no longer be checked or repaired due to the excessive number of
used inodes.

7 years agoImprove documentation of interval-related args.
Andre Noll [Tue, 29 Dec 2015 15:52:32 +0000 (15:52 +0000)]
Improve documentation of interval-related args.

Minor rewording of the help text for the --unit-interval option and
a new sentence which explains that the total number of snapshots
doubles if --num-intervals is increased by one.

7 years agoREADME: Explain that there are no incremental backups.
Andre Noll [Wed, 16 Dec 2015 13:52:54 +0000 (14:52 +0100)]
README: Explain that there are no incremental backups.

This was unclear to an admin who had used dss for several years! So
maybe it is a good idea to explain the idea behind hardlink-based
backups a bit more.

This commit adds two new sentences to README, one for the admin and
another one for the user.

8 years agodss-0.1.6. v0.1.6
Andre Noll [Wed, 5 Aug 2015 11:06:10 +0000 (13:06 +0200)]

8 years agoMerge branch 'refs/heads/t/signal_handler_improvement'
Andre Noll [Wed, 5 Aug 2015 10:52:47 +0000 (12:52 +0200)]
Merge branch 'refs/heads/t/signal_handler_improvement'

A single commit that was cooking for over a month.

8 years agoMerge branch 'refs/heads/t/nullrw'
Andre Noll [Sun, 10 May 2015 11:59:19 +0000 (13:59 +0200)]
Merge branch 'refs/heads/t/nullrw'

8 years agoINSTALL: Reword sentence about gengetopt.
Andre Noll [Fri, 24 Apr 2015 14:42:03 +0000 (16:42 +0200)]
INSTALL: Reword sentence about gengetopt.

The latest version of gengetopt is two years old, so it hardly makes
sense to talk about a "recent version".

Also link to the gengetopt web page rather than to the FTP server.

8 years agodaemon.c: Open /dev/null read-write.
Andre Noll [Mon, 30 Mar 2015 16:20:16 +0000 (16:20 +0000)]
daemon.c: Open /dev/null read-write.

While daemonizing we redirect stdin, stdout and stderr to /dev/null,
which is considered good practice. We should, however, open these
two devices in read-write mode rather than read-only, since not being
able to write to stdout/stderr might confuse rsync and the hooks.

8 years agoNEWS: Fix typo.
Andre Noll [Mon, 23 Mar 2015 13:32:15 +0000 (14:32 +0100)]
NEWS: Fix typo.

This typo was introduced in commit 34653268 (Add NEWS file) years ago,
apparently by pasting the content from the freshmeat web page to the
NEWS file.

8 years agoMerge branch 'refs/heads/t/max-errors'
Andre Noll [Wed, 25 Feb 2015 12:23:56 +0000 (13:23 +0100)]
Merge branch 'refs/heads/t/max-errors'

The topic branch was cooking for about a week, and it was tested with
no problems on several multi-terabyte file systems.

* Rework restart logic, introduce --max-errors.
* Fix typo in help text of --daemon.

8 years agoImprove signal handler.
Andre Noll [Wed, 25 Feb 2015 10:15:33 +0000 (11:15 +0100)]
Improve signal handler.

The signal handler of dss has two issues: (a) it does not check the
return value of the write(2) call, and (b) it does not restore errno
on exit. The second issue might cause problems on systems where
write(2) sets errno also on success. Those problems would be very
hard to reproduce and debug. So it is probably a good idea to be
conservative here.

This commit fixes (a) by printing an error message and calling exit(3)
if the write to the signal pipe failed or resulted in a short write.
As for (b), we now save a copy of errno before the write(2) call,
and restore the old value on success.

8 years agoRework restart logic, introduce --max-errors.
Andre Noll [Fri, 12 Dec 2014 14:05:21 +0000 (15:05 +0100)]
Rework restart logic, introduce --max-errors.

It has happened several times in the past that dss made no progress
because the underlying rsync command terminates with exit code 13
(Errors with program diagnostics). Currently dss special cases this
exit code as a non-fatal error, i.e. it does not terminate but restarts
the rsync command after 60 seconds. If the problem is permanent,
no new snapshots will be created, but the exit hook is not called
either, which is unfortunate.

This commit tries to improve on this. With this patch applied, the
only non-fatal exit code from rsync is 24 (Partial transfer due
to vanished source files), which is actually considered success.
All other non-zero exit codes cause dss to restart the rsync command,
but only at most N times, where N is the argument given to the new
--max-rsync-errors option.

8 years agoFix typo in help text of --daemon.
Andre Noll [Tue, 27 Jan 2015 09:47:19 +0000 (10:47 +0100)]
Fix typo in help text of --daemon.

8 years agostr.c: Remove vsnprintf() workaround for old glibc.
Andre Noll [Tue, 6 Jan 2015 16:12:33 +0000 (17:12 +0100)]
str.c: Remove vsnprintf() workaround for old glibc.

Since glibc-2.1 was released 16 years ago, the workaround for glibc-2.0
is no longer necessary. Even the example code of printf(3) dropped it.

8 years agostr.c: Get rid of VSPRINTF macro.
Andre Noll [Sat, 3 Jan 2015 16:54:36 +0000 (16:54 +0000)]
str.c: Get rid of VSPRINTF macro.

It has only one user, make_message(), so it's simpler to include the
code there.

8 years agoAssorted typo fixes in comments.
Andre Noll [Sat, 3 Jan 2015 16:34:48 +0000 (16:34 +0000)]
Assorted typo fixes in comments.

8 years agoFix typo in documentation of --logfile.
Andre Noll [Sat, 3 Jan 2015 16:23:55 +0000 (16:23 +0000)]
Fix typo in documentation of --logfile.

8 years agoShut down the signal subsystem on exit.
Andre Noll [Sat, 3 Jan 2015 16:16:02 +0000 (16:16 +0000)]
Shut down the signal subsystem on exit.

No biggy since we exit anyway a few lines later, but still..

8 years agotv.c: Remove unused functions.
Andre Noll [Sat, 3 Jan 2015 16:11:06 +0000 (16:11 +0000)]
tv.c: Remove unused functions.

Quite a few public functions of tv.c are not used anywhere in dss,
so let's get rid of them. We can easily add them back in case they
are neeed in the future.

Found by cppcheck.

8 years agostr.c: Remove pointless initialization.
Andre Noll [Sat, 3 Jan 2015 16:08:00 +0000 (16:08 +0000)]
str.c: Remove pointless initialization.

The variable p is initialized to a different value a few lines later
and the value set in the definition is not used in between.

Found by cppcheck.

8 years agoRemove non-functional SEE ALSO links from index.html.
Andre Noll [Sat, 3 Jan 2015 16:05:58 +0000 (16:05 +0000)]
Remove non-functional SEE ALSO links from index.html.

It's nice to have references to ssh and rsync in the SEE ALSO section
of the man page. On the web page, however, they do not add much value
since the links generated by man2html do not work. This patch omits
the broken links.

8 years agoNEWS update
Andre Noll [Tue, 6 Jan 2015 19:54:55 +0000 (20:54 +0100)]
NEWS update

8 years agoChange background color of web pages to white.
Andre Noll [Mon, 18 Aug 2014 12:01:34 +0000 (14:01 +0200)]
Change background color of web pages to white.

The old colors looked a little like the 90s ;)

8 years agoMerge branch 'refs/heads/t/min-complete'
Andre Noll [Fri, 12 Dec 2014 13:21:53 +0000 (14:21 +0100)]
Merge branch 'refs/heads/t/min-complete'

9 years agoNEWS: Fix indentation of 0.1.5 items.
Andre Noll [Wed, 24 Sep 2014 13:39:41 +0000 (15:39 +0200)]
NEWS: Fix indentation of 0.1.5 items.

The generated html looked terrible. No real changes.

9 years agoindex.html.in: Fix gitweb link.
Andre Noll [Wed, 24 Sep 2014 13:28:39 +0000 (15:28 +0200)]
index.html.in: Fix gitweb link.

Apparently the symlink workaround for the gitweb pages on
git.tuebingen.mpg.de does not work any more although the symlink
dss->dss.git is still in place.

This commit changes the link on the web page to include the .git

9 years agoIntroduce --min-complete.
Andre Noll [Tue, 18 Feb 2014 13:16:02 +0000 (14:16 +0100)]
Introduce --min-complete.

Currently dss cowardly refuses to remove the last complete snapshot
even if disk space is low, and fails if there is not enough disk space
left for a second snapshot. However, in some situations it is more
important to have a recent snapshot and to to keep dss up and running.

This commit introduces a new integer option, --min-complete, which
defaults to one to resemble the old behaviour.

If it is set to zero, dss will happily remove the last complete
snapshot, even if it is used as the reference directory for rsync's
--link-dest option. This is dangerous, but it's the only way to keep
dss going.

Conversely, --min-complete may be set to a value greater than one
to guarantee there is always a certain number of complete snapshots

9 years agoChange email address and URLs.
Andre Noll [Sat, 16 Aug 2014 10:00:18 +0000 (12:00 +0200)]
Change email address and URLs.

The web and email service of systemlinux.org was down for two
weeks. Meanwhile the dss web pages found a new home at the MPI campus
of Tübingen.

This commit changes the email addresses and the home page URL.

9 years agoSilence clang warnings.
Andre Noll [Tue, 21 Jan 2014 15:56:37 +0000 (16:56 +0100)]
Silence clang warnings.

The -Wno-sign-compare option is supposed to not print the noisy
warnings for comparisons between signed and unsigned values.
Currently, in DEBUG_CFLAGS this option is followed by -W which causes
clang (but not gcc) to turn on these warnings again. As CFLAGS contains
-Wall, the -W option was redundant anyway, so this patch removes it.

9 years agodss-0.1.5. v0.1.5
Andre Noll [Tue, 14 Jan 2014 14:22:04 +0000 (15:22 +0100)]

9 years agoMerge branch 't/exit_fix'
Andre Noll [Tue, 14 Jan 2014 14:15:38 +0000 (15:15 +0100)]
Merge branch 't/exit_fix'

Was cooking since 2013-10.

10 years agoMerge branch 't/dia'
Andre Noll [Wed, 16 Oct 2013 12:35:46 +0000 (14:35 +0200)]
Merge branch 't/dia'

The single commit of this branch is more than one year old. I totally
forgot about it, but here it is:

311ec5 Switch logo from skencil to dia.

The web page has been updated to contain the new image.

10 years agoKill children on fatal errors.
Andre Noll [Wed, 16 Oct 2013 12:17:46 +0000 (14:17 +0200)]
Kill children on fatal errors.

If dss is about to die because it received SIGINT or SIGTERM, we first
restart the rsync process by sending SIGCONT, then send SIGTERM to
both the rsync and the rm process to get rid of any child processes.

This works fine, but there are other fatal errors for which we miss
to clean up as thoroughly, most importantly if there is not enough
free disk space for a single snapshot.

This patch moves the signal-related cleanup part to the new function
kill_children(), and changes handle_signal() and com_run() to call
this function right before the exit hook is invoked.

10 years agoTrivial: Remove trailing semicolon.
Andre Noll [Wed, 16 Oct 2013 12:28:23 +0000 (14:28 +0200)]
Trivial: Remove trailing semicolon.

10 years agorsync: Remove hardcoded --quiet option.
Andre Noll [Thu, 20 Dec 2012 13:38:41 +0000 (14:38 +0100)]
rsync: Remove hardcoded --quiet option.

When running in daemon mode, the stdout and stderr stream of dss and
all its child processes are redirected to /dev/null. In particular any
output from the rsync process is discarded. Therefore, whenever a new
snapshot is created, dss currently passes --quiet to the underlying
rsync command, along with --archive and --delete.

However, as was pointed out by Sebastian Schultheiß, if the rsync
command fails for unknown reasons, the --quiet option complicates
debugging for the questionable benefit of saving the I/O for a few
writes to /dev/null.

This patch removes the --quiet option.

10 years agoMerge branch 't/zero-rsync-fix'
Andre Noll [Thu, 20 Dec 2012 13:36:42 +0000 (14:36 +0100)]
Merge branch 't/zero-rsync-fix'

11 years agoReject insane number of intervals.
Andre Noll [Sun, 28 Oct 2012 19:11:16 +0000 (20:11 +0100)]
Reject insane number of intervals.

Nobody needs more than 2^30 snapshots. More importantly, values
larger than 32 for --num_intervals cause an integer overflow in
desired_number_of_snapshots() because the number of snapshots in
interval zero does not fit in an unsigned int in this case.

This patch adds a test to check_config() that rejects values larger
than 30 for the --num_intervals option.

Many thanks to Klaus Kopec for pointing out this bug.

11 years agoDon't create two snapshots in the same second.
Andre Noll [Mon, 1 Oct 2012 17:10:02 +0000 (19:10 +0200)]
Don't create two snapshots in the same second.

This can only happen if all of the follwing are true:

(a) source and destination directories are small
(b) rsync completes successfully within one second
(c) At most two snapshots are missing

In this case the rename() call which changes the snapshot name from
*-incomplete to the proper name fails for the second snapshot with
EEXIST. This is because the previous snapshot name coincides with
the name of the second snapshot.

The fix is a bit ugly but also non-invasive and simple: Just sleep
one second in this case.

11 years agoMerge branch 't/rename_system_files'
Andre Noll [Sun, 16 Sep 2012 11:34:07 +0000 (13:34 +0200)]
Merge branch 't/rename_system_files'

Has been cooking for several weeks. The conflicts


are trivial and can be resolved easily.

11 years agoSwitch logo from skencil to dia.
Andre Noll [Wed, 8 Aug 2012 19:47:56 +0000 (21:47 +0200)]
Switch logo from skencil to dia.

The sketch/skencil project appears to be inactive for years, and
it is no longer shipped on recent Linux distributions. This commit
replaces the sketch source file dss.sk by dss.dia, a source file for
dia, an GTK+ based diagram creation program. The new logo looks very
similar to the old one but was created from scratch.

dia allows to convert a .dia file to PNG image data. This patch also
adjusts the Makefile to produce the dss.png logo from dss.dia.

11 years agoRename source files which also exist as system headers.
Andre Noll [Sat, 11 Aug 2012 18:32:19 +0000 (20:32 +0200)]
Rename source files which also exist as system headers.

As pointed out by Daniel Richard G. some of the dss header files
are named the same as system header files.

This patch renames these headers as well as their corresponding .c
files. Specifically, error.h, fd.h, signal.h, string.h and time.h
become err.h, file.h, sig.h, str.h and tv.h.

11 years agoMake the dss log facility C89 conform.
Daniel Richard G [Fri, 10 Aug 2012 12:41:22 +0000 (14:41 +0200)]
Make the dss log facility C89 conform.

Variadic macros were introduced in C99, so they are not supported on
ANSI C compilers. Since currently all DSS_*_LOG macros are variadic,
we need a replacement for these. Moreover, since not all compilers
support __func__ or an equivalent, we need to check for this feature
as well and provide a workaround if necessary.

This patch introduces the new public function dss_log_set_params()
which saves the given log level, filename, line number and the
function name in global variables. The DSS_*_LOG macros are changed
to receive a single argument only, which is the usual variadic list,
enclosed in additional parentheses.

The new DSS_*_LOG macros first set the log parameters by calling
dss_log_set_params(), then call dss_log() with the variadic list as
the argument. dss_log() is patched to print the function name only
if __func__ is supported and fall back to file name and the line
number otherwise.

All DSS_*_LOG() calls are changed to the new syntax.

11 years agoipc.c: Eliminate per-field struct initializations.
Daniel Richard G [Fri, 10 Aug 2012 12:20:57 +0000 (14:20 +0200)]
ipc.c: Eliminate per-field struct initializations.

This replaces the C99-only initializations in mutex_lock() and
mutex_try_lock() by equivalent but portable code.

11 years agoHave foo.c #include foo.h.
Daniel Richard G [Fri, 10 Aug 2012 12:16:22 +0000 (14:16 +0200)]
Have foo.c #include foo.h.

This is both to ensure function signature consistency, and to
eliminate GCC's "no previous declaration for _____" warnings.

11 years agoMark find_oldest_removable_snapshot() as static.
Daniel Richard G [Fri, 10 Aug 2012 12:10:55 +0000 (14:10 +0200)]
Mark find_oldest_removable_snapshot() as static.

It is not used outside the source file in which it is defined.

11 years agoMerge branch 't/gcc-compat_fix'
Andre Noll [Wed, 15 Aug 2012 09:34:48 +0000 (11:34 +0200)]
Merge branch 't/gcc-compat_fix'

* e1f886 Only define gcc function attributes on gcc.

11 years agoMerge branch 't/cleanups'
Andre Noll [Wed, 15 Aug 2012 09:32:10 +0000 (11:32 +0200)]
Merge branch 't/cleanups'

The changes in this branch are an attempt to make dss compile cleanly
with the more strict compiler flags (GCC 4.6 on Linux).

    -pedantic -fno-common -W -Wall -Wcast-align -Wformat=2
    -Wpointer-arith -Wundef -Waggregate-return -Wcast-qual
    -Wmissing-declarations -Wnested-externs -Wstrict-prototypes

This is only a first step that addresses the easier warnings. Some,
like the ones stemming from the variadic macros, have yet to be fixed.

* 9e6c2f Remove some debug messages.
* 899f88 string.c: Fix a statement-before-declaration issue.
* 83ebb4 Remove trailing commas.
* 2ed0d7 snap.h: Fix HSA_ITEM.
* 508350 Fix "comma after last element" warning.
* 97fbf4 compare_snapshots(): Add const keyword.
* b28495 Avoid per-element initializers.
* 9528cf dss.c: Fix initialization of argv[].
* 4526f9 dss.c: Remove redundant const.
* 2183c6 Makefile: Split CPPFLAGS.


11 years agoMerge branch 't/ipc'
Andre Noll [Fri, 10 Aug 2012 11:49:54 +0000 (13:49 +0200)]
Merge branch 't/ipc'

4d9f41 mutex_get(): Change parameter from key_t to int.
55c90e Implement --reload.
492928 Add the --kill subcommand.
dd42f7 Use semaphore locking to avoid starting dss multiple times.
17eea8 Introduce get_config_file_name().

That topic was cooking in next for a quite some time now.

11 years agoOnly define gcc function attributes on gcc.
Daniel Richard G [Mon, 6 Aug 2012 18:39:53 +0000 (20:39 +0200)]
Only define gcc function attributes on gcc.

These gcc extensions help the compiler optimize function calls,
but are unavailable if dss is not compiled with gcc.

This patch defines the corresponding macros to empty if __GNUC__
is not defined, or if the gcc version is too old to support the
particular function attribute.

11 years agoRemove some debug messages.
Daniel Richard G [Thu, 2 Aug 2012 18:04:42 +0000 (20:04 +0200)]
Remove some debug messages.

These were only helpful during development and are commented out
for quite some time now. Remove them.

11 years agostring.c: Fix a statement-before-declaration issue.
Daniel Richard G [Thu, 2 Aug 2012 18:00:29 +0000 (20:00 +0200)]
string.c: Fix a statement-before-declaration issue.

11 years agoRemove trailing commas.
Daniel Richard G [Sat, 4 Aug 2012 11:22:53 +0000 (13:22 +0200)]
Remove trailing commas.