repo sync

This commit is contained in:
hsn 2004-11-01 17:10:43 +00:00
parent ea98d0548c
commit cc9b9164b3
66 changed files with 953 additions and 634 deletions

View File

@ -9,13 +9,15 @@ FSP Development Battle plan:
============================
2.8.2 - Next Stable version after 10 years or so
- get out this version as soon as possible. 2.8.1b3 and lower are buggy.
- add FSP Rename command
FSP Protocol wire changes:
- add FSP Info command
- resolve symlink support problem. This maybe breaks compatibility
with older software versions.
- security: symlink to FILE can escape from FSP root directory.
- fix Sven's Slowaris 8 compile problem
- security: symlink to FILE can escape from FSP root directory, this will
be fixed as part of symlink support.
- add FSP change password command (??)
Code fixups:
- fix Sven's compiling problems on various unixes
- normalize return error codes of all clients
- server can be run multiple times on the same port, how to check?
on freebsd this works okay. needs re-testing on linux.
@ -24,9 +26,7 @@ FSP Development Battle plan:
* for next point Stable version 2.8.3
- retune alg. for links with high packet loss
- hard coded access list, do not load it from filesystem
- add FSP change password command
- add FSP command for changing owners
- add FSP command for listing directory owners
- support for ~user namespace
FSP V2.8.1 Beta version Notes:
------------------------------

View File

@ -1,3 +1,35 @@
version 2.8.1b21 - 1 Nov 2004
check for errors while copying files in fspd.
removed all the PROTOX macros junk. Tools for analyzing C source
code works with fsp codebase now as result.
added rename command
add fmvcmd client for renaming files
reorder some checks in configure.ac
added one testcase to the path test suite
client library did not sended any passwords to server
util_abs_path now appends \npassword to full path
server do not send correctly \0 terminated directory readmes
PROTOCOL: Added information about optionally large sized packets,
transport and information about FSP project URL.
PROTOCOL: checked/repaired by ispell :)
PROTOCOL: added more details about packet checksuming.
Lamerpack: removed port 21 from list of recommended ports.
Lamerpack: avoid easy detection by lamers by disabling ver command
do not print password to stdout in fcdcmd
PROTOCOL: Add note to clients writers that two replies from server
can contain extra data even if server is not able to handle extra
data packets on input.
FreeBSD needs /usr/local/lib in LDFLAGS to make Electric Fence
correctly detected by autotools
PROTOCOL: define 5th bit in version flags - support for xtra data
on input
server.c: send accept xtra data flag set
fver: print difference between max. supported payload and
preffered payload size
when directory has no readme, do not send any regular data block
at all. Previous versions sends one null byte
printpro.c - print readme only if nonzero sized
version 2.8.1b20 - 26 Oct 2004
Added pidfile.[c|h] from FreeBSD and modified it to fit in (hoaxter)
Added pidfile support, config option is 'pidlogname' (hoaxter)

2
FILES
View File

@ -5,7 +5,7 @@ Complete content of the FSP package:
FILES This list.
INFO Information about the purpose of FSP
INSTALL Installation instructions for FSP
PROTOCOL Unofficial FSP protocol definition
PROTOCOL FSP protocol definition
MACHINES Where FSP compiles out of box
faq.html FSP FAQ
Makefile.in input file for building makefile from configure script.

68
TODO
View File

@ -2,9 +2,10 @@ FSP SUITE TO DO LIST BY RADIM KOLAR
/* maintained by hsn -at- netmag * cz */
Radim Kolar's personal wishlist from 1997
show loosers online (finfo command) and server statz
rename command
password change command
*-high priority-*
- show loosers online (finfo command) and server statz
* l o w *
- password change command
TESTSUITE NEEDED:
Write a simple FSP protocol testing tool
@ -15,36 +16,42 @@ Test new command rename /when implemented/
SECURITY BUGS:
symlink to FILE can escape from FSP root directory. OLD known problem.
symlink support must be reworked before final release.
PROTOCOL-RELATED BUGS:
it is not clear how to generate directory items with type skip. append
\0 name to them or not? All known clients stops reading the directory
when sees skip item in block.
fprocmd/fcdcmd do not support embedded servers correctly
PORTING
Sven's Slowaris 8 compile problem
not builds on freebsd 4 and non intel platforms?
Sven's AIX compile problem
not builds on freebsd 4 and FreeBSD 5 - non intel platforms?
NEEDS IMPROVMENT:
Client LIBRARY
:high:
we should retune retry algoritm for better support lines with higher
packed loss.
packed loss. On common internet lines current one works okay.
add more detailed stats from retry alg.
:low:
fver and others add support new syntax fsp://host:port/file
add sem locking method, possible?
flscmd does stat before directory listing, why?
flscmd should not to do stat before directory listing.
directory listing should not need to get 0 sized block. Needs total code
rewrite.
better support for persistent keys - do not send cc_bye ? this should
be probably configurable
:long-term goals:
:better to write a new code instead fixing old crap
:better to write a new code instead of fixing 10 yo crap.
=convert to multi threaded=
make setup from env a separate function
do not use global variables
CLIENTS
ALL: normalize return error codes of all clients
write new clients for new commands - fsprencmd fpasswd finfo
:high:
normalize return error codes of all clients
write new clients for new commands - fpasswd finfo
:low:
add support for more sane fsplist file format (as used by warez
ppl) to fhostcmd
@ -57,35 +64,43 @@ clients do not freeing memory allocated from glob()
FUTURE FEATURES FOR SERVER:
:high: required for 2.8.2 final
can be run multiple times on the same port, how to check?
Currently looks fine on bsd.
write RENAME FSP command
drop reuse flag from socket bind?
Currently looks fine with flag on bsd. Fails on lin-suck.
report number of clients connected, size of hostable in new command
CC_INFO command
special defence against rapid/double fire clients (burst command in fspclient)
:midle:may not be in 2.8.2
Native Supports for symbolic links (needed for mirroring Debian)
new LSTAT COMMAND
write FSP_CHANGE_PASSWORD command
:midle:may not be in 2.8.2
improve RENAME FSP command
* cross directory renames are unsuported for now
* server can send error reply even to denied per directory clients
- minor security flaw
:low:this will sure go after 2.8.2:
FSP_GET/SET OWNERS like file transfer
hashed passwords
add switch for dir vs global access priority, override table
use ntons a podobne funkce v iprange.c
pouzivat nejaky jiny typ nez unsigned long pro ip adresu
hard coded directory access rights in configuration instead of loading from FS
hashed passwords. Do we really needs them?
add switch for directory vs global ACL overide
hard code acl into server configuration, do not use .FSP_ filez.
support for user directory namespace ~hsn / public_html, check links to outside!
use ntons a podobne funkce v iprange.c
ipv6 socket support
privileged Hosts, excluded from Byte transfer Limit (hard to do)
FSP Proxy repeater
new toy
FSP Proxy repeater - look at old code.
PERFORMANCE:
host hashtable shrinking sometimes
stat cache pro FSP_STAT a ostatni
stat cache pro FSP_STAT a ostatni staty
chage O(N) fifo cache to some more sane lru hashtable code.
background time() alarm() caller
Current performance 1925648B/s
MAN:
update FAQ - urgent!!
finish sgml FAQ
separate manpage for 7 fsp (protocol definition) == write FSP RFC
libraries and support for FSP protocol
@ -93,9 +108,10 @@ libraries and support for FSP protocol
DONE: FSP library for Java
DONE: FSP over HTTP
FSP plugin do Netscape/MSIE. Not possible to write protocol plugins?
we have fsproxy now.
WIP: new small,light fsplib for C.
FSP backend for APT
FSP plugin do Netscape/MSIE
Transfer HTTP over fsp transport
FSP support to lftp,wget,curl
AVFS plugin http://sourceforge.net/projects/avf

View File

@ -8,10 +8,6 @@
#
# Radim Kolar
#
# TODO: add linux support (sven?)
# add detection of automake19 and use it instead of
# automake18
#
rm -f configure configure.lineno config.log config.status
rm -f aclocal.m4
#rm -fr autom4te.cache
@ -19,19 +15,32 @@ rm -f Makefile "Makefile.in"
echo "Generating configure and friends..."
if [ `uname -s` = 'FreeBSD' ]; then
echo "* FreeBSD detected"
echo "* Using autoconf 2.59 + automake 1.8"
#Use autoconf 2.59 + automake 1.8 pair
ACLOCAL=aclocal18; export ACLOCAL
AUTOMAKE=automake18; export AUTOMAKE
echo "* Using autoconf 2.59"
if [ -x /usr/local/bin/automake18 ]; then
echo "* Using automake 1.8"
ACLOCAL=aclocal18; export ACLOCAL
AUTOMAKE=automake18; export AUTOMAKE
else
echo "* Using automake 1.9"
ACLOCAL=aclocal19; export ACLOCAL
AUTOMAKE=automake19; export AUTOMAKE
fi
#Use autoconf 2.59 + automake 1.X pair
AUTOHEADER=autoheader259; export AUTOHEADER
AUTOCONF=autoconf259; export AUTOCONF
autoreconf259 -v
export LDFLAGS=-L/usr/local/lib
autoreconf259 -iv
else
echo "Using your default auto* tools"
#this should work with recent autotools
autoreconf -iv
fi
echo "Now running configure $@"
./configure $@
echo "done."
if [ $# -eq 0 ]; then
echo "Now running configure in maintainer mode"
./configure --enable-maintainer-mode
else
echo "Now running configure $@"
./configure $@
fi;
echo "$0 done."

View File

@ -26,42 +26,42 @@
#include "ls.h"
#include "my-string.h"
int namecmp PROTO2(LS *, a, LS *, b)
int namecmp (LS * a, LS * b)
{
return(strcmp(a->name, b->name));
}
int revnamecmp PROTO2(LS *, a, LS *, b)
int revnamecmp (LS * a, LS * b)
{
return(strcmp(b->name, a->name));
}
int modcmp PROTO2(LS *, a, LS *, b)
int modcmp (LS * a, LS * b)
{
return(-(int)(a->lstat.st_mtime - b->lstat.st_mtime));
}
int revmodcmp PROTO2(LS *, a, LS *, b)
int revmodcmp (LS * a, LS * b)
{
return(-(int)(b->lstat.st_mtime - a->lstat.st_mtime));
}
int acccmp PROTO2(LS *, a, LS *, b)
int acccmp (LS * a, LS * b)
{
return(-(int)(a->lstat.st_atime - b->lstat.st_atime));
}
int revacccmp PROTO2(LS *, a, LS *, b)
int revacccmp (LS * a, LS * b)
{
return(-(int)(b->lstat.st_atime - a->lstat.st_atime));
}
int statcmp PROTO2(LS *, a, LS *, b)
int statcmp (LS * a, LS * b)
{
return(-(int)(a->lstat.st_ctime - b->lstat.st_ctime));
}
int revstatcmp PROTO2(LS *, a, LS *, b)
int revstatcmp (LS * a, LS * b)
{
return(-(int)(b->lstat.st_ctime - a->lstat.st_ctime));
}

View File

@ -56,7 +56,7 @@ PLAN *plan;
* command arguments.
*/
void find_formplan PROTO1(char **, argv)
void find_formplan (char ** argv)
{
PLAN *tail = NULL, *new = NULL;

View File

@ -51,7 +51,7 @@
#define EOS '\0'
static char *rangematch PROTO2(register char *, pattern, register char, test)
static char *rangematch (register char * pattern, register char test)
{
register char c, c2;
int negate, ok;
@ -72,7 +72,7 @@ static char *rangematch PROTO2(register char *, pattern, register char, test)
return(ok == negate ? NULL : pattern);
}
int fnmatch PROTO2(register char *, pattern, register char *, string)
int fnmatch (register char * pattern, register char * string)
{
register char c;
char test;

View File

@ -100,13 +100,7 @@
return(0); \
}
#ifdef PROTOTYPES
static PLAN *palloc (enum ntype t, int (*f)())
#else
static PLAN *palloc (t, f)
enum ntype t;
int (*f)();
#endif
{
PLAN *new;
@ -130,8 +124,8 @@ extern int process;
* find_parsenum --
* Parse a string of the form [+-]# and return the value.
*/
static long find_parsenum PROTO4(PLAN *, plan, const char *, option, char *, str,
char *, endch)
static long find_parsenum (PLAN * plan, const char * option, char * str,
char * endch)
{
long value;
char *endchar; /* pointer to character ending conversion */
@ -176,7 +170,7 @@ static long find_parsenum PROTO4(PLAN *, plan, const char *, option, char *, str
*/
extern time_t now;
static int find_time PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_time (PLAN * plan, struct stat * sbuf, char * path)
{
/* with FSP sbuf.st_atime=sbuf.st_ctime=sbuf.st_mtime */
@ -184,7 +178,7 @@ static int find_time PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
}
PLAN * c_time PROTO1(char *, arg)
PLAN * c_time (char * arg)
{
PLAN *new;
@ -197,7 +191,7 @@ PLAN * c_time PROTO1(char *, arg)
* brace_subst --
* Replace occurrences of {} in s1 with s2 and return the result string.
*/
static void brace_subst PROTO4(char *, orig, char **, store, char *, path, int,len)
static void brace_subst (char * orig, char ** store, char * path, int len)
{
register int plen;
register char ch, *p;
@ -224,7 +218,7 @@ static void brace_subst PROTO4(char *, orig, char **, store, char *, path, int,l
* print a message to standard error and then read input from standard
* input. If the input is 'y' then 1 is returned.
*/
static int queryuser PROTO1(char **, argv)
static int queryuser (char ** argv)
{
int ch, first, nl;
@ -264,7 +258,7 @@ static int queryuser PROTO1(char **, argv)
* The primary -ok is different in that it requests affirmation of the
* user before executing the utility.
*/
static int find_exec PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_exec (PLAN * plan, struct stat * sbuf, char * path)
{
register int cnt;
pid_t pid;
@ -296,7 +290,7 @@ static int find_exec PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
return(pid != -1 && WIFEXITED(status) && !WEXITSTATUS(status));
}
static char *emalloc_ffind PROTO1(unsigned int, len)
static char *emalloc_ffind (unsigned int len)
{
char *p;
@ -312,7 +306,7 @@ static char *emalloc_ffind PROTO1(unsigned int, len)
* argv array, and one with integer values that are lengths of the
* strings, but also flags meaning that the string has to be massaged.
*/
PLAN *c_exec PROTO2(char ***, argvp, int, isok)
PLAN *c_exec (char *** argvp, int isok)
{
PLAN *new; /* node returned */
register int cnt;
@ -355,12 +349,12 @@ PLAN *c_exec PROTO2(char ***, argvp, int, isok)
return(new);
}
static void printtime_ffind PROTO1(time_t, ftime)
static void printtime_ffind (time_t ftime)
{
int i;
char *longstring;
longstring = (char *)ctime((long *)&ftime);
longstring = (char *)ctime(&ftime);
for (i = 4; i < 11; ++i) putchar(longstring[i]);
#define SIXMONTHS ((DAYSPERNYEAR / 2) * SECSPERDAY)
@ -376,7 +370,7 @@ static void printtime_ffind PROTO1(time_t, ftime)
#define BLK(A) (((A)+1023)/1024)
static void printlong_ffind PROTO2(char *, name, struct stat *, sb)
static void printlong_ffind (char * name, struct stat * sb)
{
const char *modep;
@ -395,13 +389,13 @@ static void printlong_ffind PROTO2(char *, name, struct stat *, sb)
*
* Always true - prints the current sbuf to stdout in "ls" format.
*/
static int find_ls PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_ls (PLAN * plan, struct stat * sbuf, char * path)
{
printlong_ffind(path, sbuf);
return(1);
}
PLAN *c_ls PROTO0((void))
PLAN *c_ls (void)
{
isoutput = 1;
return(palloc(N_LS, find_ls));
@ -413,7 +407,7 @@ PLAN *c_ls PROTO0((void))
* True if the basename of the filename being examined
* matches pattern using Pattern Matching Notation S3.14
*/
static int find_name PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_name (PLAN * plan, struct stat * sbuf, char * path)
{
register char *name;
@ -423,7 +417,7 @@ static int find_name PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
return(fnmatch(plan->c_data, name));
}
PLAN *c_name PROTO1(char *, pattern)
PLAN *c_name (char * pattern)
{
PLAN *new;
@ -439,12 +433,12 @@ PLAN *c_name PROTO1(char *, pattern)
* then the modification time of the file named by the pathname
* file.
*/
static int find_newer PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_newer (PLAN * plan, struct stat * sbuf, char * path)
{
return(sbuf->st_mtime > plan->t_data);
}
PLAN *c_newer PROTO1(char *, filename)
PLAN *c_newer (char * filename)
{
PLAN *new;
struct stat sb;
@ -464,13 +458,13 @@ PLAN *c_newer PROTO1(char *, filename)
* Always true, causes the current pathame to be written to
* standard output.
*/
static int find_print PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_print (PLAN * plan, struct stat * sbuf, char * path)
{
(void)printf("%s\n", path);
return(1);
}
PLAN *c_print PROTO0((void))
PLAN *c_print (void)
{
isoutput = 1;
@ -482,13 +476,13 @@ PLAN *c_print PROTO0((void))
*
* Prune a portion of the hierarchy.
*/
static int find_prune PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_prune (PLAN * plan, struct stat * sbuf, char * path)
{
process = -1;
return(1);
}
PLAN *c_prune PROTO0((void))
PLAN *c_prune (void)
{
return(palloc(N_PRUNE, find_prune));
}
@ -503,7 +497,7 @@ PLAN *c_prune PROTO0((void))
#define FIND_SIZE 512
static int divsize = 1;
static int find_size PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_size (PLAN * plan, struct stat * sbuf, char * path)
{
off_t size;
@ -511,7 +505,7 @@ static int find_size PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
COMPARE(size, plan->o_data);
}
PLAN *c_size PROTO1(char *, arg)
PLAN *c_size (char * arg)
{
PLAN *new;
char endch='c';
@ -528,12 +522,12 @@ PLAN *c_size PROTO1(char *, arg)
* True if the type of the file is c, where c is d or f for
* directory or regular file, respectively.
*/
static int find_type PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_type (PLAN * plan, struct stat * sbuf, char * path)
{
return((sbuf->st_mode & S_IFMT) == plan->m_data);
}
PLAN *c_type PROTO1(char *, typestring)
PLAN *c_type (char * typestring)
{
PLAN *new;
mode_t mask;
@ -560,7 +554,7 @@ PLAN *c_type PROTO1(char *, typestring)
*
* True if expression is true.
*/
int find_expr PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
int find_expr (PLAN * plan, struct stat * sbuf, char * path)
{
register PLAN *p;
register int state;
@ -574,12 +568,12 @@ int find_expr PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
* eliminated during phase 2 of find_formplan() --- the '(' node is converted
* to a N_EXPR node containing the expression and the ')' node is discarded.
*/
PLAN *c_openparen PROTO0((void))
PLAN *c_openparen (void)
{
return(palloc(N_OPENPAREN, (int (*)())-1));
}
PLAN *c_closeparen PROTO0((void))
PLAN *c_closeparen (void)
{
return(palloc(N_CLOSEPAREN, (int (*)())-1));
}
@ -590,7 +584,7 @@ PLAN *c_closeparen PROTO0((void))
*
* Negation of a primary; the unary NOT operator.
*/
static int find_not PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_not (PLAN * plan, struct stat * sbuf, char * path)
{
register PLAN *p;
register int state;
@ -599,7 +593,7 @@ static int find_not PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
return(!state);
}
PLAN *c_not PROTO0((void))
PLAN *c_not (void)
{
return(palloc(N_NOT, find_not));
}
@ -610,7 +604,7 @@ PLAN *c_not PROTO0((void))
* Alternation of primaries; the OR operator. The second expression is
* not evaluated if the first expression is true.
*/
static int find_or PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
static int find_or (PLAN * plan, struct stat * sbuf, char * path)
{
register PLAN *p;
register int state;
@ -623,7 +617,7 @@ static int find_or PROTO3(PLAN *, plan, struct stat *, sbuf, char *, path)
return(state);
}
PLAN *c_or PROTO0((void))
PLAN *c_or (void)
{
return(palloc(N_OR, find_or));
}

View File

@ -62,21 +62,21 @@ static int globbed;
static char *entp;
static char **sortbas;
static int any PROTO2(register int, c, register const char *, s)
static int any (register int c, register const char * s)
{
while (*s)
if (*s++ == c) return(1);
return(0);
}
static int tglob PROTO1(char, c)
static int tglob (char c)
{
if (any(c, globchars))
gflag |= c == '{' ? 2 : 1;
return (c);
}
static int addpath PROTO1(char, c)
static int addpath (char c)
{
if (gpathp >= lastgpathp) globerr = "Pathname too long";
else {
@ -86,14 +86,14 @@ static int addpath PROTO1(char, c)
return(0);
}
static int ginit PROTO1(char **, agargv)
static int ginit (char ** agargv)
{
agargv[0] = 0; gargv = agargv; sortbas = agargv; gargc = 0;
gnleft = NCARGS - 4;
return(0);
}
static void sort PROTO0((void))
static void sort (void)
{
register char **p1, **p2, *c;
char **Gvp = &gargv[gargc];
@ -112,7 +112,7 @@ static void sort PROTO0((void))
sortbas = Gvp;
}
static char *strspl PROTO2(register char *, cp, register const char *, dp)
static char *strspl (register char * cp, register const char * dp)
{
register char *ep = (char *)malloc((unsigned)(strlen(cp) + strlen(dp) + 1));
@ -125,7 +125,7 @@ static char *strspl PROTO2(register char *, cp, register const char *, dp)
return (ep);
}
static int Gcat PROTO2(char *, s1, const char *, s2)
static int Gcat (char * s1, const char * s2)
{
register int len = strlen(s1) + strlen(s2) + 1;
@ -139,10 +139,10 @@ static int Gcat PROTO2(char *, s1, const char *, s2)
return(0);
}
static int execbrc PROTO0((char *, char *));
void matchdir PROTO0((char *));
static int execbrc (char *, char *);
void matchdir (char *);
static void expand PROTO1(char *, as)
static void expand (char * as)
{
register char *cs;
register char *sgpathp, *oldcs;
@ -180,7 +180,7 @@ static void expand PROTO1(char *, as)
*gpathp = 0;
}
static int amatch PROTO2(char *, s, char *, p)
static int amatch (char * s, char * p)
{
register int scc;
int ok, lc;
@ -251,7 +251,7 @@ slash:
}
}
static int match PROTO2(char *, s, char *, p)
static int match (char * s, char * p)
{
register int c;
register char *sentp;
@ -266,7 +266,7 @@ static int match PROTO2(char *, s, char *, p)
return (c);
}
void matchdir PROTO1(char *, pattern)
void matchdir (char * pattern)
{
struct stat stb;
register struct rdirent *dp;
@ -297,7 +297,7 @@ void matchdir PROTO1(char *, pattern)
util_closedir(dirp);
}
static int execbrc PROTO2(char *, p, char *, s)
static int execbrc (char * p, char * s)
{
char restbuf[BUFSIZ + 2];
register char *pe, *pm, *pl;
@ -358,7 +358,7 @@ doit:
return (0);
}
static void acollect PROTO1(register char *, as)
static void acollect (register char * as)
{
register int ogargc = gargc;
@ -367,7 +367,7 @@ static void acollect PROTO1(register char *, as)
if (gargc != ogargc) sort();
}
static void collect PROTO1(register char *, as)
static void collect (register char * as)
{
if (eq(as, "{") || eq(as, "{}")) {
Gcat(as, "");
@ -375,14 +375,14 @@ static void collect PROTO1(register char *, as)
} else acollect(as);
}
static void blkfree PROTO1(char **, av0)
static void blkfree (char ** av0)
{
register char **av = av0;
while (*av) free(*av++);
}
static int blklen PROTO1(register char **, av)
static int blklen (register char ** av)
{
register int i = 0;
@ -390,7 +390,7 @@ static int blklen PROTO1(register char **, av)
return (i);
}
static char **blkcpy PROTO2(char **, oav, register char **, bv)
static char **blkcpy (char ** oav, register char ** bv)
{
register char **av = oav;
@ -398,7 +398,7 @@ static char **blkcpy PROTO2(char **, oav, register char **, bv)
return (oav);
}
static char **copyblk PROTO1(register char **, v)
static char **copyblk (register char ** v)
{
register char **nv;
@ -410,23 +410,13 @@ static char **copyblk PROTO1(register char **, v)
return (blkcpy(nv, v));
}
#ifdef PROTOTYPES
typedef int (*charfunc) (char) ;
static void rscan (register char **t, charfunc f)
#else
static void rscan(t, f)
register char **t;
int (*f)();
#endif
{
register char *p, c;
while ((p = *t++)) {
#ifdef PROTOTYPES
if (f == (charfunc) tglob)
#else
if (f == tglob)
#endif
{
if (*p == '~') gflag |= 2;
else if (eq(p, "{") || eq(p, "{}")) continue;
@ -435,7 +425,7 @@ static void rscan(t, f)
}
}
char **glob PROTO1(register char *, v)
char **glob (register char * v)
{
char agpath[BUFSIZ];
char *agargv[GAVSIZ];
@ -443,11 +433,7 @@ char **glob PROTO1(register char *, v)
vv[0] = v;
vv[1] = 0;
gflag = 0;
#ifdef PROTOTYPES
rscan(vv, (charfunc) tglob);
#else
rscan(vv, tglob);
#endif
if (gflag == 0) return (copyblk(vv));
globerr = 0;

View File

@ -44,8 +44,8 @@ static char path[2*1024 + 1];
static char *endofpath = path;
typedef int (*COMPAR)(const void *, const void *);
int (*sortfcn)PROTO0((LS *, LS *));
void (*printfcn)PROTO0((LS *, int));
int (*sortfcn)(LS *, LS *);
void (*printfcn)(LS *, int);
int termwidth = 80; /* default terminal width */
@ -74,7 +74,7 @@ int f_timesort; /* sort by time vice name */
int f_total; /* if precede with "total" line */
int f_type; /* add type character for non-regular files */
static int tabdir PROTO2(LS *, lp, LS **, s_stats)
static int tabdir (LS * lp, LS ** s_stats)
{
register RDIR *dirp;
register int cnt, maxentry, maxlen;
@ -146,9 +146,9 @@ static int tabdir PROTO2(LS *, lp, LS **, s_stats)
return(cnt);
}
static void displaydir PROTO0((LS *, register int));
static void displaydir (LS *, register int);
static void subdir PROTO1(LS *, lp)
static void subdir (LS * lp)
{
LS *stats;
int num;
@ -170,7 +170,7 @@ static void subdir PROTO1(LS *, lp)
}
}
static void displaydir PROTO2(LS *, stats, register int, num)
static void displaydir (LS * stats, register int num)
{
register char *p, *savedpath;
LS *lp;
@ -205,7 +205,7 @@ static void displaydir PROTO2(LS *, stats, register int, num)
}
}
static void doargs PROTO2(int, argc, char **, argv)
static void doargs (int argc, char ** argv)
{
register LS *dstatp, *rstatp;
register int cnt, dircnt, dirmax, maxlen, regcnt, regmax;
@ -229,6 +229,8 @@ static void doargs PROTO2(int, argc, char **, argv)
}
for( ; *av; av++) {
/* TODO: this stat call should be avoided for performance speedups */
/* Better is turn it to get_dirblk or something like this */
if (util_stat(*av, &sb)) {
perror(*av);
if (errno == ENOENT) continue;
@ -309,7 +311,7 @@ static void doargs PROTO2(int, argc, char **, argv)
}
}
void fls_main PROTO2(int, argc, char **, argv)
void fls_main (int argc, char ** argv)
{
int ch;
char *p;

View File

@ -47,7 +47,7 @@
* yanknode --
* destructively removes the top from the plan
*/
static PLAN *yanknode PROTO1(PLAN **, planp)
static PLAN *yanknode (PLAN ** planp)
{
PLAN *node; /* top node removed from the plan */
@ -63,7 +63,7 @@ static PLAN *yanknode PROTO1(PLAN **, planp)
* paren_squish. In comments below, an expression is either a
* simple node or a N_EXPR node containing a list of simple nodes.
*/
static PLAN *yankexpr PROTO1(PLAN **, planp)
static PLAN *yankexpr (PLAN ** planp)
{
register PLAN *next; /* temp node holding subexpression results */
PLAN *node; /* pointer to returned node or expression */
@ -115,7 +115,7 @@ static PLAN *yankexpr PROTO1(PLAN **, planp)
* paren_squish --
* replaces "parentheisized" plans in our search plan with "expr" nodes.
*/
PLAN *paren_squish PROTO1(PLAN *, plan)
PLAN *paren_squish (PLAN * plan)
{
register PLAN *expr; /* pointer to next expression */
register PLAN *tail; /* pointer to tail of result plan */
@ -152,7 +152,7 @@ PLAN *paren_squish PROTO1(PLAN *, plan)
* not_squish --
* compresses "!" expressions in our search plan.
*/
PLAN *not_squish PROTO1(PLAN *, plan)
PLAN *not_squish (PLAN * plan)
{
register PLAN *next; /* next node being processed */
register PLAN *node; /* temporary node used in N_NOT processing */
@ -208,7 +208,7 @@ PLAN *not_squish PROTO1(PLAN *, plan)
* or_squish --
* compresses -o expressions in our search plan.
*/
PLAN *or_squish PROTO1(PLAN *, plan)
PLAN *or_squish (PLAN * plan)
{
register PLAN *next; /* next node being processed */
register PLAN *tail; /* pointer to tail of result plan */

View File

@ -75,7 +75,7 @@ OPTION options[] = {
* add create/process function pointers to node, so we can skip
* this switch stuff.
*/
PLAN *find_create PROTO1(char ***, argvp)
PLAN *find_create (char *** argvp)
{
register OPTION *p;
PLAN *new;
@ -112,12 +112,12 @@ PLAN *find_create PROTO1(char ***, argvp)
return(new);
}
static int typecompare PROTO2(const void *, a, const void *, b)
static int typecompare (const void * a, const void * b)
{
return(strcmp(((const OPTION *)a)->name, ((const OPTION *)b)->name));
}
OPTION *option PROTO1(char *, name)
OPTION *option (char * name)
{
OPTION tmp;

View File

@ -48,7 +48,7 @@
#define BLK(A) (((A)+1023)/1024)
static int printtype PROTO1(mode_t, mode)
static int printtype (mode_t mode)
{
switch(mode & S_IFMT) {
case S_IFDIR:
@ -62,7 +62,7 @@ static int printtype PROTO1(mode_t, mode)
* print [inode] [size] name
* return # of characters printed, no trailing characters
*/
static int printaname PROTO1(LS *, lp)
static int printaname (LS * lp)
{
int chcnt;
@ -85,7 +85,7 @@ static int printaname PROTO1(LS *, lp)
return(chcnt);
}
void printscol PROTO2(LS *, stats, int, num)
void printscol (LS * stats, int num)
{
for (; num--; ++stats) {
printaname(stats);
@ -93,12 +93,12 @@ void printscol PROTO2(LS *, stats, int, num)
}
}
static void printtime PROTO1(time_t, ftime)
static void printtime (time_t ftime)
{
int i;
char *longstring;
longstring = (char *)ctime((long *)&ftime);
longstring = (char *)ctime(&ftime);
for (i = 4; i < 11; ++i) (void)putchar(longstring[i]);
#define SIXMONTHS ((365 / 2) * 24 * 60 * 60)
@ -112,7 +112,7 @@ static void printtime PROTO1(time_t, ftime)
(void)putchar(' ');
}
void printlong PROTO2(LS *, stats, int, num)
void printlong (LS * stats, int num)
{
const char *modep;
@ -138,7 +138,7 @@ void printlong PROTO2(LS *, stats, int, num)
extern int termwidth;
void printcol PROTO2(LS *, stats, int, num)
void printcol (LS * stats, int num)
{
register int base, chcnt, cnt, col, colwidth;
int endcol, numcols, numrows, row;

View File

@ -31,7 +31,7 @@
#endif
#include "ls.h"
void prcopy PROTO3(char *, src, char *, dest, int, len)
void prcopy (char * src, char * dest, int len)
{
register int ch;
@ -41,13 +41,13 @@ void prcopy PROTO3(char *, src, char *, dest, int, len)
}
}
void nomem PROTO0((void))
void nomem (void)
{
(void)fprintf(stderr, "ls: out of memory.\n");
ls_bad(1);
}
char *emalloc PROTO1(int, size)
char *emalloc (int size)
{
char *retval;
@ -55,7 +55,7 @@ char *emalloc PROTO1(int, size)
return(retval);
}
void usage PROTO0((void))
void usage (void)
{
(void)fprintf(stderr, "usage: ls [-1ACFLRacdfgiklqrstu] [file ...]\n");
ls_bad(1);

View File

@ -34,9 +34,9 @@ unsigned long busy_delay = DEFAULT_DELAY; /* busy retransmit timer */
unsigned long idle_delay = DEFAULT_DELAY; /* idle retransmit timer */
unsigned long udp_sent_time;
UBUF *client_interact PROTO6(unsigned char, cmd, unsigned long, pos,
unsigned int, l1, unsigned const char *, p1,
unsigned int, l2, unsigned const char *, p2)
UBUF *client_interact (unsigned char cmd, unsigned long pos,
unsigned int l1, unsigned const char * p1,
unsigned int l2, unsigned const char * p2)
{
struct sockaddr_in from;
UBUF sbuf;
@ -186,7 +186,7 @@ UBUF *client_interact PROTO6(unsigned char, cmd, unsigned long, pos,
}
}
static RETSIGTYPE client_intr PROTO1(int, signum)
static RETSIGTYPE client_intr (int signum)
{
switch(client_intr_state) {
case 0: exit(2);
@ -198,7 +198,7 @@ static RETSIGTYPE client_intr PROTO1(int, signum)
#endif
}
void init_client PROTO3(const char *, host, unsigned short, port, unsigned short, myport)
void init_client (const char * host, unsigned short port, unsigned short myport)
{
busy_delay = idle_delay = target_delay;
myseq = random();
@ -217,7 +217,7 @@ void init_client PROTO3(const char *, host, unsigned short, port, unsigned short
signal(SIGINT,client_intr);
}
int client_done PROTO0((void))
int client_done (void)
{
(void) client_interact(CC_BYE, 0L, 0, (unsigned char *)NULLP, 0,
(unsigned char *)NULLP);

View File

@ -21,8 +21,8 @@ static char key_string[sizeof(KEY_PREFIX)+32];
static char code_str[] =
"0123456789:_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
static void make_key_string PROTO2(unsigned long, server_addr,
unsigned long, server_port)
static void make_key_string( unsigned long server_addr,
unsigned long server_port)
{
unsigned long v1, v2;
char *p;
@ -190,7 +190,7 @@ static unsigned short *share_key;
static unsigned int lock_fd;
static int lock_shm;
unsigned short client_get_key PROTO0((void))
unsigned short client_get_key (void)
{
if(lockf(lock_fd,F_LOCK,2) == -1) {
perror("lockf");
@ -199,7 +199,7 @@ unsigned short client_get_key PROTO0((void))
return(*share_key);
}
void client_set_key PROTO1(unsigned short, key)
void client_set_key (unsigned short key)
{
*share_key = key;
if(lockf(lock_fd,F_ULOCK,2) == -1) {
@ -208,9 +208,9 @@ void client_set_key PROTO1(unsigned short, key)
}
}
void client_init_key PROTO3(unsigned long, server_addr,
unsigned long, server_port,
unsigned short, key)
void client_init_key (unsigned long server_addr,
unsigned long server_port,
unsigned short key)
{
unsigned long omask;
key_t lock_key;
@ -260,19 +260,19 @@ void client_destroy_key(void)
int key_persists = 0;
static unsigned short okey;
unsigned short client_get_key PROTO0((void))
unsigned short client_get_key (void)
{
return(okey);
}
void client_set_key PROTO1(unsigned short, key)
void client_set_key (unsigned short key)
{
okey = key;
}
void client_init_key PROTO3(unsigned long, server_addr,
unsigned long, server_port,
unsigned short, key)
void client_init_key (unsigned long server_addr,
unsigned long server_port,
unsigned short key)
{
okey = key;
}

View File

@ -31,19 +31,30 @@ unsigned short client_net_len;
#define FOURGIGS 0xffffffffUL
/* returns mallocated abs. path merged from s2 and env.dir */
char *util_abs_path PROTO1(const char *, s2)
#define APPEND_PASSWORD if(have_password) \
{ \
strcat(path,"\n"); \
strcat(path,env_passwd); \
}
char *util_abs_path (const char * s2)
{
char *path, *s, *d, *t;
int have_password = 0;
if(!env_dir) env_dir = "";
if(!s2) s2 = "";
if(strlen(env_passwd)>0)
have_password=1;
if(*s2 == '/') {
path = malloc(strlen(s2)+2+strlen(env_passwd)+1);
sprintf(path,"/%s",s2);
if(have_password)
util_junk_password(path);
} else {
path = malloc(strlen(env_dir)+strlen(s2)+3+strlen(env_passwd)+1);
sprintf(path,"/%s/%s",env_dir,s2);
if(have_password)
util_junk_password(path);
}
for(t = path; *t; ) {
@ -54,6 +65,7 @@ char *util_abs_path PROTO1(const char *, s2)
if(t[0] == '.' && t[1] == '.') {
if(t-1 == path && t[2] == 0 ) {
*t = 0;
APPEND_PASSWORD;
return(path);
}
if(t-1 == path && t[2] == '/') {
@ -67,6 +79,7 @@ char *util_abs_path PROTO1(const char *, s2)
if(t != path || *s == '/') for(d = t; (*d++ = *s++); );
else {
t[1] = 0;
APPEND_PASSWORD;
return(path);
}
continue;
@ -75,6 +88,7 @@ char *util_abs_path PROTO1(const char *, s2)
if(t[0] == '.') {
if(t-1 == path && t[1] == 0 ) {
*t = 0;
APPEND_PASSWORD;
return(path);
}
if(t-1 == path && t[1] == '/') {
@ -90,11 +104,12 @@ char *util_abs_path PROTO1(const char *, s2)
}
t++;
}
APPEND_PASSWORD;
return(path);
}
static int util_split_path PROTO4(char *, path, char **, p1, char **, p2,
char **, p3)
static int util_split_path (char * path, char ** p1, char ** p2,
char ** p3)
{
char *s;
static char junk;
@ -121,13 +136,13 @@ static int util_split_path PROTO4(char *, path, char **, p1, char **, p2,
}
/* return current working directory (from environment) */
char *util_getwd PROTO1(char *, p)
char *util_getwd (char * p)
{
if(p) strcpy(p,env_dir);
return(p);
}
static RDIRENT **get_dir_blk PROTO1(char *, path)
static RDIRENT **get_dir_blk (char * path)
{
RDIRENT **dp;
char *p1, *p2, *fpath, buf[2*UBUF_SPACE];
@ -214,8 +229,8 @@ static RDIRENT **get_dir_blk PROTO1(char *, path)
free(fpath);
}
static int util_download_main PROTO5(char *, path, char *, fpath, FILE *, fp,
unsigned long, start_from, int, cmd)
static int util_download_main (char * path, char * fpath, FILE * fp,
unsigned long start_from, int cmd)
{
unsigned long pos, started_from = start_from, downloaded;
unsigned tmax, wrote, sent_time, rlen;
@ -268,7 +283,7 @@ static int util_download_main PROTO5(char *, path, char *, fpath, FILE *, fp,
return(0);
}
int util_download PROTO3(char *, path, FILE *, fp, unsigned long, start_from)
int util_download (char * path, FILE * fp, unsigned long start_from)
{
int code, len;
char *fpath;
@ -284,7 +299,7 @@ int util_download PROTO3(char *, path, FILE *, fp, unsigned long, start_from)
return(code);
}
int util_grab_file PROTO3(char *, path, FILE *, fp, unsigned long, start_from)
int util_grab_file (char * path, FILE * fp, unsigned long start_from)
{
int code, len;
char *fpath;
@ -313,7 +328,7 @@ int util_grab_file PROTO3(char *, path, FILE *, fp, unsigned long, start_from)
return(code);
}
int util_upload PROTO3(char *, path, FILE *, fp, time_t , stamp)
int util_upload (char * path, FILE * fp, time_t stamp)
{
unsigned long pos;
unsigned bytes, first, tmax, sent_time;
@ -422,7 +437,7 @@ int util_upload PROTO3(char *, path, FILE *, fp, time_t , stamp)
return(0);
}
static void util_get_env PROTO0((void))
static void util_get_env (void)
{
char *p;
@ -463,7 +478,7 @@ static void util_get_env PROTO0((void))
}
void env_client PROTO0((void))
void env_client (void)
{
util_get_env();
init_client(env_host,atoi(env_port),atoi(env_myport));
@ -471,7 +486,7 @@ void env_client PROTO0((void))
static DDLIST *ddroot = 0;
RDIR *util_opendir PROTO1(char *, path)
RDIR *util_opendir (char * path)
{
char *fpath;
RDIRENT **dep;
@ -505,13 +520,13 @@ RDIR *util_opendir PROTO1(char *, path)
return(rdirp);
}
void util_closedir PROTO1(RDIR *, rdirp)
void util_closedir (RDIR * rdirp)
{
rdirp->ddp->ref_cnt--;
free(rdirp);
}
rdirent *util_readdir PROTO1(RDIR *, rdirp)
rdirent *util_readdir (RDIR * rdirp)
{
static rdirent rde;
RDIRENT **dep;
@ -529,8 +544,18 @@ rdirent *util_readdir PROTO1(RDIR *, rdirp)
return(&rde);
}
/* Removes \npassword from input */
void util_junk_password(char *path)
{
char *pos;
int util_stat PROTO2(char *, path, struct stat *, sbuf)
pos=strchr(path,'\n');
if(pos != NULL)
/* terminate them! */
*pos='\0';
}
int util_stat (char * path, struct stat * sbuf)
{
static int statworks=1;
RDIR *drp;
@ -640,7 +665,7 @@ int util_stat PROTO2(char *, path, struct stat *, sbuf)
return(-1);
}
int util_cd PROTO1(char *, p)
int util_cd (char * p)
{
char *fpath;
UBUF *ub;
@ -671,7 +696,7 @@ int util_cd PROTO1(char *, p)
/* Perform a cd, but don't verify path. Assume the path has been
* pre-verified
*/
int util_cd2 PROTO1(char *, p)
int util_cd2 (char * p)
{
char *fpath;
@ -683,20 +708,11 @@ int util_cd2 PROTO1(char *, p)
return(0);
}
#ifdef PROTOTYPES
void util_process_file(char *path, int mode,
void (*process_file)(char *,struct stat *, int, int),
int (*process_start_dir)(char *,struct stat *,u_long *),
void (*process_end_dir)(char *,int,u_long,int),
int level)
#else
void util_process_file(path, mode, process_file, process_start_dir,
process_end_dir, level)
char *path;
int mode, level;
void (*process_file)(), (*process_end_dir)();
int (*process_start_dir)();
#endif
{
struct stat sbuf;
RDIR *rdir;

View File

@ -2,23 +2,22 @@
bin_PROGRAMS=fcatcmd fcdcmd fducmd ffindcmd fgetcmd fgrabcmd fhostcmd \
flscmd fmkdir fprocmd fput frmcmd frmdircmd fver fspmerge \
fstatcmd
fstatcmd fmvcmd
LDADD=-L../common -L../bsd_src -L../client -lclient -lcommon -lbsdfsp $(EX_LIBS)
fspmerge_SOURCES=merge.c printpro.c fspprof.l
fcdcmd_SOURCES=fcdcmd.c printpro.c
fprocmd_SOURCES=printpro.c fprocmd.c
noinst_HEADERS=printpro.h fhost.h
noinst_HEADERS=printpro.h fhost.h merge.h
fhostcmd_SOURCES=fhostcmd.c fspprof.l
fhostcmd_LDADD=$(LDADD)
fspmerge_LDADD=fcatcmd_m.o fcdcmd_m.o fducmd_m.o ffindcmd_m.o fgetcmd_m.o \
fgrabcmd_m.o fhostcmd_m.o flscmd_m.o fmkdir_m.o fprocmd_m.o \
fput_m.o frmcmd_m.o frmdircmd_m.o fver_m.o \
fput_m.o frmcmd_m.o frmdircmd_m.o fver_m.o fmvcmd_m.o \
fstatcmd_m.o $(LDADD)
fgetcmd_CFLAGS:=-DCOMMAND_GET
AM_CFLAGS:=-DSYSCONFDIR="\"@sysconfdir@\"" $(AM_CFLAGS)
@ -84,4 +83,8 @@ fstatcmd_m.o:
@echo '#include "fstatcmd.c"' > fstatcmd_m.c
${COMPILE} -Dmain=fstatcmd_main -c fstatcmd_m.c
@rm -f fstatcmd_m.c
fmvcmd_m.o:
@echo '#include "fmvcmd.c"' > fmvcmd_m.c
${COMPILE} -Dmain=fmvcmd_main -c fmvcmd_m.c
@rm -f fmvcmd_m.c

View File

@ -20,14 +20,14 @@
#include <unistd.h>
#endif
static RETSIGTYPE dont_die PROTO1(int, signum)
static RETSIGTYPE dont_die (int signum)
{
#ifndef RELIABLE_SIGNALS
signal(SIGPIPE,dont_die);
#endif
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
char **av;

View File

@ -21,10 +21,10 @@
#include "merge.h"
#include "printpro.h"
static int f_cd PROTO1(const char *, p)
static int f_cd (const char * p)
{
UBUF *ub;
ub = client_interact(CC_GET_PRO,0L, strlen(p), (unsigned const char *)p+1, 0,
(unsigned char *)NULLP);
@ -38,7 +38,7 @@ static int f_cd PROTO1(const char *, p)
}
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
char *np;
char **av, *av2[2];
@ -54,7 +54,11 @@ int main PROTO2(int, argc, char **, argv)
av2[1] = 0;
}
np = util_abs_path(*av);
if(f_cd(np))puts(np);
if(f_cd(np))
{
util_junk_password(np);
puts(np);
}
else {
puts(env_dir);
}

View File

@ -34,8 +34,8 @@
static u_long total_file_size;
static void add_file_size PROTO4(char *, name, struct stat *, sbufp,
int, mode, int, level)
static void add_file_size (char * name, struct stat * sbufp,
int mode, int level)
{
register u_long file_size;
@ -45,13 +45,13 @@ static void add_file_size PROTO4(char *, name, struct stat *, sbufp,
((mode & EACH) && level < 2)) printf("%-7ld %s\n", file_size, name);
}
static int start_dir PROTO3(char *, name, struct stat *, sbufp, u_long *, sum)
static int start_dir (char * name, struct stat * sbufp, u_long * sum)
{
*sum = total_file_size;
return(0);
}
static void end_dir PROTO4(char *, path, int, mode, u_long, sum, int, level)
static void end_dir (char * path, int mode, u_long sum, int level)
{
/* directories are printed as default */
/* but, check recursion level */
@ -64,7 +64,7 @@ static void end_dir PROTO4(char *, path, int, mode, u_long, sum, int, level)
}
/* ARGSUSED */
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
int mode=0;
int filcnt = 0;

View File

@ -64,17 +64,17 @@ time_t now; /* time find was run */
int isoutput; /* user specified output operator */
int process; /* process current directory */
static void usage_ffind PROTO0((void));
static void usage_ffind (void);
static void eval_file PROTO4(char *, name, struct stat *, sbufp,
int, mode, int, level)
static void eval_file (char * name, struct stat * sbufp,
int mode, int level)
{
register PLAN *p;
for (p = plan; p && (p->eval)(p, sbufp, name); p = p->next);
}
static int eval_dir PROTO3(char *, name, struct stat *, sbufp, u_long *, sum)
static int eval_dir (char * name, struct stat * sbufp, u_long * sum)
{
register PLAN *p;
@ -83,7 +83,7 @@ static int eval_dir PROTO3(char *, name, struct stat *, sbufp, u_long *, sum)
return (process);
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
register char **p;
char *singlefile[2], **files;
@ -117,7 +117,7 @@ int main PROTO2(int, argc, char **, argv)
return(0);
}
static void usage_ffind PROTO0((void))
static void usage_ffind (void)
{
fprintf(stderr,"usage: ffind file [file ...] expression\n");
exit(1);

View File

@ -43,7 +43,7 @@ static unsigned long start_from;
static int len;
static RETSIGTYPE fsp_cleanup PROTO1(int, signum)
static RETSIGTYPE fsp_cleanup (int signum)
{
char filename[20];
sprintf(filename,".fsp.%d",getpid());
@ -57,7 +57,7 @@ get_file
#else
grab_file
#endif
PROTO4(char *, path, struct stat *, sbufp, int, mode, int, level)
(char * path, struct stat * sbufp, int mode, int level)
{
char *name = path + len;
FILE *fp;
@ -150,7 +150,7 @@ PROTO4(char *, path, struct stat *, sbufp, int, mode, int, level)
return;
}
static int make_dir PROTO3(char *, name, struct stat *, sbufp, u_long *, mode)
static int make_dir (char * name, struct stat * sbufp, u_long * mode)
{
struct stat sbuf;
@ -178,7 +178,7 @@ static int make_dir PROTO3(char *, name, struct stat *, sbufp, u_long *, mode)
return (0);
}
static void usage PROTO0((void))
static void usage (void)
{
#ifdef COMMAND_GET
@ -200,7 +200,7 @@ static void usage PROTO0((void))
* -r recursively get directories
* -p preserve date/times of original file on downloaded copy
*/
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
char **av, *av2[2], n[1024];
int prompt, mode = 0;

View File

@ -115,7 +115,7 @@ static struct fsp_host *find_host(const char *name)
return NULL;
}
static void host_usage PROTO0((void)) /* print usage message */
static void host_usage (void) /* print usage message */
{
fprintf(stderr,"Usage: fhost [-d delay] [-p local port] [-l local dir]\n");
fprintf(stderr," [-o timeout] [-t trace] [-w password]\n");
@ -125,7 +125,7 @@ static void host_usage PROTO0((void)) /* print usage message */
}
/* get data out of resource file */
static void parse_prof_file_new PROTO1(const char *, filename)
static void parse_prof_file_new (const char * filename)
{
FILE *input=NULL;
@ -150,7 +150,7 @@ static void parse_prof_file_new PROTO1(const char *, filename)
fclose(input);
}
static void list_prof_file PROTO0((void)) /* list resource file */
static void list_prof_file (void) /* list resource file */
{
int i;
for(i=0;i<hostsize;i++)
@ -161,7 +161,7 @@ static void list_prof_file PROTO0((void)) /* list resource file */
return;
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
int optletter,csh,lhost=0;
register char *p;

View File

@ -20,13 +20,13 @@
#include <unistd.h>
#endif
int ls_bad PROTO1(int, n)
int ls_bad (int n)
{
client_done();
exit(n);
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
env_client();

View File

@ -19,7 +19,7 @@
#include "my-string.h"
#include "merge.h"
static int make_dir PROTO1(char *, p)
static int make_dir (char * p)
{
char *op;
UBUF *ub;
@ -41,7 +41,7 @@ static int make_dir PROTO1(char *, p)
return(0);
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
env_client();
while(*++argv) make_dir(*argv);

101
clients/fmvcmd.c Normal file
View File

@ -0,0 +1,101 @@
/*********************************************************************\
* Copyright (c) 2004 by Radim Kolar (hsn@netmag.cz) *
* Copyright (c) 1991 by Wen-King Su (wen-king@vlsi.cs.caltech.edu) *
* *
* You may copy or modify this file in any manner you wish, provided *
* that this notice is always included, and that you hold the author *
* harmless for any loss or damage resulting from the installation or *
* use of this software. *
\*********************************************************************/
#include "tweak.h"
#include "client_def.h"
#include "c_extern.h"
#include "bsd_extern.h"
#include "co_extern.h"
#ifdef STDC_HEADERS
#include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include "my-string.h"
#include "merge.h"
static unsigned int n;
static unsigned char buf[UBUF_SPACE];
static int append_to_buf(const char *what,size_t len)
{
if(n+len > UBUF_SPACE )
return -1;
memcpy(buf+n,what,len);
n+=len;
return 0;
}
static void rename_file (const char *fname,const char *target)
{
char *fpath;
unsigned int l;
UBUF *reply;
/* reset buffer */
n=0;
/* append source file */
fpath = util_abs_path(fname);
l=strlen(fpath)+1;
if(append_to_buf(fpath,l))
{
printf("path too long: %s.\n",fpath);
free(fpath);
return;
}
free(fpath);
/* add dest */
fpath=util_abs_path(target);
l=strlen(fpath)+1;
if(append_to_buf(fpath,l))
{
printf("path too long: %s.\n",fpath);
free(fpath);
return;
}
/* send our nicely crafted junk to the server */
reply=client_interact (CC_RENAME,0,n+l,buf,0,NULL);
if(reply->cmd==CC_ERR)
{
/* seems like we have really bad luck today */
printf("mv %s %s: %s\n",fname,target,reply->buf);
}
}
int main (int argc, char ** argv)
{
char **av, *av2[2];
env_client();
if(argc>1)
{
for( optind=1; argc-1>optind ; optind++)
{
if(!(av = glob(argv[optind])))
{
av = av2;
av2[0] = argv[optind];
av2[1] = 0;
}
while(*av)
rename_file(*av++,argv[argc-1]);
}
}
else
fprintf(stderr,"%s source target\n", argv[0]);
client_done();
exit(0);
}

View File

@ -21,7 +21,7 @@
#endif
#include "printpro.h"
static int get_pro PROTO1(const char *, p)
static int get_pro (const char * p)
{
char *op;
UBUF *ub;
@ -40,7 +40,7 @@ static int get_pro PROTO1(const char *, p)
return(0);
}
static int set_pro PROTO2(char *, p, char *, key)
static int set_pro (char * p, char * key)
{
char *op;
UBUF *ub;
@ -59,7 +59,7 @@ static int set_pro PROTO2(char *, p, char *, key)
return(0);
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
char **av, *av2[2], *key;

View File

@ -23,13 +23,13 @@
static int timestamps=0;
static int optletter;
static void usage PROTO0((void))
static void usage (void)
{
printf("fput");
printf(" [-p | [ -h | -? ] ] file ...\n");
}
static int put_file PROTO1(char *, path)
static int put_file (char * path)
{
struct stat sb;
char *name, *t2;
@ -55,7 +55,7 @@ static int put_file PROTO1(char *, path)
return(0);
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
char n[1024];
int prompt;

View File

@ -20,7 +20,7 @@
#include "my-string.h"
#include "merge.h"
static int remove_it PROTO1(char *, p)
static int remove_it (char * p)
{
char *op;
UBUF *ub;
@ -37,7 +37,7 @@ static int remove_it PROTO1(char *, p)
return(0);
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
char **av, *av2[2];

View File

@ -20,7 +20,7 @@
#include "my-string.h"
#include "merge.h"
static int remove_it PROTO1(char *, p)
static int remove_it (char * p)
{
char *op;
UBUF *ub;
@ -38,7 +38,7 @@ static int remove_it PROTO1(char *, p)
return(0);
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char **argv)
{
char **av, *av2[2];

View File

@ -22,7 +22,7 @@
#endif
#include "my-string.h"
static void stat_file PROTO1(const char *,fname)
static void stat_file (const char *fname)
{
struct stat sb;
struct tm *ftime;
@ -52,7 +52,7 @@ static void stat_file PROTO1(const char *,fname)
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
char n[1024];
int prompt;

View File

@ -20,7 +20,7 @@
#include <unistd.h>
#endif
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
UBUF *ub;
unsigned int len, tput = 0, len2;
@ -70,7 +70,10 @@ int main PROTO2(int, argc, char **, argv)
{
tput=0;
tput = BB_READ2(v2);
printf("\tMax. packet size supported by server is %d bytes.\n",tput);
if (tput > 1024)
printf("\tMax. payload size supported by server is %d bytes.\n",tput);
else
printf("\tPayload size prefered by server is %d bytes.\n",tput);
}
}
else

View File

@ -18,7 +18,7 @@
#include "my-string.h"
#include "merge.h"
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
char *p, *q;

View File

@ -10,18 +10,19 @@
/* spliting the prototypes from merge.c to merge.h */
/* prototypes */
int fcatcmd_main PROTO2(int, argc, char **, argv);
int fcdcmd_main PROTO2(int, argc, char **, argv);
int fgetcmd_main PROTO2(int, argc, char **, argv);
int fgrabcmd_main PROTO2(int, argc, char **, argv);
int flscmd_main PROTO2(int, argc, char **, argv);
int fmkdir_main PROTO2(int, argc, char **, argv);
int fprocmd_main PROTO2(int, argc, char **, argv);
int fput_main PROTO2(int, argc, char **, argv);
int frmcmd_main PROTO2(int, argc, char **, argv);
int frmdircmd_main PROTO2(int, argc, char **, argv);
int fver_main PROTO2(int, argc, char **, argv);
int fducmd_main PROTO2(int, argc, char **, argv);
int fhostcmd_main PROTO2(int, argc, char **, argv);
int ffindcmd_main PROTO2(int, argc, char **, argv);
int fstatcmd_main PROTO2(int, argc, char **, argv);
int fcatcmd_main (int argc, char ** argv);
int fcdcmd_main (int argc, char ** argv);
int fgetcmd_main (int argc, char ** argv);
int fgrabcmd_main (int argc, char ** argv);
int flscmd_main (int argc, char ** argv);
int fmkdir_main (int argc, char ** argv);
int fprocmd_main (int argc, char ** argv);
int fput_main (int argc, char ** argv);
int frmcmd_main (int argc, char ** argv);
int frmdircmd_main (int argc, char ** argv);
int fver_main (int argc, char ** argv);
int fducmd_main (int argc, char ** argv);
int fhostcmd_main (int argc, char ** argv);
int ffindcmd_main (int argc, char ** argv);
int fstatcmd_main (int argc, char ** argv);
int fmvcmd_main (int argc, char ** argv);

View File

@ -23,17 +23,18 @@
#define N_or_Y(y) ((flags & (y)) ? "N" : "Y")
#define Machine(y) ((flags & (y)) ? "YOU" : "other")
int print_pro PROTO2(UBUF *, ub, FILE *, where)
int print_pro (UBUF * ub, FILE * where)
{
char flags;
unsigned len, len1;
char *pro1, *pro2;
/* length of readme */
len = BB_READ2(ub->bb_len);
/* len1= size of extended protection data */
len1 = BB_READ4(ub->bb_pos);
pro1 = ub->buf;
pro2 = ub->buf+len;
if(len1) {
flags = *pro2;
fprintf(where,"owner: %s, del: %s, create: %s, mkdir: %s, get: %s, list: %s, rename: %s.\n",
@ -41,7 +42,7 @@ int print_pro PROTO2(UBUF *, ub, FILE *, where)
Y_or_N(DIR_MKDIR), N_or_Y(DIR_GET), Y_or_N(DIR_LIST),
Y_or_N(DIR_RENAME));
}
fprintf(where,"%s", pro1);
if(len) fprintf(where,"%s", pro1);
fprintf(where,"\n");
return(0);

View File

@ -1 +1 @@
int print_pro PROTO2(UBUF *, ub, FILE *, where);
int print_pro (UBUF * ub, FILE * where);

View File

@ -26,7 +26,7 @@
#include <netdb.h>
#include <netinet/in.h>
int _x_udp PROTO2(const char *, bindaddress, unsigned short *, port)
int _x_udp (const char * bindaddress, unsigned short * port)
{
int f;
socklen_t len;
@ -55,7 +55,7 @@ int _x_udp PROTO2(const char *, bindaddress, unsigned short *, port)
return(f);
}
int _x_adr PROTO3(const char *, host, int, port, struct sockaddr_in *, his)
int _x_adr (const char *host, int port, struct sockaddr_in * his)
{
char myhost[128];
struct hostent *H;
@ -83,7 +83,7 @@ int _x_adr PROTO3(const char *, host, int, port, struct sockaddr_in *, his)
return(0);
}
int _x_select PROTO2(fd_set *, rf, long, tt) /* tt is in unit of ms */
int _x_select (fd_set * rf, long tt) /* tt is in unit of ms */
{
struct timeval timeout;

View File

@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a working configure script.
dnl tested with autoconf 2.57
AC_INIT(fsp,2.8.1b20,hsn@netmag.cz)
AC_INIT(fsp,2.8.1b21,hsn@netmag.cz)
AC_CONFIG_SRCDIR(server/main.c)
AM_INIT_AUTOMAKE([dist-bzip2])
AM_MAINTAINER_MODE
@ -32,6 +32,10 @@ case $host_os in
*cygwin* ) AC_DEFINE(OS_CYGWIN,1,[Define if you are building for cygwin]) AC_MSG_RESULT(yes);;
* ) AC_MSG_RESULT(no);;
esac
AC_MSG_CHECKING([if we are building lamer pack])
AC_ARG_ENABLE(lamerpack,[Build for lamers],AC_DEFINE(LAMERPACK,1,[Define if you want to build for lamer disbled ppl]) AC_MSG_RESULT(YES),AC_MSG_RESULT(NO))
AC_MSG_CHECKING([if enable extra debug code])
AC_ARG_ENABLE(debug,[Enable client library debuging],AC_DEFINE(DEBUG,1,[Define if you want more debug messages]) AC_MSG_RESULT(YES),AC_MSG_RESULT(NO))
AC_PROG_RANLIB
AM_PROG_LEX
AC_PROG_LN_S
@ -58,8 +62,8 @@ then
-Wno-system-headers -Wredundant-decls \
-Wmissing-noreturn -pedantic \
-Wlong-long -Wundef -Winline \
-Wno-unused-parameter
# -Wunreachable-code -Wconversion
-Wno-unused-parameter \
-Wunreachable-code -Wconversion
do
if $CC $i $ac_cv_prog_gcc_flags -c configure-dummy.c >/dev/null 2>&1
then ac_cv_prog_gcc_flags="$ac_cv_prog_gcc_flags $i"
@ -71,7 +75,6 @@ rm -f configure-dummy.c configure-dummy.o
CFLAGS="$CFLAGS $ac_cv_prog_gcc_flags"
AC_SUBST(CFLAGS)
AC_AIX
AC_C_PROTOTYPES
AC_C_CONST
AC_C_VOLATILE
AC_PROG_CPP
@ -81,10 +84,6 @@ if test "${enable_maintainer_mode+set}" = set; then
CFLAGS="-g3 $ac_cv_prog_gcc_flags"
AC_CHECK_LIB(efence,EF_Abort)
fi
AC_MSG_CHECKING([if enable extra debug code])
AC_ARG_ENABLE(debug,[Enable client library debuging],AC_DEFINE(DEBUG,1,[Define if you want more debug messages]) AC_MSG_RESULT(YES),AC_MSG_RESULT(NO))
AC_MSG_CHECKING([if we are building lamer pack])
AC_ARG_ENABLE(lamerpack,[Build for lamers],AC_DEFINE(LAMERPACK,1,[Define if you want to build for lamer disbled ppl]) AC_MSG_RESULT(YES),AC_MSG_RESULT(NO))
AC_HEADER_STDC
AC_CHECK_HEADERS(limits.h sys/syslimits.h errno.h)
AC_CHECK_HEADERS(string.h memory.h strings.h unistd.h sys/resource.h utime.h)

View File

@ -25,9 +25,12 @@ Why you need it
- stealth operation
- old proven software with 10 years history
- Elite SitEZ has non interrupted operation by
lamerz for more than 10 years!
- for EliTe only
- attack resistant
- lamerz hates it
- 100% attack resistant
- net adminz do not like it
- lamerz can not handle it
STuFF firSt!
@ -35,21 +38,23 @@ you neeeed to get a p-file called cygwin1.dll. lamerz at www.cygwin.com
have some. Grab a copy, man. Copy it to your winlost sistema32 dyr.
Have it? Right.
Now rock!
There is a p-file fspd.exe. This is for stuff sharing.
Running this is easy:
There is a p-file fspd.exe. This is for stuff sharing. Server. You know.
Right. Running this is easy:
fspd.exe -d c:\your\stuff\to\share -p 53
this number is important. Recommended numbers for stealth
operation are: 53, 2090, 137-139, 13, 21, 80, 443
operation are: 53, 2090, 137-139, 13, 80, 443
You can be catched more easily with bad number, so chooze wisely. Rememmber,
some numbers like 2221 are used only by Elite! do not try it at
home; bad thingz can hepen. you know. police will certainly
take a visit.
some numbers like 2221, 21, 2000, 2001 are used only by Elite!
do not try it at home; bad thingz can hepen. you know. police will certainly
take a visit. Lamers can detect you more easily on this ports, so be
wise a little. Remember: You are c000l.
Get more stuff!

View File

@ -1,7 +1,8 @@
FILE SERVICE PROTOCOL VERSION 2
FSP v2
Document version 0.11
Last updated 24 Oct 2004
Document version 0.13
Last updated 1 Nov 2004
Also known as
File Slurping Protocol,
@ -13,10 +14,15 @@
`FSP is what anonymous FTP *should* be'
This document was created by Radim Kolar, because there is no RFC for
FSP. It was planed, but never comes out. Based on sources of FSP 2.8.1 Beta 13.
FSP. It was planed, but never comes out. See FSP Project Home page
http://fsp.sourceforge.net/ for up-to-date version of this document.
Also contact Radim Kolar with questions and if you need to help with
an implementation of this protocol in productivity environment.
This document is not copyrighted and is placed into public domain.
Data formats used in this document
Data formats used in this document:
byte - unsigned 1 byte integer 0-255
word - unsigned 2 byte integer 0-65535
long - unsigned 4 byte integer 0-4294967295
@ -24,37 +30,60 @@ Data formats used in this document
NULL - byte 00
ASCIIZ - ASCII string terminated with one NULL (the same as used in C
language)
numbers are stored in network byte order (high byte first).
Numbers are stored packed in network byte order (high byte first).
hexadecimal (base 16) numbers have 0x prefix.
File or directory names uses '/' as directory separator, they do not
need to start or end with it. There are in ASCIIZ format.
FSP servers starting from version 2.8 can have optional password
protection. To get password protected file, append '\n' followed
by password to filename.
Numbers starting with 0x are in hexadecimal (base 16) notation.
Transport
FSP uses UDP datagrams as transport medium. Minimum UDP packet size (not
including size of UDP, IP and link layer headers) is 12 bytes, maximum UDP
packet size is 1024+12 bytes.
FSP uses UDP datagrams as standard transport medium for operation in
Internet Networks.
FSP protocol uses checksum and payload size, so it do not require
any underlying transport protocol and can be used as very simple
raw-protocol (for example for sending data over serial line). This
makes it very popular in embedded devices area, because it is
extremely easy to implement.
FSP packets can have an optional extra data area. For supporting
packets with this, underlying transport must make size of received
packet available to FSP protocol stack at server side. Without this
information, full support for extra data area is not possible.
Servers can still send extra data in reply to CC_VERSION and
CC_GET_PRO because length of extra data is recorded in position
field of FSP header. Clients must check this field, when checking
checksums of received packets of that kind and process these extra
bytes.
Minimum UDP packet size (not including size of UDP, IP and link
layer headers) is 12 bytes (FSP v2 header only), maximum standard
UDP packet size is 1024+12 bytes. Server can accept longer packets,
but must send longer packets only when requested by client. All
servers and clients must support receiving 1024+12 bytes long
packets.
Security
Design
FSP protocol was not designed to transfer secret data. It was designed as
alternative protocol for providing lightweight access to collection of public
files. FSP has the same user level of security as the anonymous FTP file
server. FSP has better network level security, because it was designed
to ressist various denial-of-service attacks. FSP protocol v3 will be
designed to be fully secure. FSP3 will not be backward compatible with
FSP2.
FSP protocol was not designed to transfer secret data. It was
designed as alternative protocol for providing lightweight access to
collection of public files. FSP has the same user level of security
as the anonymous FTP file server. FSP has better network level
security, because it was designed to resist various
denial-of-service attacks. FSP protocol v3 will be designed to be
fully secure. FSP3 will not be backward compatible with FSP2.
Passwords
Recently, password support was added to protocol, because just
too many people wants it and there were hacked version of FSP with
password support floating around. Passwords are transmited in clear
Recently, password support was added to protocol, because just too
many people wants it and there were hacked version of FSP with
password support floating around. Passwords are transmitted in clear
text over network which makes them a weak protection for determined
intruder.
@ -63,11 +92,12 @@ FSP Packet format:
DATA - size = defined in header (DATA_LENGTH)
XTRA DATA - size = packet_size - header_size (12) - DATA_LENGTH
Maximal data size DATA_LENGTH + XTRA_DATA length is 1024. Clients and servers
are not required to support XTRA DATA (but in current FSP implementation does).
If XTRA DATA are provided, there must be also contained in MESSAGE_CHECKSUM.
Size of data payload is DATA_LENGTH + XTRA_DATA length. Clients and
servers are not required to support XTRA DATA (but current FSP
implementation does). If XTRA DATA are provided, there must be also
contained in MESSAGE_CHECKSUM.
HEADER FORMAT (12 bytes)
FSP v2 HEADER FORMAT (12 bytes)
byte FSP_COMMAND
byte MESSAGE_CHECKSUM
word KEY
@ -76,12 +106,13 @@ HEADER FORMAT (12 bytes)
long FILE_POSITION
MESSAGE_CHECKSUM
Entire packet (HEADER + DATA + XTRA DATA) is checksumed. When computing a
Entire packet (HEADER + DATA + XTRA DATA) is checksummed. When computing a
checksum use zero in place of MESSAGE_CHECKSUM header field.
Due to some unknown reason, method of computing checksums is different in each
direction. For packets travelling from server to client initial checksum
value is zero, otherwise it is HEADER + DATA + XTRA DATA size.
Due to some unknown reason, method of computing checksums is different
in each direction. For packets traveling from server to client initial
checksum value is zero, otherwise it is HEADER + DATA + XTRA DATA
size.
Checksums in server->client direction are computed as follows:
@ -90,22 +121,32 @@ Checksums in server->client direction are computed as follows:
for(t = packet_start, sum = 0; t < packet_end; sum += *t++);
checksum= sum + (sum >> 8);
One byte checksums can be considered weak when compared with other
protocols, which are using at least CRC16 checksum types. FSP server
fed by random data can resist for hours without falsely accepting
random data as valid FSP packet. This demonstration shows, that these
checksums when very easy to compute, are sufficient for guarding
against line noise.
KEY
Client's message to server contain a KEY value that is the same as the KEY
value of the previous message received from the server. KEY is choosen random
value of the previous message received from the server. KEY is chosen random
by server.
TIMEOUTS
Resends:
Server will accept resent message from client with old KEY after 3 seconds.
Client MUST wait at least 1 second before resending a message.
It is recommended to use initial delay of 1.34 second and after each
unsuccessfull resend multiply delay time by 1.5. Maximum recommended delay
time is 300 seconds.
Session:
Server will accept message with bad key after 60 seconds. Clients should
sent CC_BYE at end of their session, CC_BYE terminates a session.
After session is terminated, sever will accept any next key.
1. Resend
Server will accept resent message from client with old KEY after 3
seconds. Client MUST wait at least 1 second before resending a
message. It is recommended to use initial delay of 1.34 second and
after each unsuccessful resend multiply delay time by 1.5. Maximum
delay time is 300 seconds.
2. Session
Server will accept message with bad key after 60 seconds. Clients
should sent CC_BYE at end of their session, CC_BYE terminates a
session. After session is terminated, sever will accept any next key.
SEQUENCE
Similarly, the server's message to client contains a SEQUENCE value
@ -119,7 +160,7 @@ size of this field is not included in header and must be computed from
received packet size.
FILE POSITION
When transfering files, this field shows current position of requested
When transferring files, this field shows current position of requested
data.
FSP COMMANDS
@ -152,14 +193,22 @@ FSP File servers MUST supports following commands:
bit 2 set - reverse lookup required
bit 3 set - server is in private mode
bit 4 set - thruput control
bit 5 set - server accept XTRA
DATA on input
if bit 4 is set thruput info follows
long - max_thruput allowed (in bytes/sec)
word - max. packet size supported by server
word - max. payload size supported by server
if > 1024, otherwise preferred
payload size.
Compatibility
Max. packet size supported is reported only by fspd 2.8.1 b20
or newer.
Max. / preferred packet size supported is reported only
by fspd 2.8.1 b20 or newer.
Bit 5 - accept xtra data flag is set only by fspd
2.8.1 b21 or newer.
CC_ERR 0x40 - error response from server
@ -184,7 +233,7 @@ FSP File servers MUST supports following commands:
file position: position in directory
data: ASCIIZ directory name
xtra data: (not required)
word - prefered size of directory block
word - preferred size of directory block
reply
file position: same as in request
@ -197,8 +246,8 @@ which can be shorter. Default and maximum size of directory listing block is
1024 bytes. Size of directory block can be changed by server using extra
data information sent by client.
Directory blocks can't be split accross message boundary and client
can't do seeking to any arbitary offset, which can broke dirblock
Directory blocks can't be split across message boundary and client
can't do seeking to any arbitrary offset, which can broke dirblock
into 2 messages. In short: Every message can contain only one
unsplited directory block.
@ -208,14 +257,16 @@ standard format, a 4 bytes quantity 'size', and 1 byte of 'type'. Header is
followed by ASCIIZ encoded 'name'. RDIRENT is followed by enough number of
padding to fill to an 4-byte boundary.
At this point, if the next RDIRENT entry to follow will spread across 1k
boundary, then two possible things will happen:
At this point, if the next RDIRENT entry to follow will spread across
directory block boundary, then two possible things will happen:
1) if the HEADER fits between this entry and the 1k boundary,
a complete header will be filled in with a 'type' set to RDTYPE_SKIP
and no name followed - just pad to 1k boundary. Clients which sees
RDTYPE_SKIP header skips over next data in packet.
2) if the HEADER does not fit, then simply pad to the 1k boundary.
1) if the HEADER fits between this entry and the directory block
boundary, a complete header will be filled in with a 'type' set to
RDTYPE_SKIP and no name followed - just pad to boundary. Clients
which sees RDTYPE_SKIP header skips over remaining data in packet.
2) if the HEADER does not fit, then simply pad to the directory
block boundary.
This will make sure that messages carrying directory information carry only
complete directory entries and no fragmented entries.
@ -310,7 +361,7 @@ RDIRENT.HEADER types:
reply
file position: number of extra protection bytes (now 1)
data: ASCIIZ directory readme
xtra data: extra protection data (format follows)
xtra data: protection data (format follows)
Protection bits:
0 - caller owns the directory
@ -328,6 +379,7 @@ RDIRENT.HEADER types:
causes that directory can be listable even it do not have
6th bit set.
CC_SET_PRO 0x48 - set directory protection
request
@ -382,7 +434,7 @@ Commands starting from FSP version 2.4 ( released March 27, 1992 )
CC_GRAB_FILE 0x4B - atomic get+delete a file
same format as CC_GET_FILE, but file is deleted after
sucessfull transfer is done. If there are multiple
successful transfer is done. If there are multiple
grabs for the same file, only one will succeed.
CC_GRAB_DONE 0x4C - atomic get+delete a file done
@ -448,3 +500,5 @@ Reserved commands:
header will be used in protocol version 3.
CC_TEST 0x81 - reserved for testing of new header
ignore this line vi: tw=70

View File

@ -1,4 +1,4 @@
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.2//EN" [
<!-- define some ENTITYs -->
<!ENTITY fsp "File Service Protocol">
]>
@ -542,6 +542,19 @@
fine-tune its retry algorithm
by computing packet loss ratio of network, and duplicate
packet rate.
<sect2>
<title>Why not use bigger packet size?</title>
<para>
&fsp; defines maximum packet size 1024 bytes of data + header.
Because MTU of most networks is about 1500 bytes. It is true, that
we can use slightly bigger packets for gaining some speed.
We have performed some benchmarks and they shows only minor
performance increase, about 10-15 percent. Similar testing
was performed by HP in <ulink url="http://www.ietf.org/rfc/rfc2348.txt">RFC 2348</ulink>.
<para>
For bigger performance enhancement we need to use at least 2KB,
but packets of that size must be fragmented on most network and fragmenting increases possibility of packet loss. We will not increase packet size
in FSP v2, but we are willing to do some experiments in FSP v3.
</sect1>
</article>
<!-- vim: set expandtab: -->

View File

@ -7,8 +7,13 @@
# This is NOT needed if running under inetd, but otherwise is required.
# Standard port for FSP is 21, other popular ports are 2001 and 2000.
# Please run official FSP sites on port 21.
#
# If you want a random port from 1024 - 65535 range, set port to 65535
#
#
# ================================================================
# If you want to avoid detection by lamer security scanner nessus
# do not use ports: 21, 2000 and 2221.
# ================================================================
port 21
# Server can listen only on particular network interface
@ -38,7 +43,7 @@ homedir_restricted yes
# 'use_access_files' if server should check for special .FSP files
# in directory and set access rights acording to that.
# In most installation, yes is right. Use `no` if people can uload
# In most installation, yes is right. Use `no` if people can upload
# files starting with .FSP into fsp server homedir.
use_access_files yes
@ -60,8 +65,9 @@ pidlogname /var/run/fspd.pid
# The 'grabcommand' can turn grab command on or off.
grabcommand on
# The 'vercommand' can turn fver command on or off. Many FSP scanners
# are using this command as detection of FSP presence
# The 'vercommand' can turn fver command on or off. All known FSP scanners
# are using this command as detection of FSP presence.
# vercommand must be disabled for stealth operation. Yes, lamers sucks.
vercommand on
# The 'readme' commands specifies the name of the local readme file
@ -129,7 +135,8 @@ logfile ../logs/logfile
log all !readonly
#The 'xferlog' command tells server where to use wuftpd compatible
#transfer log file. Thos logs currectly do not support partial transfers.
#transfer log file. Loging substem currectly do not support
#recording of partial transfers.
xferlog ../logs/xferlog
# The 'thruput' command is used to specify the maximum average

View File

@ -1,5 +1,5 @@
## Process this file with automake to produce Makefile.in
noinst_HEADERS=bsd_extern.h c_extern.h client_conf.h client_def.h co_extern.h \
common_def.h find.h ls.h my-string.h proto.h s_extern.h server_conf.h \
common_def.h find.h ls.h my-string.h s_extern.h server_conf.h \
server_def.h tweak.h

View File

@ -2,6 +2,6 @@
#define _FSP_BSD_EXTERN_H_ 1
/* glob.c */
char **glob PROTO0((register char *));
char **glob (register char *);
#endif /* _FSP_BSD_EXTERN_H_ */

View File

@ -4,40 +4,41 @@
/* lib.c */
extern int client_trace;
extern unsigned long udp_sent_time,target_delay,target_maxdelay;
UBUF *client_interact PROTO0((unsigned char, unsigned long, unsigned int,
UBUF *client_interact (unsigned char, unsigned long, unsigned int,
unsigned const char *, unsigned int,
unsigned const char *));
void init_client PROTO0((const char *, unsigned short, unsigned short));
int client_done PROTO0((void));
unsigned const char *);
void init_client (const char *, unsigned short, unsigned short);
int client_done (void);
/* lock.c */
extern int key_persists;
unsigned short client_get_key PROTO0((void));
void client_set_key PROTO0((unsigned short));
void client_destroy_key PROTO0((void));
void client_init_key PROTO0((unsigned long, unsigned long,
unsigned short));
unsigned short client_get_key (void);
void client_set_key (unsigned short);
void client_destroy_key (void);
void client_init_key (unsigned long, unsigned long,
unsigned short);
/* util.c */
extern const char *env_dir,*env_passwd,*env_local_dir,*env_port,*env_myport,*env_host,*env_listen_on;
extern unsigned int env_timeout;
extern unsigned short client_buf_len,client_net_len;
char *util_abs_path PROTO0((const char *));
char *util_getwd PROTO0((char *));
int util_download PROTO0((char *, FILE *, unsigned long));
int util_grab_file PROTO0((char *, FILE *, unsigned long));
int util_upload PROTO0((char *, FILE *, time_t));
void env_client PROTO0((void));
RDIR *util_opendir PROTO0((char *));
void util_closedir PROTO0((RDIR *));
rdirent *util_readdir PROTO0((RDIR *));
int util_stat PROTO0((char *, struct stat *));
int util_cd PROTO0((char *));
int util_cd2 PROTO0((char *));
void util_process_file PROTO0((char *, int,
void (*)PROTO0((char *,struct stat *,int,int)),
int (*)PROTO0((char *,struct stat *,u_long *)),
void (*)PROTO0((char *,int,u_long,int)),
int));
char *util_abs_path (const char *);
void util_junk_password(char *path);
char *util_getwd (char *);
int util_download (char *, FILE *, unsigned long);
int util_grab_file (char *, FILE *, unsigned long);
int util_upload (char *, FILE *, time_t);
void env_client (void);
RDIR *util_opendir (char *);
void util_closedir (RDIR *);
rdirent *util_readdir (RDIR *);
int util_stat (char *, struct stat *);
int util_cd (char *);
int util_cd2 (char *);
void util_process_file (char *, int,
void (*)(char *,struct stat *,int,int),
int (*)(char *,struct stat *,u_long *),
void (*)(char *,int,u_long,int),
int);
#endif /* _FSP_C_EXTERN_H_ */

View File

@ -1,23 +1,25 @@
#ifndef _FSP_CO_EXTERN_H_
#define _FSP_CO_EXTERN_H_ 1
/* common routines for both server and clients */
#ifndef HAVE_STRDUP
/* strdup.c */
char *strdup PROTO0((char *));
char *strdup (const char *);
#endif
#ifndef HAVE_RANDOM
/* random.c */
void srandom PROTO0((unsigned int));
char *initstate PROTO0((unsigned int, char *, int));
char *setstate PROTO0((char *));
long random PROTO0((void));
void srandom (unsigned int);
char *initstate (unsigned int, char *, int);
char *setstate (char *);
long random (void);
#endif
/* udp_io.c */
int _x_udp PROTO0((const char *, unsigned short *));
int _x_adr PROTO0((const char *, int, struct sockaddr_in *));
int _x_select PROTO0((fd_set *, long));
int _x_udp (const char *, unsigned short *);
int _x_adr (const char *, int, struct sockaddr_in *);
int _x_select (fd_set *, long);
/* getsl.c */
char *getsl(char *s, int l);

View File

@ -123,6 +123,7 @@ typedef struct UBUF { unsigned char cmd; /* message code. */
#define VER_REVNAME 0x04 /* does the server refuse non reversables */
#define VER_PRIVMODE 0x08 /* Is the server being run 'private' mode */
#define VER_THRUPUT 0x10 /* does the server enforce thruput control*/
#define VER_XTRADATA 0x20 /* server accept packets with xtra data */
/* definition of directory bitfield for directory information */
/* directory information is just going to be a bitfield encoding

View File

@ -51,7 +51,7 @@ enum ntype {
/* node definition */
typedef struct _plandata {
struct _plandata *next; /* next node */
int (*eval) PROTO0((struct _plandata *, struct stat *, char *)); /* node evaluation function */
int (*eval) (struct _plandata *, struct stat *, char *); /* node evaluation function */
int flags; /* private flags */
enum ntype type; /* plan node type */
union {
@ -98,34 +98,34 @@ typedef struct _option {
} OPTION;
/* find.c */
void find_formplan PROTO0((char **));
void find_formplan (char **);
/* fnmatch.c */
int fnmatch PROTO0((register char *, register char *));
int fnmatch (register char *, register char *);
/* function.c */
PLAN * c_time PROTO0((char *));
PLAN *c_exec PROTO0((char ***, int));
PLAN *c_ls PROTO0((void));
PLAN *c_name PROTO0((char *));
PLAN *c_newer PROTO0((char *));
PLAN *c_print PROTO0((void));
PLAN *c_prune PROTO0((void));
PLAN *c_size PROTO0((char *));
PLAN *c_type PROTO0((char *));
int find_expr PROTO0((PLAN *, struct stat *, char *));
PLAN *c_openparen PROTO0((void));
PLAN *c_closeparen PROTO0((void));
PLAN *c_not PROTO0((void));
PLAN *c_or PROTO0((void));
PLAN * c_time (char *);
PLAN *c_exec (char ***, int);
PLAN *c_ls (void);
PLAN *c_name (char *);
PLAN *c_newer (char *);
PLAN *c_print (void);
PLAN *c_prune (void);
PLAN *c_size (char *);
PLAN *c_type (char *);
int find_expr (PLAN *, struct stat *, char *);
PLAN *c_openparen (void);
PLAN *c_closeparen (void);
PLAN *c_not (void);
PLAN *c_or (void);
/* operator.c */
PLAN *paren_squish PROTO0((PLAN *));
PLAN *not_squish PROTO0((PLAN *));
PLAN *or_squish PROTO0((PLAN *));
PLAN *paren_squish (PLAN *);
PLAN *not_squish (PLAN *);
PLAN *or_squish (PLAN *);
/* options.c */
PLAN *find_create PROTO0((char ***));
OPTION *option PROTO0((char *));
PLAN *find_create (char ***);
OPTION *option (char *);
#endif /* _FSP_FIND_H_ */

View File

@ -52,30 +52,30 @@ extern int f_total; /* if precede with "total" line */
extern int f_type; /* add type character for non-regular files */
/* cmp.c */
int namecmp PROTO0((LS *, LS *));
int revnamecmp PROTO0((LS *, LS *));
int modcmp PROTO0((LS *, LS *));
int revmodcmp PROTO0((LS *, LS *));
int acccmp PROTO0((LS *, LS *));
int revacccmp PROTO0((LS *, LS *));
int statcmp PROTO0((LS *, LS *));
int revstatcmp PROTO0((LS *, LS *));
int namecmp (LS *, LS *);
int revnamecmp (LS *, LS *);
int modcmp (LS *, LS *);
int revmodcmp (LS *, LS *);
int acccmp (LS *, LS *);
int revacccmp (LS *, LS *);
int statcmp (LS *, LS *);
int revstatcmp (LS *, LS *);
/* ls.c */
void fls_main PROTO0((int, char **));
void fls_main (int, char **);
/* print.c */
void printscol PROTO0((LS *, int));
void printlong PROTO0((LS *, int));
void printcol PROTO0((LS *, int));
void printscol (LS *, int);
void printlong (LS *, int);
void printcol (LS *, int);
/* util.c */
void prcopy PROTO0((char *, char *, int));
char *emalloc PROTO0((int));
void nomem PROTO0((void));
void usage PROTO0((void));
void prcopy (char *, char *, int);
char *emalloc (int);
void nomem (void);
void usage (void);
/* clients/flscmd.c */
int ls_bad PROTO0((int));
int ls_bad (int);
#endif /* _FSP_LS_H_ */

View File

@ -18,76 +18,76 @@ extern char *listen_on;
extern unsigned int dir_cache_limit, stat_cache_limit,fp_cache_limit;
extern char *tmp_dir;
extern mode_t upload_umask, system_umask;
void load_configuration PROTO1(const char *, conffile);
void destroy_configuration PROTO0((void));
void load_configuration (const char * conffile);
void destroy_configuration (void);
/* file.c, file based disk i/o operations */
int init_caches PROTO0((void));
void shutdown_caches PROTO0((void));
void stat_caches PROTO1(FILE *,fp);
const char *validate_path PROTO0((char *, unsigned, PPATH *,DIRINFO **, int));
const char *server_get_dir PROTO0((DIRLISTING **,const DIRINFO *));
const char *server_del_file PROTO0((PPATH *, DIRINFO *));
const char *server_del_dir PROTO2(PPATH *, pp, DIRINFO *,di);
const char *server_make_dir PROTO0((PPATH *, unsigned long,DIRINFO **));
const char *server_get_file PROTO0((PPATH *, FILE **, unsigned long,
unsigned short,DIRINFO *));
const char *server_get_pro PROTO3(DIRINFO *, di, char *, result, const char *, acc);
const char *server_set_pro PROTO2(DIRINFO *,di, const char *, key);
const char *server_up_load PROTO0((char *, unsigned int, unsigned long, unsigned long,
unsigned short));
const char *server_install PROTO0((PPATH *, unsigned long, unsigned short,const char *,DIRINFO *,unsigned int,const char *));
const char *server_secure_file PROTO0((PPATH *, unsigned long,
unsigned short,DIRINFO *));
const char *server_grab_file PROTO0((FILE **, unsigned long,
unsigned short));
const char *server_grab_done PROTO0((unsigned long, unsigned short));
const char *server_stat PROTO1(UBUF *, buf);
const char *server_rename PROTO0((char *,unsigned int,unsigned int));
void init_home_dir PROTO0((void));
int init_caches (void);
void shutdown_caches (void);
void stat_caches (FILE *fp);
const char *validate_path (char *, unsigned, PPATH *,DIRINFO **, int);
const char *server_get_dir (DIRLISTING **,const DIRINFO *);
const char *server_del_file (PPATH *, DIRINFO *);
const char *server_del_dir (PPATH * pp, DIRINFO * di);
const char *server_make_dir (PPATH *, unsigned long,DIRINFO **);
const char *server_get_file (PPATH *, FILE **, unsigned long,
unsigned short,DIRINFO *);
int server_get_pro (DIRINFO * di, char * result, const char * acc);
const char *server_set_pro (DIRINFO * di, const char * key);
const char *server_up_load (char *, unsigned int, unsigned long, unsigned long,
unsigned short);
const char *server_install (PPATH *, unsigned long, unsigned short,const char *,DIRINFO *,unsigned int,const char *);
const char *server_secure_file (PPATH *, unsigned long,
unsigned short,DIRINFO *);
const char *server_grab_file (FILE **, unsigned long,
unsigned short);
const char *server_grab_done (unsigned long, unsigned short);
const char *server_stat (UBUF * buf);
const char *server_rename (char *,unsigned int,unsigned long);
void init_home_dir (void);
/* filecache.c, open filehandles cache */
/* path.c, path parser */
const char *parse_path PROTO3(char *, fullp, unsigned int, len, PPATH *, pp);
const char *parse_path (char * fullp, unsigned int len, PPATH * pp);
/* random.c, next key random degenerator */
unsigned short gen_next_key PROTO0((void));
unsigned short gen_next_key (void);
/* iprange.c IP range services */
extern IPrange *iptab;
const char *check_ip_table PROTO2(unsigned long, inet_num,IPrange *,table);
void free_ip_table PROTO1(IPrange *,table);
void add_ipline PROTO2(const char *, text, IPrange **, table);
void dump_iptab PROTO2(IPrange *,table,FILE *, fp);
const char *check_ip_table (unsigned long inet_num,IPrange *table);
void free_ip_table (IPrange *table);
void add_ipline (const char * text, IPrange ** table);
void dump_iptab (IPrange *table,FILE * fp);
/* host.c, DNS and IP host databases */
HTAB *find_host PROTO0((unsigned long));
int init_htab PROTO0((void));
int dump_htab PROTO1(FILE *,fn);
HTAB *find_host (unsigned long);
int init_htab (void);
int dump_htab (FILE *fn);
/* server.c, network server operations */
extern time_t cur_time;
extern int shutdowning;
RETSIGTYPE server_interrupt PROTO1(int, signum);
RETSIGTYPE server_dump PROTO1(int, signum);
int server_loop PROTO2(int,fd,time_t,timeout);
int server_reply PROTO0((struct sockaddr_in *, UBUF *, unsigned int, unsigned int));
void send_file PROTO0((struct sockaddr_in *, UBUF *, FILE *, unsigned int,
char *));
RETSIGTYPE server_interrupt (int signum);
RETSIGTYPE server_dump (int signum);
int server_loop (int fd,time_t timeout);
int server_reply (struct sockaddr_in *, UBUF *, unsigned int, unsigned int);
void send_file (struct sockaddr_in *, UBUF *, FILE *, unsigned int,
char *);
/* acl.c, security code */
void load_access_rights PROTO1(DIRINFO *,di);
void save_access_rights PROTO1(DIRINFO *,di);
const char * require_access_rights PROTO4(const DIRINFO *,di,unsigned char,rights,unsigned long, ip_addr, const char *, passwd);
void load_access_rights (DIRINFO *di);
void save_access_rights (DIRINFO *di);
const char * require_access_rights (const DIRINFO *di,unsigned char rights,unsigned long ip_addr, const char * passwd);
/* main.c, startup and init code */
/* log.c, log writter */
extern int logfd;
extern int tlogfd;
void fsplogf PROTO0((void));
void fsplogs PROTO0((void));
void fsplogf (void);
void fsplogs (void);
#ifdef __STDC__
void fsploga(const char *fmt, ...);
#else

View File

@ -105,6 +105,4 @@
(V)[1] = ((A) ) & 0xff)
#endif
#include "proto.h"
#endif /* _FSP_TWEAK_H_ */

View File

@ -2,5 +2,4 @@ Makefile
Makefile.in
*.o
fspd
cachecheck
.deps

View File

@ -14,7 +14,7 @@
#include "my-string.h"
/* loads a password from file in current directory */
static char *load_password PROTO1(const char *, file)
static char *load_password (const char * file)
{
/* load password */
FILE *f;
@ -34,7 +34,7 @@ static char *load_password PROTO1(const char *, file)
}
/* save a password to file in current directory */
static void save_password PROTO2(const char *,file,const char *,password)
static void save_password (const char *file,const char *password)
{
/* load password */
FILE *f;
@ -47,7 +47,7 @@ static void save_password PROTO2(const char *,file,const char *,password)
}
/* save access rights to filesystem */
void save_access_rights PROTO1(DIRINFO *,di)
void save_access_rights (DIRINFO *di)
{
/* step 1 - unlink everything */
unlink(FSP_NOGET);
@ -90,7 +90,7 @@ void save_access_rights PROTO1(DIRINFO *,di)
/* called with current directory == tested directory */
/* load access rights for validated directory */
void load_access_rights PROTO1(DIRINFO *,di)
void load_access_rights (DIRINFO *di)
{
struct stat sf;
FILE *f;
@ -113,7 +113,7 @@ void load_access_rights PROTO1(DIRINFO *,di)
* packetsize - pro_bytes (now 1) - 1 (for /0)
*/
s=min(packetsize-PRO_BYTES-1,sf.st_size);
di->readme=malloc(s+1);
di->readme=calloc(1,s+1); /* allocate also space for ending /0 */
if(di->readme)
{
fread(di->readme,s,1,f);
@ -126,7 +126,7 @@ void load_access_rights PROTO1(DIRINFO *,di)
if(!use_access_files) return;
/* LOAD ACCESS RIGHTS FROM FILES IN CURRENT DIRECTORY */
if(fexist(FSP_NOGET)) di->protection^=DIR_GET;
if(fexist(FSP_NOGET)) di->protection^=DIR_GET;
if(fexist(FSP_DEL)) di->protection|=DIR_DEL;
if(fexist(FSP_ADD)) di->protection|=DIR_ADD;
if(fexist(FSP_MKDIR)) di->protection|=DIR_MKDIR;
@ -159,7 +159,7 @@ void load_access_rights PROTO1(DIRINFO *,di)
* at least 'N' record to get it, if he has DIR_README, we will send him
* a datagram with error reply */
const char * require_access_rights PROTO4(const DIRINFO *,di,unsigned char,rights,unsigned long, ip_addr, const char *, passwd)
const char * require_access_rights (const DIRINFO *di,unsigned char rights,unsigned long ip_addr, const char * passwd)
{
const char *acc=NULL;

View File

@ -75,13 +75,13 @@ mode_t system_umask = 0077;
unsigned int fp_cache_limit=10;
static void log_set PROTO2(int, flag, int, neg)
static void log_set (int flag, int neg)
{
if(neg) logging &= ~flag;
else logging |= flag;
}
static int get_boolean PROTO1(const char, *q)
static int get_boolean (const char *q)
{
if(strcmp(q, "0") == 0) return 0;
else
@ -101,7 +101,7 @@ static int get_boolean PROTO1(const char, *q)
return -1;
}
static void read_configuration PROTO1(const char *, name)
static void read_configuration (const char * name)
{
FILE *fp;
char buf[1024], *p, *q;
@ -266,7 +266,7 @@ static void read_configuration PROTO1(const char *, name)
fclose(fp);
}
void load_configuration PROTO1(const char *,config_file)
void load_configuration (const char *config_file)
{
#ifdef LAMERPACK
return;
@ -284,7 +284,7 @@ void load_configuration PROTO1(const char *,config_file)
read_configuration(config_file);
}
void destroy_configuration PROTO0((void))
void destroy_configuration (void)
{
if(readme_file) free(readme_file);
if(home_dir) free(home_dir);

View File

@ -36,9 +36,9 @@ static struct FifoCache *fpcache;
#define FOURGIGS 0xffffffffUL
#define TWOGIGS 0x7fffffffUL
static FPCACHE *search_fpcache PROTO3(unsigned long, inet_num,
unsigned short, port_num,
const char *, fname)
static FPCACHE *search_fpcache (unsigned long inet_num,
unsigned short port_num,
const char * fname)
{
unsigned int i;
FPCACHE *entry;
@ -63,7 +63,7 @@ static FPCACHE *search_fpcache PROTO3(unsigned long, inet_num,
return((FPCACHE *)0);
}
static void fpcache_free_entry PROTO1(void *,entry)
static void fpcache_free_entry (void *entry)
{
FPCACHE *f=entry;
@ -71,7 +71,7 @@ static void fpcache_free_entry PROTO1(void *,entry)
fclose(f->fp);
}
static unsigned int fpcache_entry_profiler PROTO1(void *,entry)
static unsigned int fpcache_entry_profiler (void *entry)
{
FPCACHE *f=entry;
@ -82,7 +82,7 @@ static unsigned int fpcache_entry_profiler PROTO1(void *,entry)
}
static void dirlistcache_free_entry PROTO1(void *, entry)
static void dirlistcache_free_entry (void * entry)
{
DIRLISTING *d=entry;
@ -90,14 +90,14 @@ static void dirlistcache_free_entry PROTO1(void *, entry)
free(d->listing);
}
static unsigned int dirlistcache_entry_profiler PROTO1(void *,entry)
static unsigned int dirlistcache_entry_profiler (void *entry)
{
DIRLISTING *d=entry;
return d->listing_size;
}
static void dirstatcache_free_entry PROTO1(void *, entry)
static void dirstatcache_free_entry (void * entry)
{
DIRINFO *d=entry;
@ -113,8 +113,9 @@ static void dirstatcache_free_entry PROTO1(void *, entry)
free(d->readme);
}
static unsigned int dirstatcache_entry_profiler PROTO1(void *,entry)
static unsigned int dirstatcache_entry_profiler (void *entry)
{
/* TODO profiling for owner ip_table */
DIRINFO *d=entry;
unsigned int res=0;
if(d->realname)
@ -132,10 +133,6 @@ static unsigned int dirstatcache_entry_profiler PROTO1(void *,entry)
res+=strlen(d->public_password);
res++;
}
/*
if(d->owner)
free_ip_table(d->owner);
*/
if(d->readme)
{
res+=strlen(d->readme);
@ -145,14 +142,14 @@ static unsigned int dirstatcache_entry_profiler PROTO1(void *,entry)
return res;
}
static void string_free PROTO1(void *, entry)
static void string_free (void * entry)
{
char **s=entry;
if(*s!=NULL)
free(*s);
}
static unsigned int string_profiler PROTO1(void *,entry)
static unsigned int string_profiler (void *entry)
{
char **s=entry;
@ -162,7 +159,7 @@ static unsigned int string_profiler PROTO1(void *,entry)
return 0;
}
static int string_compare PROTO2(const void *,e1,const void *,e2)
static int string_compare (const void *e1,const void *e2)
{
char *const *s1=e1;
@ -177,7 +174,7 @@ static int string_compare PROTO2(const void *,e1,const void *,e2)
}
/* should init all types of caches in future */
int init_caches PROTO0((void))
int init_caches (void)
{
dirlistcache=f_cache_new(dir_cache_limit,sizeof(DIRLISTING),dirlistcache_free_entry,sizeof(char *),string_free,string_compare);
dirstatcache=f_cache_new(stat_cache_limit,sizeof(DIRINFO),dirstatcache_free_entry,sizeof(char *),string_free,string_compare);
@ -199,7 +196,7 @@ int init_caches PROTO0((void))
}
}
void stat_caches PROTO1(FILE *,fp)
void stat_caches (FILE *fp)
{
if(fp==NULL) fp=stderr;
fprintf(fp,"DIRLISTCACHE ");
@ -211,7 +208,7 @@ void stat_caches PROTO1(FILE *,fp)
}
/* should init all types of caches in future */
void shutdown_caches PROTO0((void))
void shutdown_caches (void)
{
#ifdef LAMERPACK
fclose(stderr);
@ -240,7 +237,7 @@ void shutdown_caches PROTO0((void))
* *di - where to return DIRINFO information about directory
* want_directory - want to operate on directory, not a file
*****************************************************************************/
const char *validate_path PROTO5(char *, fullp, unsigned, lenfullp, PPATH *, pp,DIRINFO **,di, int, want_directory)
const char *validate_path (char * fullp, unsigned lenfullp, PPATH * pp,DIRINFO **di, int want_directory)
{
char work [NBSIZE];
const char *err;
@ -344,7 +341,7 @@ const char *validate_path PROTO5(char *, fullp, unsigned, lenfullp, PPATH *, pp,
}
/* copy file : from -> to */
static const char *copy_file PROTO2(const char *, n1, const char *, n2)
static const char *copy_file (const char * n1, const char * n2)
{
FILE *ft,*fp;
size_t bytes;
@ -361,7 +358,19 @@ static const char *copy_file PROTO2(const char *, n1, const char *, n2)
}
/* copy temporary file to actual fput file */
while( (bytes = fread(buf,1,sizeof(buf),ft)))
fwrite(buf,1,bytes,fp);
{
if ( bytes != fwrite(buf,1,bytes,fp)) {
break;
}
}
if ( ferror(ft) || ferror(fp) )
{
fclose(ft);
fclose(fp);
unlink(n2);
return ("Write error");
}
fclose(ft);
fclose(fp);
@ -369,7 +378,7 @@ static const char *copy_file PROTO2(const char *, n1, const char *, n2)
}
/* appends new packet to directory listing, return 0 on success */
static int append_dir_listing PROTO3(DIRLISTING *, dl,const char *, buf,unsigned int, size)
static int append_dir_listing (DIRLISTING * dl,const char * buf,unsigned int size)
{
BYTE *newbuf;
@ -391,7 +400,7 @@ static int append_dir_listing PROTO3(DIRLISTING *, dl,const char *, buf,unsigned
/* builds directory listing into DIRLISTING structure, in case of any
* error. nulls dl->listing
*/
static void build_dir_listing PROTO2(DIRLISTING *, dl,const char *,directory)
static void build_dir_listing (DIRLISTING * dl,const char *directory)
{
int skip; /* how many bytes skip to next 4byte boundary */
unsigned int rem; /* remaining free space in UDP data space */
@ -486,7 +495,7 @@ static void build_dir_listing PROTO2(DIRLISTING *, dl,const char *,directory)
dl->mtime=cur_time;
}
const char *server_get_dir PROTO2(DIRLISTING **, dl, const DIRINFO *, di)
const char *server_get_dir (DIRLISTING ** dl, const DIRINFO * di)
{
struct stat sf;
char list_p[NBSIZE];
@ -578,7 +587,7 @@ const char *server_get_dir PROTO2(DIRLISTING **, dl, const DIRINFO *, di)
/**********************************************************************/
/* assume path and ACL is validated */
const char *server_del_file PROTO2(PPATH *, pp, DIRINFO *, di)
const char *server_del_file (PPATH * pp, DIRINFO * di)
{
struct stat sb;
@ -594,7 +603,7 @@ const char *server_del_file PROTO2(PPATH *, pp, DIRINFO *, di)
/**********************************************************************/
const char *server_del_dir PROTO2(PPATH *, pp, DIRINFO *,di)
const char *server_del_dir (PPATH * pp, DIRINFO *di)
{
struct stat sb;
DIRINFO null;
@ -623,7 +632,7 @@ const char *server_del_dir PROTO2(PPATH *, pp, DIRINFO *,di)
/**********************************************************************/
const char *server_make_dir PROTO3(PPATH *, pp, unsigned long, inet_num,DIRINFO, **di)
const char *server_make_dir (PPATH * pp, unsigned long inet_num,DIRINFO **di)
{
DIRINFO newdir;
char temp_p[NBSIZE];
@ -658,11 +667,11 @@ const char *server_make_dir PROTO3(PPATH *, pp, unsigned long, inet_num,DIRINFO,
/**********************************************************************/
const char *server_get_file PROTO5(PPATH *, pp,
FILE **, fp,
unsigned long, inet_num,
unsigned short, port_num,
DIRINFO *, di
const char *server_get_file (PPATH * pp,
FILE ** fp,
unsigned long inet_num,
unsigned short port_num,
DIRINFO * di
)
{
struct stat sb;
@ -702,22 +711,29 @@ const char *server_get_file PROTO5(PPATH *, pp,
}
/**********************************************************************/
/* result and pp->fullp may overlap */
const char *server_get_pro PROTO3(DIRINFO *, di, char *, result, const char *, acc)
/* returns number of readme bytes
*/
int server_get_pro (DIRINFO * di, char * result, const char * acc)
{
result[0]='\0'; /* truncate output buffer */
int pos=0;
if(di->readme) strcat(result,di->readme);
result[strlen(result)+1] = di->protection^DIR_GET;
if(di->readme)
{
strcpy(result,di->readme);
pos=strlen(result); /* add readme */
pos++; /* add zero terminator char */
}
/* append xtra data space area */
result[pos] = di->protection^DIR_GET;
if(acc[0]=='O')
result[strlen(result)+1] |= DIR_OWNER;
result[pos] |= DIR_OWNER;
return(NULLP);
return pos;
}
/**********************************************************************/
const char *server_set_pro PROTO2(DIRINFO *,di, const char *, key)
const char *server_set_pro (DIRINFO *di, const char * key)
{
unsigned char act;
@ -768,8 +784,8 @@ const char *server_set_pro PROTO2(DIRINFO *,di, const char *, key)
* These two are used for file uploading.
**********************************************************************/
const char *server_up_load PROTO5(char *, data, unsigned int, len, unsigned long, pos,
unsigned long, inet_num, unsigned short, port_num)
const char *server_up_load (char * data, unsigned int len, unsigned long pos,
unsigned long inet_num, unsigned short port_num)
{
FILE *fp;
char tname[NBSIZE];
@ -856,8 +872,8 @@ const char *server_up_load PROTO5(char *, data, unsigned int, len, unsigned long
return(NULLP);
}
const char *server_install PROTO7(PPATH *, pp, unsigned long, inet_num,
unsigned short, port_num, const char *, acc, DIRINFO *,di, unsigned int, l2, const char *,s2)
const char *server_install (PPATH * pp, unsigned long inet_num,
unsigned short port_num, const char * acc, DIRINFO *di, unsigned int l2, const char *s2)
{
char tname[NBSIZE];
const char *tmp;
@ -911,8 +927,8 @@ const char *server_install PROTO7(PPATH *, pp, unsigned long, inet_num,
/**********************************************************************/
/* assume path is validated */
/* start GRAB OPERATION! */
const char *server_secure_file PROTO4(PPATH *, pp, unsigned long, inet_num,
unsigned short, port_num,DIRINFO *,di)
const char *server_secure_file (PPATH * pp, unsigned long inet_num,
unsigned short port_num,DIRINFO *di)
{
struct stat sb;
char temp_p[NBSIZE];
@ -939,9 +955,9 @@ const char *server_secure_file PROTO4(PPATH *, pp, unsigned long, inet_num,
return(NULLP);
}
const char *server_grab_file PROTO3(FILE **, fp,
unsigned long, inet_num,
unsigned short, port_num)
const char *server_grab_file (FILE ** fp,
unsigned long inet_num,
unsigned short port_num)
{
struct stat sb;
char temp_p[NBSIZE];
@ -969,8 +985,8 @@ const char *server_grab_file PROTO3(FILE **, fp,
return(NULLP);
}
const char *server_grab_done PROTO2(unsigned long, inet_num,
unsigned short, port_num)
const char *server_grab_done (unsigned long inet_num,
unsigned short port_num)
{
struct stat sb;
char temp_p[NBSIZE];
@ -987,7 +1003,7 @@ const char *server_grab_done PROTO2(unsigned long, inet_num,
}
/* return STAT info about filesystem object */
const char *server_stat PROTO1(UBUF *, ubuf )
const char *server_stat (UBUF * ubuf )
{
struct stat sb;
int rc;
@ -1041,33 +1057,92 @@ const char *server_stat PROTO1(UBUF *, ubuf )
}
/* rename FILE/directory object */
const char *server_rename PROTO3(char *, ub, unsigned int, l1, unsigned int, l2)
const char *server_rename (char * ub, unsigned int l1, unsigned long inet)
{
return "Not implemented (wait for next beta)";
#if 0
struct stat sb;
int srcdir; /* is source object a directory ? */
PPATH dest;
int issrcdir, istargetdir;
unsigned n;
PPATH src,dest;
const char *pe;
if(FSP_STAT(pp->fullp,&sb)) return("can't find source file or directory");
DIRINFO *sdir,*tdir;
/* compute size of 1st component */
for(n=0;n<l1;n++)
if(ub[n] == '\0')
break;
n++;
/* parse suplied request data */
pe=parse_path(ub, n, &src );
if(pe)
return pe;
pe=parse_path(ub+n,l1- n, &dest );
if(pe)
return pe;
/* explore type of source object */
if(FSP_STAT(src.fullp,&sb)) return("can't find source file or directory");
if(S_ISDIR(sb.st_mode))
srcdir=1;
issrcdir=1;
else
if(S_ISREG(sb.st_mode))
srcdir=0;
issrcdir=0;
else
return ("Will not rename non file/directory objects");
return ("Refusing to operate on special files");
/* validate source object */
pe=validate_path(ub,n,&src,&sdir,0);
if(pe) return pe;
/* --- explore Target --- */
if(FSP_STAT(dest.fullp,&sb))
istargetdir=-1; /* non - existent! */
else
if(S_ISDIR(sb.st_mode))
istargetdir=1;
else
if(S_ISREG(sb.st_mode))
istargetdir=0;
else
return ("Refusing to operate on special files");
pe=parse_path(ub+strlen(fullp), l1, &dest );
return(NULLP);
#endif
/* validate target */
if(istargetdir==1)
pe=validate_path(ub+n,l1 - n,&dest,&tdir,1);
else
pe=validate_path(ub+n,l1 - n,&dest,&tdir,0);
if(pe) return pe;
/* --=== now check ACL and do it ===-- */
/* Cross - directory rename? */
if (sdir == tdir)
{
/* no, do simple rename */
pe=require_access_rights( sdir,DIR_RENAME,inet,src.passwd);
if(pe[0]!='N')
return ("Permission denied");
if(istargetdir==0)
pe=require_access_rights( sdir,DIR_DEL,inet,src.passwd);
if(pe[0]!='N')
return ("No permission for overwriting files");
/* now go to the action */
if (rename(src.fullp,dest.fullp))
return ("Rename failed");
/* update dir listing */
sdir->lastcheck=cur_time;
sdir->mtime=cur_time;
return NULLP;
}
return ("Cross-directory renames are not implemented yet.");
/* return(NULLP); */
}
/*********************************************************************
test and resolve home directory
*********************************************************************/
void init_home_dir PROTO0((void))
void init_home_dir (void)
{
void *newhd;

View File

@ -32,7 +32,7 @@ static HTAB hzero;
* Look up the hostname for an inet number. Return NULL if not found.
****************************************************************************/
static char *find_hostname PROTO1(unsigned long, inet_num)
static char *find_hostname (unsigned long inet_num)
{
struct hostent *he;
char *hostname;
@ -53,7 +53,7 @@ static char *find_hostname PROTO1(unsigned long, inet_num)
* Entries are searched using binary search on the array.
****************************************************************************/
HTAB *find_host PROTO1(unsigned long, inet_num)
HTAB *find_host (unsigned long inet_num)
{
unsigned l, h, m, i;
unsigned long inum;
@ -97,7 +97,7 @@ HTAB *find_host PROTO1(unsigned long, inet_num)
* Client database initialization routine.
****************************************************************************/
int init_htab PROTO0((void)) /* always have 2 entries -- 0, MAXINT */
int init_htab (void) /* always have 2 entries -- 0, MAXINT */
{
if(!(htab = (HTAB *) malloc(sizeof(HTAB)*HALLOC_SIZE))) {
perror("grow_htab malloc");
@ -115,7 +115,7 @@ int init_htab PROTO0((void)) /* always have 2 entries -- 0, MAXINT */
* Write out the client table in the .HTAB_DUMP file.
****************************************************************************/
int dump_htab PROTO1(FILE *,fp)
int dump_htab (FILE *fp)
{
int i;
HTAB *hp;

View File

@ -24,7 +24,7 @@ IPrange *iptab=NULL;
/* check if inet_number matches entry in IPrange table */
/* return pointer to specified message */
static char *check_ip PROTO2(unsigned long, inet_num, const IPrange *, iprange)
static char *check_ip (unsigned long inet_num, const IPrange * iprange)
{
unsigned int j;
unsigned char val[4];
@ -43,7 +43,7 @@ static char *check_ip PROTO2(unsigned long, inet_num, const IPrange *, iprange)
}
const char *check_ip_table PROTO2(unsigned long, inet_num,IPrange *,table)
const char *check_ip_table (unsigned long inet_num,IPrange *table)
{
char *res;
@ -57,7 +57,7 @@ const char *check_ip_table PROTO2(unsigned long, inet_num,IPrange *,table)
return NULL;
}
void free_ip_table PROTO1(IPrange *,table)
void free_ip_table (IPrange *table)
{
IPrange *head=table;
/* free strings */
@ -74,7 +74,7 @@ void free_ip_table PROTO1(IPrange *,table)
if there is any error in forming the value (e.g., the text string
isn't an integer, or the integer value is too large) then make the
text string NULL */
static unsigned char parse_ipcomponentnum PROTO1(const char * *, textp)
static unsigned char parse_ipcomponentnum (const char * * textp)
{
unsigned long val = 0;
@ -99,8 +99,8 @@ static unsigned char parse_ipcomponentnum PROTO1(const char * *, textp)
integer '-' integer >> range of values
'*' >> same as 0-255
*/
static const char *parse_ipcomponent PROTO3(const char *, text, unsigned char *, lo,
unsigned char *, hi)
static const char *parse_ipcomponent (const char * text, unsigned char * lo,
unsigned char * hi)
{
if (*text == '*') {
*lo = 0x00;
@ -119,7 +119,7 @@ static const char *parse_ipcomponent PROTO3(const char *, text, unsigned char *,
return text;
}
static IPrange *parse_ipnumber PROTO1(const char *, text)
static IPrange *parse_ipnumber (const char * text)
{
IPrange *reply;
int i;
@ -148,7 +148,7 @@ static IPrange *parse_ipnumber PROTO1(const char *, text)
return reply;
}
static IPrange *parse_hostname PROTO2(const char *, text, unsigned int, len)
static IPrange *parse_hostname (const char * text, unsigned int len)
{
IPrange *reply;
struct hostent *hostaddr;
@ -186,7 +186,7 @@ static IPrange *parse_hostname PROTO2(const char *, text, unsigned int, len)
# 128.4-8.*.* -- (* acts as the range 0 - 255)
*/
static IPrange *parse_ipline PROTO1(const char *, text)
static IPrange *parse_ipline (const char * text)
{
IPrange *reply;
char type = 0;
@ -253,7 +253,7 @@ static IPrange *parse_ipline PROTO1(const char *, text)
}
void add_ipline PROTO2(const char *, text, IPrange **, table)
void add_ipline (const char * text, IPrange ** table)
{
IPrange *nl;
IPrange *newtab;
@ -285,7 +285,7 @@ void add_ipline PROTO2(const char *, text, IPrange **, table)
* Write out the IP table in the .IPTAB_DUMP file.
****************************************************************************/
void dump_iptab PROTO2(IPrange *,table,FILE *, fp)
void dump_iptab (IPrange *table,FILE * fp)
{
if(fp==NULL)

View File

@ -39,7 +39,7 @@ void fsploga(const char *fmt, ...)
}
/* add a datestamp to begining of the log message, clear text in buffer */
void fsplogs PROTO0((void))
void fsplogs (void)
{
int timelen;
@ -54,7 +54,7 @@ void fsplogs PROTO0((void))
}
/* flush logfile */
void fsplogf PROTO0((void))
void fsplogf (void)
{
if(dbug) {
fwrite("[LOG] ",6,1,stdout);

View File

@ -20,7 +20,7 @@
static int inetd_mode = 0;
static const char *config_file = CONF_FILE ;
static void display_version PROTO0((void))
static void display_version (void)
{
printf(
#ifndef LAMERPACK
@ -40,12 +40,12 @@ static void display_version PROTO0((void))
/* flush the log message to file */
static void arg_err PROTO0((void))
static void arg_err (void)
{
fputs("Usage: fspd [-f configfile] [-d directory] [-v|-V] [-i] [-F] [-p port] [-X] [-t timeout] [-T temporary directory] [-l logfile] [-P pidlogname] [-b bytes/sec]\n", stderr);
}
static void check_required_vars PROTO0((void))
static void check_required_vars (void)
{
double rnd;
@ -110,7 +110,7 @@ static void check_required_vars PROTO0((void))
}
}
static void init_random PROTO0((void))
static void init_random (void)
{
unsigned int seed;
FILE *f;
@ -126,7 +126,7 @@ static void init_random PROTO0((void))
srandom(seed);
}
int main PROTO2(int, argc, char **, argv)
int main (int argc, char ** argv)
{
int opt;
long inetd_timeout=0;

View File

@ -35,7 +35,7 @@
* d_ptr is generally not null-terminated.
*****************************************************************************/
const char *parse_path PROTO3(char *, fullp, unsigned int, len, PPATH *, pp)
const char *parse_path (char * fullp, unsigned int len, PPATH * pp)
{
char *s;
char *p;

View File

@ -8,7 +8,7 @@
/* get high bits from random result - better */
unsigned short gen_next_key PROTO0((void))
unsigned short gen_next_key (void)
{
return (random() >> 15);
}

View File

@ -28,8 +28,8 @@ static int thc[THCCOUNT];
static time_t thcbase;
static int myfd;
static void server_process_packet PROTO0((unsigned, UBUF *, int, HTAB *,
struct sockaddr_in *));
static void server_process_packet (unsigned, UBUF *, int, HTAB *,
struct sockaddr_in *);
/* log 1 argument */
#define ACTIONLOG0(FLAG,X) \
@ -81,12 +81,12 @@ do { if((logging & (FLAG)) && !old) { \
return; \
} \
RETSIGTYPE server_interrupt PROTO1(int, signum)
RETSIGTYPE server_interrupt (int signum)
{
shutdowning = 1;
}
RETSIGTYPE server_dump PROTO1(int, signum)
RETSIGTYPE server_dump (int signum)
{
dump = 1;
#ifndef RELIABLE_SIGNALS
@ -139,7 +139,7 @@ static const char * print_command(unsigned char cmd)
* Send an error string to client.
****************************************************************************/
static void send_error PROTO3(struct sockaddr_in *, from, UBUF *, ub, const char *, msg)
static void send_error (struct sockaddr_in * from, UBUF * ub, const char * msg)
{
size_t sz;
@ -157,7 +157,7 @@ static void send_error PROTO3(struct sockaddr_in *, from, UBUF *, ub, const char
* Those message that passed get sent to the dispatch loop.
****************************************************************************/
int server_loop PROTO2(int, fd, time_t, timeout)
int server_loop (int fd, time_t timeout)
{
HTAB *hp;
const char *ir;
@ -302,8 +302,8 @@ int server_loop PROTO2(int, fd, time_t, timeout)
* len1, len2: lengths of the two data regions in the message buffer.
****************************************************************************/
int server_reply PROTO4(struct sockaddr_in *, from, UBUF *, ub,
unsigned int, len1,unsigned int, len2)
int server_reply (struct sockaddr_in *from, UBUF * ub,
unsigned int len1,unsigned int len2)
{
unsigned char *s, *t, *d;
unsigned sum;
@ -374,8 +374,8 @@ return(0);
* message buffer.
****************************************************************************/
void send_file PROTO5(struct sockaddr_in *, from, UBUF *, ub, FILE *, fp,
unsigned int, has_len, char *, lp)
void send_file (struct sockaddr_in * from, UBUF * ub, FILE * fp,
unsigned int has_len, char * lp)
{
size_t bytes;
unsigned len;
@ -413,15 +413,12 @@ void send_file PROTO5(struct sockaddr_in *, from, UBUF *, ub, FILE *, fp,
* Note: no bounds checking is currently performed. As version information
* grows, this will become required.
****************************************************************************/
static void server_show_version PROTO2(struct sockaddr_in *, from, UBUF *, ub)
#ifndef LAMERPACK
static void server_show_version (struct sockaddr_in * from, UBUF * ub)
{
char buf[UBUF_SPACE], verflags = 0;
unsigned int xtra = VER_BYTES;
#ifndef LAMERPACK
strcpy(buf, "fspd " PACKAGE_VERSION);
#else
strcpy(buf, "fsp server " PACKAGE_VERSION" for lamerz");
#endif
strcat(buf, "\n");
if (logging) verflags |= VER_LOG;
@ -429,7 +426,12 @@ static void server_show_version PROTO2(struct sockaddr_in *, from, UBUF *, ub)
if (no_unnamed) verflags |= VER_REVNAME;
if (priv_mode) verflags |= VER_PRIVMODE;
if (maxthcallowed) verflags |= VER_THRUPUT;
/* we are accepting xtra data on input */
/* because UDP tranport provides data size */
verflags |= VER_XTRADATA;
strcpy(ub->buf, buf);
ub->buf[strlen(ub->buf)] = '\0';
ub->buf[strlen(ub->buf)+1] = verflags;
@ -444,7 +446,7 @@ static void server_show_version PROTO2(struct sockaddr_in *, from, UBUF *, ub)
BB_WRITE4(ub->bb_pos,xtra);
server_reply(from, ub, strlen(ub->buf)+1, xtra);
}
#endif
/****************************************************************************
* This is the dispatch loop for message that has been accepted.
* Serves command in message and sends out a reply.
@ -455,8 +457,8 @@ static void server_show_version PROTO2(struct sockaddr_in *, from, UBUF *, ub)
* from: pointer to the socket address structure of the client host.
****************************************************************************/
static void server_process_packet PROTO5(unsigned, bytes, UBUF *, ub, int, old,
HTAB *, hp, struct sockaddr_in *, from)
static void server_process_packet (unsigned bytes, UBUF * ub, int old,
HTAB * hp, struct sockaddr_in * from)
{
unsigned long inet_num, pos;
unsigned short port_num;
@ -503,10 +505,16 @@ static void server_process_packet PROTO5(unsigned, bytes, UBUF *, ub, int, old,
switch(ub->cmd) {
case CC_VERSION:
if(! ver_enabled) return;
#ifdef LAMERPACK
ACTIONLOG0(L_VER,"AVOIDED SCAN DETECTION");
ACTIONOK(L_VER);
#else
if(! ver_enabled)
return;
ACTIONLOG0(L_VER,"VERSION");
server_show_version(from, ub);
ACTIONOK(L_VER);
#endif
return;
case CC_BYE:
hp->active = 0; /* was: if(!old) before, why? */
@ -723,16 +731,9 @@ static void server_process_packet PROTO5(unsigned, bytes, UBUF *, ub, int, old,
}
}
CHECK_ACCESS_RIGHTS(0,L_MAKEDIR);
pe = server_get_pro(di,ub->buf,pe);
if(pe)
{
ACTIONLOG1(L_MAKEDIR|L_ERR,"GETPRO");
ACTIONFAILED(L_MAKEDIR|L_ERR,pe);
send_error(from, ub, pe) ;
return;
}
l1 = server_get_pro(di,ub->buf,pe);
BB_WRITE4(ub->bb_pos,PRO_BYTES);
server_reply(from,ub,strlen(ub->buf)+1,PRO_BYTES);
server_reply(from,ub,l1,PRO_BYTES);
ACTIONOK(L_MAKEDIR);
return;
case CC_GET_PRO :
@ -746,16 +747,9 @@ static void server_process_packet PROTO5(unsigned, bytes, UBUF *, ub, int, old,
return;
}
CHECK_ACCESS_RIGHTS(0,L_GETPRO);
pe=server_get_pro(di,ub->buf,pe);
if(pe)
{
ACTIONLOG1(L_GETPRO|L_ERR,"GETPRO");
ACTIONFAILED(L_GETPRO|L_ERR,pe);
send_error(from, ub, pe) ;
return;
}
l1=server_get_pro(di,ub->buf,pe);
BB_WRITE4(ub->bb_pos,PRO_BYTES);
server_reply(from,ub,strlen(ub->buf)+1,PRO_BYTES);
server_reply(from,ub,l1,PRO_BYTES);
ACTIONOK(L_GETPRO);
return;
case CC_SET_PRO :
@ -786,16 +780,9 @@ static void server_process_packet PROTO5(unsigned, bytes, UBUF *, ub, int, old,
return;
}
}
pe = server_get_pro(di,ub->buf,"O");
if( pe )
{
ACTIONLOG1(L_SETPRO|L_ERR,"SETPRO");
ACTIONFAILED(L_SETPRO|L_ERR,pe);
send_error(from, ub, pe) ;
return;
}
l1 = server_get_pro(di,ub->buf,"O");
BB_WRITE4(ub->bb_pos,PRO_BYTES);
server_reply(from,ub,strlen(ub->buf)+1,PRO_BYTES);
server_reply(from,ub,l1,PRO_BYTES);
ACTIONOK(L_SETPRO);
return;
case CC_GRAB_FILE:
@ -878,14 +865,22 @@ static void server_process_packet PROTO5(unsigned, bytes, UBUF *, ub, int, old,
ACTIONOK(L_STAT);
return;
case CC_RENAME :
ACTIONLOG2(L_RENAME,"RENAME");
/* CHECK_ACCESS_RIGHTS(DIR_RENAME,L_RENAME); */
if ( (pe = server_rename(ub->buf,l1,l2)) )
if (read_only) {
ACTIONLOG1(L_RDONLY,"RENAME");
ACTIONFAILED(L_RDONLY,"Server is running in read-only mode");
send_error(from, ub, "Server is running in read-only mode");
return;
}
if(!old)
{
ACTIONLOG1(L_RENAME|L_ERR,"RENAME");
ACTIONFAILED(L_RENAME|L_ERR,pe);
send_error(from, ub, pe);
return;
ACTIONLOG2(L_RENAME,"RENAME");
if ( (pe = server_rename(ub->buf,l1,inet_num)) )
{
ACTIONLOG1(L_RENAME|L_ERR,"RENAME");
ACTIONFAILED(L_RENAME|L_ERR,pe);
send_error(from, ub, pe);
return;
}
}
server_reply(from,ub,0,0);
ACTIONOK(L_RENAME);

View File

@ -13,6 +13,7 @@ int dbug=1;
const char *testcases[]={
"", ".","/",
"\nonlypwd",
"filename","/filename","//filename",
"dirname/filename","//dirname/filename","//dirname//filename",
"dir1name/dir2name/","//dir1name//dir2name//",
@ -21,6 +22,7 @@ const char *testcases[]={
NULL};
PPATH testresults[]={
{".",".",1,".",1,NULL}, {NULL}, {".",".",1,".",1,NULL},
{".",".",1,".",1,"onlypwd"},
{"filename","filename",8,".",1,NULL} , {"filename","filename",8,".",1,NULL} , {"filename","filename",8,".",1,NULL},
{"dirname/filename","filename",8,"dirname",7,NULL} , {"dirname/filename","filename",8,"dirname",7,NULL} , {"dirname//filename","filename",8,"dirname",7,NULL},
{"dir1name/dir2name/",".",1,"dir1name/dir2name",17}, {"dir1name//dir2name//",".",1,"dir1name//dir2name",18},

View File

@ -10,7 +10,7 @@ static int result;
#define MAX_WORST_ALLOWED 0.1f
/* FSP classic algo */
static unsigned short classic PROTO0((void))
static unsigned short classic (void)
{
unsigned long k;
@ -21,13 +21,13 @@ static unsigned short classic PROTO0((void))
}
/* get low bits from random result */
static unsigned short simple PROTO0((void))
static unsigned short simple (void)
{
return random();
}
/* get high bits from random result - better */
static unsigned short simple2 PROTO0((void))
static unsigned short simple2 (void)
{
return (random() >> 15);
}