From: Andre Noll Date: Wed, 15 Nov 2017 18:09:06 +0000 (+0100) Subject: Merge branch 'refs/heads/t/mountpoint' X-Git-Tag: v1.0.0~10 X-Git-Url: http://git.tuebingen.mpg.de/dss.git/log?p=dss.git;a=commitdiff_plain;h=c9fd9f2239319b95c46e49b1b7040e1a898cdcf7 Merge branch 'refs/heads/t/mountpoint' A new main option which aborts dss if the destination file system is not mounted. Cooking for two weeks. * refs/heads/t/mountpoint: New option: --mountpoint. --- c9fd9f2239319b95c46e49b1b7040e1a898cdcf7 diff --cc NEWS index fc80e8e,755cad2..75fe3a2 --- a/NEWS +++ b/NEWS @@@ -11,9 -11,6 +11,12 @@@ x.y.z (to be announced lopsub must be installed to compile this package. Also help2man is no longer required since lopsub has built-in roff support. + - New subcommand "configtest" to check the command line options and + the configuration file for syntactic correctness. + ++ - New option: --mountpoint. If this option is given, dss aborts if ++ no file system is mounted on the destination directory. ++ - "make install" will install the executable and the man page. - In run mode, dss no longer exits successfully if another instance diff --cc dss.c index 6353fbe,3d234ff..bd9e577 --- a/dss.c +++ b/dss.c @@@ -1064,16 -1058,34 +1065,34 @@@ static int change_to_dest_dir(void { int ret; const char *dd = OPT_STRING_VAL(DSS, DEST_DIR); + struct stat dot, dotdot; DSS_INFO_LOG(("changing cwd to %s\n", dd)); - if (chdir(dd) >= 0) - return 1; - ret = -ERRNO_TO_DSS_ERROR(errno); - DSS_ERROR_LOG(("could not change cwd to %s\n", dd)); - return ret; + if (chdir(dd) < 0) { + ret = -ERRNO_TO_DSS_ERROR(errno); + DSS_ERROR_LOG(("could not change cwd to %s\n", dd)); + return ret; + } + if (!OPT_GIVEN(DSS, MOUNTPOINT)) + return 0; + if (stat(".", &dot) < 0) { + ret = -ERRNO_TO_DSS_ERROR(errno); + DSS_ERROR_LOG(("could not stat .\n")); + return ret; + } + if (stat("..", &dotdot) < 0) { + ret = -ERRNO_TO_DSS_ERROR(errno); + DSS_ERROR_LOG(("could not stat ..\n")); + return ret; + } + if (dot.st_dev == dotdot.st_dev && dot.st_ino != dotdot.st_ino) { + DSS_ERROR_LOG(("mountpoint check failed for %s\n", dd)); + return -E_MOUNTPOINT; + } + return 1; } -static int check_config(const struct lls_command *cmd) +static int check_config(void) { int ret; uint32_t unit_interval = OPT_UINT32_VAL(DSS, UNIT_INTERVAL);