[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[RFC] Allow cancelation of NTP synchronisation



Hi!

As NTP packets can be blocked by a wrong network configuration (or not
working well within qemu "user" network emulation), having to wait 30
seconds until rdate failure can sometime be a little frustrating.

These two patchs allow NTP synchronisation to be canceled in the
installer.

The first patch is against rdate, and adds, when -vv is specified on the
command-line, the output of single dot (".") for each NTP query sent.

The second patch modifies clock-setup to use these dots in order to
step the progress bar on each of these dots.  In case of a cancelation,
rdate is killed on SIGPIPE due to the standard output closure.

It looked as the easiest way to make NTP synchronisation cancelable, but
I might be wrong. :)  Comments happily welcome. :)

Cheers,
-- 
Jérémy Bobbio                        .''`. 
lunar@debian.org                    : :Ⓐ  :  # apt-get install anarchism
                                    `. `'` 
                                      `-   
diff -u rdate-1.1.3/src/rdate.c rdate-1.1.3/src/rdate.c
--- rdate-1.1.3/src/rdate.c
+++ rdate-1.1.3/src/rdate.c
@@ -70,7 +70,7 @@
 #endif
 
 void rfc868time_client (const char *, int, struct timeval *, struct timeval *, int, int, int);
-void ntp_client (const char *, int, struct timeval *, struct timeval *, int, int);
+void ntp_client (const char *, int, struct timeval *, struct timeval *, int, int, int);
 
 extern char    *__progname;
 
@@ -157,7 +157,7 @@
 	hname = argv[optind];
 
 	if (ntp)
-		ntp_client(hname, family, &new, &adjust, corrleaps, port);
+		ntp_client(hname, family, &new, &adjust, corrleaps, port, verbose);
 	else
 		rfc868time_client(hname, family, &new, &adjust, corrleaps, useudp, port);
 
diff -u rdate-1.1.3/src/ntp.c rdate-1.1.3/src/ntp.c
--- rdate-1.1.3/src/ntp.c
+++ rdate-1.1.3/src/ntp.c
@@ -110,8 +110,8 @@
 	u_int64_t	xmitck;
 };
 
-void	ntp_client(const char *, int, struct timeval *, struct timeval *, int, int);
-int	sync_ntp(int, const struct sockaddr *, double *, double *);
+void	ntp_client(const char *, int, struct timeval *, struct timeval *, int, int, int);
+int	sync_ntp(int, const struct sockaddr *, double *, double *, int);
 int	write_packet(int, struct ntp_data *);
 int	read_packet(int, struct ntp_data *, double *, double *);
 void	unpack_ntp(struct ntp_data *, u_char *);
@@ -126,7 +126,7 @@
 
 void
 ntp_client(const char *hostname, int family, struct timeval *new,
-    struct timeval *adjust, int leapflag, int port)
+    struct timeval *adjust, int leapflag, int port, int verbose)
 {
 	struct addrinfo hints, *res0, *res;
 	double offset, error;
@@ -155,7 +155,7 @@
 			((struct sockaddr_in*)res->ai_addr)->sin_port = htons(port);
 		}
 
-		ret = sync_ntp(s, res->ai_addr, &offset, &error);
+		ret = sync_ntp(s, res->ai_addr, &offset, &error, verbose);
 		if (ret < 0) {
 #ifdef DEBUG
 			fprintf(stderr, "try the next address\n");
@@ -181,7 +181,8 @@
 }
 
 int
-sync_ntp(int fd, const struct sockaddr *peer, double *offset, double *error)
+sync_ntp(int fd, const struct sockaddr *peer, double *offset, double *error,
+    int verbose)
 {
 	int attempts = 0, accepts = 0, rejects = 0;
 	int delay = MAX_DELAY, ret;
@@ -200,6 +201,10 @@
 	}
 
 	while (accepts < MAX_QUERIES && attempts < 2 * MAX_QUERIES) {
+		if (verbose >= 2) {
+			fprintf(stderr, ".\n");
+			fflush(stderr);
+		}
 		memset(&data, 0, sizeof(data));
 
 		if (current_time(JAN_1970) > deadline) {
diff -u rdate-1.1.3/debian/changelog rdate-1.1.3/debian/changelog
--- rdate-1.1.3/debian/changelog
+++ rdate-1.1.3/debian/changelog
@@ -1,3 +1,11 @@
+rdate (1:1.1.3-2~~lunar1) UNRELEASED; urgency=low
+
+  * When "-vv" is specified, rdate now displays a dot each time it tries
+    to send a packet to the NTP server.  This is needed to implement
+    cancelation of time synchronisation in the debian-installer.
+
+ -- Jérémy Bobbio <lunar@debian.org>  Wed, 12 Mar 2008 08:04:06 +0100
+
 rdate (1:1.1.3-1) unstable; urgency=low
 
   * New upstream release
commit e7bc9afdc85c2080a2f5fd3ecccdedae01a47649
Author: Jérémy Bobbio <lunar@debian.org>
Date:   Wed Mar 12 08:20:58 2008 +0100

    Add the ability to cancel NTP synchronisation

diff --git a/packages/clock-setup/debian/changelog b/packages/clock-setup/debian/changelog
index 6d07620..ae78467 100644
--- a/packages/clock-setup/debian/changelog
+++ b/packages/clock-setup/debian/changelog
@@ -1,8 +1,13 @@
 clock-setup (0.96) UNRELEASED; urgency=low
 
+  [ Frans Pop ]
   * Remove Petter Reinholdtsen and Christian Perrier as Uploaders with many
     thanks for their past contributions.
 
+  [ Jérémy Bobbio ]
+  * Add the ability to cancel NTP synchronisation.
+    This needs rdate-udeb (>> 1.1.3-1).
+
  -- Frans Pop <fjp@debian.org>  Tue, 08 Apr 2008 13:25:35 +0200
 
 clock-setup (0.95) unstable; urgency=low
diff --git a/packages/clock-setup/debian/clock-setup.postinst b/packages/clock-setup/debian/clock-setup.postinst
index 2ead470..6e33a52 100755
--- a/packages/clock-setup/debian/clock-setup.postinst
+++ b/packages/clock-setup/debian/clock-setup.postinst
@@ -26,15 +26,27 @@ if [ "$RET" = true ]; then
 	db_get clock-setup/ntp-server
 	server="$RET"
 
-	db_progress START 0 1 clock-setup/progress/title
+	db_capb progresscancel
+	db_progress START 0 30 clock-setup/progress/title
 	db_progress INFO clock-setup/progress/ntp
-	if ! RDATE_OUT=`log-output -t clock-setup --pass-stdout rdate -o 123 -nv "$server"`; then
-		log "rdate failed ($?)"
-	fi
-	log "$RDATE_OUT"
+	i=0
+	exec 4>&0
+	rdate -o 123 -nvv "$server" 2>&1 |
+	while read line; do
+		if [ "$line" = . ]; then
+			if ! db_progress STEP 1 <&4; then
+				log "rdate canceled."
+				break
+			fi
+			i=$(($i + 1))
+		else
+			log "$line"
+		fi
+	done
+	exec 0>&4
 	# This is commented out as it can cause a hang as described in
 	# #436497.
-	#db_progress step 1
+	#db_progress step $((30 - $i))
 	db_progress stop
 fi
 
diff --git a/packages/clock-setup/debian/control b/packages/clock-setup/debian/control
index 9256649..15b55d7 100644
--- a/packages/clock-setup/debian/control
+++ b/packages/clock-setup/debian/control
@@ -8,7 +8,7 @@ Vcs-Svn: svn://svn.debian.org/d-i/trunk/packages/clock-setup
 
 Package: clock-setup
 Architecture: alpha amd64 arm armel armeb hppa i386 ia64 m68k mips mipsel powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64
-Depends: ${misc:Depends}, localechooser, tzsetup-udeb (>= 1:0.18), configured-network, rdate-udeb (>= 1:1.1.2-5), di-utils
+Depends: ${misc:Depends}, localechooser, tzsetup-udeb (>= 1:0.18), configured-network, rdate-udeb (>> 1.1.3-1), di-utils
 XC-Package-Type: udeb
 XB-Installer-Menu-Item: 2600
 Description: set up clock

Attachment: signature.asc
Description: Digital signature


Reply to: