About
Community
Bad Ideas
Drugs
Ego
Erotica
Fringe
Society
Technology
Hack
Phreak
Broadcast Technology
Computer Technology
Cryptography
Science & Technology
Space, Astronomy, NASA
Telecommunications
The Internet: Technology of Freedom
Viruses
register | bbs | search | rss | faq | about
meet up | add to del.icio.us | digg it

UUCP Protocol Potpourri



From: [email protected] (Brian Kantor)

Newsgroups: comp.doc

Subject: UUCP Protocol Information Potpourri

Date: 20 Jan 88 02:04:02 GMT


The following is collection of stuff that John Gilmore posted to the net

some time ago; with renewed interest in making nearly everything under

the sun talk uucp, I figured it was time this document appeared somewhere

that it would get archived for future inquiries.


From ucsdhub!hp-sdd!hplabs!decwrl!sun!hoptoad!gnu Tue Feb 3 13:10:08 PST 1987


[This information came from the Tanner Andrews's uucpinfo mailing list.

This is a collection of people interested in writing a version

of uucp in the public domain. Contact ihnp4!akgua!ucf-cs!ki4pv!tanner

to be added to the mailing list. There have only been three messages

sent to the list; all are below.


John Gilmore, hoptoad!gnu]


-----


Subject: UUCP Protocol Information (issue #1)

Date: Tue Nov 19 22:04:56 1985


Greetings. First order of business is the fact that I probably have

a lousy or a slow address for some of you all. Please complain, and

things will be corrected. Those of you not receiving this because your

names have been omitted will please inform me, giving a good address.

Those who provided replies but who are not interested in receiving

further information please warn me; maybe things won't cross in the

mail.


Now that we're over that, welcome to the first issue. There will most

likely be more, as more information is received. Anyone with comments,

information, or clean suggestions to be shared should please write to

me at the return address given below. I'll keep the copy of this

mailing list around, and make required additions, deletions, &c. This

issue is just a "welcome" and mailing-error-finder. Sorry about the

delay between your "me-too" mailing and the actual goodstuff.


This is being issued as a mailing list because, while I have some of

the required information, there is still rather a shortage. Research

is expected to improve the situation.


The second issue of this will be coming out almost immediately, and

will contain the bulk of the preliminary information which I have.

It will also include a summary which has been tempered by experience

on this system (type ~uucp_adm/uucico on my terminal, watch the fun

begin).


My address is:

uucp: ...{decvax|akgua}!ucf-cs!ki4pv!tanner

csnet: [email protected]

arpa: ki4pv!tanner%[email protected]


Tanner Andrews, systems

CompuData South,

P.O.Box 3636,

DeLand, FLA 32723.


>From: ihnp4!akgua!ucf-cs!ki4pv!tanner

To: ucf-cs!ki4pv-uucpinfo2, ucf-cs!ki4pv-uucpinfo1

Subject: UUCP Information Issue #02

Date: Wed Dec 11 23:39:26 1985


This is the second issue; the information below is the start of

what has been collected here. It is expected that more information

will be collected in the next few weeks, and that information will

be forwarded when/if it becomes available.


=====================================================

-- part 1

=====================================================

This information came via several people, most of whom snet this

exact message (probably from their news archives from before we

joined the net):


I am posting this over the network because I believe that

others are interested in knowing the protocols of UUCP.

Below is listed all the information that I have acquired

to date. This includes the initial handshaking phase, though

not the login phase. It also doesn't include information

about the data transfer protocol for non-packet networks

(the -G option left off the uucico command line). But, just

hold on - I am working on that stuff.


For a point of information : the slave is the UUCP site being

dialed, and the master is the one doing the calling up. The

protocols listed in the handshaking and termination phase are

independent of any UUCP site : it is universal. The stuff in

the work phase depends on the specific protocol chosen. The

concepts in the work phase are independent of protocol, ie. the

sequences are the same. It is just the lower level stuff that

changes from protocol to protocol. I have access only to level

g and will document it as I begin to understand it.


Most of the stuff you see here is gotten from the debug phase

of the current BSD UUCP system.


I hope this is useful. Maybe this will get some of the real

'brains' in UUCP to get off their duffs and provide some real

detail. In any case, if you have any questions please feel

free to contact me. I will post any questions and answers over

the network.



Chuck Wegrzyn

{allegra,decvax,ihnp4}!encore!wegrzyn


(617) 237-1022





UUCP Handshake Phase

====================


Master Slave

------ -----


<----- \020Shere\0 (1)



(2) \020S<mastername> <switches>\0 ----->



<----- \020RLCK\0 (3)

\020RCB\0

\020ROK\0

\020RBADSEQ\0


<----- \020P<protos>\0 (4)



(5) \020U<proto>\0 ----->

\020UN\0



(6) ...



(0) This communication happens outside of the packet communication that

is supported. If the -G flag is sent on the uucico line, all

communications will occur without the use of the packet

simulation software. The communication at this level is just

the characters listed above.


(1) The slave sends the sequence indicated, while the master waits for

the message.


(2) The slave waits for the master to send a response message. The message

is composed of the master's name and some optional switches.

The switch field can include the following


-g (set by the -G switch on the

master's uucico command line.

Indicates that communication

occurs over a packet switch net.)

-xN (set by the -x switch on the

master's uucico command line.

The number N is the debug level

desired.)

-QM (M is really a sequence number

for the communication.)


Each switch is separated from the others by a 'blank' character.


(3) The slave will send one of the many responses. The meanings appear to

be :


RLCK


This message implies that a 'lock' failure occurred:

a file called LCK..mastername couldn't be created since

one already exists. This seems to imply that the master

is already in communication with the slave.


RCB


This message will be sent out if the slave requires a

call back to the master - the slave will not accept a

call from the master but will call the master instead.


ROK


This message will be returned if the sequence number that

was sent in the message, attached to the -Q switch, from

the master is the same as that computed on the slave.


RBADSEQ


Happens if the sequence numbers do not match.


(Notes on the sequence number - if a machine does not keep

sequence numbers, the value is set to 0. If no -Q switch

is given in the master's line, the sequence number is

defaulted to 0.


The sequence file, SQFILE, has the format


<remotename> <number> <month>/<day>-<hour>:<min>


where <remotename> is the name of a master and <number>

is the previous sequence number. If the <number> field

is not present, or if it is greater than 9998, it is

set to 0. The <number> field is an ascii representation

of the number. The stuff after the <number> is the time

the sequence number was last changed, this information

doesn't seem important.)


(4) The slave sends a message that identifies all the protocols that

it supports. It seems that BSD supports 'g' as the normal case.

Some sites, such as Allegra, support 'e' and 'g', and a few

sites support 'f' as well. I have no information about these

protocols. The exact message sent might look like


\020Pefg\0


where efg indicates that this slave supports the e,f and g

protocols.


(5) The slave waits for a response from the master with the chosen

protocol. If the master has a protocol that is in common the

master will send the message


\020U<proto>\0


where <proto> is the protocol (letter) chosen. If no protocol

is in common, the master will send the message


\020UN\0


(6) At this point both the slave and master agree to use the designated

protocol. The first thing that now happens is that the master

checks for work.


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


UUCP Work Phase

===============



Master Slave

------ -----


(a) Master has UUCP Work


(1) X file1 file2 ----->


<----- XN (2)

XY


When the master wants the slave to do a 'uux' command

it sends the X message. If the slave can't or won't

do it, the slave will send an XN message. Otherwise

it will send an XY message.


(b) Master wants to send a file


(1) S file1 file2 user options ----->


<----- SN2 (2)

SN4

SY


<---- <data exchanged>----> (3)



<----- CY (4)

CN5


If the master wishes to send a file to the slave, it will

send a S message to the slave. If the slave can or will do

the transfer, it sends a SY message. If the slave has a

problem creating work files, it sends a SN4 message. If

the target file can't be created (because of priv's etc)

it sends a SN2 message.


The file1 argument is the source file, and file2 is the

(almost) target filename. If file2 is a directory, then

the target filename is composed of file2 concatenated

with the "last" part of the file1 argument. Note, if the

file2 argument begins with X, the request is targeted to

UUX and not the normal send.


The user argument indicates who, if anyone, is to be notified

if the file has been copied. This user must be on the slave

system.


I am not sure what the options argument does.


After the data has been exchanged the slave will send one of

two messages to the master. A CY message indicates that every-

thing is ok. The message CN5 indicates that the slave had

some problem moving the file to it's permanent location. This

is not the same as a problem during the exchange of data : this

causes the slave to terminate operation.


© Master wishes to receive a file.


(1) R file1 file2 user ----->


<----- RN2 (2)

RY mode


(3) <---- <data exchanged> ---->


(4) CY ----->

CN5


If the master wishes the slave to send a file, the master sends

a R message. If the slave has the file and can send it, the

slave will respond with the RY message. If the slave can't find

the file, or won't send it the RN2 message is sent. It doesn't

appear that the 'mode' field of the RY message is used.


The argument file1 is the file to transfer, unless it is a

directory. In this case the file to be transferred is built

of a concatenation of file1 with the "last" part of the file2

argument.


If anything goes wrong with the data transfer, it results in

both the slave and the master terminating.


After the data has been transferred, the master will send an

acknowledgement to the slave. If the transfer and copy to the

destination file has been successful, the master will send the

CY message. Otherwise it will send the CN5 message.


(d) Master has no work, or no more work.


(1) H ----->


<----- HY (2)

HN


(3) HY ----->


<---- HY (4)


(5) ...


The transfer of control is initiated with the master sending

a H message. This message tells the slave that the master has

no work, and the slave should look for work.


If the slave has no work it will respond with the HY message.

This will tell the master to send an HY message, and turn off

the selected protocol. When the HY message is received by the

slave, it turns off the selected protocol as well. Both the

master and slave enter the UUCP termination phase.


If the slave does have work, it sends the HN message to the

master. At this point, the slave becomes the master. After

the master receives the HN message, it becomes the slave.

The whole sequence of sending work starts over again. Note,

the transmission of HN doesn't force the master to send any

other H messages : it waits for stuff from the new master.


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



UUCP Termination Sequence

=========================


Master Slave

------ -----


(1) \020OOOOOO\0 ----->


<----- \020OOOOOOO\0 (2)





At this point all conversation has completed normally.



+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


UUCP Data Transfers

===================


After the initial handshake the systems send messages in one

of two styles : packet and not packet. A Packet protocol is

just raw data transfers : there is no protocol or acknowledgements;

this appears to assume that the lower level is a packet network

of some type. If the style is not Packet, then extra work is

done. I am still working on this stuff.


=====================================================

-- part 2

=====================================================

** summary of UUCP packets **

(this is much like part 1, but shortened and compared against a

live UUCP ~uucp_adm/uucico)


note that all transmissions end with a null, not shown here



(master) (slave)


... dials up ... <DLE>Shere says "hello"


<DLE>S<sysname> <opts> says who he is


| <DLE>ROK says ok to talk

| <DLE>RLCK says locked out

| <DLE>RCB says will call back

| <DLE>RBADSEQ says bad seq num


<DLE>P<protos> what protocols he has


<DLE>U<proto> | which to use

<DLE>UN | use none, hang up



packet driver is turned on at this time, if not told otherwise


-- if master has work --


to sned file to slave...

S <mfilenm> <sfilenm> <user> <opts> request to sned file


| SY ok -- i'll take it

| SN2 not permitted

| SN4 can't make workfile


<data> the file is transmitted


| CY finished OK

| CN5 can't move into place



to recv file from slave...

R <sfilenm> <mfilenm> <user> request to recv file


| RY<mode> ok -- here is prot mode

| RN2 not permitted


<data> file is transmitted


CY | worked

CN5 | can't move into place



to do UUX on slave...

X <file1> <file2> request to exec file


| XY ok -- will do

| XN nopers


to indicate that he has no more work...

H no more work


| HN reverse roles

| HY no work here either


to accept slave's claim of no more work...


HY agrees to hang up


the rest of the hang-up is done OUTSIDE of packet driver

<DLE>OOOOOO signs off (6*'O')


<DLE>OOOOOOO signs off (7*'O')



If the slave has work, then the roles are reversed, and the

session proceeds from the label 'loop1' above. The system

which was the slave is now the master, and the old master is

just the slave.


The <opts> which follow the system name for the start-up sequence

include:

-g don't use packet driver (command line -G)

-xN debug level (command line -Xn)

-QN seq number (if systems use this)


The filenames for <mfilenm> should be complete filenames with

path information; otherwise they are assumed to be in /usr/spool/uucp.

The filenames for <sfilenm> should be either complete filenames

or directory names. If directory names are used, then the final

componant of <mfilenm> is appended to form the complete filename.


The 'X' command to do UUX on a slave is more than a little unclear.

It doesn't seem to work here, but that may be a microsoft "feature".



Protocol "g", which seems to be the one most commonly used, is supposed

to be a slightly munged version of level 2 of X.25; an article was just

posted in net.unix-wizards (which you probably have already seen) to

this effect. The article didn't provide any details on the protocol,

but merely mentioned the modifications.


The "packet" mode, with no protocol, does not work under microsoft

implementations, and may have *lots* of trouble working anywhere

else as well. It evidently requires that zero-length reads happen

every so often to delimit things, such as files being transferred.

This of course can't happen without the packet driver, which was long

gone by the time sys-3 or sys-5 or <your current version> came along.


**********************************

** end of issue #2

**********************************



>From: ihnp4!akgua!ucf-cs!ki4pv!tanner

To: ucf-cs!ki4pv-uucpinfo, allegra!mp

Subject: UUCP INFO mailing list issue #03

Date: Sun Jan 12 19:11:18 1986


The following information, describing the uucp 'g' protocol, was

provided as "nroff" source. Cut the header and this text off of

the message, and run it through "nroff".

.ce

.B

Packet Driver Protocol

.R

.sp 1

.ce

G. L. Chesson

.br

.ce

Bell Laboratories

.SH

Abstract

.in +.5i

.PP

These notes describe the packet driver link

protocol that was supplied

with the

Seventh Edition of

.UX

and is used by the UUCP program.

.in -.5i

.SH

General

.PP

Information flow between a pair of machines

may be regulated by

first

representing the data

as sequence-numbered

.I

packets

.R

of data

and then establishing conventions that

govern the use of sequence numbers.

The

.I

PK,

.R

or

.I

packet driver,

.R

protocol

is a particular instance of this type of

flow-control discipline.

The technique depends on the notion of a transmission

.I

window

.R

to determine upper and lower bounds for valid

sequence numbers.

The transmitter is allowed to retransmit packets

having sequence numbers

within the window until the receiver indicates that

packets have been correctly received.

Positive acknowledgement from the receiver moves the

window;

negative acknowledgement or no acknowledgement

causes retransmission.

The receiver must ignore duplicate transmission, detect

the various errors that may occur,

and inform the transmitter when packets are

correctly or incorrectly received.

.PP

The following paragraphs describe the packet formats,

message exchanges,

and framing

used by the protocol as coded

in the UUCP program and the

.UX

kernel.

Although no attempt will be made here to present

internal details of the algorithms that were used,

the checksum routine is supplied

for the benefit of other implementors.

.SH

Packet Formats

.PP

The protocol is defined in terms of message

transmissions of 8-bit bytes.

Each message includes one

.I

control

.R

byte plus a

.I

data segment

.R

of zero or more information bytes.

The allowed data segment sizes range

between 32 and 4096 as determined by the formula

32(2\uk\d) where

k is a 3-bit number.

The packet sequence numbers are likewise constrained

to 3-bits; i.e. counting proceeds modulo-8.

.PP

The control byte is partitioned into three fields as

depicted below.

.bp

.nf

.sp

.in 1i

.ls 1

bit 7 6 5 4 3 2 1 0

t t x x x y y y

.ls 1

.in -1i

.fi

.sp

The

.I

t

.R

bits indicate a packet type and

determine the interpretation to be placed on

the

.I

xxx

.R

and

.I

yyy

.R

fields.

The various interpretations are as follows:

.in +1i

.sp

.nf

.ls 1

.I

tt interpretation

.sp

.R

00 control packet

10 data packet

11 `short' data packet

01 alternate channel

.ls 1

.fi

.sp

.in -1i

A data segment accompanies all non-control packets.

Each transmitter is constrained to observe the maximum

data segment size

established during initial synchronization by the

receiver that it sends to.

Type 10 packets have maximal size data segments.

Type 11, or `short', packets have zero or more data

bytes but less than the maximum.

The first one or two bytes of the data segment of a

short packet are `count' bytes that

indicate the difference between the

maximum size and the number of bytes in the short

segment.

If the difference is less than 127, one count

byte is used.

If the difference exceeds 127,

then the low-order seven bits of the difference

are put in the first data byte and the high-order

bit is set as an indicator that the remaining

bits of the difference are in the second byte.

Type 01 packets are never used by UUCP

and need not be discussed in detail here.

.PP

The sequence number of a non-control packet is

given by the

.I

xxx

.R

field.

Control packets are not sequenced.

The newest sequence number,

excluding duplicate transmissions,

accepted by a receiver is placed in the

.I

yyy

.R

field of non-control packets sent to the

`other' receiver.

.PP

There are no data bytes associated with a control packet,

the

.I

xxx

.R

field is interpreted as a control message,

and the

.I

yyy

.R

field is a value accompanying the control message.

The control messages are listed below in decreasing priority.

That is, if several control messages are to be sent,

the lower-numbered ones are sent first.

.in +1i

.nf

.ls 1

.sp

.I

xxx name yyy

.R


1 CLOSE n/a

2 RJ last correctly received sequence number

3 SRJ sequence number to retransmit

4 RR last correctly received sequence number

5 INITC window size

6 INITB data segment size

7 INITA window size

.in -i

.ls 1

.fi

.sp

.PP

The CLOSE message indicates that the communications channel

is to be shut down.

The RJ, or

.I

reject,

.R

message indicates that the receiver has detected an error

and the sender should retransmit after using the

.I

yyy

.R

field to update the window.

This mode of retransmission is usually

referred to as a

`go-back-N' procedure.

The SRJ, or

.I

selective reject,

.R

message carries with it the sequence number of

a particular packet to be retransmitted.

The RR, or

.I

receiver ready,

.R

message indicates that the receiver has detected

no errors; the

.I

yyy

.R

field updates the sender's window.

The INITA/B/C messages are used

to set window and data segment sizes.

Segment sizes are calculated by the formula

32(2\uyyy\d)

as mentioned above,

and window sizes may range between 1 and 7.

.PP

Measurements of the protocol running on communication

links at rates up to 9600 baud showed that

a window size of 2 is optimal

given a packet size greater than 32 bytes.

This means that the link bandwidth can be fully utilized

by the software.

For this reason the SRJ message is not as important as it

might otherwise be.

Therefore the

.UX

implementations no longer generate or respond to SRJ

messages.

It is mentioned here for historical accuracy only,

and one may assume that SRJ is no longer part of the protocol.

.SH

Message Exchanges

.SH

Initialization

.PP

Messages are exchanged between four cooperating

entities: two senders and two receivers.

This means that the communication channel is thought of

as two independent half-duplex data paths.

For example the window and segment sizes need not

be the same in each direction.

.PP

Initial synchronization is accomplished

with two 3-way handshakes: two each of

INITA/INITB/INITC.

Each sender transmits INITA messages repeatedly.

When an INITA message is received, INITB is

sent in return.

When an INITB message is received

.I

and

.R

an INITB message has been sent,

an INITC message is sent.

The INITA and INITB messages carry

with them the packet and window size that

each receiver wants to use,

and the senders are supposed to comply.

When a receiver has seen all three

INIT messages, the channel is

considered to be open.

.PP

It is possible to design a protocol that starts up using

fewer messages than the interlocked handshakes described above.

The advantage of the more complicated design lies in its use as

a research vehicle:

the initial handshake sequence is completely symmetric,

a handshake

can be initiated by one side of the link while the

connection is in use, and the software to do this can

utilize code that would ordinarily be used only once

at connection setup time.

These properties were used in experiments with dynamically

adjusted parameters.

That is attempts were made to adapt the window and segment

sizes to changes observed in traffic while a link was in use.

Other experiments used the initial

handshake in a different way

for restarting the protocol without data loss

after machine crashes.

These experiments never worked well in the packet driver and

basically provided the impetus for other protocol designs.

The result

as far as UUCP is concerned is that initial synchronization

uses the two 3-way handshakes, and the INIT

messages are ignored elsewhere.

.SH

Data Transport

.PP

After initial synchronization each receiver

sets a modulo-8 incrementing counter R to 0;

each sender sets a similar counter S to 1.

The value of R is always the number of the most recent

correctly received packet.

The value of S is always the first sequence number in

the output window.

Let W denote window size.

Note that the value of W may be different for each sender.

.PP

A sender may transmit packets with sequence numbers

in the range S to (S+W-1)\ mod-8.

At any particular time a receiver expects

arriving packets to have numbers in the range

(R+1)\ mod-8 to (R+W)\ mod-8.

Packets must arrive in sequence number order

are are only acknowledged in order.

That is,

the `next' packet a receiver

will acknowledge must have

sequence number (R+1)\ mod-8.

.PP

A receiver acknowledges receipt of data packets

by arranging for the value of its R counter to be

sent across the channel

where it will be used to update an S counter.

This is done in two ways.

If data is flowing in both directions across a

channel then each receiver's current R value is

carried in the

.I

yyy

.R

field of non-control packets.

Otherwise when there is no bidirectional

data flow,

each receiver's R value is transmitted across the link

as the

.I

yyy

.R

field of an RR control packet.

.PP

Error handling is up to the discretion

of the receiver.

It can ignore all errors in which case

transmitter timeouts must provide for

retransmission.

The receiver may also generate RJ

error control packets.

The

.I

yyy

.R

field of an incoming RJ message replaces

the S value of the local sender and

constitutes a request for retransmission to start

at that sequence number.

The

.I

yyy

.R

field of an incoming SRJ message selects a particular

packet for retransmission.

.PP

The resemblance between the flow control procedure in the

packet driver and that defined for X.25 is no accident.

The packet driver protocol began life as an attempt at

cleaning up X.25.

That is why, for example,

control information is uniform in length (one byte),

there is no RNR message (not needed),

and there is but one timeout defined

in the sender.

.SH

Termination

.PP

The CLOSE message is used to terminate communications.

Software on either or both ends of the communication

channel may initiate termination.

In any case when one end wants to terminate it sends

CLOSE messages until one is received from the other end

or until a programmable limit on the number of CLOSE

messages is reached.

Receipt of a CLOSE message causes a CLOSE message to be sent.

In the

.UX

environment

it also causes the SIGPIPE or

`broken pipe' signal to be sent to

the local process using the communication channel.

.SH

Framing

.PP

The term

.I

framing

.R

is used to denote the technique by which the

beginning and end of a message is detected

in a byte stream;

.I

error control

.R

denotes the method by which transmission

errors are detected.

Strategies for framing and error control depend

upon

additional information being transmitted along

with the control byte and data segment,

and the choice of a particular strategy usually

depends on characteristics of input/output

devices and transmission media.

.PP

Several framing techniques are in used in support

of PK protocol implementations,

not all of which can be described in detail here.

The technique used on asynchronous serial lines

will be described.

.PP

A six byte

framing

.I

envelope

.R

is constructed using the control byte

C of a packet and five other bytes as

depicted below.

.in +1i

<DLE><k><c0><c1><C><x>

.in -1i

The <DLE> symbol denotes the ASCII ctrl/P character.

If the envelope is to be followed by a data segment,

<k> has the value

log\d2\u(size)-4;

i.e. 1 \(<= k \(<= 8.

If k is 9, then the envelope represents a control packet.

The <c0> and <c1> bytes are the low-order and high-order

bytes respectively of a 16-bit checksum of the data segment,

if there is one.

For control packets <c1> is zero and <c0> is the same

as the control byte C.

The <x> byte is the exclusive-or of <k><c0><c1><C>.

Error control is accomplished by checking

a received framing envelope for compliance with the definition,

and comparing a checksum function of the data segment

with <c0><c1>.

.PP

This particular framing strategy assumes data segments

are constant-sized:

the `unused' bytes in a short packet are actually

transmitted.

This creates a certain amount of overhead which

can be eliminated by a more complicated framing technique.

The advantage of this strategy is that i/o

devices can be programmed to take advantage of the

constant-sized framing envelopes and data segments.

.bp

.PP

The checksum calculation is displayed below as a C function.

Note that the code is not truly portable because

the definitions of

.I short

and

.I char

are not necessarily uniform across all machines

that might support this language.

This code assumes that

.I short

and

.I char

are 16 and 8-bits respectively.

.PP

.in +.5i

.nf

.ft CW

.ls 1

/* [Original document's version corrected to actual version] */

chksum(s,n)

register char *s;

register n;

{

register short sum;

register unsigned short t;

register short x;


sum = -1;

x = 0;


do {

if (sum<0) {

sum <<= 1;

sum++;

} else

sum <<= 1;

t = sum;

sum += (unsigned)*s++ & 0377;

x += sum^n;

if ((unsigned short)sum <= t) {

sum ^= x;

}

} while (--n > 0);


return(sum);

}

.fi

.in -.5i

.ft R

--

John Gilmore {sun,ptsfa,lll-crg,ihnp4}!hoptoad!gnu [email protected]

Love your country but never trust its government.

-- from a hand-painted road sign in central Pennsylvania

(>
 
To the best of our knowledge, the text on this page may be freely reproduced and distributed.
If you have any questions about this, please check out our Copyright Policy.

 

totse.com certificate signatures
 
 
About | Advertise | Bad Ideas | Community | Contact Us | Copyright Policy | Drugs | Ego | Erotica
FAQ | Fringe | Link to totse.com | Search | Society | Submissions | Technology
Hot Topics
Kid Eats Habanero Pepper
Were no longer the olny Totse
Google anti piracy tool for youtube :(
Chick caught on webcam
Girl Loses Feet At Six Flags
Proof Of Creationism
248 dimesional object
Footage of Helicopter crash in Pheonix
 
Sponsored Links
 
Ads presented by the
AdBrite Ad Network

 

TSHIRT HELL T-SHIRTS