Merge branch 'alex'
authorWouter Verhelst <w@uter.be>
Sat, 28 May 2011 08:47:21 +0000 (10:47 +0200)
committerWouter Verhelst <w@uter.be>
Sat, 28 May 2011 08:47:21 +0000 (10:47 +0200)
autogen.sh
configure.ac
man/Makefile.am
man/nbd-server.1.in.sgml
man/nbd-server.5.in.sgml
man/nbd-trdump.8.in.sgml [new file with mode: 0644]
nbd-server.c

index 2d041fd..0719077 100755 (executable)
@@ -1,4 +1,4 @@
 #!/bin/sh
 set -ex
-make -C man -f Makefile.am nbd-server.1.sh.in nbd-server.5.sh.in nbd-client.8.sh.in
+make -C man -f Makefile.am nbd-server.1.sh.in nbd-server.5.sh.in nbd-client.8.sh.in nbd-trdump.8.sh.in
 exec autoreconf -f -i
index ef131f5..3c29625 100644 (file)
@@ -123,6 +123,6 @@ AC_TYPE_PID_T
 nbd_server_CPPFLAGS=$nbd_server_CPPFLAGS" -DSYSCONFDIR='\"$sysconfdir\"'"
 AC_SUBST(nbd_server_CPPFLAGS)
 AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_FILES([Makefile doc/Doxyfile man/Makefile man/nbd-client.8.sh man/nbd-server.5.sh man/nbd-server.1.sh])
+AC_CONFIG_FILES([Makefile doc/Doxyfile man/Makefile man/nbd-client.8.sh man/nbd-server.5.sh man/nbd-server.1.sh man/nbd-trdump.8.sh])
 AC_OUTPUT
 
index 0ee8d62..2d1de20 100644 (file)
@@ -1,8 +1,8 @@
-man_MANS = nbd-server.1 nbd-server.5 nbd-client.8
+man_MANS = nbd-server.1 nbd-server.5 nbd-client.8 nbd-trdump.8
 CLEANFILES = manpage.links manpage.refs
-DISTCLEANFILES = nbd-server.1 nbd-client.8 nbd-server.5
-MAINTAINERCLEANFILES = nbd-server.1.sh.in nbd-client.8.sh.in nbd-server.5.sh.in
-EXTRA_DIST = nbd-server.1.in.sgml nbd-client.8.in.sgml nbd-server.5.in.sgml nbd-server.1.sh.in nbd-server.5.sh.in nbd-client.8.sh.in sh.tmpl
+DISTCLEANFILES = nbd-server.1 nbd-client.8 nbd-server.5 nbd-trdump.8
+MAINTAINERCLEANFILES = nbd-server.1.sh.in nbd-client.8.sh.in nbd-server.5.sh.in nbd-trdump.8.sh.in
+EXTRA_DIST = nbd-server.1.in.sgml nbd-client.8.in.sgml nbd-server.5.in.sgml nbd-trdump.8.in.sgml nbd-server.1.sh.in nbd-server.5.sh.in nbd-client.8.sh.in nbd-trdump.8.sh.in sh.tmpl
 
 nbd-server.1: nbd-server.1.sh
        sh nbd-server.1.sh > nbd-server.1
@@ -10,6 +10,8 @@ nbd-server.5: nbd-server.5.sh
        sh nbd-server.5.sh > nbd-server.5
 nbd-client.8: nbd-client.8.sh
        sh nbd-client.8.sh > nbd-client.8
+nbd-trdump.8: nbd-trdump.8.sh
+       sh nbd-trdump.8.sh > nbd-trdump.8
 nbd-server.1.sh.in: nbd-server.1.in.sgml sh.tmpl
        LC_ALL=C docbook2man nbd-server.1.in.sgml
        cat sh.tmpl > nbd-server.1.sh.in
@@ -28,3 +30,9 @@ nbd-server.5.sh.in: nbd-server.5.in.sgml sh.tmpl
        cat NBD-SERVER.5 >> nbd-server.5.sh.in
        echo "EOF" >> nbd-server.5.sh.in
        rm NBD-SERVER.5
+nbd-trdump.8.sh.in: nbd-trdump.8.in.sgml sh.tmpl
+       LC_ALL=C docbook2man nbd-trdump.8.in.sgml
+       cat sh.tmpl > nbd-trdump.8.sh.in
+       cat NBD-TRDUMP.8 >> nbd-trdump.8.sh.in
+       echo "EOF" >> nbd-trdump.8.sh.in
+       rm NBD-TRDUMP.8
index 047fcb6..7a5832e 100644 (file)
@@ -274,7 +274,7 @@ manpage.1: manpage.sgml
   <refsect1>
     <title>SEE ALSO</title>
     
-    <para>nbd-client (8), nbd-server (5)</para>
+    <para>nbd-client (8), nbd-server (5), nbd-trdump (8)</para>
     
   </refsect1>
   <refsect1>
index 32ce37f..1bc1980 100644 (file)
@@ -691,7 +691,7 @@ manpage.1: manpage.sgml
   <refsect1>
     <title>SEE ALSO</title>
 
-    <para>nbd-server (1), nbd-client (8)</para>
+    <para>nbd-server (1), nbd-client (8), nbd-trdump (8)</para>
       
 
   </refsect1>
diff --git a/man/nbd-trdump.8.in.sgml b/man/nbd-trdump.8.in.sgml
new file mode 100644 (file)
index 0000000..d047f59
--- /dev/null
@@ -0,0 +1,143 @@
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.5//EN" [
+
+<!-- Process this file with docbook-to-man to generate an nroff manual
+     page: `docbook-to-man manpage.sgml > manpage.1'.  You may view
+     the manual page with: `docbook-to-man manpage.sgml | nroff -man |
+     less'.  A typical entry in a Makefile or Makefile.am is:
+
+manpage.1: manpage.sgml
+       docbook-to-man $< > $@
+  -->
+
+  <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+  <!ENTITY dhfirstname "<firstname>Wouter</firstname>">
+  <!ENTITY dhsurname   "<surname>Verhelst</surname>">
+  <!-- Please adjust the date whenever revising the manpage. -->
+  <!ENTITY dhdate      "<date>$Date$</date>">
+  <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+       allowed: see man(7), man(1). -->
+  <!ENTITY dhsection   "<manvolnum>8</manvolnum>">
+  <!ENTITY dhemail     "<email>wouter@debian.org</email>">
+  <!ENTITY dhusername  "Wouter Verhelst">
+  <!ENTITY dhucpackage "<refentrytitle>NBD-TRDUMP</refentrytitle>">
+  <!ENTITY dhpackage   "nbd-trdump">
+
+  <!ENTITY debian      "<productname>Debian GNU/Linux</productname>">
+  <!ENTITY gnu         "<acronym>GNU</acronym>">
+]>
+
+<refentry>
+  <refentryinfo>
+    <address>
+      &dhemail;
+    </address>
+    <author>
+      &dhfirstname;
+      &dhsurname;
+    </author>
+    <copyright>
+      <year>2001</year>
+      <holder>&dhusername;</holder>
+    </copyright>
+    &dhdate;
+  </refentryinfo>
+  <refmeta>
+    &dhucpackage;
+
+    &dhsection;
+  </refmeta>
+  <refnamediv>
+    <refname>&dhpackage;</refname>
+
+    <refpurpose>translate an nbd transaction log into human readable form</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>&dhpackage;</command>
+    </cmdsynopsis>
+  </refsynopsisdiv>
+  <refsect1>
+    <title>DESCRIPTION</title>
+
+    <para><command>&dhpackage;</command> translates
+    a transaction log produced by <command>nbd-server</command>
+    (specifically by the <command>transactionlog</command>
+    configuration directive) into human readable form.</para>
+
+    <para>The command acts as a traditional UNIX filter, i.e. the
+    transaction log must be supplied on standard input, and the
+    human readable output is sent to standard output.</para>
+  </refsect1>
+  <refsect1>
+    <title>OUTPUT</title>
+
+    <para>The following may be output:</para>
+
+    <variablelist>
+      <varlistentry>
+       <term><option>&gt;</option></term>
+       <listitem>
+         <para>A request packet sent from the client to the server.</para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term><option>&lt;</option></term>
+       <listitem>
+         <para>A reply packet sent from the server to the client.</para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term><option>H</option></term>
+       <listitem>
+         <para>The handle of the packet.</para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term><option>C</option></term>
+       <listitem>
+         <para>The command sent.</para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term><option>O</option></term>
+       <listitem>
+         <para>The offet from the start of the disk.</para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term><option>L</option></term>
+       <listitem>
+         <para>The length of data.</para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term><option>E</option></term>
+       <listitem>
+         <para>The error returned.</para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <refsect1>
+    <title>SEE ALSO</title>
+
+    <para>nbd-server (1).</para>
+
+  </refsect1>
+  <refsect1>
+    <title>AUTHOR</title>
+    <para>The NBD kernel module and the NBD tools have been written by
+    Pavel Macheck (pavel@ucw.cz).</para>
+
+    <para>The kernel module is now maintained by Paul Clements
+    (Paul.Clements@steeleye.com), while the userland tools are maintained by
+    Wouter Verhelst (wouter@debian.org)</para>
+
+    <para>This manual page was written by &dhusername; (&dhemail;) for
+    the &debian; system (but may be used by others).  Permission is
+    granted to copy, distribute and/or modify this document under the
+    terms of the <acronym>GNU</acronym> General Public License,
+    version 2, as published by the Free Software Foundation.</para>
+
+  </refsect1>
+</refentry>
index 3343d9d..6d734b3 100644 (file)
@@ -261,6 +261,22 @@ typedef struct {
                                  is PARAM_BOOL. */
 } PARAM;
 
+static inline const char * getcommandname(uint64_t command) {
+       switch (command) {
+       case NBD_CMD_READ:
+               return "NBD_CMD_READ";
+       case NBD_CMD_WRITE:
+               return "NBD_CMD_WRITE";
+       case NBD_CMD_DISC:
+               return "NBD_CMD_DISC";
+       case NBD_CMD_FLUSH:
+               return "NBD_CMD_FLUSH";
+       default:
+               break;
+       }
+       return "UNKNOWN";
+}
+
 /**
  * Check whether a client is allowed to connect. Works with an authorization
  * file which contains one line per machine, no wildcards.
@@ -1458,32 +1474,15 @@ int mainloop(CLIENT *client) {
                request.from = ntohll(request.from);
                request.type = ntohl(request.type);
                command = request.type & NBD_CMD_MASK_COMMAND;
-
-               if (command==NBD_CMD_DISC) {
-                       msg2(LOG_INFO, "Disconnect request received.");
-                       if (client->server->flags & F_COPYONWRITE) { 
-                               if (client->difmap) g_free(client->difmap) ;
-                               close(client->difffile);
-                               unlink(client->difffilename);
-                               free(client->difffilename);
-                       }
-                       go_on=FALSE;
-                       continue;
-               }
-
                len = ntohl(request.len);
 
+               DEBUG("%s from %llu (%llu) len %d, ", getcommandname(command),
+                               (unsigned long long)request.from,
+                               (unsigned long long)request.from / 512, (unsigned int)len);
+
                if (request.magic != htonl(NBD_REQUEST_MAGIC))
                        err("Not enough magic.");
-               if (len > BUFSIZE - sizeof(struct nbd_reply)) {
-                       currlen = BUFSIZE - sizeof(struct nbd_reply);
-                       msg2(LOG_INFO, "oversized request (this is not a problem)");
-               } else {
-                       currlen = len;
-               }
-               DEBUG("%s from %llu (%llu) len %d, ", command ? "WRITE" :
-                               "READ", (unsigned long long)request.from,
-                               (unsigned long long)request.from / 512, (unsigned int)len);
+
                memcpy(reply.handle, request.handle, sizeof(reply.handle));
 
                if ((command==NBD_CMD_WRITE) || (command==NBD_CMD_READ)) {
@@ -1498,9 +1497,28 @@ int mainloop(CLIENT *client) {
                                ERROR(client, reply, EINVAL);
                                continue;
                        }
+
+                       currlen = len;
+                       if (currlen > BUFSIZE - sizeof(struct nbd_reply)) {
+                               currlen = BUFSIZE - sizeof(struct nbd_reply);
+                               msg2(LOG_INFO, "oversized request (this is not a problem)");
+                       }
                }
 
-               if (command==NBD_CMD_WRITE) {
+               switch (command) {
+
+               case NBD_CMD_DISC:
+                       msg2(LOG_INFO, "Disconnect request received.");
+                       if (client->server->flags & F_COPYONWRITE) { 
+                               if (client->difmap) g_free(client->difmap) ;
+                               close(client->difffile);
+                               unlink(client->difffilename);
+                               free(client->difffilename);
+                       }
+                       go_on=FALSE;
+                       continue;
+
+               case NBD_CMD_WRITE:
                        DEBUG("wr: net->buf, ");
                        while(len > 0) {
                                readit(client->net, buf, currlen);
@@ -1517,15 +1535,14 @@ int mainloop(CLIENT *client) {
                                        ERROR(client, reply, errno);
                                        continue;
                                }
-                               SEND(client->net, reply);
-                               DEBUG("OK!\n");
                                len -= currlen;
                                currlen = (len < BUFSIZE) ? len : BUFSIZE;
                        }
+                       SEND(client->net, reply);
+                       DEBUG("OK!\n");
                        continue;
-               }
 
-               if (command==NBD_CMD_FLUSH) {
+               case NBD_CMD_FLUSH:
                        DEBUG("fl: ");
                        if (expflush(client)) {
                                DEBUG("Flush failed: %m");
@@ -1535,9 +1552,8 @@ int mainloop(CLIENT *client) {
                        SEND(client->net, reply);
                        DEBUG("OK!\n");
                        continue;
-               }
 
-               if (command==NBD_CMD_READ) {
+               case NBD_CMD_READ:
                        DEBUG("exp->buf, ");
                        memcpy(buf, &reply, sizeof(struct nbd_reply));
                        if (client->transactionlogfd != -1)
@@ -1561,9 +1577,11 @@ int mainloop(CLIENT *client) {
                        }
                        DEBUG("OK!\n");
                        continue;
-               }
 
-               DEBUG ("Ignoring unknown command\n");
+               default:
+                       DEBUG ("Ignoring unknown command\n");
+                       continue;
+               }
        }
        return 0;
 }