[ --enable-fast-restart enable fast startup of file server without salvaging],, enable_fast_restart="no")
AC_ARG_ENABLE( bitmap-later,
[ --enable-bitmap-later enable fast startup of file server by not reading bitmap till needed],, enable_bitmap_later="no")
+AC_ARG_ENABLE( unix-sockets,
+[ --enable-unix-sockets enable use of unix domain sockets for fssync],, enable_unix_sockets="yes")
AC_ARG_ENABLE( full-vos-listvol-switch,
[ --disable-full-vos-listvol-switch disable vos full listvol switch for formatted output],, enable_full_vos_listvol_switch="yes")
AC_ARG_WITH(dux-kernel-headers,
AC_DEFINE(BITMAP_LATER, 1, [define if you want to salvager to check bitmasks later])
fi
+if test "$enable_unix_sockets" = "yes"; then
+ AC_DEFINE(USE_UNIX_SOCKETS, 1, [define if you want to use UNIX sockets for fssync.])
+ USE_UNIX_SOCKETS="yes"
+else
+ USE_UNIX_SOCKETS="no"
+fi
+AC_SUBST(USE_UNIX_SOCKETS)
+
if test "$enable_full_vos_listvol_switch" = "yes"; then
AC_DEFINE(FULL_LISTVOL_SWITCH, 1, [define if you want to want listvol switch])
fi
#include <afsconfig.h>
#include <afs/param.h>
+#include <afs/afsutil.h>
RCSID
("$Header$");
#include "volume.h"
#include "partition.h"
+#ifdef USE_UNIX_SOCKETS
+#include <sys/un.h>
+#endif
+
/*@printflike@*/ extern void Log(const char *format, ...);
#ifdef osi_Assert
int
FSYNC_clientInit(void)
{
+#ifdef USE_UNIX_SOCKETS
+ struct sockaddr_un addr;
+#else /* USE_UNIX_SOCKETS */
struct sockaddr_in addr;
+#endif /* USE_UNIX_SOCKETS */
/* I can't believe the following is needed for localhost connections!! */
static time_t backoff[] =
{ 3, 3, 3, 5, 5, 5, 7, 15, 16, 24, 32, 40, 48, 0 };
#endif /* AFS_PTHREAD_ENV */
}
+#ifdef USE_UNIX_SOCKETS
+static int
+getport(struct sockaddr_un *addr)
+{
+ int sd;
+ char tbuffer[AFSDIR_PATH_MAX];
+
+ strcompose(tbuffer, AFSDIR_PATH_MAX, AFSDIR_SERVER_LOCAL_DIRPATH, "/",
+ "fssync.sock", NULL);
+
+ memset(addr, 0, sizeof(*addr));
+ addr->sun_family = AF_UNIX;
+ strncpy(addr->sun_path, tbuffer, (sizeof(struct sockaddr_un) - sizeof(short)));
+ assert((sd = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0);
+ return sd;
+}
+#else /* USE_UNIX_SOCKETS */
static int
getport(struct sockaddr_in *addr)
{
return sd;
}
+#endif
static fd_set FSYNC_readfds;
static void
FSYNC_sync()
{
+#ifdef USE_UNIX_SOCKETS
+ struct sockaddr_un addr;
+#else /* USE_UNIX_SOCKETS */
struct sockaddr_in addr;
+#endif /* USE_UNIX_SOCKETS */
int on = 1;
extern VInit;
int code;
#ifdef AFS_PTHREAD_ENV
int tid;
#endif
+#ifdef USE_UNIX_SOCKETS
+ char tbuffer[AFSDIR_PATH_MAX];
+#endif
#ifndef AFS_NT40_ENV
(void)signal(SIGPIPE, SIG_IGN);
Log("Set thread id %d for FSYNC_sync\n", tid);
#endif /* AFS_PTHREAD_ENV */
+#ifdef USE_UNIX_SOCKETS
+ strcompose(tbuffer, AFSDIR_PATH_MAX, AFSDIR_SERVER_LOCAL_DIRPATH, "/",
+ "fssync.sock", NULL);
+ /* ignore errors */
+ remove(tbuffer);
+#endif /* USE_UNIX_SOCKETS */
+
while (!VInit) {
/* Let somebody else run until level > 0. That doesn't mean that
* all volumes have been attached. */