---
name: "snstore"
section: "8"
platform: "linux"
package: "sn"
version: "0.3.8-12"
release: "Debian 12 (Bookworm)"
platforms: ["linux"]
url: "https://new.carta.tech/snsend"
---

# snstore(8)

distribute articles snstore - store articles locally

Part of [snsend(8)](/snsend/8.md).

## NAME

snsend - distribute articles\
 snstore - store articles locally

## SYNOPSIS

**snsend** \[-*rvcna*\]\
 **snstore** \[-*rvcna*\]

## DESCRIPTION

**snsend** reads articles from descriptor 0 and distributes each one into each newsgroup they are posted to, like **inews**. **snstore** does the same but stores them all locally. The input articles are expected to be in wire format (lines end with CRLF, leading dots are doubled, and articles are terminated with a lone dot).

Control messages are not treated specially.

The newsgroups list is taken from the **X-sn-Newsgroups** field if it exists; otherwise it is taken from the **Newsgroups** field, which must exist or the article will be **junked**. All fields whose names begin with **X-sn-** (case insensitive) are always removed.

If **Date** or **Message-ID** are not present, these are created. The local hosts name is prepended to the **Path** field.

If an article is to be **junked**, it is sent to the junk newsgroup if it exists, otherwise it is discarded.

## ROUTING

This applies only to **snsend**. **snstore** does not route; it treats all *news.groups* as though they were local (see **Nonexistent newsgroup** and **Local newsgroup** below). If any of the following fails, **snsend** aborts:

For each *news.group* an article is (cross-) posted to, **snsend** routes the article as follows, aborting if any action fails:

- **Nonexistent newsgroup**

  If /var/spool/sn/*news.group* is not a directory, **snsend** ignores this *news.group*. If all *news.group*s are thus ignored, the article is **junked**.

- **Global newsgroup**

  If /var/spool/sn/*news.group*/.outgoing is a (symlink to a) directory, **snsend** stores the article into a file in that directory, if the same article does not already exist there (so *news.group*'s upstream feed doesn't get multiple copies of the same article.) Such in-transit article files are given names that begin with a **$** sign.

- **Local processing via script**

  Otherwise if /var/spool/sn/*news.group*/.outgoing is a regular file, it is taken to be a script or program and is run with the article available on its input.  See /var/spool/sn/**dot-outgoing.ex**.

- **Local processing via fifo**

  Otherwise if /var/spool/sn/*news.group*/.outgoing is a fifo, the article is written into it.  It is an error if nothing is reading the fifo.

- **Local newsgroup**

  Otherwise if /var/spool/sn/*news.group*/.outgoing does not exist, the article is stored into *news.group*.

## OPTIONS

Options apply to **snsend** and **snstore** equally.

- \-**r**

  The article stream is in rnews batch format, rather than wire format.  Only the **#! rnews** form is understood.

- \-**c**

  If an article already exists in the local newsgroup it is destined for, don't store it there.  For **snsend**, this option has no effect on newsgroups that are not local.

- \-**a**

  (Aliases not allowed.) When storing to multiple local newsgroups, do not alias subsequent copies to the first, instead, make a copy.  Aliasing saves disk space, but when the original expires, so do all aliases to it. This option has no effect on newsgroups that are not local.

- \-**n**

  Don't actually do anything with the article, just dump it back onto descriptor 1.

- \-**v**

  For each article stored in each newsgroup, output a line to descriptor 1 similar to what **snscan** would emit, except that for non-local newsgroups the serial number will always be 0.

## FILES

- /var/spool/sn/*news.group.name*/

  This includes /var/spool/sn/**=junk** newsgroup if it exists. Each such directory represents the newsgroup of the same name, and articles are stored in files **1**, **2**, **3**, etc. beneath it.  Each such file contains 1 or more articles. This is contrary to the traditional form of /var/spool/sn/*news*/*group*/*name*. *news.group.name*.

- /var/spool/sn/*news.group*/.outgoing

  See also **ROUTING** above.  The presence of this directory indicates that *news.group* is global, and articles posted to *news.group* end up here in files named **$**\*. These files are linked in already complete, so all such files are ready to be uploaded.

- /var/spool/sn/*news.group*/.compress

  If this file exists, articles stored in *news.group* are candidates for compression.  The content of the file is a number representing a minimum article body size below which compression won't be applied.  If the file is empty this threshold defaults to 1024 bytes.

- /var/spool/sn/**.me**

  If this file exists, it's contents are taken to be the local hosts name for purposes of the **Path** field.  Otherwise the name is obtained from [**gethostname**(2)](/gethostname/2.md).

## ENVIRONMENT VARIABLES

See also /usr/sbin/**dot-outgoing.ex** for other variables exported when **snsend** invokes a .outgoing program.

- **SNROOT**

  If this is set, its value is used in place of /var/spool/sn.

## EXIT CODES

**snsend** and **snstore** exit 0 on success, 1 on usage error, 2 on system error, 3 on article format error, and 9 if /var/spool/sn/*news.group*/.outgoing (**snsend** only) exits with other than 0.

## SEE ALSO

/usr/sbin/dot-outgoing.ex, snscan(1)
