#!/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
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
-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
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
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
<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>
<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>
--- /dev/null
+<!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>></option></term>
+ <listitem>
+ <para>A request packet sent from the client to the server.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option><</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>
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.
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)) {
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);
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");
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)
}
DEBUG("OK!\n");
continue;
- }
- DEBUG ("Ignoring unknown command\n");
+ default:
+ DEBUG ("Ignoring unknown command\n");
+ continue;
+ }
}
return 0;
}