INN commit: trunk (23 files)
INN Commit
rra at isc.org
Tue Nov 17 18:57:20 UTC 2009
Date: Tuesday, November 17, 2009 @ 10:57:19
Author: iulius
Revision: 8817
Integrate showtoken into the main distribution. "sm -c" will now
show clear, decoded information about storage API tokens.
A new SMexplaintoken() function has been added to the storage manager.
Modified:
trunk/MANIFEST
trunk/contrib/ (properties)
trunk/contrib/Makefile
trunk/contrib/README
trunk/doc/pod/news.pod
trunk/doc/pod/sm.pod
trunk/frontends/sm.c
trunk/include/inn/storage.h
trunk/storage/buildconfig.in
trunk/storage/cnfs/cnfs.c
trunk/storage/cnfs/cnfs.h
trunk/storage/interface.c
trunk/storage/interface.h
trunk/storage/timecaf/timecaf.c
trunk/storage/timecaf/timecaf.h
trunk/storage/timehash/timehash.c
trunk/storage/timehash/timehash.h
trunk/storage/tradspool/tradspool.c
trunk/storage/tradspool/tradspool.h
trunk/storage/trash/trash.c
trunk/storage/trash/trash.h
trunk/support/mkmanifest
Deleted:
trunk/contrib/showtoken.in
-------------------------------+
MANIFEST | 1
contrib/Makefile | 3 -
contrib/README | 4 -
contrib/showtoken.in | 95 ----------------------------------------
doc/pod/news.pod | 7 ++
doc/pod/sm.pod | 27 +++++++----
frontends/sm.c | 20 ++++++--
include/inn/storage.h | 1
storage/buildconfig.in | 2
storage/cnfs/cnfs.c | 47 ++++++++++++++++---
storage/cnfs/cnfs.h | 1
storage/interface.c | 11 ++++
storage/interface.h | 1
storage/timecaf/timecaf.c | 41 +++++++++++++----
storage/timecaf/timecaf.h | 1
storage/timehash/timehash.c | 40 +++++++++++++---
storage/timehash/timehash.h | 1
storage/tradspool/tradspool.c | 53 +++++++++++++++++-----
storage/tradspool/tradspool.h | 1
storage/trash/trash.c | 10 ++++
storage/trash/trash.h | 1
support/mkmanifest | 1
22 files changed, 215 insertions(+), 154 deletions(-)
Modified: MANIFEST
===================================================================
--- MANIFEST 2009-11-15 19:26:22 UTC (rev 8816)
+++ MANIFEST 2009-11-17 18:57:19 UTC (rev 8817)
@@ -79,7 +79,6 @@
contrib/reset-cnfs.c Reset the state parts of a CNFS buffer
contrib/respool.c Respool articles in the storage manager
contrib/sample.init.script Example SysV-style init.d script
-contrib/showtoken.in Decode storage API tokens
contrib/stathist.in Parse history statistics
contrib/thdexpire.in Dynamic expire for timehash and timecaf
contrib/tunefeed.in Tune a feed by comparing active files
Property changes on: trunk/contrib
___________________________________________________________________
Modified: svn:ignore
- .libs
archivegz
backlogstat
cleannewsgroups
delayer
findreadgroups
makeexpctl
makestorconf
mlockfile
newsresp
pullart
reset-cnfs
respool
showtoken
stathist
thdexpire
tunefeed
+ .libs
archivegz
backlogstat
cleannewsgroups
delayer
findreadgroups
makeexpctl
makestorconf
mlockfile
newsresp
pullart
reset-cnfs
respool
stathist
thdexpire
tunefeed
Modified: contrib/Makefile
===================================================================
--- contrib/Makefile 2009-11-15 19:26:22 UTC (rev 8816)
+++ contrib/Makefile 2009-11-17 18:57:19 UTC (rev 8817)
@@ -11,7 +11,7 @@
ALL = archivegz backlogstat cleannewsgroups delayer \
findreadgroups makeexpctl makestorconf mlockfile newsresp \
- pullart reset-cnfs respool showtoken stathist thdexpire \
+ pullart reset-cnfs respool stathist thdexpire \
tunefeed
all: $(ALL)
@@ -49,7 +49,6 @@
findreadgroups: findreadgroups.in $(FIX) ; $(FIX) findreadgroups.in
makeexpctl: makeexpctl.in $(FIX) ; $(FIX) makeexpctl.in
makestorconf: makestorconf.in $(FIX) ; $(FIX) makestorconf.in
-showtoken: showtoken.in $(FIX) ; $(FIX) -i showtoken.in
stathist: stathist.in $(FIX) ; $(FIX) -i stathist.in
thdexpire: thdexpire.in $(FIX) ; $(FIX) thdexpire.in
tunefeed: tunefeed.in $(FIX) ; $(FIX) -i tunefeed.in
Modified: contrib/README
===================================================================
--- contrib/README 2009-11-15 19:26:22 UTC (rev 8816)
+++ contrib/README 2009-11-17 18:57:19 UTC (rev 8817)
@@ -148,10 +148,6 @@
the system since INN and related programs can be file descriptor hogs.
It then starts INN.
-showtoken
-
- Decodes storage API tokens.
-
stathist
Parses and summarizes the log files created by the history profiling
Deleted: contrib/showtoken.in
===================================================================
--- contrib/showtoken.in 2009-11-15 19:26:22 UTC (rev 8816)
+++ contrib/showtoken.in 2009-11-17 18:57:19 UTC (rev 8817)
@@ -1,95 +0,0 @@
-#!/usr/bin/perl -w
-# showtoken - decode SM tokens
-# Olaf Titz, 1999. Marco d'Itri, 2000. Public domain.
-# Takes tokens on stdin and write them along with a decoded form on stdout.
-
-use strict;
-
-my ($pathspool, %NG);
-
-my @types = ('trash', '', 'timehash', 'cnfs', 'timecaf', 'tradspool');
-
-if ($ARGV[0]) {
- $pathspool = $ARGV[0];
- if (open(MAP, "$pathspool/tradspool.map")) {
- while (<MAP>) {
- my ($ng, $gnum) = split;
- $NG{$gnum} = $ng;
- }
- close MAP;
- }
-}
-
-$| = 1;
-while (<STDIN>) {
- chomp;
- next if not /^@.+@/;
- print "$_ ";
- splittoken($_);
-}
-
-sub splittoken {
- my $t = shift;
-
- $t =~ tr/@//d;
- $t = pack('H*', $t);
- my ($type, $class, $token, $index, $offset, $overlen, $cancelled) =
- unpack('C C a16 CLnc', $t);
-
- if (not $types[$type]) {
- print "type=$type unknown!\n";
- next;
- }
- print "type=$types[$type] class=$class ";
-
- if ($type == 0) { # trash
- } elsif ($type == 2) { # timehash
- my ($time, $seq) = unpack('Nn', $token);
- my ($a, $b, $c, $d) = unpack('CCCC', $token);
- printf 'time=%08lX seq=%04X file=time-%02x/%02x/%02x/%04x-%02x%02x',
- $time, $seq, $class, $b, $c, $seq, $a, $d;
- } elsif ($type == 3) { # cnfs
- my ($buffn, $offset, $cnum) = unpack('A8NN', $token);
- printf 'buffer=%s offset=%x cycnum=%x', $buffn, $offset * 512, $cnum;
- } elsif ($type == 4) { # timecaf
- my ($time, $seq) = unpack('Nn', $token);
- my (undef, $b, $c, $d) = unpack('CCCC', $token);
- printf 'time=%06lX seq=%04X caf=timecaf-%02x/%02x/%02x%02x.CF',
- $time, $seq, $class, $c, $b, $d;
- } elsif ($type == 5) { # tradspool
- my ($gnum, $art) = unpack('NN', $token);
- printf 'ng=%08X art=%d', $gnum, $art;
- print "file=articles/$NG{$gnum}/$art" if $NG{$gnum};
- } else {
- die "invalid type $type";
- }
- print " over=$index offset=$offset overlen=$overlen cancelled=$cancelled"
- if length $t > 36;
- print "\n";
-}
-__END__
-# Format of a token:
-# 1 type
-# 1 class
-# 16 token
-# 1 index
-# 4 offset
-# 2 overlen
-# 2 cancelled
-# The fields "index" and following are not available with OV3 (INN 2.3 up)
-#
-# the "token" field is:
-# for type=0 (trash) ignored
-# for type=2 (timehash)
-# 4 time
-# 2 seqnum
-# for type=3 (cnfs)
-# 8 cycbuffname
-# 4 offset/512
-# 4 cycnum
-# for type=4 (timecaf)
-# 4 time
-# 2 seqnum
-# for type=5 (tradspool)
-# 4 ngnum
-# 4 artnum
Modified: doc/pod/news.pod
===================================================================
--- doc/pod/news.pod 2009-11-15 19:26:22 UTC (rev 8816)
+++ doc/pod/news.pod 2009-11-17 18:57:19 UTC (rev 8817)
@@ -70,6 +70,13 @@
=item *
+A new feature has been added to B<sm>. When the B<-c> flag is used,
+it shows a clear, decoded form of the storage API token. This
+was previously done by the contrib B<showtoken> script developed
+by Olaf Titz and Marco d'Itri.
+
+=item *
+
A new "unsigned long" type bas been added to the configuration parser. It
will properly warn the news administrator when a variable supposed to
be positive contains a negative integer. It will prevent INN
Modified: doc/pod/sm.pod
===================================================================
--- doc/pod/sm.pod 2009-11-15 19:26:22 UTC (rev 8816)
+++ doc/pod/sm.pod 2009-11-17 18:57:19 UTC (rev 8817)
@@ -4,11 +4,11 @@
=head1 SYNOPSIS
-B<sm> [B<-dHiqRrS>] [I<token> ...]
+B<sm> [B<-cdHiqRrSs>] [I<token> ...]
=head1 DESCRIPTION
-The INN storage manager is the subsystesm that stores and keeps track of
+The INN storage manager is the subsystem that stores and keeps track of
all of the articles and what storage backend they're in. All stored
articles are assigned a storage API token. B<sm> is a command-line
interface to that storage manager, primarily used to retrieve articles by
@@ -16,11 +16,11 @@
subsystem.
I<token> is the token of an article (the same thing that's returned by
-B<grephistory> or stored in the history file). It looks something like:
+B<grephistory> or stored in the F<history> file). It looks something like:
@0502000005A4000000010000000000000000@
-Any number of tokens can be given on the command line for any function
+Any number of tokens can be given on the command-line for any function
other than B<-s>. If none are, B<sm> normally reads tokens from standard
input, one per line. The default operation is to retrieve and write to
standard output the corresponding article for each token given.
@@ -36,16 +36,23 @@
=over 4
+=item B<-c>
+
+Show a clear, decoded form of the storage API token. Each part of the token
+is explained, in a human-readable string. Amongst other elements, this
+command gives the path to where the corresponding article is supposed
+to be stored.
+
=item B<-d>, B<-r>
Rather than retrieving the specified article, remove the article. This
will delete the article out of the news spool and it will not subsequently
be retrievable by any part of INN. It's equivalent to C<ctlinnd cancel>
-except it takes a storage API token instead of a message ID.
+except it takes a storage API token instead of a message-ID.
=item B<-H>
-Retrieve only the header of the article rather than the entire article.
+Retrieve only the headers of the article rather than the entire article.
This option cannot be used with B<-d>, B<-r>, B<-i>, or B<-S>.
=item B<-i>
@@ -62,15 +69,15 @@
=item B<-R>
Display the raw article. This means that line endings won't be converted
-to native line endings and will be left as CRLF sequences, leading periods
+to native line endings and will be left as CRLF sequences; leading periods
will still be escaped for sending over NNTP, and the article will end in
a CRLF.CRLF sequence.
=item B<-S>
-Write the article to standard output in the format used by rnews spool
+Write the article to standard output in the format used by B<rnews> spool
files. Multiple articles can be written in this format, and the resulting
-output can be fed to rnews (on another system, for example) to inject
+output can be fed to B<rnews> (on another system, for example) to inject
those articles into INN. This option cannot be used with B<-d>, B<-r>,
B<-H>, B<-i>, or B<-R>.
@@ -93,7 +100,7 @@
still exit with status 1.
This means that if you need to be sure whether a particular operation
-succeeded, you should run sm on one token at a time.
+succeeded, you should run B<sm> on one token at a time.
=head1 HISTORY
Modified: frontends/sm.c
===================================================================
--- frontends/sm.c 2009-11-15 19:26:22 UTC (rev 8816)
+++ frontends/sm.c 2009-11-17 18:57:19 UTC (rev 8817)
@@ -1,6 +1,6 @@
/* $Id$
**
-** Provide a command line interface to the storage manager
+** Provide a command line interface to the storage manager.
*/
#include "config.h"
@@ -16,13 +16,14 @@
#include "inn/storage.h"
static const char usage[] = "\
-Usage: sm [-dHiqrRSs] [token ...]\n\
+Usage: sm [-cdHiqrRSs] [token ...]\n\
\n\
Command-line interface to the INN storage manager. The default action is\n\
to display the complete article associated with each token given. If no\n\
tokens are specified on the command line, they're read from stdin, one per\n\
line.\n\
\n\
+ -c Show clear information about a token\n\
-d, -r Delete the articles associated with the given tokens\n\
-H Display the headers of articles only\n\
-i Translate tokens into newsgroup names and article numbers\n\
@@ -35,6 +36,7 @@
do with each token. */
struct options {
bool artinfo; /* Show newsgroup and article number. */
+ bool clearinfo; /* Show clear information about a token. */
bool delete; /* Delete articles instead of showing them. */
bool header; /* Display article headers only. */
bool raw; /* Show the raw wire-format articles. */
@@ -156,6 +158,10 @@
printf("%s: %lu\n", artinfo.groupname, artinfo.artnum);
free(artinfo.groupname);
}
+ } else if (options->clearinfo) {
+ text = SMexplaintoken(token);
+ printf("%s %s\n", id, text);
+ free(text);
} else if (options->delete) {
if (!SMcancel(token)) {
warn("could not remove %s: %s", id, SMerrorstr);
@@ -189,7 +195,7 @@
{
int option;
bool okay, status;
- struct options options = { false, false, false, false, false };
+ struct options options = { false, false, false, false, false, false };
bool store = false;
/* Suppress notice messages like tradspool rebuilding its map. */
@@ -200,8 +206,11 @@
if (!innconf_read(NULL))
exit(1);
- while ((option = getopt(argc, argv, "iqrdRSsH")) != EOF) {
+ while ((option = getopt(argc, argv, "cdHiqrRSs")) != EOF) {
switch (option) {
+ case 'c':
+ options.clearinfo = true;
+ break;
case 'd':
case 'r':
options.delete = true;
@@ -246,6 +255,9 @@
die("-s cannot be used with -i, -r, -d, -H, -R, or -S");
if (store && (options.raw || options.rnews))
die("-s cannot be used with -i, -r, -d, -H, -R, or -S");
+ if (options.clearinfo && (options.artinfo || options.delete || options.header
+ || options.raw || options.rnews || store))
+ die("-c cannot be used with -i, -r, -d, -H, -R, -S, or -s");
/* Initialize the storage manager. If we're doing article deletions, we
need to open it read/write. */
Modified: include/inn/storage.h
===================================================================
--- include/inn/storage.h 2009-11-15 19:26:22 UTC (rev 8816)
+++ include/inn/storage.h 2009-11-17 18:57:19 UTC (rev 8817)
@@ -85,6 +85,7 @@
bool SMprobe(PROBETYPE type, TOKEN *token, void *value);
bool SMflushcacheddata(FLUSHTYPE type);
void SMprintfiles(FILE *file, TOKEN token, char **xref, int ngroups);
+char * SMexplaintoken(const TOKEN token);
void SMshutdown(void);
END_DECLS
Modified: storage/buildconfig.in
===================================================================
--- storage/buildconfig.in 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/buildconfig.in 2009-11-17 18:57:19 UTC (rev 8817)
@@ -15,7 +15,7 @@
# Storage API functions.
@STORAGE = qw(init store retrieve next freearticle cancel ctl flushcacheddata
- printfiles shutdown);
+ printfiles explaintoken shutdown);
# Overview API functions.
@OVERVIEW = qw(open groupstats groupadd groupdel add cancel opensearch search
Modified: storage/cnfs/cnfs.c
===================================================================
--- storage/cnfs/cnfs.c 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/cnfs/cnfs.c 2009-11-17 18:57:19 UTC (rev 8817)
@@ -60,18 +60,51 @@
static int metabuff_update = METACYCBUFF_UPDATE;
static int refresh_interval = REFRESH_INTERVAL;
+static CYCBUFF *CNFSgetcycbuffbyname(char *name);
+
+
+/*
+** The token is @03nnxxxxxxxxxxxxxxxxyyyyyyyyzzzzzzzz@
+** where "03" is the cnfs method number,
+** "nn" the hexadecimal value of the storage class,
+** "xxxxxxxxxxxxxxxx" the name of the cyclic buffer (as defined
+** in <pathetc>/cycbuff.conf),
+** "yyyyyyyy" the block,
+** "zzzzzzzz" the cyclic number.
+*/
+char *
+cnfs_explaintoken(const TOKEN token)
+{
+ char *text;
+ CYCBUFF *cycbuff;
+ char cycbuffname[CNFSMAXCYCBUFFNAME+1];
+ unsigned int blksz;
+ uint32_t block;
+ uint32_t cycnum;
+
+ snprintf(cycbuffname, sizeof(cycbuffname), "%s", token.token);
+
+ if ((cycbuff = CNFSgetcycbuffbyname(cycbuffname)) == NULL) {
+ blksz = CNFS_DFL_BLOCKSIZE;
+ } else {
+ blksz = (unsigned int) cycbuff->blksz;
+ }
+
+ memcpy(&block, &token.token[8], sizeof(block));
+ memcpy(&cycnum, &token.token[12], sizeof(cycnum));
+ xasprintf(&text, "method=cnfs class=%u buffer=%s block=%lu blocksize=%u cycnum=%lu file=%s",
+ (unsigned int) token.class, cycbuffname, ntohl(block), blksz, ntohl(cycnum),
+ cycbuff ? cycbuff->path : "");
+
+ return text;
+}
+
+
static TOKEN CNFSMakeToken(char *cycbuffname, off_t offset,
int blksz, uint32_t cycnum, STORAGECLASS class) {
TOKEN token;
uint32_t uint32;
- /* The token is @03nnxxxxxxxxxxxxxxxxyyyyyyyyzzzzzzzz@
- * where "03" is the cnfs method number,
- * "nn" the hexadecimal value of the storage class,
- * "xxxxxxxxxxxxxxxx" the name of the cyclic buffer (as defined
- * in <pathetc>/cycbuff.conf),
- * "yyyyyyyy" the offset,
- * "zzzzzzzz" the cyclic number. */
token.type = TOKEN_CNFS;
token.class = class;
memcpy(token.token, cycbuffname, CNFSMAXCYCBUFFNAME);
Modified: storage/cnfs/cnfs.h
===================================================================
--- storage/cnfs/cnfs.h 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/cnfs/cnfs.h 2009-11-17 18:57:19 UTC (rev 8817)
@@ -15,6 +15,7 @@
bool cnfs_ctl(PROBETYPE type, TOKEN *token, void *value);
bool cnfs_flushcacheddata(FLUSHTYPE type);
void cnfs_printfiles(FILE *file, TOKEN token, char **xref, int ngroups);
+char *cnfs_explaintoken(const TOKEN token);
void cnfs_shutdown(void);
#endif
Modified: storage/interface.c
===================================================================
--- storage/interface.c 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/interface.c 2009-11-17 18:57:19 UTC (rev 8817)
@@ -1,6 +1,6 @@
/* $Id$
**
-** Storage Manager interface
+** Storage Manager interface.
*/
#include "config.h"
#include "clibrary.h"
@@ -792,6 +792,15 @@
storage_methods[typetoindex[token.type]].printfiles(file, token, xref, ngroups);
}
+/*
+** Print a clear, decoded information on a token.
+*/
+char *
+SMexplaintoken(const TOKEN token)
+{
+ return storage_methods[typetoindex[token.type]].explaintoken(token);
+}
+
void SMshutdown(void) {
int i;
STORAGE_SUB *old;
Modified: storage/interface.h
===================================================================
--- storage/interface.h 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/interface.h 2009-11-17 18:57:19 UTC (rev 8817)
@@ -27,6 +27,7 @@
bool (*ctl)(PROBETYPE type, TOKEN *token, void *value);
bool (*flushcacheddata)(FLUSHTYPE type);
void (*printfiles)(FILE *, TOKEN, char **xref, int ngroups);
+ char *(*explaintoken)(const TOKEN token);
void (*shutdown)(void);
} STORAGE_METHOD;
Modified: storage/timecaf/timecaf.c
===================================================================
--- storage/timecaf/timecaf.c 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/timecaf/timecaf.c 2009-11-17 18:57:19 UTC (rev 8817)
@@ -97,17 +97,45 @@
static CAFTOCL3CACHE *TOCCache[256]; /* indexed by storage class! */
static int TOCCacheHits, TOCCacheMisses;
+/*
+** The token is @04nn00aabbccyyyyxxxx0000000000000000@
+** where "04" is the timecaf method number,
+** "nn" the hexadecimal value of the storage class,
+** "aabbccdd" the arrival time in hexadecimal (dd is unused),
+** "xxxxyyyy" the hexadecimal sequence number seqnum.
+**
+** innconf->patharticles + '/timecaf-nn/bb/aacc.CF'
+** where "nn" is the hexadecimal value of the storage class,
+** "aabbccdd" the arrival time in hexadecimal (dd is unused).
+*/
+char *
+timecaf_explaintoken(const TOKEN token)
+{
+ char *text;
+ uint32_t arrival;
+ uint16_t seqnum1;
+ uint16_t seqnum2;
+ memcpy(&arrival, &token.token[0], sizeof(arrival));
+ memcpy(&seqnum1, &token.token[4], sizeof(seqnum1));
+ memcpy(&seqnum2, &token.token[6], sizeof(seqnum2));
+
+ xasprintf(&text, "method=timecaf class=%u time=%lu seqnum=%lu file=%s/timecaf-%02x/%02x/%02x%02x.CF",
+ (unsigned int) token.class, ntohl(arrival) << 8,
+ ntohs(seqnum1) + (ntohs(seqnum2) << 16),
+ innconf->patharticles, token.class,
+ (ntohl(arrival) >> 8) & 0xff,
+ (ntohl(arrival) >> 16) & 0xff,
+ ntohl(arrival) & 0xff);
+
+ return text;
+}
+
static TOKEN MakeToken(time_t now, ARTNUM seqnum, STORAGECLASS class, TOKEN *oldtoken) {
TOKEN token;
uint32_t i;
uint16_t s;
- /* The token is @04nn00aabbccyyyyxxxx0000000000000000@
- * where "04" is the timecaf method number,
- * "nn" the hexadecimal value of the storage class,
- * "aabbccdd" the arrival time in hexadecimal (dd is unused),
- * "xxxxyyyy" the hexadecimal sequence number seqnum. */
if (oldtoken == (TOKEN *)NULL)
memset(&token, '\0', sizeof(token));
else
@@ -144,9 +172,6 @@
char *path;
size_t length;
- /* innconf->patharticles + '/timecaf-nn/bb/aacc.CF'
- * where "nn" is the hexadecimal value of the storage class,
- * "aabbccdd" the arrival time in hexadecimal (dd is unused). */
length = strlen(innconf->patharticles) + 32;
path = xmalloc(length);
snprintf(path, length, "%s/timecaf-%02x/%02x/%02x%02x.CF",
Modified: storage/timecaf/timecaf.h
===================================================================
--- storage/timecaf/timecaf.h 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/timecaf/timecaf.h 2009-11-17 18:57:19 UTC (rev 8817)
@@ -20,6 +20,7 @@
bool timecaf_ctl(PROBETYPE type, TOKEN *token, void *value);
bool timecaf_flushcacheddata(FLUSHTYPE type);
void timecaf_printfiles(FILE *file, TOKEN token, char **xref, int ngroups);
+char *timecaf_explaintoken(const TOKEN token);
void timecaf_shutdown(void);
#endif
Modified: storage/timehash/timehash.c
===================================================================
--- storage/timehash/timehash.c 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/timehash/timehash.c 2009-11-17 18:57:19 UTC (rev 8817)
@@ -38,16 +38,42 @@
static int SeqNum = 0;
+/*
+** The token is @02nnaabbccddyyyy00000000000000000000@
+** where "02" is the timehash method number,
+** "nn" the hexadecimal value of the storage class,
+** "aabbccdd" the arrival time in hexadecimal,
+** "yyyy" the hexadecimal sequence number seqnum.
+**
+** innconf->patharticles + '/time-nn/bb/cc/yyyy-aadd'
+** where "nn" is the hexadecimal value of the storage class,
+** "aabbccdd" the arrival time in hexadecimal,
+** "yyyy" the hexadecimal sequence number seqnum.
+*/
+char *
+timehash_explaintoken(const TOKEN token)
+{
+ char *text;
+ uint32_t arrival;
+ uint16_t seqnum;
+
+ memcpy(&arrival, &token.token[0], sizeof(arrival));
+ memcpy(&seqnum, &token.token[4], sizeof(seqnum));
+
+ xasprintf(&text, "method=timehash class=%u time=%lu seqnum=%lu file=%s/time-%02x/%02x/%02x/%04x-%02x%02x",
+ (unsigned int) token.class, ntohl(arrival), ntohs(seqnum),
+ innconf->patharticles, token.class, (ntohl(arrival) >> 16) & 0xff,
+ (ntohl(arrival) >> 8) & 0xff, ntohs(seqnum),
+ (ntohl(arrival) >> 24) & 0xff, ntohl(arrival) & 0xff);
+
+ return text;
+}
+
static TOKEN MakeToken(time_t now, int seqnum, STORAGECLASS class, TOKEN *oldtoken) {
TOKEN token;
uint32_t i;
uint16_t s;
- /* The token is @02nnaabbccddyyyy00000000000000000000@
- * where "02" is the timehash method number,
- * "nn" the hexadecimal value of the storage class,
- * "aabbccdd" the arrival time in hexadecimal,
- * "yyyy" the hexadecimal sequence number seqnum. */
if (oldtoken == (TOKEN *)NULL)
memset(&token, '\0', sizeof(token));
else
@@ -75,10 +101,6 @@
char *path;
size_t length;
- /* innconf->patharticles + '/time-nn/bb/cc/yyyy-aadd'
- * where "nn" is the hexadecimal value of the storage class,
- * "aabbccdd" the arrival time in hexadecimal,
- * "yyyy" the hexadecimal sequence number seqnum. */
length = strlen(innconf->patharticles) + 32;
path = xmalloc(length);
snprintf(path, length, "%s/time-%02x/%02x/%02x/%04x-%04x",
Modified: storage/timehash/timehash.h
===================================================================
--- storage/timehash/timehash.h 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/timehash/timehash.h 2009-11-17 18:57:19 UTC (rev 8817)
@@ -18,6 +18,7 @@
bool timehash_ctl(PROBETYPE type, TOKEN *token, void *value);
bool timehash_flushcacheddata(FLUSHTYPE type);
void timehash_printfiles(FILE *file, TOKEN token, char **xref, int ngroups);
+char *timehash_explaintoken(const TOKEN token);
void timehash_shutdown(void);
#endif
Modified: storage/tradspool/tradspool.c
===================================================================
--- storage/tradspool/tradspool.c 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/tradspool/tradspool.c 2009-11-17 18:57:19 UTC (rev 8817)
@@ -78,6 +78,8 @@
bool NGTableUpdated; /* set to true if we've added any entries since reading
in the database file */
+static char * TokenToPath(TOKEN token);
+
/*
** Convert all .s to /s in a newsgroup name. Modifies the passed string
** inplace.
@@ -462,19 +464,52 @@
return InitNGTable();
}
-/* Make a token for an article given the primary newsgroup name and article # */
+/*
+** The token is @05nnxxxxxxxxyyyyyyyy0000000000000000@
+** where "05" is the tradspool method number,
+** "nn" the hexadecimal value of the storage class,
+** "xxxxxxxx" the name of the primary newsgroup (as defined
+** in <pathspool>/tradspool.map),
+** "yyyyyyyy" the article number in the primary newsgroup.
+**
+** innconf->patharticles + '/news/group/path/yyyyyyyy'
+** where "news/group/path" is the path of the primary newsgroup
+** (as defined in <pathspool>/tradspool.map),
+** "yyyyyyyy" the article number in the primary newsgroup.
+*/
+char *
+tradspool_explaintoken(const TOKEN token)
+{
+ char *text;
+ char *path;
+ uint32_t ngnum;
+ uint32_t artnum;
+
+ memcpy(&ngnum, &token.token[0], sizeof(ngnum));
+ memcpy(&artnum, &token.token[4], sizeof(artnum));
+
+ path = TokenToPath(token);
+
+ xasprintf(&text, "method=tradspool class=%u ngnum=%lu artnum=%lu file=%s",
+ (unsigned int) token.class, ntohl(ngnum), ntohl(artnum),
+ path != NULL ? path : "");
+
+ if (path != NULL)
+ free(path);
+
+ return text;
+}
+
+/*
+** Make a token for an article given the primary newsgroup name and
+** article number.
+*/
static TOKEN
MakeToken(char *ng, unsigned long artnum, STORAGECLASS class) {
TOKEN token;
NGTENT *ngtp;
unsigned long num;
- /* The token is @05nnxxxxxxxxyyyyyyyy0000000000000000@
- * where "05" is the tradspool method number,
- * "nn" the hexadecimal value of the storage class,
- * "xxxxxxxx" the name of the primary newsgroup (as defined
- * in <pathspool>/tradspool.map),
- * "yyyyyyyy" the article number in the primary newsgroup. */
memset(&token, '\0', sizeof(token));
token.type = TOKEN_TRADSPOOL;
@@ -507,10 +542,6 @@
char *ng, *path;
size_t length;
- /* innconf->patharticles + '/news/group/path/yyyyyyyy'
- * where "news/group/path" is the path of the primary newsgroup
- * (as defined in <pathspool>/tradspool.map),
- * "yyyyyyyy" the article number in the primary newsgroup. */
CheckNeedReloadDB(false);
memcpy(&ngnum, &token.token[0], sizeof(ngnum));
Modified: storage/tradspool/tradspool.h
===================================================================
--- storage/tradspool/tradspool.h 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/tradspool/tradspool.h 2009-11-17 18:57:19 UTC (rev 8817)
@@ -18,6 +18,7 @@
bool tradspool_ctl(PROBETYPE type, TOKEN *token, void *value);
bool tradspool_flushcacheddata(FLUSHTYPE type);
void tradspool_printfiles(FILE *file, TOKEN token, char **xref, int ngroups);
+char *tradspool_explaintoken(const TOKEN token);
void tradspool_shutdown(void);
#endif
Modified: storage/trash/trash.c
===================================================================
--- storage/trash/trash.c 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/trash/trash.c 2009-11-17 18:57:19 UTC (rev 8817)
@@ -82,6 +82,16 @@
{
}
+char *
+trash_explaintoken(const TOKEN token UNUSED)
+{
+ char *text;
+
+ xasprintf(&text, "method=%s", "trash");
+
+ return text;
+}
+
ARTHANDLE *
trash_next(ARTHANDLE *article UNUSED, const RETRTYPE amount UNUSED)
{
Modified: storage/trash/trash.h
===================================================================
--- storage/trash/trash.h 2009-11-15 19:26:22 UTC (rev 8816)
+++ storage/trash/trash.h 2009-11-17 18:57:19 UTC (rev 8817)
@@ -18,6 +18,7 @@
bool trash_ctl(PROBETYPE type, TOKEN *token, void *value);
bool trash_flushcacheddata(FLUSHTYPE type);
void trash_printfiles(FILE *file, TOKEN token, char **xref, int ngroups);
+char *trash_explaintoken(const TOKEN token);
void trash_shutdown(void);
#endif
Modified: support/mkmanifest
===================================================================
--- support/mkmanifest 2009-11-15 19:26:22 UTC (rev 8816)
+++ support/mkmanifest 2009-11-17 18:57:19 UTC (rev 8817)
@@ -123,7 +123,6 @@
contrib/pullart
contrib/reset-cnfs
contrib/respool
-contrib/showtoken
contrib/stathist
contrib/thdexpire
contrib/tunefeed
More information about the inn-committers
mailing list