From: Stelian Pop <stelian@popies.net>
Date: Fri, 11 Jun 2010 09:57:31 +0000 (+0000)
Subject: Create UNIX sockets instead of dummy files
X-Git-Tag: release_0_4b43~2
X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=f0ab1ab5331f9ed387ade32d96b24285b0cd5282;p=dump.git

Create UNIX sockets instead of dummy files
---

diff --git a/CHANGES b/CHANGES
index f2d56fc..dcdf046 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,4 @@
-$Id: CHANGES,v 1.314 2010/06/11 09:51:59 stelian Exp $
+$Id: CHANGES,v 1.315 2010/06/11 09:57:31 stelian Exp $
 
 Changes between versions 0.4b42 and 0.4b43 (released ?????????????)
 ===================================================================
@@ -54,11 +54,8 @@ Changes between versions 0.4b42 and 0.4b43 (released ?????????????)
 	Kieran Clancy <codebeard@users.sourceforge.net> for reporting the
 	bug (Sourceforge bug #2999207).
 
-12.	Extract dumped UNIX sockets as dummy files, instead of not
-	restoring them at all. This will correct some warnings during
-	the restoration of incrementals, if the inodes previously occupied
-	by sockets gets reused by other files. See Sourceforge bug
-	#3007216 for details.
+12.	Extract dumped UNIX sockets instead of ignoring them.
+	(Sourceforge bug #3007216).
 
 Changes between versions 0.4b41 and 0.4b42 (released June 18, 2009)
 ===================================================================
diff --git a/restore/tape.c b/restore/tape.c
index 5ee9973..395c99e 100644
--- a/restore/tape.c
+++ b/restore/tape.c
@@ -42,7 +42,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-	"$Id: tape.c,v 1.97 2010/06/11 09:51:59 stelian Exp $";
+	"$Id: tape.c,v 1.98 2010/06/11 09:57:31 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -61,6 +61,8 @@ static const char rcsid[] =
 #include <sys/file.h>
 #include <sys/mtio.h>
 #include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/un.h>
 
 #ifdef	__linux__
 #include <sys/time.h>
@@ -847,19 +849,28 @@ extractfile(struct entry *ep, int doremove)
 		uid_t luid = curfile.dip->di_uid;
 		gid_t lgid = curfile.dip->di_gid;
 
-		Vprintf(stdout, "extract socket as dummy file %s\n", name);
+		Vprintf(stdout, "extract socket %s\n", name);
 		skipfile();
 		if (Nflag)
 			return (GOOD);
 		if (! (spcl.c_flags & DR_METAONLY)) {
-			int fd;
+			int sk;
+			struct sockaddr_un addr;
+
 			if (uflag)
 				(void)unlink(name);
-			if ((fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) {
-				warn("%s: cannot create dummy file", name);
+
+			if ((sk = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) {
+				warn("%s: cannot create socket", name);
+				return (FAIL);
+			}
+			addr.sun_family = AF_UNIX;
+			strcpy(addr.sun_path, name);
+			if (bind(sk, (const struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) {
+				warn("%s: cannot create socket", name);
 				return (FAIL);
 			}
-			close(fd);
+			close(sk);
 		}
 		(void) chown(name, luid, lgid);
 		(void) chmod(name, mode);