Blob Blame History Raw
diff -up cups-1.6.3/conf/cups-files.conf.in.synconclose cups-1.6.3/conf/cups-files.conf.in
--- cups-1.6.3/conf/cups-files.conf.in.synconclose	2013-06-07 02:12:52.000000000 +0100
+++ cups-1.6.3/conf/cups-files.conf.in	2013-11-04 11:37:32.063897669 +0000
@@ -8,6 +8,9 @@
 # List of events that are considered fatal errors for the scheduler...
 #FatalErrors @CUPS_FATAL_ERRORS@
 
+# Do we call fsync() after writing configuration or status files?
+#SyncOnClose Yes
+
 # Default user and group for filters/backends/helper programs; this cannot be
 # any user or group that resolves to ID 0 for security reasons...
 #User @CUPS_USER@
diff -up cups-1.6.3/doc/help/ref-cups-files-conf.html.in.synconclose cups-1.6.3/doc/help/ref-cups-files-conf.html.in
--- cups-1.6.3/doc/help/ref-cups-files-conf.html.in.synconclose	2013-05-10 17:52:10.000000000 +0100
+++ cups-1.6.3/doc/help/ref-cups-files-conf.html.in	2013-11-04 11:39:51.104528571 +0000
@@ -437,6 +437,31 @@ to resolve relative paths in the <VAR>cu
 default server directory is <VAR>/etc/cups</VAR>.</P>
 
 
+<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6.4</SPAN><A NAME="SyncOnClose">SyncOnClose</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+SyncOnClose No
+SyncOnClose Yes
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>SyncOnClose</CODE> directive determines whether the scheduler
+flushes changes to configuration and state files to disk. The default is
+<CODE>Yes</CODE>. The option <CODE>No</CODE> relies on the operating
+system to schedule a suitable time to write changes to disk.</P>
+
+<BLOCKQUOTE><B>Note:</B>
+
+<P>Setting <CODE>SyncOnClose</CODE> to <CODE>Yes</CODE> makes the scheduler use the <CODE>fsync(2)</CODE> system call to write all changes to disk, however the drive or network file system server may still delay writing data to disk. Do not depend on this functionality to prevent data loss in the event of unexpected hardware failure.</P>
+
+<P>Enabling <CODE>SyncOnClose</CODE> may also cause the scheduler to periodically become unresponsive while it waits for changes to be written.</P>
+
+</BLOCKQUOTE>
+
+
 <H2 CLASS="title"><A NAME="SystemGroup">SystemGroup</A></H2>
 
 <H3>Examples</H3>
diff -up cups-1.6.3/man/cups-files.conf.man.in.synconclose cups-1.6.3/man/cups-files.conf.man.in
--- cups-1.6.3/man/cups-files.conf.man.in.synconclose	2013-06-07 02:12:52.000000000 +0100
+++ cups-1.6.3/man/cups-files.conf.man.in	2013-11-04 11:39:51.104528571 +0000
@@ -122,6 +122,12 @@ ServerRoot directory
 .br
 Specifies the directory where the server configuration files can be found.
 .TP 5
+SyncOnClose Yes
+.TP 5
+SyncOnClose No
+Specifies whether the scheduler calls \fIfsync(2)\fR after writing configuration
+or state files. The default is Yes.
+.TP 5
 SystemGroup group-name [group-name ...]
 .br
 Specifies the group(s) to use for System class authentication.
diff -up cups-1.6.3/scheduler/conf.c.synconclose cups-1.6.3/scheduler/conf.c
--- cups-1.6.3/scheduler/conf.c.synconclose	2013-11-04 11:37:21.497849726 +0000
+++ cups-1.6.3/scheduler/conf.c	2013-11-04 11:39:51.106528580 +0000
@@ -174,6 +174,7 @@ static const cupsd_var_t	cupsfiles_vars[
   { "ServerRoot",		&ServerRoot,		CUPSD_VARTYPE_PATHNAME },
   { "SMBConfigFile",		&SMBConfigFile,		CUPSD_VARTYPE_STRING },
   { "StateDir",			&StateDir,		CUPSD_VARTYPE_STRING },
+  { "SyncOnClose",		&SyncOnClose,		CUPSD_VARTYPE_BOOLEAN },
 #ifdef HAVE_AUTHORIZATION_H
   { "SystemGroupAuthKey",	&SystemGroupAuthKey,	CUPSD_VARTYPE_STRING },
 #endif /* HAVE_AUTHORIZATION_H */
@@ -738,6 +739,7 @@ cupsdReadConfiguration(void)
   ReloadTimeout	           = DEFAULT_KEEPALIVE;
   RootCertDuration         = 300;
   StrictConformance        = FALSE;
+  SyncOnClose              = TRUE;
   Timeout                  = DEFAULT_TIMEOUT;
   WebInterface             = CUPS_DEFAULT_WEBIF;
 
diff -up cups-1.6.3/scheduler/conf.h.synconclose cups-1.6.3/scheduler/conf.h
--- cups-1.6.3/scheduler/conf.h.synconclose	2013-11-04 11:37:21.498849730 +0000
+++ cups-1.6.3/scheduler/conf.h	2013-11-04 11:37:32.064897673 +0000
@@ -177,6 +177,8 @@ VAR int			ClassifyOverride	VALUE(0),
 					/* Which errors are fatal? */
 			StrictConformance	VALUE(FALSE),
 					/* Require strict IPP conformance? */
+			SyncOnClose		VALUE(FALSE),
+					/* Call fsync() when closing files? */
 			LogFilePerm		VALUE(0644);
 					/* Permissions for log files */
 VAR cupsd_loglevel_t	LogLevel		VALUE(CUPSD_LOG_WARN);
diff -up cups-1.6.3/scheduler/file.c.synconclose cups-1.6.3/scheduler/file.c
--- cups-1.6.3/scheduler/file.c.synconclose	2013-06-07 02:12:52.000000000 +0100
+++ cups-1.6.3/scheduler/file.c	2013-11-04 11:37:32.064897673 +0000
@@ -109,6 +109,29 @@ cupsdCloseCreatedConfFile(
 
 
  /*
+  * Synchronize changes to disk if SyncOnClose is enabled.
+  */
+
+  if (SyncOnClose)
+  {
+    if (cupsFileFlush(fp))
+    {
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to write changes to \"%s\": %s",
+		      filename, strerror(errno));
+      cupsFileClose(fp);
+      return (-1);
+    }
+
+    if (fsync(cupsFileNumber(fp)))
+    {
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to sync changes to \"%s\": %s",
+		      filename, strerror(errno));
+      cupsFileClose(fp);
+      return (-1);
+    }
+  }
+
+ /*
   * First close the file...
   */