binkd/0000775000076400007640000000000011700610242010310 5ustar gulgulbinkd/md5b.h0000664000076400007640000000646107633067651011343 0ustar gulgul/* MD5.H - header file for MD5C.C */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ /* * $Id: md5b.h,v 2.4 2003/03/10 10:57:45 gul Exp $ * * $Log: md5b.h,v $ * Revision 2.4 2003/03/10 10:57:45 gul * Extern declarations moved to header files * * Revision 2.3 2003/03/05 13:21:50 gul * Fix warnings * * Revision 2.2 2003/03/02 08:08:49 gul * Added CVS ID and Revision * */ /* ------------------------------------------------------------------ */ /* GLOBAL.H - RSAREF types and constants */ /* RFC 1321 MD5 Message-Digest Algorithm April 1992 */ /* PROTOTYPES should be set to one if and only if the compiler supports function argument prototyping. The following makes PROTOTYPES default to 0 if it has not already been defined with C compiler flags. */ #ifndef PROTOTYPES #define PROTOTYPES 0 #endif /* POINTER defines a generic pointer type */ typedef unsigned char *POINTER; #ifdef UINT16_TYPE typedef UINT16_TYPE UINT2; typedef UINT32_TYPE UINT4; #elif defined(SIZEOF_INT) && SIZEOF_INT!=0 #if SIZEOF_SHORT==2 typedef unsigned short int UINT2; #else #error Cannot find type for 16-bit integer! #endif #if SIZEOF_INT==4 typedef unsigned int UINT4; #elif SIZEOF_LONG==4 typedef unsigned long int UINT4; #else #error Cannot find type for 32-bit integer! #endif #else /* default, no configure and Makefile UINT16_TYPE defines */ /* UINT2 defines a two byte word */ typedef unsigned short int UINT2; /* UINT4 defines a four byte word */ typedef unsigned long int UINT4; #endif /* PROTO_LIST is defined depending on how PROTOTYPES is defined above. If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it returns an empty list. */ #if PROTOTYPES #define PROTO_LIST(list) list #else #define PROTO_LIST(list) () #endif /* end of GLOBAL.H ---------------------------------------------------------- */ /* MD5 context. */ typedef struct { UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */ } MD5_CTX; #define MD5_DIGEST_LEN 16 /* MD5 digest */ typedef unsigned char MDcaddr_t[MD5_DIGEST_LEN]; #define MD_CHALLENGE_LEN 16 #include "prothlp.h" #include "readcfg.h" #include "ftnnode.h" #include "iphdr.h" #include "protoco2.h" #include "server.h" unsigned char *MD_getChallenge(char *src, STATE *st); char *MD_buildDigest(char *pw, unsigned char *challenge); void MD_toString(char *rs, int len, unsigned char *digest); binkd/binlog.h0000664000076400007640000000162607227050665011760 0ustar gulgul/*--------------------------------------------------------------------*/ /* B i n L o g . h */ /* */ /* Part of BinkD project */ /* Binary log interface */ /* */ /* Definition file. */ /*--------------------------------------------------------------------*/ /* * $Id: binlog.h,v 2.0 2001/01/10 12:12:37 gul Exp $ * * $Log: binlog.h,v $ * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * */ #ifndef __BINLOG_H__ #define __BINLOG_H__ void BinLogInit(void); void BinLogDeInit(void); #ifdef STATE_DEFINED void BinLogStat (char *status, STATE *state); #endif #endif binkd/dos/0000775000076400007640000000000011700610241011074 5ustar gulgulbinkd/dos/dirent.c0000664000076400007640000000343307633224012012537 0ustar gulgul/* * dirent.c -- additional functions not found in IBM VisualAge C / CSet RTL * * dirent.c is a part of binkd project * * Copyright (C) 1997 Victor Pashkevich, 2:451/30@FidoNet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ #include #include #include #include #include "dirent.h" #define SEARCH_ATTR (_A_HIDDEN|_A_SYSTEM|_A_RDONLY|_A_SUBDIR) DIR * opendir(const char * dirname) { char * name; int len; DIR * dir; int apiret; len=strlen(dirname); if( (name=malloc(len+5))==NULL ) { errno=ENOMEM; return NULL; } strcpy(name,dirname); if( len-- && name[len]!=':' && name[len]!='\\' && name[len]!='/' ) strcat(name,"\\*.*"); else strcat(name,"*.*"); if( (dir=malloc(sizeof(DIR)))==NULL ) { errno=ENOMEM; free(name); return NULL; } if( (apiret=_dos_findfirst(name,SEARCH_ATTR, (struct find_t *)&dir->_d_reserved) )!=0 ) { free(name); free(dir); return NULL; } dir->dirname=name; dir->_d_first = 1; return dir; } void rewinddir(DIR * dir) { _dos_findfirst(dir->dirname,SEARCH_ATTR, (struct find_t *)&dir->_d_reserved); dir->_d_first = 1; } struct dirent * readdir(DIR * dir) { if( !dir->_d_first ) { if( _dos_findnext((struct find_t *)&dir->_d_reserved)!=0 ) return NULL; } dir->_d_first=0; return &dir->_d_dirent; } int closedir(DIR * dir) { if( dir==NULL ) { errno = EBADF; return -1; } free(dir->dirname); free(dir); return 0; } binkd/dos/dirent.h0000664000076400007640000000165207740477473012571 0ustar gulgul/* * dirent.h -- additional functions not found in IBM VisualAge C / CSet RTL * * dirent.h is a part of binkd project * * Copyright (C) 1997 Victor Pashkevich, 2:451/30@FidoNet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ #ifndef __DIRENT_H__ #define __DIRENT_H__ #ifdef __cplusplus extern "C" { #endif struct dirent { char d_name[13]; }; typedef struct { char _d_reserved[30]; struct dirent _d_dirent; char * dirname; char _d_first; } DIR; DIR * opendir(const char * __dirname); struct dirent * readdir(DIR * __dir); int closedir(DIR * __dir); void rewinddir(DIR * __dir); #ifdef __cplusplus } #endif #endif binkd/dos/CVS/0000775000076400007640000000000011700610241011527 5ustar gulgulbinkd/dos/CVS/Tag0000664000076400007640000000001611700610241012162 0ustar gulgulNbinkd-0_9_11 binkd/dos/CVS/Repository0000664000076400007640000000001211700610241013622 0ustar gulgulbinkd/dos binkd/dos/CVS/Entries0000664000076400007640000000043011700610241013060 0ustar gulgul/dirent.c/1.1/Tue Mar 11 00:04:26 2003//Tbinkd-0_9_11 /dirent.h/1.1.2.1/Tue Oct 7 08:54:19 2003//Tbinkd-0_9_11 /getfree.c/1.1.2.1/Tue Oct 7 08:54:19 2003//Tbinkd-0_9_11 /sleep.c/1.1/Sun Apr 6 13:50:14 2003//Tbinkd-0_9_11 /tcperr.c/1.1/Tue Mar 11 00:04:26 2003//Tbinkd-0_9_11 D binkd/dos/CVS/Root0000664000076400007640000000004611700610241012375 0ustar gulgul:pserver:binkd@cvs.happy.kiev.ua:/cvs binkd/dos/getfree.c0000664000076400007640000000150107740477473012711 0ustar gulgul#ifdef __WATCOMC__ #define __IBMC__ 0 #define __IBMCPP__ 0 #endif #include #include #include extern void Log (int lev, char *s,...); unsigned long getfree (char *path) { struct diskfree_t fsa; unsigned disknum = 0; int rc; if (isalpha (path[0]) && path[1] == ':') disknum = toupper (path[0]) - 'A' + 1; rc=_dos_getdiskfree(disknum,&fsa); if (rc) { Log (1, "_dos_gwtdiskfree error: return code = %u", rc); return ULONG_MAX; /* Assume enough disk space */ } else { if (fsa.sectors_per_cluster * fsa.bytes_per_sector >= 1024) return (unsigned long)fsa.avail_clusters * (fsa.sectors_per_cluster * fsa.bytes_per_sector / 1024); else return (unsigned long)fsa.avail_clusters / (1024 / (fsa.sectors_per_cluster * fsa.bytes_per_sector)); } } binkd/dos/tcperr.c0000664000076400007640000000570607633224012012556 0ustar gulgul#if defined(IBMTCPIPDOS) #include #else #include #endif static const char *sockerrors[] = { "Error 0", "Not owner", /* SOCBASEERR+1 */ "Error 2", "No such process", /* SOCBASEERR+3 */ "Interrupted system call", /* SOCBASEERR+4 */ "Error 5", "No such device or address", /* SOCBASEERR+6 */ "Error 7", "Error 8", "Bad file number", /* SOCBASEERR+9 */ "Error 10", "Error 11", "Error 12", "Permission denied", /* SOCBASEERR+13 */ "Bad address", /* SOCBASEERR+14 */ "Error 15", "Error 16", "Error 17", "Error 18", "Error 19", "Error 20", "Error 21", "Invalid argument", /* SOCBASEERR+22 */ "Error 23", "Too many open files", /* SOCBASEERR+24 */ "Error 25", "Error 26", "Error 27", "Error 28", "Error 29", "Error 30", "Error 31", "Broken pipe", /* SOCBASEERR+32 */ "Error 33", "Error 34", "Operation would block", /* SOCBASEERR+35 */ "Operation now in progress", /* SOCBASEERR+36 */ "Operation already in progress", /* SOCBASEERR+37 */ "Socket operation on non-socket", /* SOCBASEERR+38 */ "Destination address required", /* SOCBASEERR+39 */ "Message too long", /* SOCBASEERR+40 */ "Protocol wrong type for socket", /* SOCBASEERR+41 */ "Protocol not available", /* SOCBASEERR+42 */ "Protocol not supported", /* SOCBASEERR+43 */ "Socket type not supported", /* SOCBASEERR+44 */ "Operation not supported on socket", /* SOCBASEERR+45 */ "Protocol family not supported", /* SOCBASEERR+46 */ "Address family not supported by protocol family", /* SOCBASEERR+47 */ "Address already in use", /* SOCBASEERR+48 */ "Can't assign requested address", /* SOCBASEERR+49 */ "Network is down", /* SOCBASEERR+50 */ "Network is unreachable", /* SOCBASEERR+51 */ "Network dropped connection on reset", /* SOCBASEERR+52 */ "Software caused connection abort", /* SOCBASEERR+53 */ "Connection reset by peer", /* SOCBASEERR+54 */ "No buffer space available", /* SOCBASEERR+55 */ "Socket is already connected", /* SOCBASEERR+56 */ "Socket is not connected", /* SOCBASEERR+57 */ "Can't send after socket shutdown", /* SOCBASEERR+58 */ "Too many references: can't splice", /* SOCBASEERR+59 */ "Connection timed out", /* SOCBASEERR+60 */ "Connection refused", /* SOCBASEERR+61 */ "Too many levels of symbolic links", /* SOCBASEERR+62 */ "File name too long", /* SOCBASEERR+63 */ "Host is down", /* SOCBASEERR+64 */ "No route to host", /* SOCBASEERR+65 */ "Directory not empty" /* SOCBASEERR+66 */ }; int sock_errno( void ); const char *tcperr () { int err = tcperrno - 0; if (err == 100) return "OS/2 Error"; /* SOCBASEERR+100 */ else if (err > (sizeof (sockerrors) / sizeof (char *))) return "Unknown TCP/IP error"; else return sockerrors[err]; } binkd/dos/sleep.c0000664000076400007640000000347607644030226012375 0ustar gulgul#include #include #include "../sys.h" #ifdef CATCH_TIMER #define TIME_FREQ 1193180l static unsigned long counter; static void (_cdecl _interrupt _far *old_timer)(void); static void _cdecl _interrupt _far new_timer(void) { if (counter) counter--; /* don't know how to make "jmp old_timer" from C :-( */ old_timer(); } #endif void dos_sleep(int sec) { static int dv = -1, win, os2; union REGS reg_in, reg_out; #ifndef CATCH_TIMER time_t t, start = time(NULL); #endif if (dv == -1) { /* dv installation check */ reg_in.x.ax = 0x2b01; reg_in.x.cx = 0x4445; reg_in.x.dx = 0x5351; intdos(®_in, ®_out); if (reg_out.h.al != 0xff) { dv = 1; win = os2 = 0; } else { dv = 0; /* windows installation check */ reg_in.x.ax = 0x1600; int86(0x2f, ®_in, ®_out); if (reg_out.h.al & 0x7f) { win = 1; os2 = 0; } else { win = 0; /* os/2 installation check */ reg_in.x.ax = 0x4010; int86(0x2f, ®_in, ®_out); if (reg_out.x.ax == 0x4010) os2 = 0; else os2 = 1; } } } #ifdef CATCH_TIMER /* save timer interrupt */ old_timer = _dos_getvect(8); /* count timer */ if ((unsigned long)sec > 0xfffffffful/TIME_FREQ) counter = (TIME_FREQ/0x100)*sec/0x100; else counter = TIME_FREQ*sec/0x10000ul; /* set our timer */ _dos_setvect(8, new_timer); #endif do { /* giveup cpu */ int86(0x28, ®_in, ®_out); if (dv) { reg_in.x.ax = 0x1000; int86(0x15, ®_in, ®_out); } else if (win || os2) { reg_in.x.ax = 0x1680; int86(0x2f, ®_in, ®_out); } #ifndef CATCH_TIMER t = time(NULL); if (t < start) start = t; /* time shifted */ } while (t < start + sec); #else } while (counter > 0); /* restore timer */ _dos_setvect(8, old_timer); #endif } binkd/todo.lst0000664000076400007640000000221707670313650012021 0ustar gulgul- nolog "call to*" "*:unknown host" "some annoing message" - perl hooks: - recvfile - sendfile - beforesession - aftersession - startsession (shared aka) - log - start, atexit - outcall (i.e. only if more then N Kb mail) - rexx hooks - set root-domain for every domain - shared aka - reread config "on fly" in multithread versions - do not kill attaches (save and ignore) if drive missing (unmounted) - no incoming calls under BeOS (file locking problem) - no syslog support under BeOS - charsets support, unicode - present aka, hide aka - 3 passwords in passwd-file - "incoming,pkt,outgoing" - separate child status to signal and retcode - aftersession - "empty queue" flag (exit if "-p") - exit immediately after session in "-p" mode - tzoff - ? Now used only for binlog - do not send files with hidden attribute from filebox - non-destructive skip by mask - binkd/dos: waterloo tcpip - single-thread version - put session time in "done" line - send-hold-on-outgoing option - argus-compatible freq (M_NUL "FREQ") - options -snr, -snd - force send in NR or ND mode on binkp/1.1 - turn on NR-mode if exists incomplete files from this link (optional?) binkd/iptools.c0000664000076400007640000001254207664475447012207 0ustar gulgul/* * iptools.c -- Some useful TCP/IP utils * * iptools.c is a part of binkd project * * Copyright (C) 1997-1998 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: iptools.c,v 2.10 2003/05/26 20:37:59 gul Exp $ * * $Log: iptools.c,v $ * Revision 2.10 2003/05/26 20:37:59 gul * typo in previous patch * * Revision 2.9 2003/05/26 20:34:38 gul * Bugfix on resolving raw IP when HAVE_FORK * * Revision 2.8 2003/05/04 08:45:30 gul * Lock semaphores more safely for resolve and IP-addr print * * Revision 2.7 2003/03/26 12:59:16 gul * Fix previous patch * * Revision 2.6 2003/03/26 10:44:40 gul * Code cleanup * * Revision 2.5 2003/03/25 20:37:46 gul * free_hostent() function * * Revision 2.4 2003/03/01 18:46:05 gul * Use HAVE_SYS_IOCTL_H macro * * Revision 2.3 2003/02/28 08:53:38 gul * Fixed proxy usage * * Revision 2.2 2003/02/22 12:12:33 gul * Cleanup sources * * Revision 2.1 2003/02/22 11:45:41 gul * Do not resolve hosts if proxy or socks5 using * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.3 1998/06/19 05:19:33 mff * changes in get_hostname() * * Revision 1.2 1997/10/23 04:01:29 mff * +find_port(), minor changes for Amiga port * * Revision 1.1 1997/03/28 06:52:14 mff * Initial revision */ #include #include #include #include #include #if defined(HAVE_SYS_IOCTL_H) #include #endif #include "iphdr.h" #include "iptools.h" #include "tools.h" #include "readcfg.h" #include "sem.h" /* * Finds ASCIIZ address */ const char *get_hostname (struct sockaddr_in *addr, char *host, int len) { struct hostent *hp; struct sockaddr_in s; memcpy(&s, addr, sizeof(s)); if (backresolv) { lockresolvsem(); hp = gethostbyaddr ((char *) &s.sin_addr, sizeof s.sin_addr, AF_INET); if (hp) { strnzcpy (host, hp->h_name, len); releaseresolvsem(); return host; } releaseresolvsem(); } lockhostsem(); strncpy (host, inet_ntoa (s.sin_addr), len); releasehostsem(); return host; } #ifdef HAVE_THREADS struct hostent *copy_hostent(struct hostent *dest, struct hostent *src) { int naddr; char **cp; memcpy(dest, src, sizeof(struct hostent)); for (cp = src->h_addr_list, naddr = 0; cp && *cp; naddr++, cp++); dest->h_addr_list = malloc((naddr+1)*sizeof(dest->h_addr_list[0])); if (dest->h_addr_list) { dest->h_addr_list[0] = malloc(naddr*src->h_length); if (dest->h_addr_list[0]) { for (cp = src->h_addr_list, naddr=0; cp && *cp; cp++, naddr++) { dest->h_addr_list[naddr] = dest->h_addr_list[0]+naddr*src->h_length; memcpy(dest->h_addr_list[naddr], *cp, src->h_length); } dest->h_addr_list[naddr] = NULL; } } return dest; } void free_hostent(struct hostent *hp) { if (hp) { if (hp->h_addr_list && hp->h_addr_list[0]) free(hp->h_addr_list[0]); if (hp->h_addr_list) free(hp->h_addr_list); hp->h_addr_list = NULL; } } #endif /* * Sets non-blocking mode for a given socket */ void setsockopts (SOCKET s) { #if defined(FIONBIO) #if defined(UNIX) || defined(IBMTCPIP) || defined(AMIGA) int arg; arg = 1; if (ioctl (s, FIONBIO, (char *) &arg, sizeof arg) < 0) Log (1, "ioctl (FIONBIO): %s", TCPERR ()); #elif defined(WIN32) u_long arg; arg = 1; if (ioctlsocket (s, FIONBIO, &arg) < 0) Log (1, "ioctlsocket (FIONBIO): %s", TCPERR ()); #endif #endif #if defined(UNIX) || defined(EMX) || defined(AMIGA) if (fcntl (s, F_SETFL, O_NONBLOCK) == -1) Log (1, "fcntl: %s", strerror (errno)); #endif } /* * Find the port number (in the host byte order) by a port number string or * a service name. Find_port ("") will return binkp's port from * /etc/services or even (if there is no binkp entry) 24554. * Returns 0 on error. */ int find_port (char *s) { struct servent *entry = getservbyname (*s ? s : PRTCLNAME, "tcp"); if (entry) return ntohs (entry->s_port); if (*s == 0) return DEF_PORT; if (isdigit (*s)) return atoi (s); Log (1, "%s: incorrect port", s); return 0; } /* * Find the host IP address list by a domain name or IP address string. * Returns NULL on error. */ struct hostent *find_host(char *host, struct hostent *he, struct in_addr *defaddr) { struct hostent *hp; #ifdef HAVE_THREADS struct hostent ht; char *alist[2]; #else static struct hostent ht; static char *alist[2]; #endif if (!isdigit(host[0]) || (defaddr->s_addr = inet_addr (host)) == INADDR_NONE) { /* If not a raw ip address, try nameserver */ Log (5, "resolving `%s'...", host); lockresolvsem(); if ((hp = gethostbyname(host)) == NULL) { Log(1, "%s: unknown host", host); releaseresolvsem(); return NULL; } hp = copy_hostent(he, hp); releaseresolvsem(); return hp; } /* Raw ip address, fake */ hp = &ht; hp->h_name = host; hp->h_aliases = 0; hp->h_addrtype = AF_INET; hp->h_length = sizeof (struct in_addr); hp->h_addr_list = alist; hp->h_addr_list[0] = (char *) defaddr; hp->h_addr_list[1] = (char *) 0; hp = copy_hostent(he, hp); return hp; } binkd/server.h0000664000076400007640000000077007633067651012017 0ustar gulgul/* * $Id: server.h,v 2.2 2003/03/10 10:57:45 gul Exp $ * * $Log: server.h,v $ * Revision 2.2 2003/03/10 10:57:45 gul * Extern declarations moved to header files * * Revision 2.1 2003/03/10 10:39:23 gul * New include file common.h * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * */ #ifndef _servmgr_h #define _servmgr_h #include "iphdr.h" /* * Listens... Than calls protocol() */ void servmgr(void *arg); extern SOCKET sockfd; extern int ext_rand; #endif binkd/COPYING0000664000076400007640000004307607227050665011375 0ustar gulgul GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. binkd/iphdr.h0000664000076400007640000001065710075016136011606 0ustar gulgul/* * iphdr.h -- TCP/IP interface * * iphdr.h is a part of binkd project * * Copyright (C) 1996 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: iphdr.h,v 2.10.2.4 2004/07/13 17:31:10 stas Exp $ * * $Log: iphdr.h,v $ * Revision 2.10.2.4 2004/07/13 17:31:10 stas * Fix the #include statement * * Revision 2.10.2.3 2003/08/24 18:58:34 gul * Bugfix in timeout check on win32 * * Revision 2.10.2.2 2003/08/24 00:35:46 hbrew * Cosmetic change for previous patch * * Revision 2.10.2.1 2003/08/24 00:29:31 hbrew * win9x-select-workaround fix, thanks to Pavel Gulchouck) * * Revision 2.10 2003/06/04 10:36:58 stas * Thread-safety tcperr() implementation on Win32 * * Revision 2.9 2003/03/30 10:14:40 gul * Use HAVE_SOCKLEN_T macro * * Revision 2.8 2003/03/26 13:53:28 gul * Fix OS/2 compilation * * Revision 2.7 2003/03/11 09:21:30 gul * Fixed OS/2 Watcom compilation * * Revision 2.6 2003/03/11 00:04:25 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.5 2003/03/10 18:16:10 gul * Define socklen_t for win32 * * Revision 2.4 2003/03/10 12:16:53 gul * Use HAVE_DOS_H macro * * Revision 2.3 2003/03/01 20:16:27 gul * OS/2 IBM C support * * Revision 2.2 2003/03/01 18:37:08 gul * Use HAVE_SYS_PARAM_H macro * * Revision 2.1 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.4 1997/10/23 04:02:31 mff * many, many changes (forget to ci a version or two) * * Revision 1.2 1996/12/07 11:42:18 mff * soclose() for NT was defined as close(). Fixed. * * */ #ifndef _iphdrs_h #define _iphdrs_h #include #ifdef HAVE_SYS_PARAM_H #include #endif #include "sys.h" /* Get system i/o headers */ #ifdef IBMTCPIP #include #undef ENAMETOOLONG #undef ENOTEMPTY #define BSD_SELECT #define __off_t #define __size_t #include #include #include #include #endif #if !defined(WIN32) #if defined(IBMTCPIPDOS) #include #endif #include #include /* One of these two should have * MAXHOSTNAMELEN */ #endif #ifdef HAVE_ARPA_INET_H #include #endif #if !defined(WIN32) #include #else #include #endif #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 255 /* max hostname size */ #endif #define MAXSERVNAME 80 /* max id len in /etc/services */ #ifndef HAVE_SOCKLEN_T typedef int socklen_t; #endif #if defined(IBMTCPIP) const char *tcperr (void); #define ReleaseErrorList() #define TCPERR() tcperr() #define TCPERRNO (sock_errno()) #include #define TCPERR_WOULDBLOCK EWOULDBLOCK #define TCPERR_AGAIN EAGAIN #define sock_deinit() #ifndef MAXSOCKETS #define MAXSOCKETS 2048 #endif #elif defined(IBMTCPIPDOS) const char *tcperr (void); #define ReleaseErrorList() #define TCPERR() tcperr() #define TCPERRNO (tcperrno) #include #include #undef ENAMETOOLONG #undef ENOTEMPTY #define TCPERR_WOULDBLOCK EWOULDBLOCK #define TCPERR_AGAIN EAGAIN #define sock_deinit() #elif defined(WIN32) const char *tcperr (int); void ReleaseErrorList(void); #define TCPERR() tcperr(h_errno) #define TCPERRNO (h_errno) #define TCPERR_WOULDBLOCK WSAEWOULDBLOCK #define TCPERR_AGAIN WSAEWOULDBLOCK #include "nt/WSock.h" #define sock_init() WinsockIni() #define sock_deinit() WinsockClean() #define soclose(h) closesocket(h) /* w9x_workaround_sleep: 1000000 = 1 sec, 10000 = 10 ms */ #define w9x_workaround_sleep 10000 #else #include #define ReleaseErrorList() #define TCPERR() strerror(errno) #define TCPERRNO errno #define TCPERR_WOULDBLOCK EWOULDBLOCK #define TCPERR_AGAIN EAGAIN #define sock_init() 0 #define sock_deinit() #define soclose(h) close(h) #endif #if !defined(WIN32) typedef int SOCKET; #define INVALID_SOCKET (-1) #define SOCKET_ERROR (-1) #endif #ifndef INADDR_NONE #define INADDR_NONE -1 #endif #endif binkd/md5b.c0000664000076400007640000003716010134717312011320 0ustar gulgul/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ /* * $Id: md5b.c,v 2.6.2.1 2004/10/18 10:45:30 gul Exp $ * * $Log: md5b.c,v $ * Revision 2.6.2.1 2004/10/18 10:45:30 gul * Bugfix in MD_getChallenge(), thanks to Victor Levenets * * Revision 2.6 2003/03/11 09:21:30 gul * Fixed OS/2 Watcom compilation * * Revision 2.5 2003/03/10 10:57:45 gul * Extern declarations moved to header files * * Revision 2.4 2003/03/05 13:21:50 gul * Fix warnings * * Revision 2.3 2003/03/02 08:08:49 gul * Added CVS ID and Revision * */ #include #include #include #include #ifdef HAVE_SYS_TIME_H #include #endif #include "sys.h" #include "md5b.h" #include "tools.h" /* Constants for MD5Transform routine. */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64])); static void Encode PROTO_LIST ((unsigned char *, UINT4 *, unsigned int)); static void Decode PROTO_LIST ((UINT4 *, unsigned char *, unsigned int)); static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int)); static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* F, G, H and I are basic MD5 functions. */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define HH(a, b, c, d, x, s, ac) { (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ static void MD5Init (context) MD5_CTX *context; /* context */ { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; } /* MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context. */ static void MD5Update (context, input, inputLen) MD5_CTX *context; /* context */ unsigned char *input; /* input block */ unsigned int inputLen; /* length of input block */ { unsigned int i, index, partLen; /* Compute number of bytes mod 64 */ index = (unsigned int)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) context->count[1]++; context->count[1] += ((UINT4)inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { MD5_memcpy ((POINTER)&context->buffer[index], (POINTER)input, partLen); MD5Transform (context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform (context->state, &input[i]); index = 0; } else i = 0; /* Buffer remaining input */ MD5_memcpy ((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); } /* MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context. */ static void MD5Final (digest, context) unsigned char digest[16]; /* message digest */ MD5_CTX *context; /* context */ { unsigned char bits[8]; unsigned int index, padLen; /* Save number of bits */ Encode (bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update (context, PADDING, padLen); /* Append length (before padding) */ MD5Update (context, bits, 8); /* Store state in digest */ Encode (digest, context->state, 16); /* Zeroize sensitive information. */ MD5_memset ((POINTER)context, 0, sizeof (*context)); } /* MD5 basic transformation. Transforms state based on block. */ static void MD5Transform (state, block) UINT4 state[4]; unsigned char block[64]; { UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64); /* Round 1 */ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ MD5_memset ((POINTER)x, 0, sizeof (x)); } /* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */ static void Encode (output, input, len) unsigned char *output; UINT4 *input; unsigned int len; { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (unsigned char)(input[i] & 0xff); output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); } } /* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */ static void Decode (output, input, len) UINT4 *output; unsigned char *input; unsigned int len; { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); } /* Note: Replace "for loop" with standard memcpy if possible. */ static void MD5_memcpy (output, input, len) POINTER output; POINTER input; unsigned int len; { unsigned int i; for (i = 0; i < len; i++) output[i] = input[i]; } /* Note: Replace "for loop" with standard memset if possible. */ static void MD5_memset (output, value, len) POINTER output; int value; unsigned int len; { unsigned int i; for (i = 0; i < len; i++) ((char *)output)[i] = (char)value; } /* ---------------------------------------------------------- */ static void hmac_md5(text, text_len, key, key_len, digest) unsigned char* text; /* pointer to data stream */ int text_len; /* length of data stream */ unsigned char* key; /* pointer to authentication key */ int key_len; /* length of authentication key */ MDcaddr_t digest; /* caller digest to be filled in */ { MD5_CTX context; unsigned char k_ipad[65]; /* inner padding - * key XORd with ipad */ unsigned char k_opad[65]; /* outer padding - * key XORd with opad */ unsigned char tk[16]; int i; /* if key is longer than 64 bytes reset it to key=MD5(key) */ if (key_len > 64) { MD5_CTX tctx; MD5Init(&tctx); MD5Update(&tctx, key, key_len); MD5Final(tk, &tctx); key = tk; key_len = 16; } /* * the HMAC_MD5 transform looks like: * * MD5(K XOR opad, MD5(K XOR ipad, text)) * * where K is an n byte key * ipad is the byte 0x36 repeated 64 times * opad is the byte 0x5c repeated 64 times * and text is the data being protected */ /* start out by storing key in pads */ #ifndef bzero #define bzero(x,y) memset((char*)x, 0, y) #endif #ifndef bcopy #define bcopy(x,y,z) memmove((char*)y, (char*)x, z) #endif bzero( k_ipad, sizeof k_ipad); bzero( k_opad, sizeof k_opad); bcopy( key, k_ipad, key_len); bcopy( key, k_opad, key_len); /* XOR key with ipad and opad values */ for (i=0; i<64; i++) { k_ipad[i] ^= 0x36; k_opad[i] ^= 0x5c; } /* * perform inner MD5 */ MD5Init(&context); /* init context for 1st * pass */ MD5Update(&context, k_ipad, 64); /* start with inner pad */ MD5Update(&context, text, text_len); /* then text of datagram */ MD5Final(digest, &context); /* finish up 1st pass */ /* * perform outer MD5 */ MD5Init(&context); /* init context for 2nd * pass */ MD5Update(&context, k_opad, 64); /* start with outer pad */ MD5Update(&context, digest, 16); /* then results of 1st * hash */ MD5Final(digest, &context); /* finish up 2nd pass */ } /* ---------------------------------------------------------- */ static void getrand(unsigned char *res, int len, STATE *rnd) { MDcaddr_t digest; struct { time_t tm; unsigned short pid; unsigned short rand; int ext_rand; } rd; time(&rd.tm); rd.pid=PID(); rd.rand=rand(); rd.ext_rand=ext_rand; hmac_md5((void *)&rd, sizeof(rd), (void *)rnd, sizeof(STATE), digest); if((rnd->peer_name)&&(rnd->peer_name[0])) hmac_md5(rnd->peer_name, strlen(rnd->peer_name), digest, sizeof(digest), digest); memcpy(res, digest, len); } unsigned char *MD_getChallenge(char *str, STATE *rnd) { unsigned char *res=NULL; int i; if(!str) { res=(unsigned char*)xalloc(MD_CHALLENGE_LEN+1); res[0]=MD_CHALLENGE_LEN; for(i=1;i<(MD_CHALLENGE_LEN+1);i+=MD5_DIGEST_LEN) { int k=MD5_DIGEST_LEN; if(k>MD_CHALLENGE_LEN-i) k=MD_CHALLENGE_LEN-i; getrand(res+i, k, rnd); } } else { char *sp; if((sp=strstr(str, "CRAM"))==NULL) return NULL; if((sp=strstr(sp, "MD5"))==NULL) return NULL; while(sp[0]) if(*sp++=='-') break; if(!sp[0]) return NULL; for(i=0;isxdigit((int)sp[i]);i++) if(i>=128) break; i/=2; res=(unsigned char*)xalloc(i+1); res[0]=(char)i; for(i=0;isxdigit((int)sp[i]) && (i<128);i++) { unsigned char c=tolower(sp[i]); if(c>'9') c-='a'-10; else c-='0'; if(!(i%2)) res[i/2+1]=c<<4; else res[i/2+1]|=c; } } return res; } void MD_toString(char *rs, int len, unsigned char *digest) { int i,j; if(!rs) return; strcpy(rs, "CRAM-MD5-"); for(i=0,j=9;i>4); if(c>9) c+='a'-10; else c+='0'; rs[j++]=c; c=(digest[i]&0xF); if(c>9) c+='a'-10; else c+='0'; rs[j++]=c; } rs[j]=0; } char *MD_buildDigest(char *pw, unsigned char *challenge) { char *rs=NULL; MDcaddr_t digest; if((!pw)||(!challenge)) return rs; hmac_md5(challenge+1, challenge[0], pw, strlen(pw), digest); rs=(char*)xalloc(MD5_DIGEST_LEN*2+10); MD_toString(rs, MD5_DIGEST_LEN, digest); return rs; } binkd/tools.c0000664000076400007640000005043210466305075011635 0ustar gulgul/* * tools.c -- misc utils * * tools.c is a part of binkd project * * Copyright (C) 1996-1998 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: tools.c,v 2.22.2.4 2006/08/09 07:09:49 gul Exp $ * * $Log: tools.c,v $ * Revision 2.22.2.4 2006/08/09 07:09:49 gul * cosmetic fix * * Revision 2.22.2.3 2004/10/21 17:02:05 gul * Rename trunc() -> trunc_file() due to conflicts under OS/2 EMX and SuSE * * Revision 2.22.2.2 2003/12/02 14:24:13 gul * Use vsnprintf() if exists * * Revision 2.22.2.1 2003/06/30 22:46:03 hbrew * Print only binkd name (without path) in error messages * * Revision 2.22 2003/04/02 13:12:57 gul * Try to use workaround for buggy windows time functions (timezone) * * Revision 2.21 2003/03/31 22:47:22 gul * remove workaround for msvc localtime() bug * * Revision 2.20 2003/03/31 21:48:59 gul * Avoid infinite recursion * * Revision 2.19 2003/03/31 21:27:12 gul * Avoid infinite recursion * * Revision 2.18 2003/03/31 20:28:24 gul * safe_localtime() and safe_gmtime() functions * * Revision 2.17 2003/03/31 19:35:16 gul * Clean semaphores usage * * Revision 2.16 2003/03/31 18:22:12 gul * Use snprintf() instead of sprintf() * * Revision 2.15 2003/03/10 10:57:45 gul * Extern declarations moved to header files * * Revision 2.14 2003/03/05 13:21:51 gul * Fix warnings * * Revision 2.13 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.12 2002/11/14 09:46:59 gul * Minor BINKDW9X fix * * Revision 2.11 2002/11/12 16:55:58 gul * Run as service under win9x * * Revision 2.10 2002/05/06 19:25:40 gul * new keyword inboundCase in config * * Revision 2.9 2002/03/20 15:31:19 gul * ftrans bugfix * * Revision 2.8 2002/03/20 14:32:14 gul * Bugfix in ftrans * * Revision 2.7 2002/03/07 14:29:52 gul * print PID as unsigned to bsy/csy * * Revision 2.6 2002/02/25 21:33:56 gul * Dequote \hh in filenames as \xhh; both \20 and \x20 are space now (FSP-1011) * * Revision 2.5 2001/11/08 14:04:12 gul * bugfix * * Revision 2.4 2001/11/07 17:01:12 gul * Check size of buffer in strnzcpy() * * Revision 2.3 2001/10/23 08:33:44 gul * Change filename (not ext) in incoming *.req if already exists * * Revision 2.2 2001/09/30 13:49:59 gul * Do not put log to socket if run via inetd * * Revision 2.1 2001/09/24 10:31:39 gul * Build under mingw32 * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.18 1998/05/05 04:37:54 mff * Now we add trailing '\n' to pids in pidfiles, added 2nd arg to strquote(), * added strdequote(), strwipe() does not touch ' ' and 0xff any more, * added istic(), ispkt(), isarcmail(). * * Revision 1.17 1997/10/23 03:31:49 mff * minor bug fixes in mkpath*() (again!), added mutex into Log(), * stricmp() -> STRICMP(), getwordx() moved to getw.c, minor fixes. * * Revision 1.16 1997/06/16 05:38:21 mff * Changed Log() -> syslog() loglevel mapping, fixed endless recursion * in Log() when calling assert() from Log() * * Revision 1.15 1997/05/17 11:18:14 mff * + get_os_string() * * Revision 1.14 1997/05/17 08:40:35 mff * assert() in Log() changed a bit * * Revision 1.13 1997/05/08 05:23:20 mff * Fixed syslog feature of Log() * * Revision 1.12 1997/03/28 06:10:12 mff * + ed() * * Revision 1.11 1997/03/15 05:03:32 mff * added touch() * * Revision 1.10 1997/03/09 07:15:30 mff * GWX_*, syslog * * Revision 1.9 1997/02/07 06:45:52 mff * getwordx now handles not only first `#' as comment. Though it can be * quoted with "" or \. TODO: bitmapped arg to turn this and var substing off * * Revision 1.8 1997/01/09 05:33:35 mff * Now we don't mkdir("") (Thanks to Mike Malakhov) * * Revision 1.7 1996/12/29 09:47:42 mff * Added: create_empty_sem_file() * * Revision 1.6 1996/12/14 07:13:51 mff * log() is now Log() * * Revision 1.5 1996/12/05 08:01:11 mff * Changed parse_args(), removed free_args() * * Revision 1.4 1996/12/05 07:24:35 mff * Format strings for Log() should have no "\n" at the end * * Revision 1.3 1996/12/05 04:30:14 mff * Now we don't mkdir drives */ #include #include #include #include #include #include #include #include #include #include #if defined (HAVE_VSYSLOG) && defined (HAVE_FACILITYNAMES) #include #endif #include "assert.h" #include "Config.h" #include "sys.h" #include "common.h" #include "tools.h" #include "readdir.h" /* for [sys/]utime.h */ #include "readcfg.h" #include "sem.h" /* * Lowercase the string */ char *strlower (char *s) { int i; for (i = 0; s[i]; ++i) s[i] = tolower (s[i]); return s; } /* * Uppercase the string */ char *strupper (char *s) { int i; for (i = 0; s[i]; ++i) s[i] = toupper (s[i]); return s; } int mkpath0 (const char *path0) { struct stat sb; if (stat (path0, &sb) == -1) { char *path, *s; int retval; if ((path = strdup (path0)) == NULL) { errno = ENOMEM; return -1; } if ((s = max (strrchr (path, '\\'), strrchr (path, '/'))) != 0) { *(s++) = 0; if (*path && mkpath0 (path) == -1) { free (path); return -1; } } else s = path; if (path0[strlen (path0) - 1] == ':') retval = 0; /* we found the device part of the * path */ else retval = MKDIR (path0); free (path); return retval; } else if (sb.st_mode & S_IFDIR) { return 0; } else { errno = ENOTDIR; return -1; } } int mkpath (char *s) { char path[MAXPATHLEN]; strnzcpy (path, s, MAXPATHLEN); if ((s = max (strrchr (path, '\\'), strrchr (path, '/'))) == 0) return 0; *s = 0; return mkpath0 (path); } unsigned long rnd (void) { static int i; if (!i) { i = 1; srand (time (0)); } return (time (0) + rand ()) & 0xFFFFFFFFul; } /* * 1 -- created, 0 -- already busy */ int create_empty_sem_file (char *name) { int h; if ((h = open (name, O_RDWR | O_CREAT | O_EXCL, 0666)) == -1) return 0; close (h); return 1; } int create_sem_file (char *name) { int h, i; char buf[16]; if ((h = open (name, O_RDWR | O_CREAT | O_EXCL, 0666)) == -1) { Log (5, "Can't create %s: %s", name, strerror(errno)); return 0; } #ifdef HAVE_SNPRINTF snprintf (buf, sizeof (buf), "%u\n", (int) getpid ()); #else sprintf (buf, "%u\n", (int) getpid ()); #endif if ((i = write(h, buf, strlen(buf))) != (int)strlen(buf)) { if (i == -1) Log (2, "Can't write to %s (handle %d): %s", name, h, strerror(errno)); else Log (2, "Can't write %d bytes to %s, wrote only %d", strlen(buf), name, i); } close (h); Log (5, "created %s", name); return 1; } #if defined(EMX) || defined(__WATCOMC__) #include /* for _heapchk() */ #endif struct tm *safe_gmtime(time_t *t, struct tm *tm) { threadsafe(memcpy(tm, gmtime(t), sizeof(*tm))); return tm; } #ifdef WIN32 #include static void stime_to_tm(const SYSTEMTIME *stime, struct tm *tm) { tm->tm_year = stime->wYear-1900; tm->tm_mon = stime->wMonth-1; tm->tm_mday = stime->wDay; tm->tm_wday = stime->wDayOfWeek; tm->tm_hour = stime->wHour; tm->tm_min = stime->wMinute; tm->tm_sec = stime->wSecond; } static void tm_to_stime(const struct tm *tm, SYSTEMTIME *stime) { stime->wYear = tm->tm_year+1900; stime->wMonth = tm->tm_mon+1; stime->wDay = tm->tm_mday; stime->wDayOfWeek = tm->tm_wday; stime->wHour = tm->tm_hour; stime->wMinute = tm->tm_min; stime->wSecond = tm->tm_sec; stime->wMilliseconds = 0; } static int safe_cmptime(const struct tm *tm1, const struct tm *tm2) { if (tm1->tm_year > tm2->tm_year) return 1; if (tm1->tm_year < tm2->tm_year) return -1; if (tm1->tm_mon > tm2->tm_mon ) return 1; if (tm1->tm_mon < tm2->tm_mon ) return -1; if (tm1->tm_mday > tm2->tm_mday) return 1; if (tm1->tm_mday < tm2->tm_mday) return -1; if (tm1->tm_hour > tm2->tm_hour) return 1; if (tm1->tm_hour < tm2->tm_hour) return -1; return 0; } time_t safe_time(void) { /* gmtime(t) should be SystemTime */ SYSTEMTIME stime; struct tm utctm, tm; time_t t; int i; GetSystemTime(&stime); stime_to_tm(&stime, &utctm); t = time(NULL); t -= (t-utctm.tm_sec)%60; for (i=0; i<24; i++) { safe_gmtime(&t, &tm); if (tm.tm_hour == utctm.tm_hour) return t; t += safe_cmptime(&tm, &utctm) > 0 ? -3600 : 3600; } return t; } struct tm *safe_localtime(time_t *t, struct tm *tm) { FILETIME utcftime, localftime; SYSTEMTIME stime; safe_gmtime(t, tm); /* convert gmtime to localtime */ tm_to_stime(tm, &stime); SystemTimeToFileTime(&stime, &utcftime); FileTimeToLocalFileTime(&utcftime, &localftime); FileTimeToSystemTime(&localftime, &stime); stime_to_tm(&stime, tm); return tm; } #else struct tm *safe_localtime(time_t *t, struct tm *tm) { threadsafe(memcpy(tm, localtime(t), sizeof(*tm))); return tm; } time_t safe_time(void) { return time(NULL); } #endif #if defined(HAVE_THREADS) || defined(AMIGA) MUTEXSEM LSem = 0; #endif void Log (int lev, char *s,...) { static int first_time = 1; char timebuf[60]; time_t t; struct tm tm; va_list ap; static const char *marks = "!?+-"; char ch = (0 <= lev && lev < (int) strlen (marks)) ? marks[lev] : ' '; if (first_time == 1) { first_time = 2; InitSem (&LSem); } t = safe_time(); safe_localtime (&t, &tm); if (lev <= conlog #if defined(UNIX) || defined(OS2) || defined(AMIGA) && !inetd_flag #endif ) { strftime (timebuf, sizeof (timebuf), "%H:%M", &tm); LockSem (&LSem); fprintf (stderr, "%30.30s\r%c %s [%i] ", " ", ch, timebuf, (int) PID ()); va_start (ap, s); vfprintf (stderr, s, ap); va_end (ap); if (lev >= 0) fputc ('\n', stderr); ReleaseSem (&LSem); if (lev < 0) return; } if (lev <= loglevel && *logpath) { FILE *logfile = 0; int i; LockSem (&LSem); for (i = 0; logfile == 0 && i < 10; ++i) { logfile = fopen (logpath, "a"); } if (logfile) { if (first_time) { fputc ('\n', logfile); first_time = 0; } strftime (timebuf, sizeof (timebuf), "%d %b %H:%M:%S", &tm); fprintf (logfile, "%c %s [%i] ", ch, timebuf, (int) PID ()); va_start (ap, s); vfprintf (logfile, s, ap); va_end (ap); fputc ('\n', logfile); fclose (logfile); } else fprintf (stderr, "Cannot open %s: %s!\n", logpath, strerror (errno)); ReleaseSem (&LSem); } #ifdef WIN32 #ifdef BINKDW9X if(!lev) #else if((!lev)&&(isService)) #endif { char tmp[256]; va_start (ap, s); #ifdef HAVE_SNPRINTF vsnprintf (tmp, sizeof(tmp), s, ap); #else vsprintf (tmp, s, ap); #endif va_end (ap); MessageBox(NULL, tmp, MYNAME, MB_OK|MB_ICONSTOP|0x00200000L|MB_SYSTEMMODAL|MB_SETFOREGROUND); } #endif #if defined (HAVE_VSYSLOG) && defined (HAVE_FACILITYNAMES) if (lev <= loglevel && syslog_facility >= 0) { static int opened = 0; static int log_levels[] = { /* Correspondence between binkd's loglevel and syslog's priority */ LOG_ERR, /* 0 */ LOG_WARNING, /* 1 */ LOG_NOTICE, /* 2 */ LOG_INFO, /* 3 */ LOG_INFO, /* 4 */ LOG_INFO, /* 5 */ LOG_INFO, /* 6 */ LOG_DEBUG /* other */ }; if (!opened) { opened = 1; openlog ("binkd", LOG_PID, syslog_facility); } if (lev < 0 || lev >= sizeof log_levels / sizeof (int)) lev = sizeof log_levels / sizeof (int) - 1; va_start (ap, s); vsyslog (log_levels[lev], s, ap); va_end (ap); } #endif if (lev == 0) exit (1); #if defined(EMX) || defined(__WATCOMC__) /* assert (_heapchk () == _HEAPOK || _heapchk () == _HEAPEMPTY); */ #endif } int o_memicmp (const void *s1, const void *s2, size_t n) { int i; for (i = 0; i < (int) n; ++i) if (tolower (((char *) s1)[i]) != tolower (((char *) s2)[i])) return (tolower (((char *) s1)[i]) - tolower (((char *) s2)[i])); return 0; } int o_stricmp (const char *s1, const char *s2) { int i; for (i = 0;; ++i) { if (tolower (s1[i]) != tolower (s2[i])) return (tolower (s1[i]) - tolower (s2[i])); if (!s1[i]) return 0; } } int o_strnicmp (const char *s1, const char *s2, size_t n) { int i; for (i = 0; i < (int) n; ++i) { if (tolower (s1[i]) != tolower (s2[i])) return (tolower (s1[i]) - tolower (s2[i])); if (!s1[i]) return 0; } return 0; } /* * Quotes all special chars. free() it's retval! */ char *strquote (char *s, int flags) { char *r = xalloc (strlen (s) * 4 + 1); int i; for (i = 0; *s; ++s) { if (((flags & SQ_CNTRL) && iscntrl (*s)) || ((flags & SQ_SPACE) && isspace (*s)) || (*s == '\\')) { sprintf (r + i, "\\x%02x", *(unsigned char *) s); i += 4; } else r[i++] = *s; } r[i] = 0; return r; } /* * Reverse for strquote(), free it's return value! */ char *strdequote (char *s) { char *r = xstrdup (s); int i = 0; while (*s) { #define XD(x) (isdigit(x) ? ((x)-'0') : (tolower(x)-'a'+10)) if (s[0] == '\\' && s[1] == 'x' && isxdigit (s[2]) && isxdigit (s[3])) { r[i++] = XD (s[2]) * 16 + XD (s[3]); s += 4; } else if (s[0] == '\\' && isxdigit (s[1]) && isxdigit (s[2])) { r[i++] = XD (s[1]) * 16 + XD (s[2]); s += 3; } #undef XD else r[i++] = *(s++); } r[i] = 0; return r; } /* * Makes file system-safe names by wiping suspicious chars with '_' */ char *strwipe (char *s) { int i; for (i = 0; s[i]; ++i) if ((iscntrl (s[i]) || s[i] == '\\' || s[i] == '/' || s[i] == ':') #ifdef WIN32 /* ungly hack */ && ((s[i] & 0x80) == 0) #endif ) s[i] = '_'; return s; } /* * Copyes not more than len chars from src into dst, but, unlike strncpy(), * it appends '\0' even if src is longer than len. */ char *strnzcpy (char *dst, const char *src, size_t len) { dst[len - 1] = 0; return strncpy (dst, src, len - 1); } char *strnzcat (char *dst, const char *src, size_t len) { size_t x = strlen (dst); if (len <= x) return dst; return strnzcpy (dst + x, src, len - x); } /* * Splits args ASCIIZ string onto argc separate words, * saves them as argv[0]...argv[argc-1]. Logs error * "ID: cannot parse args", if args containes less than argc words. */ int parse_args (int argc, char *argv[], char *src, char *ID) { int i = 0; while (i < argc) { while (*src && isspace (*src)) ++src; if (!*src) break; argv[i] = src; while (*src && !isspace (*src)) ++src; ++i; if (!*src) break; src++[0] = 0; } if (i < argc) { Log (1, "%s: cannot parse args", ID, src); return 0; } else return 1; } /* * Set times for a file, 0 == success, -1 == error */ int touch (char *file, time_t t) { #ifndef OS2 struct utimbuf utb; utb.actime = utb.modtime = t; return utime (file, &utb); #else /* FastEcho deletes *.bsy by ctime :-( */ APIRET r; FILESTATUS3 buf; struct stat st; if ((r = stat(file, &st)) == 0) { struct tm tm; safe_localtime(&t, &tm); buf.fdateCreation.day=buf.fdateLastAccess.day=buf.fdateLastWrite.day= tm.tm_mday; buf.fdateCreation.month=buf.fdateLastAccess.month=buf.fdateLastWrite.month= tm.tm_mon+1; buf.fdateCreation.year=buf.fdateLastAccess.year=buf.fdateLastWrite.year= tm.tm_year-80; buf.ftimeCreation.twosecs=buf.ftimeLastAccess.twosecs=buf.ftimeLastWrite.twosecs= tm.tm_sec/2; buf.ftimeCreation.minutes=buf.ftimeLastAccess.minutes=buf.ftimeLastWrite.minutes= tm.tm_min; buf.ftimeCreation.hours=buf.ftimeLastAccess.hours=buf.ftimeLastWrite.hours= tm.tm_hour; buf.cbFile = buf.cbFileAlloc = st.st_size; buf.attrFile = FILE_ARCHIVED | FILE_NORMAL; r=DosSetPathInfo(file, FIL_STANDARD, &buf, sizeof(buf), 0); if (r == 32) r = 0; /* Can't touch opened *.bsy */ if (r) Log (1, "touch: DosSetPathInfo(%s) retcode %d", file, r); } return (r!=0); #endif } /* * Replaces all entries of a in s for b, returns edited line. * Returned value must be free()'d. Ignores case. * size parameter can be used only if "s" was created by malloc() */ char *ed (char *s, char *a, char *b, size_t *size) { size_t i, j, sr, sz; size_t len_a=a?strlen(a):0; size_t len_b=b?strlen(b):0; char *r=s; if ((!len_a) || (!s)) return r; if (!size) { sz=strlen(s)+1; r=xstrdup(s); } else sz=*size; sr=strlen(r); for (i=j=0; i=sz) { if (len_b<64) sz+=64; else sz+=len_b; r=xrealloc(r, sz); } i-=len_a-1; if (len_a!=len_b) memmove(r+i+len_b, r+i+len_a, sr-i-len_a+1); if (len_b) memcpy(r+i, b, len_b); j=0; i+=len_b-1; sr+=len_b-len_a; } if (size) *size=sz; return r; } /* * Remove/trucate a file, log this */ int delete (char *path) { int rc; if ((rc = unlink (path)) != 0) Log (1, "error unlinking `%s': %s", path, strerror (errno)); else Log (5, "unlinked `%s'", path); return rc; } int trunc_file (char *path) { int h; if ((h = open (path, O_WRONLY | O_TRUNC)) == -1) { Log (1, "cannot truncate `%s': %s", path, strerror (errno)); return -1; } else { Log (4, "truncated %s", path); close (h); return 0; } } /* * Get the string with OS name/version */ #ifdef HAVE_UNAME #include #endif char *get_os_string (void) { static char os[80]; strcpy (os, "/"); #ifdef HAVE_UNAME { struct utsname name; if (uname (&name) == 0) { strnzcat (os, name.sysname, sizeof (os)); return os; } } #endif #ifdef OS strnzcat (os, OS, sizeof (os)); #else *os = 0; #endif return os; } /* * Test netnames against some wildcards */ int ispkt (char *s) { return pmatch ("*.[Pp][Kk][Tt]", s); } int isreq (char *s) { return pmatch ("*.[Rr][Ee][Qq]", s); } int istic (char *s) { return pmatch ("*.?[Ii][Cc]", s); } int isarcmail (char *s) { /* *.su? *.mo? *.tu? *.we? *.th? *.fr? *.sa? */ return (pmatch ("*.[Ss][Uu]?", s) || pmatch ("*.[Mm][Oo]?", s) || pmatch ("*.[Tt][Uu]?", s) || pmatch ("*.[Ww][Ee]?", s) || pmatch ("*.[Tt][Hh]?", s) || pmatch ("*.[Ff][Rr]?", s) || pmatch ("*.[Ss][Aa]?", s)); } /* * Formats and prints argv into buf (for logging purposes) */ void print_args (char *buf, size_t sizeof_buf, int argc, char *argv[]) { int i, j, quote; assert (sizeof_buf > 5); *buf = 0; for (i = 0; i < argc; ++i) { quote = 0; if (argv[i][0] == 0) quote = 1; else for (j = 0; argv[i][j]; ++j) if (argv[i][j] <= ' ') { quote = 1; break; } strnzcat (buf, " ", sizeof_buf); if (quote) strnzcat (buf, "\"", sizeof_buf); strnzcat (buf, argv[i], sizeof_buf); if (quote) strnzcat (buf, "\"", sizeof_buf); } } /* * Dup argv */ char **mkargv (int argc, char **argv) { int i; char **p; p = (char **) xalloc ((argc + 1) * sizeof (*p)); for (i = 0; i < argc; i++) p[i] = xstrdup (argv[i]); p[i] = NULL; return p; } /* * Apply filename case style defined in inboundcase */ char *makeinboundcase (char *s) { int i; switch (inboundcase) { case INB_UPPER: s = strupper(s); Log (8, "uppercase filename"); break; case INB_LOWER: s = strlower(s); Log (8, "lowercase filename"); break; case INB_MIXED: s[0] = toupper (s[0]); for (i = 1; s[i]; ++i) s[i] = isalnum(s[i-1]) ? tolower(s[i]) : toupper(s[i]); Log (8, "mixing filename case"); break; default: Log (8, "nothing to do with filename case"); break; } return s; } /* Extract filename from path */ char *extract_filename(char *s) { char *tmp = max(max(strrchr(s, '\\'), strrchr(s, '/')), strrchr(s, ':')); return tmp? tmp+1: s; } binkd/reapchld.inc0000664000076400007640000000166407633047357012621 0ustar gulgul/* * Common part of SIGCHLD handling for diff.parts of binkd * Should be included in chld() */ /* * $Id: reapchld.inc,v 2.1 2003/03/10 08:38:07 gul Exp $ * * $Log: reapchld.inc,v $ * Revision 2.1 2003/03/10 08:38:07 gul * Make n_servers/n_clients changes thread-safe * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * */ { int old_errno = errno; int status; int pid; extern int pidcmgr; #ifdef HAVE_WAITPID while ((pid = waitpid (-1, &status, WNOHANG)) > 0) /* NO ";" !!! */ #else pid = (int) wait (&status); #endif if (pid > 0) { if (pidcmgr && pid == pidcmgr) { Log (0, "client manager (pid=%u) exited, retcode %u", pid, status); exit(4); } #ifdef CHILDCOUNT threadsafe(CHILDCOUNT--); #endif Log (4, "rc(%i)=%i", pid, status); } #ifdef SYS5SIGNALS signal (SIGCHLD, chld); #endif #ifdef EMXSIGNALS signal (SIGCHLD, SIG_ACK); #endif errno = old_errno; } binkd/iptools.h0000664000076400007640000000357107640302230012163 0ustar gulgul/* * iptools.h -- Some useful TCP/IP utils * * iptools.h is a part of binkd project * * Copyright (C) 1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: iptools.h,v 2.5 2003/03/26 10:44:40 gul Exp $ * * $Log: iptools.h,v $ * Revision 2.5 2003/03/26 10:44:40 gul * Code cleanup * * Revision 2.4 2003/03/25 21:09:04 gul * Memory leak * * Revision 2.3 2003/03/25 20:37:46 gul * free_hostent() function * * Revision 2.2 2003/02/28 08:53:38 gul * Fixed proxy usage * * Revision 2.1 2003/02/22 11:45:41 gul * Do not resolve hosts if proxy or socks5 using * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.2 1997/10/23 04:00:57 mff * +find_port() * * Revision 1.1 1997/03/28 06:52:14 mff * Initial revision * */ /* * Finds ASCIIZ address */ const char *get_hostname (struct sockaddr_in * addr, char *host, int len); #ifdef HAVE_THREADS struct hostent *copy_hostent(struct hostent *dest, struct hostent *src); void free_hostent(struct hostent *hp); #else #define free_hostent(hp) #define copy_hostent(dest, src) (src) #endif /* * Sets non-blocking mode for a given socket */ void setsockopts (SOCKET s); /* * Find the port number (in the host byte order) by a port number string or * a service name. Find_port ("") will return binkp's port from * /etc/services or even (if there is no binkp entry) 24554. * Returns 0 on error. */ int find_port (char *s); /* * * Find the host IP address list by a domain name or IP address string. * * Returns NULL on error. * */ struct hostent *find_host(char *host, struct hostent *he, struct in_addr *defaddr); binkd/readflo.h0000664000076400007640000000234607227050667012124 0ustar gulgul/* * readflo.h -- Filename translation in ?lo-files * * readflo.h is a part of binkd project * * Copyright (C) 1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: readflo.h,v 2.0 2001/01/10 12:12:39 gul Exp $ * * $Log: readflo.h,v $ * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.1 1997/03/28 06:20:30 mff * Initial revision * */ #ifndef _readflo_h #define _readflo_h #include typedef struct _RF_RULE RF_RULE; struct _RF_RULE { char *from, *to; RF_RULE *next; }; /* * Add a translation rule for trans_flo_line () * (From and to are saved as pointers!) */ void rf_rule_add (char *from, char *to); /* * Reads a line from a flo to dst[MAXPATHLEN], sets action * 1 -- ok * 0 -- EOF */ int read_flo_line (char *dst, int *action, FILE *flo); /* * Translates a flo line using rf_rules. * Returns 0 if no rf_rules defined, otherwise returned value * should be free()'d */ char *trans_flo_line (char *s); #endif binkd/binlog.c0000664000076400007640000001747007642560731011760 0ustar gulgul/*--------------------------------------------------------------------*/ /* B i n L o g . c */ /* */ /* Part of BinkD project */ /* Binary log implementation */ /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/ /* Copyright (c) 1997 by Fydodor Ustinov */ /* FIDONet 2:5020/79 */ /* FrontDoor stat (c) 1997 A&T Software */ /* 2:5023/8@fidonet */ /* */ /* This program is free software; you can redistribute it and/or */ /* modify it under the terms of the GNU General Public License as */ /* published by the Free Software Foundation; either version 2 of */ /* the License, or (at your option) any later version. See COPYING. */ /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/ /* RCS Information */ /*--------------------------------------------------------------------*/ /* * $Id: binlog.c,v 2.4 2003/04/02 13:12:57 gul Exp $ * * Revision history: * $Log: binlog.c,v $ * Revision 2.4 2003/04/02 13:12:57 gul * Try to use workaround for buggy windows time functions (timezone) * * Revision 2.3 2003/03/31 19:35:16 gul * Clean semaphores usage * * Revision 2.2 2003/03/11 09:21:29 gul * Fixed OS/2 Watcom compilation * * Revision 2.1 2003/03/05 13:21:50 gul * Fix warnings * * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * Revision 0.02 1997/07/11 11:40:19 maxb * Added FrontDoor aka Bink/+ statistics * * Revision 0.01 1997/05/25 18:36:00 ufm * First revision * */ /*--------------------------------------------------------------------*/ /* System include files */ /*--------------------------------------------------------------------*/ #include #include /*--------------------------------------------------------------------*/ /* Local include files */ /*--------------------------------------------------------------------*/ #include "Config.h" #include "binlog.h" #include "sys.h" #include "readcfg.h" #include "prothlp.h" #include "protoco2.h" #include "assert.h" #include "sem.h" /*--------------------------------------------------------------------*/ /* Global definitions */ /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/ /* Global variables */ /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/ /* Local variables */ /*--------------------------------------------------------------------*/ #if defined(HAVE_THREADS) || defined(AMIGA) static MUTEXSEM BLSem; /* =0 removed */ #endif /*--------------------------------------------------------------------*/ /* void BinLogInit(Void) */ /* */ /* Initialise BinLog semaphore. */ /*--------------------------------------------------------------------*/ void BinLogInit(void) { InitSem(&BLSem); } /*--------------------------------------------------------------------*/ /* void BinLogDeInit(Void) */ /* */ /* Deinitialise BinLog semaphore. */ /*--------------------------------------------------------------------*/ void BinLogDeInit(void) { CleanSem(&BLSem); } /*--------------------------------------------------------------------*/ /* void TLogStat (char*, STATE*) */ /* */ /* Add record to T-Mail style binary log. */ /*--------------------------------------------------------------------*/ void TLogStat (char *status, STATE *state) { struct { u16 fZone; u16 fNet; u16 fNode; u16 fPoint; u32 fSTime; u32 fLTime; u32 fBReceive; u32 fBSent; u8 fFReceive; u8 fFSent; u16 fStatus; } TS; FILE *fl; if (binlogpath[0]) { TS.fStatus = 0; if (state->to) { TS.fZone = state->to->fa.z; TS.fNet = state->to->fa.net; TS.fNode = state->to->fa.node; TS.fPoint = state->to->fa.p; TS.fStatus = 1; } else if (state->fa) { TS.fZone = state->fa->z; TS.fNet = state->fa->net; TS.fNode = state->fa->node; TS.fPoint = state->fa->p; TS.fStatus = 2; } else { TS.fZone = 0; TS.fNet = 0; TS.fNode = 0; TS.fPoint = 0; TS.fStatus = 0; } TS.fBReceive = state->bytes_rcvd; TS.fBSent = state->bytes_sent; TS.fFReceive = state->files_rcvd; TS.fFSent = state->files_sent; TS.fSTime = state->start_time + tzoff; TS.fLTime = safe_time() - state->start_time; if (STRICMP(status, "OK") != 0) { TS.fStatus |= 3; } if ((fl = fopen(binlogpath,"ab")) != NULL) { fwrite(&TS,sizeof(TS),1,fl); fclose(fl); } else { Log(1,"unable to open binary log file `%s'",binlogpath); } } } /*--------------------------------------------------------------------*/ /* void FDLogStat (STATE*) */ /* */ /* Add record to FrontDoor-style binary log. */ /*--------------------------------------------------------------------*/ void FDLogStat (STATE *state) { struct { u16 Zone; u16 Net; u16 Node; u16 Point; char Domain[16]; u32 TimeStart; u32 TimeEnd; char StationName[32]; char StationLoc[40]; u32 Received; u32 Sent; u32 Cost; } std; FILE *fp; time_t t; if (!state->fa || ((state->to && !fdouthist[0]) || (!state->to && !fdinhist[0]))) return; /* nothing to do */ t = safe_time(); std.TimeStart = (u32)(state->start_time + tzoff); std.TimeEnd = (u32)(t + tzoff); std.Zone = state->fa->z; std.Net = state->fa->net; std.Node = state->fa->node; std.Point = state->fa->p; strnzcpy (std.Domain, state->fa->domain, sizeof (std.Domain)); strnzcpy (std.StationName, state->sysname, sizeof (std.StationName)); strnzcpy (std.StationLoc, state->location, sizeof (std.StationLoc)); std.Received = state->bytes_rcvd; std.Sent = state->bytes_sent; std.Cost = 0; /* Let it be free :) */ if (state->to) fp = fopen( fdouthist, "ab+" ); else fp = fopen( fdinhist , "ab+" ); if( fp != NULL ) { fwrite ( &std, (size_t) sizeof(std), (size_t) 1, fp); fclose( fp ); } else Log (1, "failed to write to %s", (state->to ? fdouthist : fdinhist)); } /*--------------------------------------------------------------------*/ /* void BinLogStat (char*, STATE*) */ /* */ /* Add record to binary logs. */ /*--------------------------------------------------------------------*/ void BinLogStat (char *status, STATE *state) { LockSem (&BLSem); TLogStat (status, state); FDLogStat (state); ReleaseSem (&BLSem); } binkd/ntlm/0000775000076400007640000000000011700610242011262 5ustar gulgulbinkd/ntlm/helpers.h0000664000076400007640000000032007350330022013071 0ustar gulgulint ntlm_encrypt(char *passw, int idx, unsigned char *nonce, unsigned char *lm_resp, unsigned char *nt_resp); int getNTLM1(char *udata, char *result); int getNTLM2(char *udata, char *req, char *result); binkd/ntlm/des_enc.c0000664000076400007640000002500207313671622013043 0ustar gulgul/* crypto/des/des_enc.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include "des_locl.h" void des_encrypt(DES_LONG *data, des_key_schedule ks, int enc) { register DES_LONG l,r,t,u; #ifdef DES_PTR register const unsigned char *des_SP=(const unsigned char *)des_SPtrans; #endif #ifndef DES_UNROLL register int i; #endif register DES_LONG *s; r=data[0]; l=data[1]; IP(r,l); /* Things have been modified so that the initial rotate is * done outside the loop. This required the * des_SPtrans values in sp.h to be rotated 1 bit to the right. * One perl script later and things have a 5% speed up on a sparc2. * Thanks to Richard Outerbridge <71755.204@CompuServe.COM> * for pointing this out. */ /* clear the top bits on machines with 8byte longs */ /* shift left by 2 */ r=ROTATE(r,29)&0xffffffffL; l=ROTATE(l,29)&0xffffffffL; s=ks->ks.deslong; /* I don't know if it is worth the effort of loop unrolling the * inner loop */ if (enc) { #ifdef DES_UNROLL D_ENCRYPT(l,r, 0); /* 1 */ D_ENCRYPT(r,l, 2); /* 2 */ D_ENCRYPT(l,r, 4); /* 3 */ D_ENCRYPT(r,l, 6); /* 4 */ D_ENCRYPT(l,r, 8); /* 5 */ D_ENCRYPT(r,l,10); /* 6 */ D_ENCRYPT(l,r,12); /* 7 */ D_ENCRYPT(r,l,14); /* 8 */ D_ENCRYPT(l,r,16); /* 9 */ D_ENCRYPT(r,l,18); /* 10 */ D_ENCRYPT(l,r,20); /* 11 */ D_ENCRYPT(r,l,22); /* 12 */ D_ENCRYPT(l,r,24); /* 13 */ D_ENCRYPT(r,l,26); /* 14 */ D_ENCRYPT(l,r,28); /* 15 */ D_ENCRYPT(r,l,30); /* 16 */ #else for (i=0; i<32; i+=8) { D_ENCRYPT(l,r,i+0); /* 1 */ D_ENCRYPT(r,l,i+2); /* 2 */ D_ENCRYPT(l,r,i+4); /* 3 */ D_ENCRYPT(r,l,i+6); /* 4 */ } #endif } else { #ifdef DES_UNROLL D_ENCRYPT(l,r,30); /* 16 */ D_ENCRYPT(r,l,28); /* 15 */ D_ENCRYPT(l,r,26); /* 14 */ D_ENCRYPT(r,l,24); /* 13 */ D_ENCRYPT(l,r,22); /* 12 */ D_ENCRYPT(r,l,20); /* 11 */ D_ENCRYPT(l,r,18); /* 10 */ D_ENCRYPT(r,l,16); /* 9 */ D_ENCRYPT(l,r,14); /* 8 */ D_ENCRYPT(r,l,12); /* 7 */ D_ENCRYPT(l,r,10); /* 6 */ D_ENCRYPT(r,l, 8); /* 5 */ D_ENCRYPT(l,r, 6); /* 4 */ D_ENCRYPT(r,l, 4); /* 3 */ D_ENCRYPT(l,r, 2); /* 2 */ D_ENCRYPT(r,l, 0); /* 1 */ #else for (i=30; i>0; i-=8) { D_ENCRYPT(l,r,i-0); /* 16 */ D_ENCRYPT(r,l,i-2); /* 15 */ D_ENCRYPT(l,r,i-4); /* 14 */ D_ENCRYPT(r,l,i-6); /* 13 */ } #endif } /* rotate and clear the top bits on machines with 8byte longs */ l=ROTATE(l,3)&0xffffffffL; r=ROTATE(r,3)&0xffffffffL; FP(r,l); data[0]=l; data[1]=r; l=r=t=u=0; } void des_encrypt2(DES_LONG *data, des_key_schedule ks, int enc) { register DES_LONG l,r,t,u; #ifdef DES_PTR register const unsigned char *des_SP=(const unsigned char *)des_SPtrans; #endif #ifndef DES_UNROLL register int i; #endif register DES_LONG *s; r=data[0]; l=data[1]; /* Things have been modified so that the initial rotate is * done outside the loop. This required the * des_SPtrans values in sp.h to be rotated 1 bit to the right. * One perl script later and things have a 5% speed up on a sparc2. * Thanks to Richard Outerbridge <71755.204@CompuServe.COM> * for pointing this out. */ /* clear the top bits on machines with 8byte longs */ r=ROTATE(r,29)&0xffffffffL; l=ROTATE(l,29)&0xffffffffL; s=ks->ks.deslong; /* I don't know if it is worth the effort of loop unrolling the * inner loop */ if (enc) { #ifdef DES_UNROLL D_ENCRYPT(l,r, 0); /* 1 */ D_ENCRYPT(r,l, 2); /* 2 */ D_ENCRYPT(l,r, 4); /* 3 */ D_ENCRYPT(r,l, 6); /* 4 */ D_ENCRYPT(l,r, 8); /* 5 */ D_ENCRYPT(r,l,10); /* 6 */ D_ENCRYPT(l,r,12); /* 7 */ D_ENCRYPT(r,l,14); /* 8 */ D_ENCRYPT(l,r,16); /* 9 */ D_ENCRYPT(r,l,18); /* 10 */ D_ENCRYPT(l,r,20); /* 11 */ D_ENCRYPT(r,l,22); /* 12 */ D_ENCRYPT(l,r,24); /* 13 */ D_ENCRYPT(r,l,26); /* 14 */ D_ENCRYPT(l,r,28); /* 15 */ D_ENCRYPT(r,l,30); /* 16 */ #else for (i=0; i<32; i+=8) { D_ENCRYPT(l,r,i+0); /* 1 */ D_ENCRYPT(r,l,i+2); /* 2 */ D_ENCRYPT(l,r,i+4); /* 3 */ D_ENCRYPT(r,l,i+6); /* 4 */ } #endif } else { #ifdef DES_UNROLL D_ENCRYPT(l,r,30); /* 16 */ D_ENCRYPT(r,l,28); /* 15 */ D_ENCRYPT(l,r,26); /* 14 */ D_ENCRYPT(r,l,24); /* 13 */ D_ENCRYPT(l,r,22); /* 12 */ D_ENCRYPT(r,l,20); /* 11 */ D_ENCRYPT(l,r,18); /* 10 */ D_ENCRYPT(r,l,16); /* 9 */ D_ENCRYPT(l,r,14); /* 8 */ D_ENCRYPT(r,l,12); /* 7 */ D_ENCRYPT(l,r,10); /* 6 */ D_ENCRYPT(r,l, 8); /* 5 */ D_ENCRYPT(l,r, 6); /* 4 */ D_ENCRYPT(r,l, 4); /* 3 */ D_ENCRYPT(l,r, 2); /* 2 */ D_ENCRYPT(r,l, 0); /* 1 */ #else for (i=30; i>0; i-=8) { D_ENCRYPT(l,r,i-0); /* 16 */ D_ENCRYPT(r,l,i-2); /* 15 */ D_ENCRYPT(l,r,i-4); /* 14 */ D_ENCRYPT(r,l,i-6); /* 13 */ } #endif } /* rotate and clear the top bits on machines with 8byte longs */ data[0]=ROTATE(l,3)&0xffffffffL; data[1]=ROTATE(r,3)&0xffffffffL; l=r=t=u=0; } void des_encrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3) { register DES_LONG l,r; l=data[0]; r=data[1]; IP(l,r); data[0]=l; data[1]=r; des_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT); des_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT); des_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT); l=data[0]; r=data[1]; FP(r,l); data[0]=l; data[1]=r; } void des_decrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3) { register DES_LONG l,r; l=data[0]; r=data[1]; IP(l,r); data[0]=l; data[1]=r; des_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT); des_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT); des_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT); l=data[0]; r=data[1]; FP(r,l); data[0]=l; data[1]=r; } #ifndef DES_DEFAULT_OPTIONS #undef CBC_ENC_C__DONT_UPDATE_IV #include "ncbc_enc.c" /* des_ncbc_encrypt */ void des_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, long length, des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3, des_cblock *ivec, int enc) { register DES_LONG tin0,tin1; register DES_LONG tout0,tout1,xor0,xor1; register const unsigned char *in; unsigned char *out; register long l=length; DES_LONG tin[2]; unsigned char *iv; in=input; out=output; iv = &(*ivec)[0]; if (enc) { c2l(iv,tout0); c2l(iv,tout1); for (l-=8; l>=0; l-=8) { c2l(in,tin0); c2l(in,tin1); tin0^=tout0; tin1^=tout1; tin[0]=tin0; tin[1]=tin1; des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3); tout0=tin[0]; tout1=tin[1]; l2c(tout0,out); l2c(tout1,out); } if (l != -8) { c2ln(in,tin0,tin1,l+8); tin0^=tout0; tin1^=tout1; tin[0]=tin0; tin[1]=tin1; des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3); tout0=tin[0]; tout1=tin[1]; l2c(tout0,out); l2c(tout1,out); } iv = &(*ivec)[0]; l2c(tout0,iv); l2c(tout1,iv); } else { register DES_LONG t0,t1; c2l(iv,xor0); c2l(iv,xor1); for (l-=8; l>=0; l-=8) { c2l(in,tin0); c2l(in,tin1); t0=tin0; t1=tin1; tin[0]=tin0; tin[1]=tin1; des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3); tout0=tin[0]; tout1=tin[1]; tout0^=xor0; tout1^=xor1; l2c(tout0,out); l2c(tout1,out); xor0=t0; xor1=t1; } if (l != -8) { c2l(in,tin0); c2l(in,tin1); t0=tin0; t1=tin1; tin[0]=tin0; tin[1]=tin1; des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3); tout0=tin[0]; tout1=tin[1]; tout0^=xor0; tout1^=xor1; l2cn(tout0,tout1,out,l+8); xor0=t0; xor1=t1; } iv = &(*ivec)[0]; l2c(xor0,iv); l2c(xor1,iv); } tin0=tin1=tout0=tout1=xor0=xor1=0; tin[0]=tin[1]=0; } #endif /* DES_DEFAULT_OPTIONS */ binkd/ntlm/helpers.c0000664000076400007640000002124307627744355013124 0ustar gulgul#include #include #include #include "../iphdr.h" #include "des.h" #include "md4.h" /* * turns a 56 bit key into the 64 bit, odd parity key and sets the key. * The key schedule ks is also set. */ void setup_des_key(unsigned char key_56[], des_key_schedule ks) { des_cblock key; key[0] = key_56[0]; key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1); key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2); key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3); key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4); key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5); key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6); key[7] = (key_56[6] << 1) & 0xFF; des_set_odd_parity(&key); des_set_key(&key, ks); } /* * takes a 21 byte array and treats it as 3 56-bit DES keys. The * 8 byte plaintext is encrypted with each key and the resulting 24 * bytes are stored in the results array. */ void calc_resp(unsigned char *keys, unsigned char *plaintext, unsigned char *results) { des_key_schedule ks; setup_des_key(keys, ks); des_ecb_encrypt((des_cblock*) plaintext, (des_cblock*) results, ks, DES_ENCRYPT); setup_des_key(keys+7, ks); des_ecb_encrypt((des_cblock*) plaintext, (des_cblock*) (results+8), ks, DES_ENCRYPT); setup_des_key(keys+14, ks); des_ecb_encrypt((des_cblock*) plaintext, (des_cblock*) (results+16), ks, DES_ENCRYPT); } int ntlm_encrypt(char *passw, int idx, unsigned char *nonce, unsigned char *lm_resp, unsigned char *nt_resp) { unsigned char nt_hpw[21]; MD4_CTX context; char *nt_pw; des_cblock cb; unsigned char magic[] = { 0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25 }; unsigned char lm_hpw[21]; des_key_schedule ks; /* setup LanManager password */ unsigned char lm_pw[14]; int len = strlen(passw); if (len > 14) len = 14; for (idx=0; idx>8) & 0xFF) | ((x&0xFF)<<8)); } static char b64t[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static int enbase64(char *data, int size, char *p) { int i; int c; unsigned char *q; char *s = p; q = (unsigned char*)data; i=0; for(i = 0; i < size;){ c=q[i++]; c*=256; if(i < size) c+=q[i]; i++; c*=256; if(i < size) c+=q[i]; i++; p[0]=b64t[(c&0x00fc0000) >> 18]; p[1]=b64t[(c&0x0003f000) >> 12]; p[2]=b64t[(c&0x00000fc0) >> 6]; p[3]=b64t[(c&0x0000003f) >> 0]; if(i > size) p[3]='='; if(i > size+1) p[2]='='; p+=4; } return p - s; } static int debase64(char *s, unsigned char *rc) { int i, j; char *sp; if ((!s) || (!rc)) return (-1); for(i = j = 0; ((sp = strchr(b64t, s[i])) != NULL); i++) { int k = (sp - b64t); switch(i%4) { case 0: rc[j] = k<<2; break; case 1: rc[j++] |= k>>4; rc[j] = (k << 4) & 0xF0; break; case 2: rc[j++] |= k>>2; rc[j] = (k << 6) & 0xC0; break; case 3: rc[j++] |= k; break; } } return j; } /* * User data: username:password:host:domain */ int getNTLM1(char *udata, char *result) { Type1message m; int i; char *td = strdup(udata); char *host; char *domain = strrchr(td, '/'); if (!domain) { free(td); return 1; } domain[0] = 0; domain++; host = strrchr(td, '/'); if (!host) { free(td); return 2; } host++; memset(&m, 0, sizeof(m)); strcpy(m.protocol, "NTLMSSP"); m.type=1; m.flags=mkls(0xB203); m.dom_len1 = m.dom_len2 = mkls(strlen(domain)); m.host_len1 = m.host_len2 = mkls(strlen(host)); m.host_off = mkls(0x20); m.dom_off = mkls(0x20 + strlen(host)); strcpy(m.host_dom, host); strcpy(m.host_dom + strlen(host), domain); for (i = 0; m.host_dom[i]; i++) m.host_dom[i] = toupper(m.host_dom[i]); i+=0x20; free(td); enbase64((char*)&m, i, result); return 0; } /* * User data: username:password:host:domain */ int getNTLM2(char *udata, char *req, char *result) { int i, j; Type3message m; unsigned char nonce[8]; char *user = strdup(udata); char *password; char *host; char *domain = strrchr(user, '/'); if (!domain) { free(user); return 1; } domain[0] = 0; domain++; host = strrchr(user, '/'); if (!host) { free(user); return 2; } host[0] = 0; host++; password = strrchr(user, '/'); if (!password) { free(user); return 3; } password[0] = 0; password++; j = debase64(req, (unsigned char*)m.data); memcpy(nonce, m.data + 24, 8); memset(&m, 0, sizeof(m)); strcpy(m.protocol, "NTLMSSP"); m.type = 3; m.lm_resp_len = m.lm_resp_len1 = mkls(0x18); m.nt_resp_len = m.nt_resp_len1 = mkls(0x18); m.dom_len = m.dom_len1 = mkls(strlen(domain)*2); m.dom_off = mkls(0x40); m.user_len = m.user_len1 = mkls(strlen(user)*2); m.user_off = mkls(0x40 + strlen(domain)*2); m.host_len = m.host_len1 = mkls(strlen(host)*2); m.host_off = mkls(0x40 + strlen(domain)*2 + strlen(user)*2); m.lm_resp_off = mkls(0x40 + strlen(domain)*2 + strlen(user)*2 + strlen(host)*2); m.nt_resp_off = mkls(0x58 + strlen(domain)*2 + strlen(user)*2 + strlen(host)*2); m.flags = mkls(0x8201); for (i = j = 0; domain[i]; i++, j+=2) m.data[j] = toupper(domain[i]); for (i = 0; user[i]; i++, j+=2) m.data[j] = user[i]; for (i = 0; host[i]; i++, j+=2) m.data[j] = toupper(host[i]); ntlm_encrypt(password, 0, nonce, (unsigned char*)m.data+j, (unsigned char*)(m.data+j+24)); j += 0x40+48; m.msg_len = mkls(j); enbase64((char*)&m, j, result); return 0; } binkd/ntlm/set_key.c0000664000076400007640000003716407313671622013122 0ustar gulgul/* crypto/des/set_key.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ /* set_key.c v 1.4 eay 24/9/91 * 1.4 Speed up by 400% :-) * 1.3 added register declarations. * 1.2 unrolled make_key_sched a bit more * 1.1 added norm_expand_bits * 1.0 First working version */ #include "des_locl.h" OPENSSL_GLOBAL int des_check_key=0; static const unsigned char odd_parity[256]={ 1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14, 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31, 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47, 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62, 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79, 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94, 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110, 112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127, 128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143, 145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158, 161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174, 176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191, 193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206, 208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223, 224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239, 241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254}; void des_set_odd_parity(des_cblock *key) { int i; for (i=0; i>(n))^(b))&(m)),\ * (b)^=(t),\ * (a)=((a)^((t)<<(n)))) */ #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\ (a)=(a)^(t)^(t>>(16-(n)))) static const DES_LONG des_skb[8][64]={ { /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ 0x00000000L,0x00000010L,0x20000000L,0x20000010L, 0x00010000L,0x00010010L,0x20010000L,0x20010010L, 0x00000800L,0x00000810L,0x20000800L,0x20000810L, 0x00010800L,0x00010810L,0x20010800L,0x20010810L, 0x00000020L,0x00000030L,0x20000020L,0x20000030L, 0x00010020L,0x00010030L,0x20010020L,0x20010030L, 0x00000820L,0x00000830L,0x20000820L,0x20000830L, 0x00010820L,0x00010830L,0x20010820L,0x20010830L, 0x00080000L,0x00080010L,0x20080000L,0x20080010L, 0x00090000L,0x00090010L,0x20090000L,0x20090010L, 0x00080800L,0x00080810L,0x20080800L,0x20080810L, 0x00090800L,0x00090810L,0x20090800L,0x20090810L, 0x00080020L,0x00080030L,0x20080020L,0x20080030L, 0x00090020L,0x00090030L,0x20090020L,0x20090030L, 0x00080820L,0x00080830L,0x20080820L,0x20080830L, 0x00090820L,0x00090830L,0x20090820L,0x20090830L, },{ /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ 0x00000000L,0x02000000L,0x00002000L,0x02002000L, 0x00200000L,0x02200000L,0x00202000L,0x02202000L, 0x00000004L,0x02000004L,0x00002004L,0x02002004L, 0x00200004L,0x02200004L,0x00202004L,0x02202004L, 0x00000400L,0x02000400L,0x00002400L,0x02002400L, 0x00200400L,0x02200400L,0x00202400L,0x02202400L, 0x00000404L,0x02000404L,0x00002404L,0x02002404L, 0x00200404L,0x02200404L,0x00202404L,0x02202404L, 0x10000000L,0x12000000L,0x10002000L,0x12002000L, 0x10200000L,0x12200000L,0x10202000L,0x12202000L, 0x10000004L,0x12000004L,0x10002004L,0x12002004L, 0x10200004L,0x12200004L,0x10202004L,0x12202004L, 0x10000400L,0x12000400L,0x10002400L,0x12002400L, 0x10200400L,0x12200400L,0x10202400L,0x12202400L, 0x10000404L,0x12000404L,0x10002404L,0x12002404L, 0x10200404L,0x12200404L,0x10202404L,0x12202404L, },{ /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ 0x00000000L,0x00000001L,0x00040000L,0x00040001L, 0x01000000L,0x01000001L,0x01040000L,0x01040001L, 0x00000002L,0x00000003L,0x00040002L,0x00040003L, 0x01000002L,0x01000003L,0x01040002L,0x01040003L, 0x00000200L,0x00000201L,0x00040200L,0x00040201L, 0x01000200L,0x01000201L,0x01040200L,0x01040201L, 0x00000202L,0x00000203L,0x00040202L,0x00040203L, 0x01000202L,0x01000203L,0x01040202L,0x01040203L, 0x08000000L,0x08000001L,0x08040000L,0x08040001L, 0x09000000L,0x09000001L,0x09040000L,0x09040001L, 0x08000002L,0x08000003L,0x08040002L,0x08040003L, 0x09000002L,0x09000003L,0x09040002L,0x09040003L, 0x08000200L,0x08000201L,0x08040200L,0x08040201L, 0x09000200L,0x09000201L,0x09040200L,0x09040201L, 0x08000202L,0x08000203L,0x08040202L,0x08040203L, 0x09000202L,0x09000203L,0x09040202L,0x09040203L, },{ /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ 0x00000000L,0x00100000L,0x00000100L,0x00100100L, 0x00000008L,0x00100008L,0x00000108L,0x00100108L, 0x00001000L,0x00101000L,0x00001100L,0x00101100L, 0x00001008L,0x00101008L,0x00001108L,0x00101108L, 0x04000000L,0x04100000L,0x04000100L,0x04100100L, 0x04000008L,0x04100008L,0x04000108L,0x04100108L, 0x04001000L,0x04101000L,0x04001100L,0x04101100L, 0x04001008L,0x04101008L,0x04001108L,0x04101108L, 0x00020000L,0x00120000L,0x00020100L,0x00120100L, 0x00020008L,0x00120008L,0x00020108L,0x00120108L, 0x00021000L,0x00121000L,0x00021100L,0x00121100L, 0x00021008L,0x00121008L,0x00021108L,0x00121108L, 0x04020000L,0x04120000L,0x04020100L,0x04120100L, 0x04020008L,0x04120008L,0x04020108L,0x04120108L, 0x04021000L,0x04121000L,0x04021100L,0x04121100L, 0x04021008L,0x04121008L,0x04021108L,0x04121108L, },{ /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ 0x00000000L,0x10000000L,0x00010000L,0x10010000L, 0x00000004L,0x10000004L,0x00010004L,0x10010004L, 0x20000000L,0x30000000L,0x20010000L,0x30010000L, 0x20000004L,0x30000004L,0x20010004L,0x30010004L, 0x00100000L,0x10100000L,0x00110000L,0x10110000L, 0x00100004L,0x10100004L,0x00110004L,0x10110004L, 0x20100000L,0x30100000L,0x20110000L,0x30110000L, 0x20100004L,0x30100004L,0x20110004L,0x30110004L, 0x00001000L,0x10001000L,0x00011000L,0x10011000L, 0x00001004L,0x10001004L,0x00011004L,0x10011004L, 0x20001000L,0x30001000L,0x20011000L,0x30011000L, 0x20001004L,0x30001004L,0x20011004L,0x30011004L, 0x00101000L,0x10101000L,0x00111000L,0x10111000L, 0x00101004L,0x10101004L,0x00111004L,0x10111004L, 0x20101000L,0x30101000L,0x20111000L,0x30111000L, 0x20101004L,0x30101004L,0x20111004L,0x30111004L, },{ /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ 0x00000000L,0x08000000L,0x00000008L,0x08000008L, 0x00000400L,0x08000400L,0x00000408L,0x08000408L, 0x00020000L,0x08020000L,0x00020008L,0x08020008L, 0x00020400L,0x08020400L,0x00020408L,0x08020408L, 0x00000001L,0x08000001L,0x00000009L,0x08000009L, 0x00000401L,0x08000401L,0x00000409L,0x08000409L, 0x00020001L,0x08020001L,0x00020009L,0x08020009L, 0x00020401L,0x08020401L,0x00020409L,0x08020409L, 0x02000000L,0x0A000000L,0x02000008L,0x0A000008L, 0x02000400L,0x0A000400L,0x02000408L,0x0A000408L, 0x02020000L,0x0A020000L,0x02020008L,0x0A020008L, 0x02020400L,0x0A020400L,0x02020408L,0x0A020408L, 0x02000001L,0x0A000001L,0x02000009L,0x0A000009L, 0x02000401L,0x0A000401L,0x02000409L,0x0A000409L, 0x02020001L,0x0A020001L,0x02020009L,0x0A020009L, 0x02020401L,0x0A020401L,0x02020409L,0x0A020409L, },{ /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ 0x00000000L,0x00000100L,0x00080000L,0x00080100L, 0x01000000L,0x01000100L,0x01080000L,0x01080100L, 0x00000010L,0x00000110L,0x00080010L,0x00080110L, 0x01000010L,0x01000110L,0x01080010L,0x01080110L, 0x00200000L,0x00200100L,0x00280000L,0x00280100L, 0x01200000L,0x01200100L,0x01280000L,0x01280100L, 0x00200010L,0x00200110L,0x00280010L,0x00280110L, 0x01200010L,0x01200110L,0x01280010L,0x01280110L, 0x00000200L,0x00000300L,0x00080200L,0x00080300L, 0x01000200L,0x01000300L,0x01080200L,0x01080300L, 0x00000210L,0x00000310L,0x00080210L,0x00080310L, 0x01000210L,0x01000310L,0x01080210L,0x01080310L, 0x00200200L,0x00200300L,0x00280200L,0x00280300L, 0x01200200L,0x01200300L,0x01280200L,0x01280300L, 0x00200210L,0x00200310L,0x00280210L,0x00280310L, 0x01200210L,0x01200310L,0x01280210L,0x01280310L, },{ /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ 0x00000000L,0x04000000L,0x00040000L,0x04040000L, 0x00000002L,0x04000002L,0x00040002L,0x04040002L, 0x00002000L,0x04002000L,0x00042000L,0x04042000L, 0x00002002L,0x04002002L,0x00042002L,0x04042002L, 0x00000020L,0x04000020L,0x00040020L,0x04040020L, 0x00000022L,0x04000022L,0x00040022L,0x04040022L, 0x00002020L,0x04002020L,0x00042020L,0x04042020L, 0x00002022L,0x04002022L,0x00042022L,0x04042022L, 0x00000800L,0x04000800L,0x00040800L,0x04040800L, 0x00000802L,0x04000802L,0x00040802L,0x04040802L, 0x00002800L,0x04002800L,0x00042800L,0x04042800L, 0x00002802L,0x04002802L,0x00042802L,0x04042802L, 0x00000820L,0x04000820L,0x00040820L,0x04040820L, 0x00000822L,0x04000822L,0x00040822L,0x04040822L, 0x00002820L,0x04002820L,0x00042820L,0x04042820L, 0x00002822L,0x04002822L,0x00042822L,0x04042822L, }}; int des_set_key(const_des_cblock *key, des_key_schedule schedule) { if (des_check_key) { return des_set_key_checked(key, schedule); } else { des_set_key_unchecked(key, schedule); return 0; } } /* return 0 if key parity is odd (correct), * return -1 if key parity error, * return -2 if illegal weak key. */ int des_set_key_checked(const_des_cblock *key, des_key_schedule schedule) { if (!des_check_key_parity(key)) return(-1); if (des_is_weak_key(key)) return(-2); des_set_key_unchecked(key, schedule); return 0; } void des_set_key_unchecked(const_des_cblock *key, des_key_schedule schedule) { static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0}; register DES_LONG c,d,t,s,t2; register const unsigned char *in; register DES_LONG *k; register int i; k = &schedule->ks.deslong[0]; in = &(*key)[0]; c2l(in,c); c2l(in,d); /* do PC1 in 47 simple operations :-) * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov) * for the inspiration. :-) */ PERM_OP (d,c,t,4,0x0f0f0f0fL); HPERM_OP(c,t,-2,0xcccc0000L); HPERM_OP(d,t,-2,0xcccc0000L); PERM_OP (d,c,t,1,0x55555555L); PERM_OP (c,d,t,8,0x00ff00ffL); PERM_OP (d,c,t,1,0x55555555L); d= (((d&0x000000ffL)<<16L)| (d&0x0000ff00L) | ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L)); c&=0x0fffffffL; for (i=0; i>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); } else { c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); } c&=0x0fffffffL; d&=0x0fffffffL; /* could be a few less shifts but I am to lazy at this * point in time to investigate */ s= des_skb[0][ (c )&0x3f ]| des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]| des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]| des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) | ((c>>22L)&0x38)]; t= des_skb[4][ (d )&0x3f ]| des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]| des_skb[6][ (d>>15L)&0x3f ]| des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)]; /* table contained 0213 4657 */ t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL; *(k++)=ROTATE(t2,30)&0xffffffffL; t2=((s>>16L)|(t&0xffff0000L)); *(k++)=ROTATE(t2,26)&0xffffffffL; } } int des_key_sched(const_des_cblock *key, des_key_schedule schedule) { return(des_set_key(key,schedule)); } #undef des_fixup_key_parity void des_fixup_key_parity(des_cblock *key) { des_set_odd_parity(key); } binkd/ntlm/md4_dgst.c0000664000076400007640000002247307313671622013161 0ustar gulgul/* crypto/md4/md4_dgst.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include #include "md4_locl.h" const char *MD4_version="MD4"; /* Implemented from RFC1186 The MD4 Message-Digest Algorithm */ #define INIT_DATA_A (unsigned long)0x67452301L #define INIT_DATA_B (unsigned long)0xefcdab89L #define INIT_DATA_C (unsigned long)0x98badcfeL #define INIT_DATA_D (unsigned long)0x10325476L void MD4_Init(MD4_CTX *c) { c->A=INIT_DATA_A; c->B=INIT_DATA_B; c->C=INIT_DATA_C; c->D=INIT_DATA_D; c->Nl=0; c->Nh=0; c->num=0; } #ifndef md4_block_host_order void md4_block_host_order (MD4_CTX *c, const void *data, int num) { const MD4_LONG *X=(MD4_LONG *)data; register unsigned long A,B,C,D; /* * In case you wonder why A-D are declared as long and not * as MD4_LONG. Doing so results in slight performance * boost on LP64 architectures. The catch is we don't * really care if 32 MSBs of a 64-bit register get polluted * with eventual overflows as we *save* only 32 LSBs in * *either* case. Now declaring 'em long excuses the compiler * from keeping 32 MSBs zeroed resulting in 13% performance * improvement under SPARC Solaris7/64 and 5% under AlphaLinux. * Well, to be honest it should say that this *prevents* * performance degradation. * * */ A=c->A; B=c->B; C=c->C; D=c->D; for (;num--;X+=HASH_LBLOCK) { /* Round 0 */ R0(A,B,C,D,X[ 0], 3,0); R0(D,A,B,C,X[ 1], 7,0); R0(C,D,A,B,X[ 2],11,0); R0(B,C,D,A,X[ 3],19,0); R0(A,B,C,D,X[ 4], 3,0); R0(D,A,B,C,X[ 5], 7,0); R0(C,D,A,B,X[ 6],11,0); R0(B,C,D,A,X[ 7],19,0); R0(A,B,C,D,X[ 8], 3,0); R0(D,A,B,C,X[ 9], 7,0); R0(C,D,A,B,X[10],11,0); R0(B,C,D,A,X[11],19,0); R0(A,B,C,D,X[12], 3,0); R0(D,A,B,C,X[13], 7,0); R0(C,D,A,B,X[14],11,0); R0(B,C,D,A,X[15],19,0); /* Round 1 */ R1(A,B,C,D,X[ 0], 3,0x5A827999L); R1(D,A,B,C,X[ 4], 5,0x5A827999L); R1(C,D,A,B,X[ 8], 9,0x5A827999L); R1(B,C,D,A,X[12],13,0x5A827999L); R1(A,B,C,D,X[ 1], 3,0x5A827999L); R1(D,A,B,C,X[ 5], 5,0x5A827999L); R1(C,D,A,B,X[ 9], 9,0x5A827999L); R1(B,C,D,A,X[13],13,0x5A827999L); R1(A,B,C,D,X[ 2], 3,0x5A827999L); R1(D,A,B,C,X[ 6], 5,0x5A827999L); R1(C,D,A,B,X[10], 9,0x5A827999L); R1(B,C,D,A,X[14],13,0x5A827999L); R1(A,B,C,D,X[ 3], 3,0x5A827999L); R1(D,A,B,C,X[ 7], 5,0x5A827999L); R1(C,D,A,B,X[11], 9,0x5A827999L); R1(B,C,D,A,X[15],13,0x5A827999L); /* Round 2 */ R2(A,B,C,D,X[ 0], 3,0x6ED9EBA1); R2(D,A,B,C,X[ 8], 9,0x6ED9EBA1); R2(C,D,A,B,X[ 4],11,0x6ED9EBA1); R2(B,C,D,A,X[12],15,0x6ED9EBA1); R2(A,B,C,D,X[ 2], 3,0x6ED9EBA1); R2(D,A,B,C,X[10], 9,0x6ED9EBA1); R2(C,D,A,B,X[ 6],11,0x6ED9EBA1); R2(B,C,D,A,X[14],15,0x6ED9EBA1); R2(A,B,C,D,X[ 1], 3,0x6ED9EBA1); R2(D,A,B,C,X[ 9], 9,0x6ED9EBA1); R2(C,D,A,B,X[ 5],11,0x6ED9EBA1); R2(B,C,D,A,X[13],15,0x6ED9EBA1); R2(A,B,C,D,X[ 3], 3,0x6ED9EBA1); R2(D,A,B,C,X[11], 9,0x6ED9EBA1); R2(C,D,A,B,X[ 7],11,0x6ED9EBA1); R2(B,C,D,A,X[15],15,0x6ED9EBA1); A = c->A += A; B = c->B += B; C = c->C += C; D = c->D += D; } } #endif #ifndef md4_block_data_order #ifdef X #undef X #endif void md4_block_data_order (MD4_CTX *c, const void *data_, int num) { const unsigned char *data=data_; register unsigned long A,B,C,D,l; /* * In case you wonder why A-D are declared as long and not * as MD4_LONG. Doing so results in slight performance * boost on LP64 architectures. The catch is we don't * really care if 32 MSBs of a 64-bit register get polluted * with eventual overflows as we *save* only 32 LSBs in * *either* case. Now declaring 'em long excuses the compiler * from keeping 32 MSBs zeroed resulting in 13% performance * improvement under SPARC Solaris7/64 and 5% under AlphaLinux. * Well, to be honest it should say that this *prevents* * performance degradation. * * */ #ifndef MD32_XARRAY /* See comment in crypto/sha/sha_locl.h for details. */ unsigned long XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7, XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15; # define X(i) XX##i #else MD4_LONG XX[MD4_LBLOCK]; # define X(i) XX[i] #endif A=c->A; B=c->B; C=c->C; D=c->D; for (;num--;) { HOST_c2l(data,l); X( 0)=l; HOST_c2l(data,l); X( 1)=l; /* Round 0 */ R0(A,B,C,D,X( 0), 3,0); HOST_c2l(data,l); X( 2)=l; R0(D,A,B,C,X( 1), 7,0); HOST_c2l(data,l); X( 3)=l; R0(C,D,A,B,X( 2),11,0); HOST_c2l(data,l); X( 4)=l; R0(B,C,D,A,X( 3),19,0); HOST_c2l(data,l); X( 5)=l; R0(A,B,C,D,X( 4), 3,0); HOST_c2l(data,l); X( 6)=l; R0(D,A,B,C,X( 5), 7,0); HOST_c2l(data,l); X( 7)=l; R0(C,D,A,B,X( 6),11,0); HOST_c2l(data,l); X( 8)=l; R0(B,C,D,A,X( 7),19,0); HOST_c2l(data,l); X( 9)=l; R0(A,B,C,D,X( 8), 3,0); HOST_c2l(data,l); X(10)=l; R0(D,A,B,C,X( 9), 7,0); HOST_c2l(data,l); X(11)=l; R0(C,D,A,B,X(10),11,0); HOST_c2l(data,l); X(12)=l; R0(B,C,D,A,X(11),19,0); HOST_c2l(data,l); X(13)=l; R0(A,B,C,D,X(12), 3,0); HOST_c2l(data,l); X(14)=l; R0(D,A,B,C,X(13), 7,0); HOST_c2l(data,l); X(15)=l; R0(C,D,A,B,X(14),11,0); R0(B,C,D,A,X(15),19,0); /* Round 1 */ R1(A,B,C,D,X( 0), 3,0x5A827999L); R1(D,A,B,C,X( 4), 5,0x5A827999L); R1(C,D,A,B,X( 8), 9,0x5A827999L); R1(B,C,D,A,X(12),13,0x5A827999L); R1(A,B,C,D,X( 1), 3,0x5A827999L); R1(D,A,B,C,X( 5), 5,0x5A827999L); R1(C,D,A,B,X( 9), 9,0x5A827999L); R1(B,C,D,A,X(13),13,0x5A827999L); R1(A,B,C,D,X( 2), 3,0x5A827999L); R1(D,A,B,C,X( 6), 5,0x5A827999L); R1(C,D,A,B,X(10), 9,0x5A827999L); R1(B,C,D,A,X(14),13,0x5A827999L); R1(A,B,C,D,X( 3), 3,0x5A827999L); R1(D,A,B,C,X( 7), 5,0x5A827999L); R1(C,D,A,B,X(11), 9,0x5A827999L); R1(B,C,D,A,X(15),13,0x5A827999L); /* Round 2 */ R2(A,B,C,D,X( 0), 3,0x6ED9EBA1L); R2(D,A,B,C,X( 8), 9,0x6ED9EBA1L); R2(C,D,A,B,X( 4),11,0x6ED9EBA1L); R2(B,C,D,A,X(12),15,0x6ED9EBA1L); R2(A,B,C,D,X( 2), 3,0x6ED9EBA1L); R2(D,A,B,C,X(10), 9,0x6ED9EBA1L); R2(C,D,A,B,X( 6),11,0x6ED9EBA1L); R2(B,C,D,A,X(14),15,0x6ED9EBA1L); R2(A,B,C,D,X( 1), 3,0x6ED9EBA1L); R2(D,A,B,C,X( 9), 9,0x6ED9EBA1L); R2(C,D,A,B,X( 5),11,0x6ED9EBA1L); R2(B,C,D,A,X(13),15,0x6ED9EBA1L); R2(A,B,C,D,X( 3), 3,0x6ED9EBA1L); R2(D,A,B,C,X(11), 9,0x6ED9EBA1L); R2(C,D,A,B,X( 7),11,0x6ED9EBA1L); R2(B,C,D,A,X(15),15,0x6ED9EBA1L); A = c->A += A; B = c->B += B; C = c->C += C; D = c->D += D; } } #endif #ifdef undef int printit(unsigned long *l) { int i,ii; for (i=0; i<2; i++) { for (ii=0; ii<8; ii++) { fprintf(stderr,"%08lx ",l[i*8+ii]); } fprintf(stderr,"\n"); } } #endif binkd/ntlm/md32_com.h0000664000076400007640000002732307633224012013053 0ustar gulgul/* crypto/md32_common.h */ /* ==================================================================== * Copyright (c) 1999 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * licensing@OpenSSL.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ /* * This is a generic 32 bit "collector" for message digest algorithms. * Whenever needed it collects input character stream into chunks of * 32 bit values and invokes a block function that performs actual hash * calculations. * * Porting guide. * * Obligatory macros: * * DATA_ORDER_IS_BIG_ENDIAN or DATA_ORDER_IS_LITTLE_ENDIAN * this macro defines byte order of input stream. * HASH_CBLOCK * size of a unit chunk HASH_BLOCK operates on. * HASH_LONG * has to be at lest 32 bit wide, if it's wider, then * HASH_LONG_LOG2 *has to* be defined along * HASH_CTX * context structure that at least contains following * members: * typedef struct { * ... * HASH_LONG Nl,Nh; * HASH_LONG data[HASH_LBLOCK]; * int num; * ... * } HASH_CTX; * HASH_UPDATE * name of "Update" function, implemented here. * HASH_TRANSFORM * name of "Transform" function, implemented here. * HASH_FINAL * name of "Final" function, implemented here. * HASH_BLOCK_HOST_ORDER * name of "block" function treating *aligned* input message * in host byte order, implemented externally. * HASH_BLOCK_DATA_ORDER * name of "block" function treating *unaligned* input message * in original (data) byte order, implemented externally (it * actually is optional if data and host are of the same * "endianess"). * HASH_MAKE_STRING * macro convering context variables to an ASCII hash string. * * Optional macros: * * B_ENDIAN or L_ENDIAN * defines host byte-order. * HASH_LONG_LOG2 * defaults to 2 if not states otherwise. * HASH_LBLOCK * assumed to be HASH_CBLOCK/4 if not stated otherwise. * * MD5 example: * * #define DATA_ORDER_IS_LITTLE_ENDIAN * * #define HASH_LONG MD5_LONG * #define HASH_LONG_LOG2 MD5_LONG_LOG2 * #define HASH_CTX MD5_CTX * #define HASH_CBLOCK MD5_CBLOCK * #define HASH_LBLOCK MD5_LBLOCK * #define HASH_UPDATE MD5_Update * #define HASH_TRANSFORM MD5_Transform * #define HASH_FINAL MD5_Final * #define HASH_BLOCK_HOST_ORDER md5_block_host_order * #define HASH_BLOCK_DATA_ORDER md5_block_data_order * * */ #if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN) #error "DATA_ORDER must be defined!" #endif #ifndef HASH_CBLOCK #error "HASH_CBLOCK must be defined!" #endif #ifndef HASH_LONG #error "HASH_LONG must be defined!" #endif #ifndef HASH_CTX #error "HASH_CTX must be defined!" #endif #ifndef HASH_UPDATE #error "HASH_UPDATE must be defined!" #endif #ifndef HASH_TRANSFORM #error "HASH_TRANSFORM must be defined!" #endif #ifndef HASH_FINAL #error "HASH_FINAL must be defined!" #endif #ifndef HASH_BLOCK_HOST_ORDER #error "HASH_BLOCK_HOST_ORDER must be defined!" #endif #ifndef HASH_BLOCK_DATA_ORDER #error "HASH_BLOCK_DATA_ORDER must be defined!" #endif #ifndef HASH_LBLOCK #define HASH_LBLOCK (HASH_CBLOCK/4) #endif #ifndef HASH_LONG_LOG2 #define HASH_LONG_LOG2 2 #endif #ifdef ROTATE #undef ROTATE #endif #define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n)))) /* * Make some obvious choices. E.g., HASH_BLOCK_DATA_ORDER_ALIGNED * and HASH_BLOCK_HOST_ORDER ought to be the same if input data * and host are of the same "endianess". It's possible to mask * this with blank #define HASH_BLOCK_DATA_ORDER though... * * */ #if defined(DATA_ORDER_IS_BIG_ENDIAN) #define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))<<24), \ l|=(((unsigned long)(*((c)++)))<<16), \ l|=(((unsigned long)(*((c)++)))<< 8), \ l|=(((unsigned long)(*((c)++))) ), \ l) #define HOST_p_c2l(c,l,n) { \ switch (n) { \ case 0: l =((unsigned long)(*((c)++)))<<24; \ case 1: l|=((unsigned long)(*((c)++)))<<16; \ case 2: l|=((unsigned long)(*((c)++)))<< 8; \ case 3: l|=((unsigned long)(*((c)++))); \ } } #define HOST_p_c2l_p(c,l,sc,len) { \ switch (sc) { \ case 0: l =((unsigned long)(*((c)++)))<<24; \ if (--len == 0) break; \ case 1: l|=((unsigned long)(*((c)++)))<<16; \ if (--len == 0) break; \ case 2: l|=((unsigned long)(*((c)++)))<< 8; \ } } /* NOTE the pointer is not incremented at the end of this */ #define HOST_c2l_p(c,l,n) { \ l=0; (c)+=n; \ switch (n) { \ case 3: l =((unsigned long)(*(--(c))))<< 8; \ case 2: l|=((unsigned long)(*(--(c))))<<16; \ case 1: l|=((unsigned long)(*(--(c))))<<24; \ } } #define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \ *((c)++)=(unsigned char)(((l)>>16)&0xff), \ *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ *((c)++)=(unsigned char)(((l) )&0xff), \ l) #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) #define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++))) ), \ l|=(((unsigned long)(*((c)++)))<< 8), \ l|=(((unsigned long)(*((c)++)))<<16), \ l|=(((unsigned long)(*((c)++)))<<24), \ l) #define HOST_p_c2l(c,l,n) { \ switch (n) { \ case 0: l =((unsigned long)(*((c)++))); \ case 1: l|=((unsigned long)(*((c)++)))<< 8; \ case 2: l|=((unsigned long)(*((c)++)))<<16; \ case 3: l|=((unsigned long)(*((c)++)))<<24; \ } } #define HOST_p_c2l_p(c,l,sc,len) { \ switch (sc) { \ case 0: l =((unsigned long)(*((c)++))); \ if (--len == 0) break; \ case 1: l|=((unsigned long)(*((c)++)))<< 8; \ if (--len == 0) break; \ case 2: l|=((unsigned long)(*((c)++)))<<16; \ } } /* NOTE the pointer is not incremented at the end of this */ #define HOST_c2l_p(c,l,n) { \ l=0; (c)+=n; \ switch (n) { \ case 3: l =((unsigned long)(*(--(c))))<<16; \ case 2: l|=((unsigned long)(*(--(c))))<< 8; \ case 1: l|=((unsigned long)(*(--(c)))); \ } } #define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \ *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ *((c)++)=(unsigned char)(((l)>>16)&0xff), \ *((c)++)=(unsigned char)(((l)>>24)&0xff), \ l) #endif /* * Time for some action:-) */ void HASH_UPDATE (HASH_CTX *c, const void *data_, unsigned long len) { const unsigned char *data=(unsigned char *)data_; register HASH_LONG * p; register unsigned long l; int sw,sc,ew,ec; if (len==0) return; l=(c->Nl+(len<<3))&0xffffffffL; /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to * Wei Dai for pointing it out. */ if (l < c->Nl) /* overflow */ c->Nh++; c->Nh+=(len>>29); c->Nl=l; if (c->num != 0) { p=c->data; sw=c->num>>2; sc=c->num&0x03; if ((c->num+len) >= HASH_CBLOCK) { l=p[sw]; HOST_p_c2l(data,l,sc); p[sw++]=l; for (; swnum); c->num=0; /* drop through and do the rest */ } else { c->num+=len; if ((sc+len) < 4) /* ugly, add char's to a word */ { l=p[sw]; HOST_p_c2l_p(data,l,sc,len); p[sw]=l; } else { ew=(c->num>>2); ec=(c->num&0x03); l=p[sw]; HOST_p_c2l(data,l,sc); p[sw++]=l; for (; sw < ew; sw++) { HOST_c2l(data,l); p[sw]=l; } if (ec) { HOST_c2l_p(data,l,ec); p[sw]=l; } } return; } } sw=len/HASH_CBLOCK; if (sw > 0) { #if defined(HASH_BLOCK_DATA_ORDER) { HASH_BLOCK_DATA_ORDER(c,data,sw); sw*=HASH_CBLOCK; data+=sw; len-=sw; } #endif } if (len!=0) { p = c->data; c->num = len; ew=len>>2; /* words to copy */ ec=len&0x03; for (; ew; ew--,p++) { HOST_c2l(data,l); *p=l; } HOST_c2l_p(data,l,ec); *p=l; } } void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data) { #if defined(HASH_BLOCK_DATA_ORDER) HASH_BLOCK_DATA_ORDER (c,data,1); #endif } void HASH_FINAL (unsigned char *md, HASH_CTX *c) { register HASH_LONG *p; register unsigned long l; register int i,j; static const unsigned char end[4]={0x80,0x00,0x00,0x00}; const unsigned char *cp=end; /* c->num should definitly have room for at least one more byte. */ p=c->data; i=c->num>>2; j=c->num&0x03; #if 0 /* purify often complains about the following line as an * Uninitialized Memory Read. While this can be true, the * following p_c2l macro will reset l when that case is true. * This is because j&0x03 contains the number of 'valid' bytes * already in p[i]. If and only if j&0x03 == 0, the UMR will * occur but this is also the only time p_c2l will do * l= *(cp++) instead of l|= *(cp++) * Many thanks to Alex Tang for pickup this * 'potential bug' */ #ifdef PURIFY if (j==0) p[i]=0; /* Yeah, but that's not the way to fix it:-) */ #endif l=p[i]; #else l = (j==0) ? 0 : p[i]; #endif HOST_p_c2l(cp,l,j); p[i++]=l; /* i is the next 'undefined word' */ if (i>(HASH_LBLOCK-2)) /* save room for Nl and Nh */ { if (iNh; p[HASH_LBLOCK-1]=c->Nl; #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) p[HASH_LBLOCK-2]=c->Nl; p[HASH_LBLOCK-1]=c->Nh; #endif HASH_BLOCK_HOST_ORDER (c,p,1); #ifndef HASH_MAKE_STRING #error "HASH_MAKE_STRING must be defined!" #else HASH_MAKE_STRING(c,md); #endif c->num=0; /* clear stuff, HASH_BLOCK may be leaving some stuff on the stack * but I'm not worried :-) memset((void *)c,0,sizeof(HASH_CTX)); */ } binkd/ntlm/spr.h0000664000076400007640000002350607313671622012263 0ustar gulgul/* crypto/des/spr.h */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ OPENSSL_GLOBAL const DES_LONG des_SPtrans[8][64]={ { /* nibble 0 */ 0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L, 0x02000000L, 0x00080802L, 0x00080002L, 0x02000002L, 0x00080802L, 0x02080800L, 0x02080000L, 0x00000802L, 0x02000802L, 0x02000000L, 0x00000000L, 0x00080002L, 0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L, 0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L, 0x00000002L, 0x00000800L, 0x00080800L, 0x02080002L, 0x00000800L, 0x02000802L, 0x02080002L, 0x00000000L, 0x00000000L, 0x02080802L, 0x02000800L, 0x00080002L, 0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L, 0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L, 0x00080802L, 0x00000002L, 0x02000002L, 0x02080000L, 0x02080802L, 0x00080800L, 0x02080000L, 0x02000802L, 0x02000000L, 0x00000802L, 0x00080002L, 0x00000000L, 0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L, 0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L, },{ /* nibble 1 */ 0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L, 0x40000010L, 0x00008010L, 0x40008000L, 0x00108000L, 0x00008000L, 0x40100010L, 0x00000010L, 0x40008000L, 0x00100010L, 0x40108000L, 0x40100000L, 0x00000010L, 0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L, 0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L, 0x40008010L, 0x00108010L, 0x40108000L, 0x40000010L, 0x40000000L, 0x00100000L, 0x00008010L, 0x40108010L, 0x00100010L, 0x40108000L, 0x40008000L, 0x00108010L, 0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L, 0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L, 0x00008000L, 0x40000000L, 0x00108010L, 0x40008010L, 0x40108000L, 0x00008000L, 0x00000000L, 0x40000010L, 0x00000010L, 0x40108010L, 0x00108000L, 0x40100000L, 0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L, 0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L, },{ /* nibble 2 */ 0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L, 0x00040001L, 0x04000000L, 0x04000101L, 0x00040100L, 0x04000100L, 0x00040000L, 0x04040000L, 0x00000001L, 0x04040101L, 0x00000101L, 0x00000001L, 0x04040001L, 0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L, 0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L, 0x04040001L, 0x04000100L, 0x00040101L, 0x04040000L, 0x00040100L, 0x00000000L, 0x04000000L, 0x00040101L, 0x04040100L, 0x00000100L, 0x00000001L, 0x00040000L, 0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L, 0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L, 0x00040001L, 0x04000000L, 0x04040101L, 0x00000001L, 0x00040101L, 0x04000001L, 0x04000000L, 0x04040101L, 0x00040000L, 0x04000100L, 0x04000101L, 0x00040100L, 0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L, 0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L, },{ /* nibble 3 */ 0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L, 0x00000000L, 0x10400000L, 0x10001008L, 0x00400008L, 0x10401000L, 0x10000008L, 0x10000000L, 0x00001008L, 0x10000008L, 0x00401008L, 0x00400000L, 0x10000000L, 0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L, 0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L, 0x00001008L, 0x00000000L, 0x00400008L, 0x10401000L, 0x10001000L, 0x10400008L, 0x10401008L, 0x00400000L, 0x10400008L, 0x00001008L, 0x00400000L, 0x10000008L, 0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L, 0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L, 0x00000000L, 0x10400008L, 0x10401000L, 0x00001000L, 0x10000000L, 0x10401008L, 0x00401008L, 0x00400000L, 0x10401008L, 0x00000008L, 0x10001000L, 0x00401008L, 0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L, 0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L, },{ /* nibble 4 */ 0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L, 0x08010020L, 0x08000400L, 0x00010420L, 0x08010000L, 0x00010000L, 0x00000020L, 0x08000020L, 0x00010400L, 0x08000420L, 0x08010020L, 0x08010400L, 0x00000000L, 0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L, 0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L, 0x00000020L, 0x08000420L, 0x08010420L, 0x00010020L, 0x08010000L, 0x00000400L, 0x00000420L, 0x08010400L, 0x08010400L, 0x08000420L, 0x00010020L, 0x08010000L, 0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L, 0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L, 0x00010420L, 0x08000000L, 0x00000400L, 0x00010020L, 0x08000420L, 0x00000400L, 0x00000000L, 0x08010420L, 0x08010020L, 0x08010400L, 0x00000420L, 0x00010000L, 0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L, 0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L, },{ /* nibble 5 */ 0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L, 0x00200040L, 0x00002000L, 0x80002040L, 0x00200000L, 0x00002040L, 0x80202040L, 0x00202000L, 0x80000000L, 0x80002000L, 0x80000040L, 0x80200000L, 0x00202040L, 0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L, 0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L, 0x80202040L, 0x80200000L, 0x80000000L, 0x00002040L, 0x00000040L, 0x00202000L, 0x00202040L, 0x80002000L, 0x00002040L, 0x80000000L, 0x80002000L, 0x00202040L, 0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L, 0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L, 0x00200040L, 0x80202040L, 0x00202000L, 0x00000040L, 0x80202040L, 0x00202000L, 0x00200000L, 0x80002040L, 0x80000040L, 0x80200000L, 0x00202040L, 0x00000000L, 0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L, 0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L, },{ /* nibble 6 */ 0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L, 0x01004204L, 0x00004004L, 0x00004200L, 0x00000000L, 0x01000000L, 0x01000204L, 0x00000204L, 0x01004000L, 0x00000004L, 0x01004200L, 0x01004000L, 0x00000204L, 0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L, 0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L, 0x01004004L, 0x00004204L, 0x01004200L, 0x00000004L, 0x00004204L, 0x01004004L, 0x00000200L, 0x01000000L, 0x00004204L, 0x01004000L, 0x01004004L, 0x00000204L, 0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L, 0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L, 0x00000200L, 0x01000004L, 0x00000004L, 0x01000200L, 0x00000000L, 0x01000204L, 0x01000200L, 0x00004200L, 0x00000204L, 0x00004000L, 0x01004204L, 0x01000000L, 0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L, 0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L, },{ /* nibble 7 */ 0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L, 0x20020000L, 0x00800080L, 0x20800000L, 0x20820080L, 0x00000080L, 0x20000000L, 0x00820000L, 0x00020080L, 0x00820080L, 0x20020080L, 0x20000080L, 0x20800000L, 0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L, 0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L, 0x20000000L, 0x00800000L, 0x20020080L, 0x20800080L, 0x00800000L, 0x00020000L, 0x20820000L, 0x00000080L, 0x00800000L, 0x00020000L, 0x20000080L, 0x20820080L, 0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L, 0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L, 0x20820000L, 0x00000080L, 0x00800080L, 0x20020000L, 0x20820080L, 0x00800000L, 0x20800000L, 0x20000080L, 0x00820000L, 0x00020080L, 0x20020080L, 0x20800000L, 0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L, 0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L, }}; binkd/ntlm/ncbc_enc.c0000664000076400007640000001205207313671622013176 0ustar gulgul/* crypto/des/ncbc_enc.c */ /* * #included by: * cbc_enc.c (des_cbc_encrypt) * des_enc.c (des_ncbc_encrypt) */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include "des_locl.h" #ifdef CBC_ENC_C__DONT_UPDATE_IV void des_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, des_key_schedule schedule, des_cblock *ivec, int enc) #else void des_ncbc_encrypt(const unsigned char *in, unsigned char *out, long length, des_key_schedule schedule, des_cblock *ivec, int enc) #endif { register DES_LONG tin0,tin1; register DES_LONG tout0,tout1,xor0,xor1; register long l=length; DES_LONG tin[2]; unsigned char *iv; iv = &(*ivec)[0]; if (enc) { c2l(iv,tout0); c2l(iv,tout1); for (l-=8; l>=0; l-=8) { c2l(in,tin0); c2l(in,tin1); tin0^=tout0; tin[0]=tin0; tin1^=tout1; tin[1]=tin1; des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); tout0=tin[0]; l2c(tout0,out); tout1=tin[1]; l2c(tout1,out); } if (l != -8) { c2ln(in,tin0,tin1,l+8); tin0^=tout0; tin[0]=tin0; tin1^=tout1; tin[1]=tin1; des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); tout0=tin[0]; l2c(tout0,out); tout1=tin[1]; l2c(tout1,out); } #ifndef CBC_ENC_C__DONT_UPDATE_IV iv = &(*ivec)[0]; l2c(tout0,iv); l2c(tout1,iv); #endif } else { c2l(iv,xor0); c2l(iv,xor1); for (l-=8; l>=0; l-=8) { c2l(in,tin0); tin[0]=tin0; c2l(in,tin1); tin[1]=tin1; des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); tout0=tin[0]^xor0; tout1=tin[1]^xor1; l2c(tout0,out); l2c(tout1,out); xor0=tin0; xor1=tin1; } if (l != -8) { c2l(in,tin0); tin[0]=tin0; c2l(in,tin1); tin[1]=tin1; des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); tout0=tin[0]^xor0; tout1=tin[1]^xor1; l2cn(tout0,tout1,out,l+8); #ifndef CBC_ENC_C__DONT_UPDATE_IV xor0=tin0; xor1=tin1; #endif } #ifndef CBC_ENC_C__DONT_UPDATE_IV iv = &(*ivec)[0]; l2c(xor0,iv); l2c(xor1,iv); #endif } tin0=tin1=tout0=tout1=xor0=xor1=0; tin[0]=tin[1]=0; } binkd/ntlm/CVS/0000775000076400007640000000000011700610242011715 5ustar gulgulbinkd/ntlm/CVS/Tag0000664000076400007640000000001611700610242012350 0ustar gulgulNbinkd-0_9_11 binkd/ntlm/CVS/Repository0000664000076400007640000000001311700610242014011 0ustar gulgulbinkd/ntlm binkd/ntlm/CVS/Entries0000664000076400007640000000130611700610242013251 0ustar gulgul/des.h/1.3/Fri Feb 28 20:39:09 2003//Tbinkd-0_9_11 /des_enc.c/1.1/Tue Jun 19 15:45:22 2001//Tbinkd-0_9_11 /des_locl.h/1.3/Tue Mar 11 09:21:30 2003//Tbinkd-0_9_11 /ecb_enc.c/1.3/Mon Jul 22 19:45:50 2002//Tbinkd-0_9_11 /helpers.c/1.5/Fri Feb 28 20:39:09 2003//Tbinkd-0_9_11 /helpers.h/1.2/Fri Sep 14 07:21:54 2001//Tbinkd-0_9_11 /md32_com.h/1.1/Tue Mar 11 00:04:26 2003//Tbinkd-0_9_11 /md4.h/1.1/Tue Jun 19 15:45:22 2001//Tbinkd-0_9_11 /md4_dgst.c/1.1/Tue Jun 19 15:45:22 2001//Tbinkd-0_9_11 /md4_locl.h/1.3/Tue Mar 11 00:04:26 2003//Tbinkd-0_9_11 /ncbc_enc.c/1.1/Tue Jun 19 15:45:22 2001//Tbinkd-0_9_11 /set_key.c/1.1/Tue Jun 19 15:45:22 2001//Tbinkd-0_9_11 /spr.h/1.1/Tue Jun 19 15:45:22 2001//Tbinkd-0_9_11 D binkd/ntlm/CVS/Root0000664000076400007640000000004611700610242012563 0ustar gulgul:pserver:binkd@cvs.happy.kiev.ua:/cvs binkd/ntlm/des.h0000664000076400007640000002664107627744355012251 0ustar gulgul/* crypto/des/des.h */ /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #ifndef HEADER_DES_H #define HEADER_DES_H #ifdef NO_DES #error DES is disabled. #endif #ifdef _KERBEROS_DES_H #error replaces . #endif #define DES_LONG unsigned long #define DES_LONG_SIZE "long" /* #include "opensslconf.h" */ /* DES_LONG */ #if defined(VMS) && !defined(__DECC) # define OPENSSL_EXTERN globalref # define OPENSSL_GLOBAL globaldef #else # define OPENSSL_EXTERN extern # define OPENSSL_GLOBAL #endif /* #include "e_os2.h" */ /* OPENSSL_EXTERN */ #ifdef __cplusplus extern "C" { #endif typedef unsigned char des_cblock[8]; typedef /* const */ unsigned char const_des_cblock[8]; /* With "const", gcc 2.8.1 on Solaris thinks that des_cblock * * and const_des_cblock * are incompatible pointer types. */ typedef struct des_ks_struct { union { des_cblock cblock; /* make sure things are correct size on machines with * 8 byte longs */ DES_LONG deslong[2]; } ks; int weak_key; } des_key_schedule[16]; #define DES_KEY_SZ (sizeof(des_cblock)) #define DES_SCHEDULE_SZ (sizeof(des_key_schedule)) #define DES_ENCRYPT 1 #define DES_DECRYPT 0 #define DES_CBC_MODE 0 #define DES_PCBC_MODE 1 #define des_ecb2_encrypt(i,o,k1,k2,e) \ des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) #define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) #define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) #define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) OPENSSL_EXTERN int des_check_key; /* defaults to false */ OPENSSL_EXTERN int des_rw_mode; /* defaults to DES_PCBC_MODE */ OPENSSL_EXTERN int des_set_weak_key_flag; /* set the weak key flag */ const char *des_options(void); void des_ecb3_encrypt(const_des_cblock *input, des_cblock *output, des_key_schedule ks1,des_key_schedule ks2, des_key_schedule ks3, int enc); DES_LONG des_cbc_cksum(const unsigned char *input,des_cblock *output, long length,des_key_schedule schedule, const_des_cblock *ivec); /* des_cbc_encrypt does not update the IV! Use des_ncbc_encrypt instead. */ void des_cbc_encrypt(const unsigned char *input,unsigned char *output, long length,des_key_schedule schedule,des_cblock *ivec, int enc); void des_ncbc_encrypt(const unsigned char *input,unsigned char *output, long length,des_key_schedule schedule,des_cblock *ivec, int enc); void des_xcbc_encrypt(const unsigned char *input,unsigned char *output, long length,des_key_schedule schedule,des_cblock *ivec, const_des_cblock *inw,const_des_cblock *outw,int enc); void des_cfb_encrypt(const unsigned char *in,unsigned char *out,int numbits, long length,des_key_schedule schedule,des_cblock *ivec, int enc); void des_ecb_encrypt(const_des_cblock *input,des_cblock *output, des_key_schedule ks,int enc); /* This is the DES encryption function that gets called by just about every other DES routine in the library. You should not use this function except to implement 'modes' of DES. I say this because the functions that call this routine do the conversion from 'char *' to long, and this needs to be done to make sure 'non-aligned' memory access do not occur. The characters are loaded 'little endian'. Data is a pointer to 2 unsigned long's and ks is the des_key_schedule to use. enc, is non zero specifies encryption, zero if decryption. */ void des_encrypt(DES_LONG *data,des_key_schedule ks, int enc); /* This functions is the same as des_encrypt() except that the DES initial permutation (IP) and final permutation (FP) have been left out. As for des_encrypt(), you should not use this function. It is used by the routines in the library that implement triple DES. IP() des_encrypt2() des_encrypt2() des_encrypt2() FP() is the same as des_encrypt() des_encrypt() des_encrypt() except faster :-). */ void des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc); void des_encrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3); void des_decrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3); void des_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output, long length, des_key_schedule ks1,des_key_schedule ks2, des_key_schedule ks3,des_cblock *ivec,int enc); void des_ede3_cbcm_encrypt(const unsigned char *in,unsigned char *out, long length, des_key_schedule ks1,des_key_schedule ks2, des_key_schedule ks3, des_cblock *ivec1,des_cblock *ivec2, int enc); void des_ede3_cfb64_encrypt(const unsigned char *in,unsigned char *out, long length,des_key_schedule ks1, des_key_schedule ks2,des_key_schedule ks3, des_cblock *ivec,int *num,int enc); void des_ede3_ofb64_encrypt(const unsigned char *in,unsigned char *out, long length,des_key_schedule ks1, des_key_schedule ks2,des_key_schedule ks3, des_cblock *ivec,int *num); void des_xwhite_in2out(const_des_cblock *des_key,const_des_cblock *in_white, des_cblock *out_white); int des_enc_read(int fd,void *buf,int len,des_key_schedule sched, des_cblock *iv); int des_enc_write(int fd,const void *buf,int len,des_key_schedule sched, des_cblock *iv); char *des_fcrypt(const char *buf,const char *salt, char *ret); char *des_crypt(const char *buf,const char *salt); #if !defined(PERL5) && !defined(__FreeBSD__) && !defined(NeXT) char *crypt(const char *buf,const char *salt); #endif void des_ofb_encrypt(const unsigned char *in,unsigned char *out,int numbits, long length,des_key_schedule schedule,des_cblock *ivec); void des_pcbc_encrypt(const unsigned char *input,unsigned char *output, long length,des_key_schedule schedule,des_cblock *ivec, int enc); DES_LONG des_quad_cksum(const unsigned char *input,des_cblock output[], long length,int out_count,des_cblock *seed); void des_random_seed(des_cblock *key); int des_random_key(des_cblock *ret); int des_read_password(des_cblock *key,const char *prompt,int verify); int des_read_2passwords(des_cblock *key1,des_cblock *key2, const char *prompt,int verify); int des_read_pw_string(char *buf,int length,const char *prompt,int verify); void des_set_odd_parity(des_cblock *key); int des_check_key_parity(const_des_cblock *key); int des_is_weak_key(const_des_cblock *key); /* des_set_key (= set_key = des_key_sched = key_sched) calls * des_set_key_checked if global variable des_check_key is set, * des_set_key_unchecked otherwise. */ int des_set_key(const_des_cblock *key,des_key_schedule schedule); int des_key_sched(const_des_cblock *key,des_key_schedule schedule); int des_set_key_checked(const_des_cblock *key,des_key_schedule schedule); void des_set_key_unchecked(const_des_cblock *key,des_key_schedule schedule); void des_string_to_key(const char *str,des_cblock *key); void des_string_to_2keys(const char *str,des_cblock *key1,des_cblock *key2); void des_cfb64_encrypt(const unsigned char *in,unsigned char *out,long length, des_key_schedule schedule,des_cblock *ivec,int *num, int enc); void des_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length, des_key_schedule schedule,des_cblock *ivec,int *num); int des_read_pw(char *buf,char *buff,int size,const char *prompt,int verify); /* The following definitions provide compatibility with the MIT Kerberos * library. The des_key_schedule structure is not binary compatible. */ #define _KERBEROS_DES_H #define KRBDES_ENCRYPT DES_ENCRYPT #define KRBDES_DECRYPT DES_DECRYPT #ifdef KERBEROS # define ENCRYPT DES_ENCRYPT # define DECRYPT DES_DECRYPT #endif #ifndef NCOMPAT # define C_Block des_cblock # define Key_schedule des_key_schedule # define KEY_SZ DES_KEY_SZ # define string_to_key des_string_to_key # define read_pw_string des_read_pw_string # define random_key des_random_key # define pcbc_encrypt des_pcbc_encrypt # define set_key des_set_key # define key_sched des_key_sched # define ecb_encrypt des_ecb_encrypt # define cbc_encrypt des_cbc_encrypt # define ncbc_encrypt des_ncbc_encrypt # define xcbc_encrypt des_xcbc_encrypt # define cbc_cksum des_cbc_cksum # define quad_cksum des_quad_cksum # define check_parity des_check_key_parity #endif typedef des_key_schedule bit_64; #define des_fixup_key_parity des_set_odd_parity #ifdef __cplusplus } #endif #endif binkd/ntlm/md4_locl.h0000664000076400007640000001455507633224012013150 0ustar gulgul/* crypto/md4/md4_locl.h */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include #include /* #include "opensslconf.h" */ #include "md4.h" #ifndef MD4_LONG_LOG2 #define MD4_LONG_LOG2 2 /* default to 32 bits */ #endif void md4_block_host_order (MD4_CTX *c, const void *p,int num); void md4_block_data_order (MD4_CTX *c, const void *p,int num); #if defined(__i386) || defined(_M_IX86) || defined(__INTEL__) /* * *_block_host_order is expected to handle aligned data while * *_block_data_order - unaligned. As algorithm and host (x86) * are in this case of the same "endianness" these two are * otherwise indistinguishable. But normally you don't want to * call the same function because unaligned access in places * where alignment is expected is usually a "Bad Thing". Indeed, * on RISCs you get punished with BUS ERROR signal or *severe* * performance degradation. Intel CPUs are in turn perfectly * capable of loading unaligned data without such drastic side * effect. Yes, they say it's slower than aligned load, but no * exception is generated and therefore performance degradation * is *incomparable* with RISCs. What we should weight here is * costs of unaligned access against costs of aligning data. * According to my measurements allowing unaligned access results * in ~9% performance improvement on Pentium II operating at * 266MHz. I won't be surprised if the difference will be higher * on faster systems:-) * * */ #define md4_block_data_order md4_block_host_order #endif #define DATA_ORDER_IS_LITTLE_ENDIAN #define HASH_LONG MD4_LONG #define HASH_LONG_LOG2 MD4_LONG_LOG2 #define HASH_CTX MD4_CTX #define HASH_CBLOCK MD4_CBLOCK #define HASH_LBLOCK MD4_LBLOCK #define HASH_UPDATE MD4_Update #define HASH_TRANSFORM MD4_Transform #define HASH_FINAL MD4_Final #define HASH_MAKE_STRING(c,s) do { \ unsigned long ll; \ ll=(c)->A; HOST_l2c(ll,(s)); \ ll=(c)->B; HOST_l2c(ll,(s)); \ ll=(c)->C; HOST_l2c(ll,(s)); \ ll=(c)->D; HOST_l2c(ll,(s)); \ } while (0) #define HASH_BLOCK_HOST_ORDER md4_block_host_order #if !defined(L_ENDIAN) || defined(md4_block_data_order) #define HASH_BLOCK_DATA_ORDER md4_block_data_order /* * Little-endians (Intel and Alpha) feel better without this. * It looks like memcpy does better job than generic * md4_block_data_order on copying-n-aligning input data. * But frankly speaking I didn't expect such result on Alpha. * On the other hand I've got this with egcs-1.0.2 and if * program is compiled with another (better?) compiler it * might turn out other way around. * * */ #endif #include "md32_com.h" /* #define F(x,y,z) (((x) & (y)) | ((~(x)) & (z))) #define G(x,y,z) (((x) & (y)) | ((x) & ((z))) | ((y) & ((z)))) */ /* As pointed out by Wei Dai , the above can be * simplified to the code below. Wei attributes these optimizations * to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel. */ #define F(b,c,d) ((((c) ^ (d)) & (b)) ^ (d)) #define G(b,c,d) (((b) & (c)) | ((b) & (d)) | ((c) & (d))) #define H(b,c,d) ((b) ^ (c) ^ (d)) #define R0(a,b,c,d,k,s,t) { \ a+=((k)+(t)+F((b),(c),(d))); \ a=ROTATE(a,s); }; #define R1(a,b,c,d,k,s,t) { \ a+=((k)+(t)+G((b),(c),(d))); \ a=ROTATE(a,s); };\ #define R2(a,b,c,d,k,s,t) { \ a+=((k)+(t)+H((b),(c),(d))); \ a=ROTATE(a,s); }; binkd/ntlm/ecb_enc.c0000664000076400007640000001022207517060356013021 0ustar gulgul/* crypto/des/ecb_enc.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include "des_locl.h" #include "spr.h" OPENSSL_GLOBAL const char *libdes_version="libdes"; OPENSSL_GLOBAL const char *DES_version="DES"; const char *des_options(void) { #ifdef DES_PTR #define PTR "ptr" #else #define PTR "idx" #endif #if defined(DES_RISC1) || defined(DES_RISC2) #ifdef DES_RISC1 #define RISC "risc1" #endif #ifdef DES_RISC2 #define RISC "risc2" #endif #else #define RISC "cisc" #endif #ifdef DES_UNROLL #define UNROLL "16" #else #define UNROLL "4" #endif #ifndef DES_LONG_SIZE #define SIZE "long" #else #define SIZE DES_LONG_SIZE #endif return "des(" PTR "," RISC "," UNROLL "," SIZE ")"; #undef PTR #undef RISC #undef UNROLL #undef SIZE } void des_ecb_encrypt(const_des_cblock *input, des_cblock *output, des_key_schedule ks, int enc) { register DES_LONG l; DES_LONG ll[2]; const unsigned char *in = &(*input)[0]; unsigned char *out = &(*output)[0]; c2l(in,l); ll[0]=l; c2l(in,l); ll[1]=l; des_encrypt(ll,ks,enc); l=ll[0]; l2c(l,out); l=ll[1]; l2c(l,out); l=ll[0]=ll[1]=0; } binkd/ntlm/des_locl.h0000664000076400007640000003126307633325232013240 0ustar gulgul/* crypto/des/des_locl.h */ /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #ifndef HEADER_DES_LOCL_H #define HEADER_DES_LOCL_H #if defined(WIN32) || defined(WIN16) #ifndef MSDOS #define MSDOS #endif #endif #include #include /* #include "opensslconf.h" */ #ifndef MSDOS #if !defined(VMS) || defined(__DECC) #ifdef HAVE_UNISTD_H #include #endif #include #endif #endif #include "des.h" #ifdef MSDOS /* Visual C++ 2.1 (Windows NT/95) */ #include #include #include #include #endif #if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS) #include #endif #define ITERATIONS 16 #define HALF_ITERATIONS 8 /* used in des_read and des_write */ #define MAXWRITE (1024*16) #define BSIZE (MAXWRITE+4) #define c2l(c,l) (l =((DES_LONG)(*((c)++))) , \ l|=((DES_LONG)(*((c)++)))<< 8L, \ l|=((DES_LONG)(*((c)++)))<<16L, \ l|=((DES_LONG)(*((c)++)))<<24L) /* NOTE - c is not incremented as per c2l */ #define c2ln(c,l1,l2,n) { \ c+=n; \ l1=l2=0; \ switch (n) { \ case 8: l2 =((DES_LONG)(*(--(c))))<<24L; \ case 7: l2|=((DES_LONG)(*(--(c))))<<16L; \ case 6: l2|=((DES_LONG)(*(--(c))))<< 8L; \ case 5: l2|=((DES_LONG)(*(--(c)))); \ case 4: l1 =((DES_LONG)(*(--(c))))<<24L; \ case 3: l1|=((DES_LONG)(*(--(c))))<<16L; \ case 2: l1|=((DES_LONG)(*(--(c))))<< 8L; \ case 1: l1|=((DES_LONG)(*(--(c)))); \ } \ } #define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \ *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ *((c)++)=(unsigned char)(((l)>>24L)&0xff)) /* replacements for htonl and ntohl since I have no idea what to do * when faced with machines with 8 byte longs. */ #define HDRSIZE 4 #define n2l(c,l) (l =((DES_LONG)(*((c)++)))<<24L, \ l|=((DES_LONG)(*((c)++)))<<16L, \ l|=((DES_LONG)(*((c)++)))<< 8L, \ l|=((DES_LONG)(*((c)++)))) #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \ *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ *((c)++)=(unsigned char)(((l) )&0xff)) /* NOTE - c is not incremented as per l2c */ #define l2cn(l1,l2,c,n) { \ c+=n; \ switch (n) { \ case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \ case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \ case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \ case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \ case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \ case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \ case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \ case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \ } \ } #if defined(WIN32) && defined(_MSC_VER) #define ROTATE(a,n) (_lrotr(a,n)) #else #define ROTATE(a,n) (((a)>>(n))+((a)<<(32-(n)))) #endif /* Don't worry about the LOAD_DATA() stuff, that is used by * fcrypt() to add it's little bit to the front */ #ifdef DES_FCRYPT #define LOAD_DATA_tmp(R,S,u,t,E0,E1) \ { DES_LONG tmp; LOAD_DATA(R,S,u,t,E0,E1,tmp); } #define LOAD_DATA(R,S,u,t,E0,E1,tmp) \ t=R^(R>>16L); \ u=t&E0; t&=E1; \ tmp=(u<<16); u^=R^s[S ]; u^=tmp; \ tmp=(t<<16); t^=R^s[S+1]; t^=tmp #else #define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g) #define LOAD_DATA(R,S,u,t,E0,E1,tmp) \ u=R^s[S ]; \ t=R^s[S+1] #endif /* The changes to this macro may help or hinder, depending on the * compiler and the architecture. gcc2 always seems to do well :-). * Inspired by Dana How * DO NOT use the alternative version on machines with 8 byte longs. * It does not seem to work on the Alpha, even when DES_LONG is 4 * bytes, probably an issue of accessing non-word aligned objects :-( */ #ifdef DES_PTR /* It recently occurred to me that 0^0^0^0^0^0^0 == 0, so there * is no reason to not xor all the sub items together. This potentially * saves a register since things can be xored directly into L */ #if defined(DES_RISC1) || defined(DES_RISC2) #ifdef DES_RISC1 #define D_ENCRYPT(LL,R,S) { \ unsigned int u1,u2,u3; \ LOAD_DATA(R,S,u,t,E0,E1,u1); \ u2=(int)u>>8L; \ u1=(int)u&0xfc; \ u2&=0xfc; \ t=ROTATE(t,4); \ u>>=16L; \ LL^= *(const DES_LONG *)(des_SP +u1); \ LL^= *(const DES_LONG *)(des_SP+0x200+u2); \ u3=(int)(u>>8L); \ u1=(int)u&0xfc; \ u3&=0xfc; \ LL^= *(const DES_LONG *)(des_SP+0x400+u1); \ LL^= *(const DES_LONG *)(des_SP+0x600+u3); \ u2=(int)t>>8L; \ u1=(int)t&0xfc; \ u2&=0xfc; \ t>>=16L; \ LL^= *(const DES_LONG *)(des_SP+0x100+u1); \ LL^= *(const DES_LONG *)(des_SP+0x300+u2); \ u3=(int)t>>8L; \ u1=(int)t&0xfc; \ u3&=0xfc; \ LL^= *(const DES_LONG *)(des_SP+0x500+u1); \ LL^= *(const DES_LONG *)(des_SP+0x700+u3); } #endif #ifdef DES_RISC2 #define D_ENCRYPT(LL,R,S) { \ unsigned int u1,u2,s1,s2; \ LOAD_DATA(R,S,u,t,E0,E1,u1); \ u2=(int)u>>8L; \ u1=(int)u&0xfc; \ u2&=0xfc; \ t=ROTATE(t,4); \ LL^= *(const DES_LONG *)(des_SP +u1); \ LL^= *(const DES_LONG *)(des_SP+0x200+u2); \ s1=(int)(u>>16L); \ s2=(int)(u>>24L); \ s1&=0xfc; \ s2&=0xfc; \ LL^= *(const DES_LONG *)(des_SP+0x400+s1); \ LL^= *(const DES_LONG *)(des_SP+0x600+s2); \ u2=(int)t>>8L; \ u1=(int)t&0xfc; \ u2&=0xfc; \ LL^= *(const DES_LONG *)(des_SP+0x100+u1); \ LL^= *(const DES_LONG *)(des_SP+0x300+u2); \ s1=(int)(t>>16L); \ s2=(int)(t>>24L); \ s1&=0xfc; \ s2&=0xfc; \ LL^= *(const DES_LONG *)(des_SP+0x500+s1); \ LL^= *(const DES_LONG *)(des_SP+0x700+s2); } #endif #else #define D_ENCRYPT(LL,R,S) { \ LOAD_DATA_tmp(R,S,u,t,E0,E1); \ t=ROTATE(t,4); \ LL^= \ *(const DES_LONG *)(des_SP +((u )&0xfc))^ \ *(const DES_LONG *)(des_SP+0x200+((u>> 8L)&0xfc))^ \ *(const DES_LONG *)(des_SP+0x400+((u>>16L)&0xfc))^ \ *(const DES_LONG *)(des_SP+0x600+((u>>24L)&0xfc))^ \ *(const DES_LONG *)(des_SP+0x100+((t )&0xfc))^ \ *(const DES_LONG *)(des_SP+0x300+((t>> 8L)&0xfc))^ \ *(const DES_LONG *)(des_SP+0x500+((t>>16L)&0xfc))^ \ *(const DES_LONG *)(des_SP+0x700+((t>>24L)&0xfc)); } #endif #else /* original version */ #if defined(DES_RISC1) || defined(DES_RISC2) #ifdef DES_RISC1 #define D_ENCRYPT(LL,R,S) {\ unsigned int u1,u2,u3; \ LOAD_DATA(R,S,u,t,E0,E1,u1); \ u>>=2L; \ t=ROTATE(t,6); \ u2=(int)u>>8L; \ u1=(int)u&0x3f; \ u2&=0x3f; \ u>>=16L; \ LL^=des_SPtrans[0][u1]; \ LL^=des_SPtrans[2][u2]; \ u3=(int)u>>8L; \ u1=(int)u&0x3f; \ u3&=0x3f; \ LL^=des_SPtrans[4][u1]; \ LL^=des_SPtrans[6][u3]; \ u2=(int)t>>8L; \ u1=(int)t&0x3f; \ u2&=0x3f; \ t>>=16L; \ LL^=des_SPtrans[1][u1]; \ LL^=des_SPtrans[3][u2]; \ u3=(int)t>>8L; \ u1=(int)t&0x3f; \ u3&=0x3f; \ LL^=des_SPtrans[5][u1]; \ LL^=des_SPtrans[7][u3]; } #endif #ifdef DES_RISC2 #define D_ENCRYPT(LL,R,S) {\ unsigned int u1,u2,s1,s2; \ LOAD_DATA(R,S,u,t,E0,E1,u1); \ u>>=2L; \ t=ROTATE(t,6); \ u2=(int)u>>8L; \ u1=(int)u&0x3f; \ u2&=0x3f; \ LL^=des_SPtrans[0][u1]; \ LL^=des_SPtrans[2][u2]; \ s1=(int)u>>16L; \ s2=(int)u>>24L; \ s1&=0x3f; \ s2&=0x3f; \ LL^=des_SPtrans[4][s1]; \ LL^=des_SPtrans[6][s2]; \ u2=(int)t>>8L; \ u1=(int)t&0x3f; \ u2&=0x3f; \ LL^=des_SPtrans[1][u1]; \ LL^=des_SPtrans[3][u2]; \ s1=(int)t>>16; \ s2=(int)t>>24L; \ s1&=0x3f; \ s2&=0x3f; \ LL^=des_SPtrans[5][s1]; \ LL^=des_SPtrans[7][s2]; } #endif #else #define D_ENCRYPT(LL,R,S) {\ LOAD_DATA_tmp(R,S,u,t,E0,E1); \ t=ROTATE(t,4); \ LL^=\ des_SPtrans[0][(u>> 2L)&0x3f]^ \ des_SPtrans[2][(u>>10L)&0x3f]^ \ des_SPtrans[4][(u>>18L)&0x3f]^ \ des_SPtrans[6][(u>>26L)&0x3f]^ \ des_SPtrans[1][(t>> 2L)&0x3f]^ \ des_SPtrans[3][(t>>10L)&0x3f]^ \ des_SPtrans[5][(t>>18L)&0x3f]^ \ des_SPtrans[7][(t>>26L)&0x3f]; } #endif #endif /* IP and FP * The problem is more of a geometric problem that random bit fiddling. 0 1 2 3 4 5 6 7 62 54 46 38 30 22 14 6 8 9 10 11 12 13 14 15 60 52 44 36 28 20 12 4 16 17 18 19 20 21 22 23 58 50 42 34 26 18 10 2 24 25 26 27 28 29 30 31 to 56 48 40 32 24 16 8 0 32 33 34 35 36 37 38 39 63 55 47 39 31 23 15 7 40 41 42 43 44 45 46 47 61 53 45 37 29 21 13 5 48 49 50 51 52 53 54 55 59 51 43 35 27 19 11 3 56 57 58 59 60 61 62 63 57 49 41 33 25 17 9 1 The output has been subject to swaps of the form 0 1 -> 3 1 but the odd and even bits have been put into 2 3 2 0 different words. The main trick is to remember that t=((l>>size)^r)&(mask); r^=t; l^=(t<>(n))^(b))&(m)),\ (b)^=(t),\ (a)^=((t)<<(n))) #define IP(l,r) \ { \ register DES_LONG tt; \ PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \ PERM_OP(l,r,tt,16,0x0000ffffL); \ PERM_OP(r,l,tt, 2,0x33333333L); \ PERM_OP(l,r,tt, 8,0x00ff00ffL); \ PERM_OP(r,l,tt, 1,0x55555555L); \ } #define FP(l,r) \ { \ register DES_LONG tt; \ PERM_OP(l,r,tt, 1,0x55555555L); \ PERM_OP(r,l,tt, 8,0x00ff00ffL); \ PERM_OP(l,r,tt, 2,0x33333333L); \ PERM_OP(r,l,tt,16,0x0000ffffL); \ PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \ } OPENSSL_EXTERN const DES_LONG des_SPtrans[8][64]; void fcrypt_body(DES_LONG *out,des_key_schedule ks, DES_LONG Eswap0, DES_LONG Eswap1); #endif binkd/ntlm/md4.h0000664000076400007640000001075607313671622012146 0ustar gulgul/* crypto/md4/md4.h */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #ifndef HEADER_MD4_H #define HEADER_MD4_H #ifdef __cplusplus extern "C" { #endif #ifdef NO_MD4 #error MD4 is disabled. #endif /* * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then ! * ! MD4_LONG_LOG2 has to be defined along. ! * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ #if defined(WIN16) || defined(__LP32__) #define MD4_LONG unsigned long #elif defined(_CRAY) || defined(__ILP64__) #define MD4_LONG unsigned long #define MD4_LONG_LOG2 3 /* * _CRAY note. I could declare short, but I have no idea what impact * does it have on performance on none-T3E machines. I could declare * int, but at least on C90 sizeof(int) can be chosen at compile time. * So I've chosen long... * */ #else #define MD4_LONG unsigned int #endif #define MD4_CBLOCK 64 #define MD4_LBLOCK (MD4_CBLOCK/4) #define MD4_DIGEST_LENGTH 16 typedef struct MD4state_st { MD4_LONG A,B,C,D; MD4_LONG Nl,Nh; MD4_LONG data[MD4_LBLOCK]; int num; } MD4_CTX; void MD4_Init(MD4_CTX *c); void MD4_Update(MD4_CTX *c, const void *data, unsigned long len); void MD4_Final(unsigned char *md, MD4_CTX *c); unsigned char *MD4(const unsigned char *d, unsigned long n, unsigned char *md); void MD4_Transform(MD4_CTX *c, const unsigned char *b); #ifdef __cplusplus } #endif #endif binkd/ftndom.c0000664000076400007640000000247107627744354012000 0ustar gulgul/* * ftndom.c -- Source to handle FTN Domains * * ftndom.c is a part of binkd project * * Copyright (C) 1996,1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: ftndom.c,v 2.1 2003/02/28 20:39:08 gul Exp $ * * $Log: ftndom.c,v $ * Revision 2.1 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * Revision 1.2 1997/10/23 04:08:50 mff * stricmp() -> STRICMP() * * Revision 1.1 1996/12/29 09:41:15 mff * Initial revision * */ #include "ftndom.h" #include "tools.h" FTN_DOMAIN *pDomains = 0; /* * 0 == domain not found */ FTN_DOMAIN *get_domain_info (char *domain_name) { FTN_DOMAIN *curr; for (curr = pDomains; curr; curr = curr->next) if (!STRICMP (curr->name, domain_name)) return curr; return 0; } /* * Returns the default domain */ FTN_DOMAIN *get_def_domain (void) { FTN_DOMAIN *curr; for (curr = pDomains; curr->next; curr = curr->next); return curr; } binkd/binkd9x.txt.en0000664000076400007640000002077510743320353013044 0ustar gulgul binkd9x is a special binkd version compiled for working in Win9x systems (Windows 95/98/ME). The fact is that these systems have a documented and rather an ugly bug in the console subsystem. Because of the bug a console does not receive any signals (messages) except the keyboard messages CTRL_C_EVENT and CTRL_BREAK_EVENT. In practice it leads to impossibility of an automatic binkd shutdown when the OS is shut down or restarted. binkd9x is not a console application and it creates a window which receives the system messages. In fact classic binkd is still working but without console (in a hidden mode). This is the first disadvantage. At that none needs a separate binary for Win9x systems. This is the second disadvantage. binkd9x can also work as a service in Win9x systems. Certainly one cannot compare this mode with the service mode in Windows NT/2000/XP as far as functionality is concerned but it may be necessary in some cases in Win9x. For example, if you log off frequently. When binkd9x is installed to work as a service it is loaded at the system start before anybody logs on and it does not stop at a logoff. Unlike the regular Win32 ("Win32") binkd, binkd9x identifies itself as "Win9x". However such a behavior may be easily corrected in config.h In some situations binkd9x activates a temporary console. Pressing any key is awaited to close it. Distinctions of binkd9x options from the regular Win32 binkd options: "-T minimize to Tray" is not available in binkd9x since there is nothing to minimize because of the console absence. "-v be verbose / dump version and quit", "-h print this help", undocumented "--help" and also starting binkd9x without arguments activates a temporary console before the corresponding action. The new options: "-i install Win9x service" Installs a service. The services are written to the registry branch "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices". The current path at the moment of binkd9x service installation is also written to the "HKEY_LOCAL_MACHINE\Software\binkd9x" registry branch. This path is made current when binkd9x service starts. If binkd9x was started at the installation from command.com or from a shell (for example, from Far) then the binkd9x process command line contains short file name and short path. If you want to insert the long file name into the registry during installation then you may use "start" command. For example: start binkd9x-mingw -i binkd.cfg If commands "-i", "-u", "-t" are used binkd9x starts a temporary console. "-q" option blocks starting the temporary console for all three commands. At that binkd9x informs its user of important errors using pop-up messages. Such a mode is useful mainly for automatic control of services with "-t" command. If a service installation is successful then binkd9x tries to start the service. "-u UNinstall Win9x service" Uninstalls the service. Works similar to the "-i" command. You may uninstall all the registered services using "-S name" option with the name "all". Example: 1. binkd9x -u ==> uninstall binkd9x-service 2. binkd9x -u -S Zol ==> uninstall binkd9x-service-Zol 3. binkd9x -u -S all ==> uninstall all binkd9x services "-t cmd (start|stop|restart|status|install|uninstall) service(s)" It is the command for service control. "-t install" installs a service. The services are written to the registry branch "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices". The current path at the moment of binkd9x service installation is also written to the "HKEY_LOCAL_MACHINE\Software\binkd9x" registry branch. This path is made current when binkd9x service starts. If binkd9x was started at the installation from command.com or from a shell (for example, from Far) then the binkd9x process command line contains short file name and short path. If you want to insert the long file name into the registry during installation then you may use "start" command. For example: start binkd9x-mingw -t install binkd.cfg If commands "-i", "-u", "-t" are used binkd9x starts a temporary console. "-q" option blocks starting the temporary console for all three commands. At that binkd9x informs its user of important errors using pop-up messages. Such a mode is useful mainly for automatic control of services with "-t" command. If a service installation is successful then binkd9x tries to start the service. "-t uninstall" uninstalls the service. Works similar to the "-i" command. You may uninstall all the registered services using "-S name" option with the name "all". Example: 1. binkd9x -u ==> uninstall binkd9x-service 2. binkd9x -u -S Zol ==> uninstall binkd9x-service-Zol 3. binkd9x -u -S all ==> uninstall all binkd9x services "-t status" shows the status of binkd9x services in registry. "-t start" starts services. "-t stop" stops services. "-t restart" restarts services. On default all actions refer to "binkd9x-service". You may indicate the service name using "-S name" option. If you indicate "all" instead of the service name then the operation is done to all services registered in the system registry. There is no much sense in using "-q" option with "-t status" command. Example: 1. binkd9x -t status ==> Prints the status of the binkd9x-service 2. binkd9x -t status -S local ==> Prints the status of the binkd9x-service-local 3. binkd9x -t status -S all ==> Prints the status of all registered services 4. binkd9x -t status -S all -q ==> see 2., but there is no practical sense in it (there is no console) 5. binkd9x -t start ==> Starts binkd9x-service, if it has not been started 6. binkd9x -t start -S local ==> see 5., but for binkd9x-service-local 7. binkd9x -t start -S all ==> see 5., but for all services 9. binkd9x -t start -q ==> см. 5., but does not create console (it is convinient for using in scripts or bat-files). 10. binkd9x -t stop -q ==> similar to 9., but the service is stopped. ... and so on... "-S name set Win9x service name, all - use all services" It indicates the name of the service with which "-t" command will work. The service real name which is written to registry is built in the following way: "binkd9x-service[-name]", where "binkd9x-service" is the compulsory part, and "-name" is appended if "-S name" is present. For all commands except "-t install" special service name "all" is allowed. In this case the indicated operation will be done to all installed services. If you indicate "binkd9x-service" or "binkd9x-service-*" as a service name then the service name will be used as is, without prepending an additional "binkd9x-service" prefix. Examples: 1. binkd9x -t install binkd.cfg ==> binkd9x-service 2. binkd9x -t install -S local binkd.cfg ==> binkd9x-service-local 3. binkd9x -t install -S binkd9x-service binkd.cfg ==> binkd9x-service 4. binkd9x -t install -S binkd9x-service-local binkd.cfg ==> binkd9x-service-local 5. binkd9x -t status -S all ==> status of all installed services is printed How to make binkd9x: At present binkd9x is compiled with the help of MSVC and MinGW. The technology is practically the same as for the regular binkd. For MSVC it is only necessary to indicate "BINKD9X" macro for using with nmake, for instance: 1. nmake BINKD9X=1 ==> makes binkd9x with the Release configuration 2. nmake BINKD9X=1 DEBUG=1 ==> makes binkd9x with the Debug configuration 3. nmake BINKD9X=1 STATIC=1 ==> makes binkd9x using static RTL library For MinGW it is similar: make BINKD9X=1 ATTENTION! If you alternately compile binkd and binkd9x using MinGW then it is necessary to "make clean" or to manually delete *.o, nt/*.o and ntlm/*.o files. If you do not do it compilation errors or improper work of binkd and binkd9x is possible. I shall be glad, if binkd9x come in useful to anybody besides me. Alexander Reznikov, 2:4600/220@fidonet homebrewer@yandex.ru $Id: binkd9x.txt.en,v 1.1 2008/01/16 06:15:07 stas Exp $ Translated from Russian by Michael Dukelsky, 2:5020/1042@fidonet binkd/sem.h0000664000076400007640000000653307655151452011275 0ustar gulgul/* * sem.h -- semaphores for multithreaded version * * sem.h is a part of binkd project * * Copyright (C) 1996 Fydodor Ustinov, FIDONet 2:5020/79 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: sem.h,v 2.8 2003/05/04 08:45:30 gul Exp $ * * $Log: sem.h,v $ * Revision 2.8 2003/05/04 08:45:30 gul * Lock semaphores more safely for resolve and IP-addr print * * Revision 2.7 2003/03/31 19:35:16 gul * Clean semaphores usage * * Revision 2.6 2003/03/26 13:53:28 gul * Fix OS/2 compilation * * Revision 2.5 2003/03/11 11:42:23 gul * Use event semaphores for exit threads * * Revision 2.4 2003/03/10 12:16:54 gul * Use HAVE_DOS_H macro * * Revision 2.3 2003/03/10 08:38:07 gul * Make n_servers/n_clients changes thread-safe * * Revision 2.2 2003/02/22 19:20:25 gul * Fix type in previous patch * * Revision 2.1 2003/02/22 12:12:34 gul * Cleanup sources * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.5 1997/10/23 03:40:27 mff * Amiga port * * Revision 1.3 1996/12/05 06:56:18 mff * Changed to support multiple semaphores */ #ifndef _SEM_H_ #define _SEM_H_ #if defined(WIN32) #include typedef HANDLE MUTEXSEM; typedef HANDLE EVENTSEM; #elif defined(OS2) #define INCL_DOS #include typedef HMTX MUTEXSEM; typedef HEV EVENTSEM; #elif defined(AMIGA) #include typedef struct SignalSemaphore MUTEXSEM; #endif /* * Initialise Semaphores. */ int _InitSem (void *); /* * Clean Semaphores. */ int _CleanSem (void *); /* * Wait & lock semaphore */ int _LockSem (void *); /* * Release Semaphore. */ int _ReleaseSem (void *); /* * Initialise Event Semaphores. */ int _InitEventSem (void *); /* * Post Semaphore. */ int _PostSem (void *); /* * Wait Semaphore. */ int _WaitSem (void *, int); /* * Clean Event Semaphores. */ int _CleanEventSem (void *); #if defined(HAVE_THREADS) || defined(AMIGA) #define InitSem(vpSem) _InitSem(vpSem) #define CleanSem(vpSem) _CleanSem(vpSem) #define LockSem(vpSem) _LockSem(vpSem) #define ReleaseSem(vpSem) _ReleaseSem(vpSem) #define InitEventSem(vpSem) _InitEventSem(vpSem) #define PostSem(vpSem) _PostSem(vpSem) #define WaitSem(vpSem, sec) _WaitSem(vpSem, sec) #define CleanEventSem(vpSem) _CleanEventSem(vpSem) #else /* Do nothing */ #define InitSem(vpSem) #define CleanSem(vpSem) #define LockSem(vpSem) #define ReleaseSem(vpSem) #define InitEventSem(vpSem) #define PostSem(vpSem) #define WaitSem(vpSem, sec) #define CleanEventSem(vpSem) #endif #ifdef HAVE_THREADS extern MUTEXSEM hostsem; extern MUTEXSEM resolvsem; extern MUTEXSEM varsem; extern EVENTSEM eothread; extern EVENTSEM exitcmgr; extern EVENTSEM LSem; #define lockhostsem() LockSem(&hostsem) #define releasehostsem() ReleaseSem(&hostsem) #define lockresolvsem() LockSem(&resolvsem) #define releaseresolvsem() ReleaseSem(&resolvsem) #define threadsafe(exp) LockSem(&varsem); exp; ReleaseSem(&varsem) #ifdef OS2 extern MUTEXSEM fhsem; #endif #else #define lockhostsem() #define releasehostsem() #define lockresolvsem() #define releaseresolvsem() #define threadsafe(exp) exp #endif #endif binkd/readcfg.c0000664000076400007640000006627711622760760012107 0ustar gulgul/* * readcfg.c -- reads config * * readcfg.c is a part of binkd project * * Copyright (C) 1996-2003 Dima Maloff, 5047/13 and others * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: readcfg.c,v 2.26.2.5 2011/08/17 15:44:48 stas Exp $ * * $Log: readcfg.c,v $ * Revision 2.26.2.5 2011/08/17 15:44:48 stas * Default root-domain fidonet.net changed to binkp.net. binkd 0.9.11 is released * * Revision 2.26.2.4 2008/05/28 11:16:31 gul * Ignore comments in passwords file * * Revision 2.26.2.3 2006/03/02 20:27:10 stas * print warning if password file is invalid * * Revision 2.26.2.2 2006/03/02 20:08:06 stas * ifcico/qico passwords file support * * Revision 2.26.2.1 2003/06/30 22:49:39 hbrew * Allow to override -ip, -sip, -md, -nomd in add_node() * * Revision 2.26 2003/05/28 09:03:17 gul * Typo in prev patch * * Revision 2.25 2003/05/28 08:56:33 gul * Reread config if passwords file changed when -C switch specified * * Revision 2.24 2003/05/01 09:55:01 gul * Remove -crypt option, add global -r option (disable crypt). * * Revision 2.23 2003/03/25 13:17:53 gul * Check if inbound and temp-inbound are in the same partition * * Revision 2.22 2003/03/11 00:04:26 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.21 2003/03/10 10:57:45 gul * Extern declarations moved to header files * * Revision 2.20 2003/03/10 10:39:23 gul * New include file common.h * * Revision 2.19 2003/03/01 15:00:17 gul * Join skipmask and overwrite into common maskchain * * Revision 2.18 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.17 2003/02/23 16:31:21 gul * Add "-sip" option in node string. * Change "-ip" check logic. * * Revision 2.16 2003/02/22 21:32:46 gul * Amiga Style Outbound support * * Revision 2.15 2003/02/22 20:19:54 gul * Update copyrightes, 2002->2003 * * Revision 2.14 2003/02/13 19:18:11 gul * minor fix * * Revision 2.13 2003/01/29 19:32:03 gul * Code cleanup, prevent segfault on bad config * * Revision 2.12 2003/01/16 14:34:11 gul * Fix segfault under unix * * Revision 2.11 2002/12/17 14:02:22 gul * change strcasecmp -> STRICMP * * Revision 2.10 2002/12/17 13:00:44 gul * Fix previous patch * * Revision 2.9 2002/12/10 21:31:30 gul * Bugfix for check filebox and outbound * * Revision 2.8 2002/11/14 13:01:43 gul * Bugfix for previous patch * * Revision 2.7 2002/11/12 17:41:02 gul * Check for (personal) outbox pointed to (common) outbound * * Revision 2.6 2002/07/21 10:35:44 gul * overwrite option * * Revision 2.5 2002/05/11 08:37:32 gul * Added token deletedirs * * Revision 2.4 2002/05/06 19:25:39 gul * new keyword inboundCase in config * * Revision 2.3 2002/02/22 00:18:34 gul * Run by-file events with the same command-line once after session * * Revision 2.2 2001/08/24 13:23:28 da * binkd/binkd.c * binkd/readcfg.c * binkd/readcfg.h * binkd/server.c * binkd/nt/service.c * * Revision 2.1 2001/02/15 11:03:18 gul * Added crypt traffic possibility * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.14 1997/10/23 03:45:34 mff * +fdinhist, +fdouthist, +root_domain, many fixes to hide pNod into * ftnnode.c * * Revision 1.13 1997/09/04 02:53:01 mff * Added fdinhist/fdouthist keywords to support FrontDoor-style history. * Added support for multiple hosts per node. Find_port() moved to * iptools.c * * Revision 1.12 1997/08/19 21:42:29 mff * Changes to support multiple hosts per node: in FTN_NODE * host/port pair replaced with asciiz string in ``hosts'' * * * 1997/07/11 11:47:55 maxb * Added fdinhist and fdouthist keyword * * Revision 1.11 1997/06/16 05:42:30 mff * Added binlog and tzoff keywords. * * Revision 1.10 1997/05/17 08:43:23 mff * Flavours for fileboxes were ignored * * Revision 1.9 1997/03/28 06:36:28 mff * Added "exec" keyword * * Revision 1.8 1997/03/15 05:06:08 mff * Added -nr key to node statement * * Revision 1.6 1997/03/09 07:13:30 mff * getservbyname with iport/oport, added reading of syslog facility * * Revision 1.5 1997/02/07 06:55:11 mff * `include', extened `node', more? */ #include #include #include #include #include #include #include #if defined (HAVE_VSYSLOG) && defined (HAVE_FACILITYNAMES) #define SYSLOG_NAMES #include #endif #include "Config.h" #include "common.h" #include "readcfg.h" #include "tools.h" #include "ftnaddr.h" #include "ftnq.h" #include "srif.h" #include "iphdr.h" #include "iptools.h" #include "assert.h" #include "readflo.h" static char *path; static int line; char siport[MAXSERVNAME + 1] = ""; char soport[MAXSERVNAME + 1] = ""; int havedefnode=0; int iport = 0; int oport = 0; int call_delay = 60; int rescan_delay = 60; int nettimeout = DEF_TIMEOUT; int oblksize = DEF_BLKSIZE; int max_servers = 100; int max_clients = 100; int kill_dup_partial_files = 0; int kill_old_partial_files = 0; int kill_old_bsy = 0; int percents = 0; int minfree = -1; int minfree_nonsecure = -1; int debugcfg = 0; int printq = 0; int backresolv = 0; char sysname[MAXSYSTEMNAME + 1] = ""; char sysop[MAXSYSOPNAME + 1] = ""; char location[MAXLOCATIONNAME + 1] = ""; char nodeinfo[MAXNODEINFO + 1] = ""; char inbound[MAXPATHLEN + 1] = "."; char inbound_nonsecure[MAXPATHLEN + 1] = ""; char temp_inbound[MAXPATHLEN + 1] = ""; #ifdef MAILBOX /* FileBoxes dir */ char tfilebox[MAXPATHLEN + 1] = ""; /* BrakeBoxes dir */ char bfilebox[MAXPATHLEN + 1] = ""; int deleteablebox = 0; #endif int deletedirs = 0; char logpath[MAXPATHLEN + 1] = ""; char binlogpath[MAXPATHLEN + 1] = ""; char fdinhist[MAXPATHLEN + 1] = ""; char fdouthist[MAXPATHLEN + 1] = ""; char pid_file[MAXPATHLEN + 1] = ""; #ifdef HTTPS char proxy[MAXHOSTNAMELEN + 40] = ""; char socks[MAXHOSTNAMELEN + 40] = ""; #endif char bindaddr[16] = ""; int loglevel = 4; int conlog = 0; int send_if_pwd = 0; int tzoff = 0; char root_domain[MAXHOSTNAMELEN + 1] = ROOT_DOMAIN; int prescan = 0; enum inbcasetype inboundcase = INB_SAVE; int connect_timeout = 0; struct conflist_type *config_list = NULL; #ifdef AMIGADOS_4D_OUTBOUND int aso = 0; #endif #if defined (HAVE_VSYSLOG) && defined (HAVE_FACILITYNAMES) int syslog_facility = -1; #endif int tries = 0; int hold = 0; int hold_skipped = 60 * 60; struct maskchain *skipmask = NULL, *overwrite = NULL; int nAddr = 0; FTN_ADDR *pAddr = 0; typedef struct _KEYWORD KEYWORD; struct _KEYWORD { const char *key; void (*callback) (KEYWORD *key, char *s); void *var; long option1; long option2; }; static void passwords (KEYWORD *, char *); static void include (KEYWORD *, char *); static void read_aka_list (KEYWORD *, char *); static void read_domain_info (KEYWORD *, char *); static void read_node_info (KEYWORD *, char *); static void read_int (KEYWORD *, char *); static void read_string (KEYWORD *, char *); static void read_bool (KEYWORD *, char *); static void read_flag_exec_info (KEYWORD *, char *); static void read_rfrule (KEYWORD *, char *); static void read_mask (KEYWORD *key, char *s); static void read_inboundcase (KEYWORD *, char *); #if defined (HAVE_VSYSLOG) && defined (HAVE_FACILITYNAMES) static void read_syslog_facility (KEYWORD *, char *); #endif #define DONT_CHECK 0x7fffffffl KEYWORD keywords[] = { {"passwords", passwords, NULL, 0, 0}, {"include", include, NULL, 0, 0}, {"log", read_string, logpath, 'f', 0}, {"loglevel", read_int, &loglevel, 0, DONT_CHECK}, {"conlog", read_int, &conlog, 0, DONT_CHECK}, {"binlog", read_string, binlogpath, 'f', 0}, {"fdinhist", read_string, fdinhist, 'f', 0}, {"fdouthist", read_string, fdouthist, 'f', 0}, {"tzoff", read_int, &tzoff, DONT_CHECK, DONT_CHECK}, {"domain", read_domain_info, NULL, 0, 0}, {"address", read_aka_list, NULL, 0, 0}, {"sysname", read_string, sysname, 0, MAXSYSTEMNAME}, {"bindaddr", read_string, bindaddr, 0, 16}, {"sysop", read_string, sysop, 0, MAXSYSOPNAME}, {"location", read_string, location, 0, MAXLOCATIONNAME}, {"nodeinfo", read_string, nodeinfo, 0, MAXNODEINFO}, {"iport", read_string, siport, 0, MAXSERVNAME}, {"oport", read_string, soport, 0, MAXSERVNAME}, {"rescan-delay", read_int, &rescan_delay, 1, DONT_CHECK}, {"call-delay", read_int, &call_delay, 1, DONT_CHECK}, {"timeout", read_int, &nettimeout, 1, DONT_CHECK}, {"oblksize", read_int, &oblksize, MIN_BLKSIZE, MAX_BLKSIZE}, {"maxservers", read_int, &max_servers, 0, DONT_CHECK}, {"maxclients", read_int, &max_clients, 0, DONT_CHECK}, {"inbound", read_string, inbound, 'd', 0}, {"inbound-nonsecure", read_string, inbound_nonsecure, 'd', 0}, {"temp-inbound", read_string, temp_inbound, 'd', 0}, {"node", read_node_info, NULL, 0, 0}, {"defnode", read_node_info, NULL, 1, 0}, {"kill-dup-partial-files", read_bool, &kill_dup_partial_files, 0, 0}, {"kill-old-partial-files", read_int, &kill_old_partial_files, 1, DONT_CHECK}, {"kill-old-bsy", read_int, &kill_old_bsy, 1, DONT_CHECK}, {"percents", read_bool, &percents, 0, 0}, {"minfree", read_int, &minfree, 0, DONT_CHECK}, {"minfree-nonsecure", read_int, &minfree_nonsecure, 0, DONT_CHECK}, {"flag", read_flag_exec_info, NULL, 'f', 0}, {"exec", read_flag_exec_info, NULL, 'e', 0}, {"debugcfg", read_bool, &debugcfg, 0, 0}, {"printq", read_bool, &printq, 0, 0}, {"try", read_int, &tries, 0, 0xffff}, {"hold", read_int, &hold, 0, DONT_CHECK}, {"hold-skipped", read_int, &hold_skipped, 0, DONT_CHECK}, {"backresolv", read_bool, &backresolv, 0, 0}, {"pid-file", read_string, pid_file, 'f', 0}, #ifdef HTTPS {"proxy", read_string, proxy, 0, MAXHOSTNAMELEN + 40}, {"socks", read_string, socks, 0, MAXHOSTNAMELEN + 40}, #endif #if defined (HAVE_VSYSLOG) && defined (HAVE_FACILITYNAMES) {"syslog", read_syslog_facility, &syslog_facility, 0, 0}, #endif {"ftrans", read_rfrule, NULL, 0, 0}, {"send-if-pwd", read_bool, &send_if_pwd, 0, 0}, {"root-domain", read_string, root_domain, 0, MAXHOSTNAMELEN}, {"prescan", read_bool, &prescan, 0, 0}, {"connect-timeout", read_int, &connect_timeout, 0, DONT_CHECK}, #ifdef MAILBOX {"filebox", read_string, tfilebox, 'd', 0}, {"brakebox", read_string, bfilebox, 'd', 0}, {"deletebox", read_bool, &deleteablebox, 0, 0}, #endif {"skipmask", read_mask, &skipmask, 0, 0}, {"inboundcase", read_inboundcase, &inboundcase, 0, 0}, {"deletedirs", read_bool, &deletedirs, 0, 0}, {"overwrite", read_mask, &overwrite, 0, 0}, #ifdef AMIGADOS_4D_OUTBOUND {"aso", read_bool, &aso, 0, 0}, #endif {NULL, NULL, NULL, 0, 0} }; #define TEST(var) if (!*var) Log (0, "%s: "#var" should be defined", path) void readcfg0 (char *_path); void debug_readcfg (void); /* Check for (personal) outbox pointed to (common) outbound */ static int check_outbox(char *obox) { FTN_DOMAIN *pd=pDomains; #ifndef UNIX char *OBOX, *PATH=NULL; if (obox == NULL) return 0; OBOX = strupper(xstrdup(obox)); #else if (obox == NULL) return 0; #endif for (; pd; pd=pd->next) { if (pd->alias4) continue; if (pd->path) { char *s; #ifdef UNIX if (obox==strstr(obox, pd->path)) { s = obox+strlen(pd->path); if ((*s == '\\' || *s == '/') && STRICMP(s+1, pd->dir) == 0) return 1; } #else PATH = strupper(xstrdup(pd->path)); if (OBOX==strstr(OBOX, PATH)) { s = OBOX+strlen(PATH); if ((*s == '\\' || *s == '/') && stricmp(s+1, pd->dir) == 0) { free(PATH); free(OBOX); return 1; } } free(PATH); #endif } } #ifndef UNIX free(OBOX); #endif return 0; } static int check_boxes(FTN_NODE *node, void *arg) { struct stat st; char addr[FTN_ADDR_SZ + 1]; ftnaddress_to_str(addr, &(node->fa)); if (node->obox && node->obox[0]) { if (stat(node->obox, &st) || (st.st_mode & S_IFDIR) == 0) Log (0, "Outbox for %s does not exist (link %s)", node->obox, addr); if (check_outbox(node->obox)) Log (0, "Outbox cannot point to outbound! (link %s)", addr); } if (node->ibox && node->ibox[0]) { if (stat(node->ibox, &st) || (st.st_mode & S_IFDIR) == 0) Log (0, "Inbox for %s does not exist (link %s)", node->ibox, addr); if (arg && st.st_dev != *(dev_t *)arg) Log (0, "Inbox and temp-inbound must be in the same partition (link %s)", addr); } return 0; } static void check_config(void) { struct stat st, si; if (temp_inbound[0] && stat(temp_inbound, &st) == 0) { if (stat(inbound, &si) == 0 && st.st_dev != si.st_dev) Log (0, "Inbound and temp-inbound must be in the same partition"); if (stat(inbound_nonsecure, &si) == 0 && st.st_dev != si.st_dev) Log (0, "Unsecure-inbound and temp-inbound must be in the same partition"); } foreach_node(check_boxes, temp_inbound[0] ? &st.st_dev : NULL); } static void add_to_config_list(const char *path) { struct conflist_type *pc; if (config_list) { for (pc = config_list; pc->next; pc = pc->next); pc->next = xalloc(sizeof(*pc)); pc = pc->next; } else { config_list = xalloc(sizeof(*pc)); pc = config_list; } pc->next = NULL; pc->path = xstrdup(path); pc->mtime = 0; } /* * Parses and reads _path as config.file */ void readcfg (char *_path) { readcfg0 (_path); if ((iport = find_port (siport)) == 0 || (oport = find_port (soport)) == 0) Log (0, "cannot find the port number"); TEST (sysname); TEST (sysop); TEST (location); TEST (nodeinfo); if (!*inbound_nonsecure) strcpy (inbound_nonsecure, inbound); if (!nAddr) Log (0, "%s: your address should be defined", path); if (pDomains == 0) Log (0, "%s: at least one domain should be defined", path); if (debugcfg) debug_readcfg (); check_config(); } void readcfg0 (char *_path) { FILE *in; char buf[MAXCFGLINE + 1]; char *w; line = 0; path = _path; if ((in = fopen (path, "r")) == 0) Log (0, "%s: %s", path, strerror (errno)); if (checkcfg_flag) add_to_config_list (path); while (!feof (in)) { if (!fgets (buf, sizeof (buf), in)) break; ++line; if ((w = getword (buf, 1)) != 0) { int j; for (j = 0; keywords[j].key; ++j) if (!STRICMP (keywords[j].key, w)) break; if (keywords[j].key) { keywords[j].callback (keywords + j, buf); } else { Log (0, "%s: %i: %s: unknown keyword", path, line, w); } free (w); } } fclose (in); } /* * METHODS TO PROCESS KEYWORDS' ARGUMETS */ static void include (KEYWORD *key, char *s) { static int level = 0; if (++level > MAXINCLUDELEVEL) { Log (0, "%s: %i: too many nested include commands", path, line); } else { char *old_path = path; int old_line = line; char *w = getword (s, 2); if (w) { readcfg0 (w); free (w); } else Log (0, "%s: %i: filename expected", path, line); path = old_path; line = old_line; --level; } } static void passwords (KEYWORD *key, char *s) { FILE *in; char buf[MAXCFGLINE + 1]; char *w = getword(s, 2); FTN_ADDR fa; if(!w) Log (0, "%s: %i: password filename expected", path, line); if((in=fopen(w, "rt"))==NULL) Log (0, "%s: %i: unable to open password file (%s)", path, line, w); if (checkcfg_flag) add_to_config_list (w); free(w); while (!feof (in)) { if (!fgets (buf, sizeof (buf), in)) break; for (w = buf; isspace(w[0]); w++); /* skip spaces */ if (STRNICMP(w, "password", 8)==0) /* ifcico/qico password file */ { w += 8; while (isspace(*w)) w++; } if (w != buf) strcpy(buf, w); for (w = buf; (w[0]) && (!isspace(w[0])); w++); while (w[0] && isspace(w[0])) /* go to the password */ { w[0] = 0; w++; } if ((!w[0]) || (!parse_ftnaddress (buf, &fa))) { if (*w && *buf != ';' && *buf != '#') Log (1, "%s: invalid FTN address", buf); continue; /* Do not process if any garbage found */ } exp_ftnaddress (&fa); strcpy(buf, w); for (w=buf; (w[0]) && (!isspace(w[0])); w++); w[0]=0; if (!add_node (&fa, NULL, buf, '-', NULL, NULL, NR_USE_OLD, ND_USE_OLD, MD_USE_OLD, RIP_USE_OLD)) Log (0, "%s: add_node() failed", w[0]); } fclose(in); } static void read_aka_list (KEYWORD *key, char *s) { int i; char *w; for (i = 1; (w = getword (s, i + 1)) != 0; ++i) { pAddr = xrealloc (pAddr, sizeof (FTN_ADDR) * (nAddr + 1)); if (!parse_ftnaddress (w, pAddr + nAddr)) { Log (0, "%s: %i: %s: the address cannot be parsed", path, line, w); } if (!is4D (pAddr + nAddr)) { Log (0, "%s: %i: %s: must be at least a 4D address", path, line, w); } if (!pAddr[nAddr].domain[0]) { if (!pDomains) Log (0, "%s: %i: at least one domain must be defined first", path, line); strcpy (pAddr[nAddr].domain, get_def_domain ()->name); } ++nAddr; free (w); } } static void read_domain_info (KEYWORD *key, char *s) { char *w1 = getword (s, 2); char *w2 = getword (s, 3); char *w3 = getword (s, 4); FTN_DOMAIN *new_domain; if (!w1 || !w2 || !w3) Log (0, "%s: %i: domain: not enough args", path, line); if (get_domain_info (w1) == 0) { new_domain = xalloc (sizeof (FTN_DOMAIN)); strnzcpy (new_domain->name, w1, sizeof (new_domain->name)); if (!STRICMP (w2, "alias-for")) { FTN_DOMAIN *tmp_domain; if ((tmp_domain = get_domain_info (w3)) == 0) Log (0, "%s: %i: %s: undefined domain", path, line, w3); else new_domain->alias4 = tmp_domain; free (w2); } else { char *s; int z; if ((z = atoi (w3)) <= 0) Log (0, "%s: %i: invalid zone", path, line); new_domain->z = xalloc (sizeof (int) * 2); new_domain->z[0] = z; new_domain->z[1] = 0; new_domain->alias4 = 0; for (s = w2 + strlen (w2) - 1; (*s == '/' || *s == '\\') && s >= w2; --s) *s = 0; if ((s = max (strrchr (w2, '\\'), strrchr (w2, '/'))) == 0) { new_domain->dir = w2; new_domain->path = xstrdup ("."); } else { new_domain->dir = xstrdup (s + 1); for (; *s == '/' || *s == '\\'; --s) *s = 0; new_domain->path = w2; } if (strchr (new_domain->dir, '.')) Log (0, "%s: %i: there should be no extension for " "the base outbound name", path, line); } new_domain->next = pDomains; pDomains = new_domain; } else { Log (0, "%s: %i: %s: duplicate domain", path, line, w1); } free (w1); free (w3); } static void check_dir_path (char *s) { if (s) { char *w = s + strlen (s) - 1; while (w >= s && (*w == '/' || *w == '\\')) *(w--) = 0; } } static void read_node_info (KEYWORD *key, char *s) { #define ARGNUM 6 char *w[ARGNUM], *tmp; int i, j; int NR_flag = NR_USE_OLD, ND_flag = ND_USE_OLD, MD_flag = MD_USE_OLD, restrictIP = RIP_USE_OLD; FTN_ADDR fa; memset (w, 0, sizeof (w)); i = 0; /* index in w[] */ j = 2; /* number of word in the source string */ if(key->option1) /* defnode */ { w[i++]=xstrdup("0:0/0.0@defnode"); havedefnode=1; } while (1) { if ((tmp = getword (s, j++)) == NULL) break; if (tmp[0] == '-') { if (tmp[1] != '\0') { if (STRICMP (tmp, "-md") == 0) MD_flag = MD_ON; else if (STRICMP (tmp, "-nomd") == 0) MD_flag = MD_OFF; else if (STRICMP (tmp, "-nr") == 0) NR_flag = NR_ON; else if (STRICMP (tmp, "-nd") == 0) { NR_flag = NR_ON; ND_flag = ND_ON; } else if (STRICMP (tmp, "-ip") == 0) restrictIP = RIP_ON; /* allow matched or unresolvable */ else if (STRICMP (tmp, "-sip") == 0) restrictIP = RIP_SIP; /* allow only resolved and matched */ else if (STRICMP (tmp, "-crypt") == 0) Log (1, "%s: %i: obsolete %s option ignored", path, line, tmp); else Log (0, "%s: %i: %s: unknown option for `node' keyword", path, line, tmp); } else { /* Process "-": skip w[i]. Let it be filled with default NULL */ ++i; } } else if (i >= ARGNUM) Log (0, "%s: %i: too many argumets for `node' keyword", path, line); else w[i++] = tmp; } if (i == 0) Log (0, "%s: %i: the address is not specified in the node string", path, line); if (!parse_ftnaddress (w[0], &fa)) Log (0, "%s: %i: %s: the address cannot be parsed", path, line, w[0]); else exp_ftnaddress (&fa); if (w[2] && w[2][0] == 0) Log (0, "%s: %i: empty password", path, line); if (w[3] && w[3][0] != '-' && !isflvr (w[3][0])) Log (0, "%s: %i: %s: incorrect flavour", path, line, w[3]); check_dir_path (w[4]); check_dir_path (w[5]); if (!add_node (&fa, w[1], w[2], (char)(w[3] ? w[3][0] : '-'), w[4], w[5], NR_flag, ND_flag, MD_flag, restrictIP)) Log (0, "%s: add_node() failed", w[0]); for (i = 0; i < ARGNUM; ++i) if (w[i]) free (w[i]); #undef ARGNUM } /* * Gets hostname/portnumber for ``n''-th host in ``src'' string (1 ... N) * = [ "," ] * = "*" * = [ ":" ] * * "*" will expand in corresponding domain name for ``fn'' * (2:5047/13 --> "f13.n5047.z2.fidonet.net.") * * ``Host'' should contain at least MAXHOSTNAMELEN bytes. * * Returns 0 on error, -1 on EOF, 1 otherwise */ int get_host_and_port (int n, char *host, unsigned short *port, char *src, FTN_ADDR *fa) { int rc = 0; char *s = getwordx2 (src, n, 0, ",;", ""); if (s) { char *t = strchr (s, ':'); if (t) *t = 0; if (!strcmp (s, "*")) ftnaddress_to_domain (host, fa); else strnzcpy (host, s, MAXHOSTNAMELEN); if (!t) { *port = oport; rc = 1; } else if ((*port = find_port (t + 1)) != 0) rc = 1; free (s); } else rc = -1; return rc; } /* * Read a string (key->option1 == 0) * or a directory name (key->option1 == 'd') * or a file name (key->option1 == 'f') */ static void read_string (KEYWORD *key, char *s) { struct stat sb; char *target = (char *) (key->var); char *w; if ((w = getword (s, 2)) == NULL) Log (0, "%s: %i: missing an argument for `%s'", path, line, key->key); if (getword (s, 3) != NULL) Log (0, "%s: %i: extra arguments for `%s'", path, line, key->key); strnzcpy (target, w, key->option1 == 0 ? key->option2 : MAXPATHLEN); free (w); if (key->option1 != 0) { w = target + strlen (target) - 1; while (w >= target && (*w == '/' || *w == '\\')) { if (key->option1 == 'f') { Log (0, "%s: %i: unexpected `%c' at the end of filename", path, line, *w); } *(w--) = 0; } if (key->option1 == 'd' && (stat (target, &sb) == -1 || !(sb.st_mode & S_IFDIR))) { Log (0, "%s: %i: %s: incorrect directory", path, line, target); } } } static void read_int (KEYWORD *key, char *s) { int *target = (int *) (key->var); char *w; if ((w = getword (s, 2)) == NULL) Log (0, "%s: %i: missing an argument for `%s'", path, line, key->key); if (getword (s, 3) != NULL) Log (0, "%s: %i: extra arguments for `%s'", path, line, key->key); *target = atoi (w); free (w); if ((key->option1 != DONT_CHECK && *target < key->option1) || (key->option2 != DONT_CHECK && *target > key->option2)) Log (0, "%s: %i: %i: incorrect value", path, line, *target); } static void read_inboundcase (KEYWORD *key, char *s) { enum inbcasetype *target = (enum inbcasetype *) (key->var); char *w; if ((w = getword (s, 2)) == NULL) Log (0, "%s: %i: missing an argument for `%s'", path, line, key->key); if (getword (s, 3) != NULL) Log (0, "%s: %i: extra arguments for `%s'", path, line, key->key); *target = 0; if (!STRICMP (w, "save")) *target = INB_SAVE; else if (!STRICMP (w, "upper")) *target = INB_UPPER; else if (!STRICMP (w, "lower")) *target = INB_LOWER; else if (!STRICMP (w, "mixed")) *target = INB_MIXED; else Log (0, "%s: %i: the syntax is incorrect for '%s'", path, line, key->key); free (w); } #if defined (HAVE_VSYSLOG) && defined (HAVE_FACILITYNAMES) static void read_syslog_facility (KEYWORD *key, char *s) { int *target = (int *) (key->var); char *w; if ((w = getword (s, 2)) != 0 && getword (s, 3) == 0) { int i; for (i = 0; facilitynames[i].c_name; ++i) if (!strcmp (facilitynames[i].c_name, w)) break; if (facilitynames[i].c_name == 0) Log (0, "%s: %i: %s: incorrect facility name", path, line, w); *target = facilitynames[i].c_val; free (w); } else Log (0, "%s: %i: the syntax is incorrect", path, line); } #endif static void read_rfrule (KEYWORD *key, char *s) { char *w1, *w2; if ((w1 = getword (s, 2)) != 0 && (w2 = getword (s, 3)) != 0 && getword (s, 4) == 0) { rf_rule_add (w1, w2); } else Log (0, "%s: %i: the syntax is incorrect", path, line); } static void mask_add(char *mask, struct maskchain **chain) { struct maskchain *ps; if (*chain == NULL) { *chain = xalloc(sizeof(**chain)); ps = *chain; } else { for (ps = *chain; ps->next; ps = ps->next); ps->next = xalloc(sizeof(*ps)); ps = ps->next; } ps->next = NULL; ps->mask = xstrdup(mask); } char *mask_test(char *netname, struct maskchain *chain) { struct maskchain *ps; for (ps = chain; ps; ps = ps->next) if (pmatch(ps->mask, netname)) return ps->mask; return NULL; } static void read_mask (KEYWORD *key, char *s) { char *w; int i; for (i=2; (w = getword (s, i)) != NULL; i++) mask_add (w, (struct maskchain **) (key->var)); if (i == 2) Log (0, "%s: %i: the syntax is incorrect", path, line); } static void read_bool (KEYWORD *key, char *s) { if (getword (s, 2) == 0) { *(int *) (key->var) = 1; } else Log (0, "%s: %i: the syntax is incorrect", path, line); } static void read_flag_exec_info (KEYWORD *key, char *s) { EVT_FLAG *tmp; char *path, *w, **body; int i; static EVT_FLAG *last = 0; if ((path = getword (s, 2)) == 0) Log (0, "%s: %i: the syntax is incorrect", path, line); for (i = 2; (w = getword (s, i + 1)) != 0; ++i) { tmp = xalloc (sizeof (EVT_FLAG)); memset (tmp, 0, sizeof (EVT_FLAG)); if (key->option1 == 'f') body = &(tmp->path); else if (key->option1 == 'e') body = &(tmp->command); else continue; /* should never happens */ *body = path; if (**body == '!') { tmp->imm = 1; body[0]++; } tmp->pattern = w; strlower (tmp->pattern); tmp->next = 0; if (last == 0) evt_flags = tmp; else last->next = tmp; last = tmp; } } void debug_readcfg (void) { int i; char buf[80]; FTN_DOMAIN *curr_domain; printf ("addr:"); for (i = 0; i < nAddr; ++i) { ftnaddress_to_str (buf, pAddr + i); printf (" %s", buf); } printf ("\n"); for (curr_domain = pDomains; curr_domain; curr_domain = curr_domain->next) { if (curr_domain->alias4 == 0) printf ("`%s', `%s', `%s'.\n", curr_domain->name, curr_domain->path, curr_domain->dir); else printf ("`%s' alias for `%s'.\n", curr_domain->name, curr_domain->alias4->name); } printf ("\n"); print_node_info (stdout); printf ("\n"); } binkd/ftnnode.c0000664000076400007640000002137207704047760012140 0ustar gulgul/* * ftnnode.c -- Handle our links * * ftnnode.c is a part of binkd project * * Copyright (C) 1996-1998 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: ftnnode.c,v 2.12.2.2 2003/07/12 18:14:08 gul Exp $ * * $Log: ftnnode.c,v $ * Revision 2.12.2.2 2003/07/12 18:14:08 gul * Fixed node output on debugcfg * * Revision 2.12.2.1 2003/06/30 22:49:39 hbrew * Allow to override -ip, -sip, -md, -nomd in add_node() * * Revision 2.12 2003/05/04 08:49:05 gul * Fix previous patch * * Revision 2.11 2003/05/04 08:45:30 gul * Lock semaphores more safely for resolve and IP-addr print * * Revision 2.10 2003/05/01 09:55:01 gul * Remove -crypt option, add global -r option (disable crypt). * * Revision 2.9 2003/04/23 04:35:34 gul * Fix semaphores usage * * Revision 2.8 2003/03/31 19:51:29 gul * Fix prev patch * * Revision 2.7 2003/03/31 19:35:16 gul * Clean semaphores usage * * Revision 2.6 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.5 2003/02/22 15:53:45 gul * Bugfix with locking array of nodes in multithread version * * Revision 2.4 2003/02/22 14:30:18 gul * Make nNod var static * * Revision 2.3 2003/02/22 12:12:33 gul * Cleanup sources * * Revision 2.2 2002/05/10 17:46:06 gul * passwords file usage bugfix * * Revision 2.1 2001/02/15 11:03:18 gul * Added crypt traffic possibility * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.3 1997/11/03 06:10:39 mff * +nodes_init() * * Revision 1.2 1997/10/23 04:07:55 mff * many changes to hide pNod int ftnnode.c * * Revision 1.1 1996/12/29 09:41:37 mff * Initial revision */ #include #include #include "assert.h" #include "ftnnode.h" #include "ftnq.h" #include "tools.h" #include "sem.h" #include "readcfg.h" #if defined(HAVE_THREADS) || defined(AMIGA) static MUTEXSEM NSem; #endif static int nNod = 0; static FTN_NODE *pNod = 0; static int nNodSorted = 0; /* * Call this before all others functions from this file. */ void nodes_init (void) { InitSem (&NSem); } void locknodesem (void) { LockSem (&NSem); } void releasenodesem (void) { ReleaseSem (&NSem); } void nodes_deinit(void) { CleanSem (&NSem); } /* * Compares too nodes. 0 == don't match */ static int node_cmp (FTN_NODE *a, FTN_NODE *b) { return ftnaddress_cmp (&a->fa, &b->fa); } /* * Sorts pNod array. Must NOT be called if NSem is locked! */ static void sort_nodes (void) { qsort (pNod, nNod, sizeof (FTN_NODE), (int (*) (const void *, const void *)) node_cmp); nNodSorted = 1; } /* * Add a new node, or edit old settings for a node * * 1 -- ok, 0 -- error; */ static int add_node_nolock(FTN_ADDR *fa, char *hosts, char *pwd, char obox_flvr, char *obox, char *ibox, int NR_flag, int ND_flag, int MD_flag, int restrictIP) { int cn; for (cn = 0; cn < nNod; ++cn) { if (!ftnaddress_cmp (&pNod[cn].fa, fa)) break; } /* Node not found, create new entry */ if (cn >= nNod) { cn = nNod; pNod = xrealloc (pNod, sizeof (FTN_NODE) * ++nNod); memset (pNod + cn, 0, sizeof (FTN_NODE)); memcpy (&pNod[cn].fa, fa, sizeof (FTN_ADDR)); strcpy (pNod[cn].pwd, "-"); pNod[cn].hosts = NULL; pNod[cn].obox_flvr = 'f'; pNod[cn].NR_flag = NR_OFF; pNod[cn].ND_flag = ND_OFF; pNod[cn].MD_flag = MD_USE_OLD; pNod[cn].restrictIP = RIP_OFF; /* We've broken the order... */ nNodSorted = 0; } if (MD_flag != MD_USE_OLD) pNod[cn].MD_flag = MD_flag; if (restrictIP != RIP_USE_OLD) pNod[cn].restrictIP = restrictIP; if (NR_flag != NR_USE_OLD) pNod[cn].NR_flag = NR_flag; if (ND_flag != ND_USE_OLD) pNod[cn].ND_flag = ND_flag; if (hosts && *hosts) { if (pNod[cn].hosts) free (pNod[cn].hosts); pNod[cn].hosts = xstrdup (hosts); } if (pwd && *pwd && strcmp(pwd, "-")) { strnzcpy (pNod[cn].pwd, pwd, sizeof (pNod[cn].pwd)); } if (obox_flvr != '-') { pNod[cn].obox_flvr = obox_flvr; } if (obox) { if (pNod[cn].obox) free (pNod[cn].obox); pNod[cn].obox = xstrdup (obox); } if (ibox) { if (pNod[cn].ibox) free (pNod[cn].ibox); pNod[cn].ibox = xstrdup (ibox); } return 1; } int add_node (FTN_ADDR *fa, char *hosts, char *pwd, char obox_flvr, char *obox, char *ibox, int NR_flag, int ND_flag, int MD_flag, int restrictIP) { int res; locknodesem(); res = add_node_nolock(fa, hosts, pwd, obox_flvr, obox, ibox, NR_flag, ND_flag, MD_flag, restrictIP); releasenodesem(); return res; } static FTN_NODE *get_defnode_info(FTN_ADDR *fa, FTN_NODE *on) { struct hostent *he; FTN_NODE n, *np; char host[MAXHOSTNAMELEN + 1]; /* current host/port */ unsigned short port; int i; strcpy(n.fa.domain, "defnode"); n.fa.z=n.fa.net=n.fa.node=n.fa.p=0; np = (FTN_NODE *) bsearch (&n, pNod, nNod, sizeof (FTN_NODE), (int (*) (const void *, const void *)) node_cmp); if (!np) /* we don't have defnode info */ return on; for (i=1; get_host_and_port(i, host, &port, np->hosts, fa)==1; i++) { lockresolvsem(); he=gethostbyname(host); releaseresolvsem(); if (!he) continue; sprintf (host+strlen(host), ":%d", port); i=0; break; } if (i) strcpy(host, "-"); if (on) { /* on contains only passwd */ on->hosts=xstrdup(host); on->NR_flag=np->NR_flag; on->ND_flag=np->ND_flag; on->MD_flag=np->MD_flag; on->ND_flag=np->ND_flag; on->restrictIP=np->restrictIP; return on; } if(!add_node_nolock(fa, host, NULL, np->obox_flvr, np->obox, np->ibox, np->NR_flag, np->ND_flag, np->MD_flag, np->restrictIP)) return NULL; sort_nodes (); memcpy (&n.fa, fa, sizeof (FTN_ADDR)); return (FTN_NODE *) bsearch (&n, pNod, nNod, sizeof (FTN_NODE), (int (*) (const void *, const void *)) node_cmp); } /* * Return up/downlink info by fidoaddress. 0 == node not found */ FTN_NODE *get_node_info (FTN_ADDR *fa) { FTN_NODE n, *np; if (!nNodSorted) sort_nodes (); memcpy (&n.fa, fa, sizeof (FTN_ADDR)); np = (FTN_NODE *) bsearch (&n, pNod, nNod, sizeof (FTN_NODE), (int (*) (const void *, const void *)) node_cmp); if ((!np || !np->hosts) && havedefnode) np=get_defnode_info(fa, np); else if (np && !np->hosts) /* node exists only in passwords and defnode is not defined */ np->hosts = xstrdup("-"); return np; } /* * Find up/downlink info by fidoaddress and write info into node var. * Return pointer to node structure or NULL if node not found. */ FTN_NODE *get_node (FTN_ADDR *fa, FTN_NODE *node) { FTN_NODE *n; locknodesem(); if ((n = get_node_info(fa)) == NULL) { releasenodesem(); return NULL; } memcpy(node, n, sizeof(*node)); releasenodesem(); return node; } /* * Iterates through nodes while func() == 0. */ int foreach_node (int (*func) (FTN_NODE *, void *), void *arg) { int i, rc = 0; locknodesem(); for (i = 0; i < nNod; ++i) { if (!pNod[i].hosts) rc = func (get_node_info(&(pNod[i].fa)), arg); else rc = func (pNod + i, arg); if (rc != 0) break; } releasenodesem(); return rc; } static int print_node_info_1 (FTN_NODE *fn, void *arg) { char szfa[FTN_ADDR_SZ + 1]; ftnaddress_to_str (szfa, &fn->fa); fprintf ((FILE *) arg, "%-20.20s %s %s %c %s %s%s%s%s%s%s%s\n", szfa, fn->hosts ? fn->hosts : "-", fn->pwd, fn->obox_flvr, fn->obox ? fn->obox : "-", fn->ibox ? fn->ibox : "-", (fn->NR_flag == NR_ON) ? " -nr" : "", (fn->ND_flag == ND_ON) ? " -nd" : "", (fn->ND_flag == MD_ON) ? " -md" : "", (fn->ND_flag == MD_OFF) ? " -nomd" : "", (fn->restrictIP == RIP_ON) ? " -ip" : "", (fn->restrictIP == RIP_SIP) ? " -sip" : ""); return 0; } void print_node_info (FILE *out) { foreach_node (print_node_info_1, out); } /* * Create a poll for an address (in "z:n/n.p" format) (0 -- bad) */ int poll_node (char *s) { FTN_ADDR target; if (!parse_ftnaddress (s, &target)) { Log (1, "`%s' cannot be parsed as a Fido-style address\n", s); return 0; } else { char buf[FTN_ADDR_SZ + 1]; exp_ftnaddress (&target); ftnaddress_to_str (buf, &target); Log (4, "creating a poll for %s (`%c' flavour)", buf, POLL_NODE_FLAVOUR); locknodesem(); if (!get_node_info (&target)) if (!add_node_nolock (&target, "*", 0, '-', 0, 0, 0, 0, 0, 0)) Log (1, "%s: add_node() failed", buf); releasenodesem(); return create_poll (&target, POLL_NODE_FLAVOUR); } } binkd/!README0000664000076400007640000000210511071063000011222 0ustar gulgulCOMPILING --------- non-UNIX: 1. Find in mkfls/ a subdirectory for your system/compiler, copy all files to the root of the sources. 2. Run make. UNIXes: 1. Copy all files from mkfls/unix/ to the root of binkd sources: cd /usr/src/binkd-0.9.11 cp mkfls/unix/* . 2. Run configure: sh configure 3. Run make. INSTALLATION ------------ 1. Edit sample binkd.cfg. 2. Run binkd. MORE INFO --------- 1. RU.BINKD echoarea. 2. http://www.corbina.net/~maloff/binkd/ ftp://happy.kiev.ua/pub/fidosoft/mailer/binkd/ Mirror sites: ftp://fido.thunderdome.ws/pub/mirror/binkd/ ftp://cheetah.itpark.ua/pub/fido/binkd/ ftp://ftp.alexblues.ru/pub/binkd/ ftp://cube.sut.ru/pub/mirror/binkd/ Documentation: http://www.doe.carleton.ca/~nsoveiko/fido/binkd/man/ (c) Nick Soveiko 3. Authors: Dmitry Maloff and others. Bug reporting: binkd-bugs@happy.kiev.ua, 2:463/68. Binkd developers mailing list binkd-dev@happy.kiev.ua (send "subscribe binkd-dev" to majordomo@happy.kiev.ua for subscribe). binkd/srif.h0000664000076400007640000000324407435307132011442 0ustar gulgul/* * srif.h -- Create flags or run external programs on mail events * * srif.h is a part of binkd project * * Copyright (C) 1996-1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: srif.h,v 2.1 2002/02/22 00:18:34 gul Exp $ * * $Log: srif.h,v $ * Revision 2.1 2002/02/22 00:18:34 gul * Run by-file events with the same command-line once after session * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.3 1997/10/23 03:37:25 mff * *** empty log message *** * * Revision 1.2 1997/03/28 06:12:48 mff * Changes to support SRIF: + evt_run(), etc. */ #ifndef _srif_h #define _srif_h #include "ftnq.h" #include "readcfg.h" #include "prothlp.h" #include "protoco2.h" typedef struct _EVT_FLAG EVT_FLAG; struct _EVT_FLAG { EVT_FLAG *next; char *path; /* Set this flag if != NULL */ char *command; /* Run this command if != NULL */ char *pattern; int imm; /* Immediate flag */ }; extern EVT_FLAG *evt_flags; /* * Tests if filename matches any of EVT_FLAG's patterns. */ int evt_test (EVTQ **eq, char *filename); /* * Runs external programs using S.R.I.F. interface * if the name matches one of our "exec"'s */ FTNQ *evt_run (EVTQ **eq, FTNQ *q, char *filename0, FTN_ADDR *fa, int nfa, int prot, int listed, char *peer_name, STATE *st); /* * Sets flags for all matched with evt_test events */ void evt_set (EVTQ *eq); #endif binkd/prothlp.h0000664000076400007640000000470407630176040012170 0ustar gulgul/* * prothlp.h -- Some tools for protocol.c * * prothlp.h is a part of binkd project * * Copyright (C) 1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: prothlp.h,v 2.2 2003/03/01 18:29:52 gul Exp $ * * $Log: prothlp.h,v $ * Revision 2.2 2003/03/01 18:29:52 gul * Change size_t to off_t for file sizes and offsets * * Revision 2.1 2002/02/22 00:18:34 gul * Run by-file events with the same command-line once after session * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.1 1997/03/28 06:49:13 mff * Initial revision * */ #ifndef _prothlp_h #define _prothlp_h #include "ftnq.h" /* A file in transfer */ typedef struct _TFILE TFILE; struct _TFILE { char path[MAXPATHLEN + 1]; /* It's name */ char flo[MAXPATHLEN + 1]; /* It's .?lo */ char netname[MAX_NETNAME + 1]; /* It's "netname" */ char action; /* 'd'elete, 't'runcate, '\0' -- * * * none */ char type; off_t size; time_t start; /* The transfer started at... */ time_t time; /* Filetime */ FILE *f; }; #define TF_ZERO(a) (memset(a, 0, sizeof(*a))) int tfile_cmp (TFILE *a, char *netname, off_t size, time_t time); /* Files to kill _after_ session */ typedef struct _KILLLIST KILLLIST; struct _KILLLIST { char name[MAXPATHLEN + 1]; /* file's name */ char cond; /* after 's'uccessful session, * '\0' -- in any case */ }; typedef struct _EVTQ { char *path; struct _EVTQ *next; char evt_type; } EVTQ; /* Adds a file to killlist */ void add_to_killlist (KILLLIST **killlist, int *n_killlist, char *name, int cond); void q_to_killlist (KILLLIST **killlist, int *n_killlist, FTNQ *q); void free_killlist (KILLLIST **killlist, int *n_killlist); void process_killlist (KILLLIST *killlist, int n_killlist, int flag); /* List of files received in the current batch */ typedef struct _RCVDLIST RCVDLIST; struct _RCVDLIST { char name[MAXPATHLEN + 1]; /* file's name */ }; /* Adds a file to rcvdlist */ void add_to_rcvdlist (RCVDLIST **rcvdlist, int *n_rcvdlist, char *name); void free_rcvdlist (RCVDLIST **rcvdlist, int *n_rcvdlist); /* Creates a netname from a local name */ void netname (char *s, TFILE *q); #endif binkd/binkd.cfg0000664000076400007640000002201111622760760012072 0ustar gulgul# Binkd sample configuration file # Copyright (C) 1996-1997 Dima Maloff, 2:5047/13 # Copyright (C) 1998-2009 Binkd Development Team # $Id: binkd.cfg,v 2.13.2.9 2011/08/17 15:44:48 stas Exp $ # Dump configuration (and not exit). Use for debugging only, #debugcfg # # Your FTN domains: # domain # or # domain alias-for # domain fidonet c:\\fido\\outbound\\fidonet 2 domain fidonet.org alias-for fidonet domain fidonet.net alias-for fidonet domain fidonet.rus alias-for fidonet domain fido alias-for fidonet domain fidorus alias-for fidonet domain fido7 alias-for fidonet # # Your addresses, 4D or 5D: # address ... # address 2:5047/999@fidonet 2:5020/999.1@fidonet # # The name of your system, its location and your name # sysname "Ivan's BBS" location "Magadan, Russia" sysop "Ivan Ivanov" # # System capabilities # nodeinfo 115200,TCP,BINKP # # TCP settings. Leave this unchanged if not sure. # #iport binkp #oport binkp #oblksize 4096 #timeout 300 #connect-timeout 300 #bindaddr 192.168.0.3 # # HTTPS or SOCKS settings. Require build with feature https (configure --with-https) # # proxy 192.168.0.3:3128 <- regular http/https proxy (i.e. squid) # proxy 192.168.0.3:3128/user/password <- proxy required username/password # (as in browser) # # proxy 192.168.0.3:3128/user/password/your_host/your_domain # ^- proxy required NTLM authorization with username/password # Require build with feature ntlm (configure --with-ntlm) # your_host -- Windows host name without domain (i.e. MY_HOST) # your_domain -- Windows domain name (not FQDN, i.e. DEFAULT_DOMAIN) # # socks 192.168.0.3:1080 <- socks4 proxy # socks 192.168.0.3:1080/ <- socks5 proxy without authorization # socks 192.168.0.3:1080/user/password <- socks5 proxy with username/password # (RFC-1929) # # Delay of calls and outbound rescans # #call-delay 60 #rescan-delay 60 # # Max. number of inbound/outbound connections # #maxservers 2 #maxclients 2 # # Binkd will try to call a node N times. If failed it will # hold the node for S seconds. The feature is off by default. # try 10 hold 600 # # hold-skipped # Binkd will hold for S seconds all mail skipped by a node. (Def. -- 3600) # #hold-skipped 3600 # # Don't send (only receive) files if no password for an inbound session # send-if-pwd # # Path and name for the logfile, loglevel # log binkd.log loglevel 6 # # Uncomment it if you want binkd's log at your console # conlog 4 # # Uncomment if you want T-Mail(FrontDoor)-style binary log # (Will work and have sense on PCs only?) # Tzoff corrects UTC time returned by time() under DOS-derived OS # #binlog binkd.sts #fdinhist in.his #fdouthist out.his #tzoff 10800 # # Use syslog (Only if made with -DHAVE_VSYSLOG and -DHAVE_FACILITYNAMES) # #syslog local0 # # Print percents while sending or receiving # percents # # List queue after rescans. May produce extra output in console # printq # # Perform reverse resolving (for logging only) # backresolv # # Log pid: # #pid-file /var/run/binkd.pid # # Map paths in flo's: # ftrans # Use as many ftrans's as you want. # #ftrans "D:\\fido\\outbound" "/var/spool/fido/outb" #ftrans "\\" "/" # this replaces all slashes in a path # # Inbound directory for secure and non-secure links # inbound c:\\fido\\inbound inbound-nonsecure c:\\fido\\inbound\\unknown # # Directory for incomplete receiving files (.hr and .dt), # default to inbound for the node # temp-inbound c:\\fido\\inbound\\incomplete # # Binkd will skip all files from a node if # size_of_the_next_file_for_us_there + minfree < free_space_in_inbound # minfree 2048 minfree-nonsecure 2048 # # When trying to receive a new file: remove partial files with this # name but different size or time from inbound. (If commented out, binkd # will left old parts as .dt and .hr in the inbound directory) # kill-dup-partial-files # # Remove all old partial files from inbound. (OFF if commented out) # kill-old-partial-files # kill-old-partial-files 86400 # # Remove old .bsy/.csy files (If some are left after a system crash). It would # be wise to set this to 43200 (12 hrs) on almost any system. (Note that binkd # always touches .bsy's/.csy's for active sessions) # # kill-old-bsy is OFF by default. # #kill-old-bsy 43200 # # Create a flag file after receiving a file # #flag toss!.now *.pkt #flag toss!.now *.su? *.mo? *.tu? *.we? *.th? *.fr? *.sa? # # Run an external program. # The "*S" macro in command line substed with S.R.I.F., see !SRIF.TXT # The "!" before program pathname means immediate program execution # after receiving the file. # *** win32 only: # The "@" before program pathname means execute program in separate console # The "@@" before program pathname means execute program in hidden console # *** # Macros: *F - complete name of received file, # *A0..*A9 - first 10 AKA of remote system, # *A*, *A@ - list of all remote AKA separated by spaces # *P - password protected [0|1], # *L - listed system [0|1] # *H - remote hostname or IP, # *N - short file name (win32 only). # #exec "my-freq-processor.exe /options *S" *.req #exec "my-pkt-unpacker.exe /options *S" *.pkt # # Include a file # #include binkd.inc # # Overrides root domain for DNS lookups, see `node' below. # #root-domain binkp.net # # Scan T-Mail boxes (short and long) # filebox c:\\fido\\tmail\\boxes # # Scan theBrake! long boxes # brakebox c:\\fido\\brake\\boxes # # Should binkd delete empty boxes? # uncomment the following line if yes # #deletebox # # Scan node outbound while connecting and send mail size to remote # prescan # # t-mail, ifcico or qico passwords file # Format of passwords file: # [password] # where: # [password] optional token "password" # address of a link in the form 1:2/3.4@domain # or 1:2/3@domain or 1:2/3 or 1:2/3.4 # secret password (one word, without spaces or tabs) # #passwords c:\\fido\\t-mail\\password.lst # # Skip (destructive!) this files # #skipmask pm2*.* *.mp3 # # Overwrite the existing file by the new received, # do not save with the changed extension # #overwrite net_*.* # # Inbound filename case: # inboundcase [save(default)|upper|lower|mixed] # # 'save' don't change filename case (default) # 'upper' uppercase filename (FILE-NAME.EXT) # 'lower' lowercase filename (file-name.ext) # 'mixed' make filename pretty (File-Name.Ext) # # * tested only with english filenames # #inboundcase save # # Should binkd delete empty point dirs in BSO? # Uncomment the following line if yes # #deletedirs # # Use Amiga Style Outbound (ASO), require build with enabled feature "aso" (configure --with-aso) # #aso # # Define a link: # node [[z:]n/]n[.p][@domain] [-nr|-nd] [-md] [-ip|-sip] [{hosts|-} [{pwd|-} [flavour [{obox|-} [{ibox|-}]]]]] # # * All non-"-" fields will redefine the values specified for the same node # earlier in config. # * Flavour is one of i, c, d, -, h; and is the flavour for the outbound # filebox ("obox"). # * Binkd sends from obox all non-dir entries NOT matching ".*" wildcard. # EVERY TIME YOU PUT A FILE INTO OBOX CHECK IF BINKD WILL BE ABLE TO # UNLINK IT. Otherwise, the session will never end. # * Default for ibox is inbound or inbound-nosecure depending on the pwd field. # * Default for port is oport. # * `-nr' stands for `Not Reliable Link', this works only on outbound calls # with another binkp/1.1 mailer. The option solves the only problem with # binkd having no enough time to start receiving of a file from # non-zero offset before IP link's down, so don't use it unless you # have this problem -- really not effective # * `-nd' means "No Dupe Mode", this works only on outbound calls with # another binkd 0.9.3 or higher. The option solves problem with # duplicating files while losts carrier but link is a bit slower # then with "-nr" option # * `-md' means "Must have CRAM-MD5". This works only with nodes with # binkd or argus supported this method. Do not set it if your link # can use the old version of binkd. # * `-nomd' - do not use CRAM-MD5 for this node (send plain text password) # * `-ip' means "Remote IP check". In this case the node will be # rejected if it comes not from one of its IP-addresses. # * `-sip' means "Strict remote IP check". Like "-ip", but node will be # rejected if no IP-addresses allowed ("-" or not resolved). # * Hosts is a list in form # host1[:port1][;host2[:port2]] ... # * Asterisk (`*') in the host list forces Binkd to perform # 1:2/3.4 --> p4.f3.n2.z1.binkp.net translation for a node's # Fido-address and lookup IP for the resulting FQDN in DNS. # Root domain part ("binkp.net") can be changed with root-domain # keyword. # node 5047/888 - password node 5047/999 hostname;* password i c:\\fido\\boxes\\to999 c:\\fido\\boxes\\from999 # # Default node flags. Binkd will call unlisted node if "defnode" defined. # #defnode -nr * binkd/protocol.c0000664000076400007640000021265111145542032012330 0ustar gulgul/* * protocol.c -- binkp implementation * * protocol.c is a part of binkd project * * Copyright (C) 1996-2004 Dima Maloff, 5047/13 and others * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: protocol.c,v 2.67.2.26 2009/02/14 13:16:10 gul Exp $ * * $Log: protocol.c,v $ * Revision 2.67.2.26 2009/02/14 13:16:10 gul * Bugfix: segfault on crafted input sequences, * possible remote DoS for multithread versions (win32 and OS/2). * Thanks to Dennis Yurichev. * * Revision 2.67.2.25 2008/01/14 20:46:39 gul * Workaroud bug of earlyer binkd versions with partial files and not NR-mode * * Revision 2.67.2.24 2008/01/14 11:45:46 gul * Fixed bug in protocol logic (partial files send without NR-mode) * * Revision 2.67.2.23 2006/07/24 20:47:47 gul * Use MSG_NOSIGNAL flag for send() * * Revision 2.67.2.22 2005/10/03 07:55:16 gul * Fixed memory leak (thanks to Roman Trunov) * * Revision 2.67.2.21 2005/10/02 18:01:28 gul * Verbously report about mail/files for us when receive TRF from remote. * * Revision 2.67.2.20 2005/10/02 15:23:35 gul * Fileboxes was not scanned for unlisted links * * Revision 2.67.2.19 2005/06/06 17:01:02 stream * Fixed broken ND-mode status. * * Revision 2.67.2.18 2004/11/08 12:05:33 gul * 0.9.8 release * * Revision 2.67.2.17 2004/10/21 17:02:03 gul * Rename trunc() -> trunc_file() due to conflicts under OS/2 EMX and SuSE * * Revision 2.67.2.16 2004/10/18 15:18:16 gul * Minor bugfix (patch from Victor Levenets ) * * Revision 2.67.2.15 2004/10/01 10:05:09 gul * Fixed memory leak * (Reported by Victor Levenets ) * * Revision 2.67.2.14 2003/09/15 21:28:31 gul * Fix remote IP check logic * * Revision 2.67.2.13 2003/08/29 13:37:37 gul * Do not save zero-length .dt files * * Revision 2.67.2.12 2003/08/27 06:46:37 gul * Migrate from stable branch: * remove partial if received part more then total size, * flush buffer after receive data frame, * drop session if extra bytes received. * * Revision 2.67.2.11 2003/08/24 18:58:33 gul * Bugfix in timeout check on win32 * * Revision 2.67.2.10 2003/08/24 01:34:11 hbrew * Update for previous patch * * Revision 2.67.2.9 2003/08/24 00:35:46 hbrew * Cosmetic change for previous patch * * Revision 2.67.2.8 2003/08/24 00:29:31 hbrew * win9x-select-workaround fix, thanks to Pavel Gulchouck) * * Revision 2.67.2.7 2003/08/17 08:11:06 gul * Migrate patch from current: * Drop remote AKA with another password on outgoing sessions * * Revision 2.67.2.5 2003/08/13 11:38:43 hbrew * Fix warning. * * Revision 2.67.2.4 2003/08/11 08:41:55 gul * workaround winsock bug (patch by Alexander Reznikov) * * Revision 2.67.2.3 2003/06/24 07:11:47 gul * Migrate try/hold behavior from current branch * * Revision 2.67.2.2 2003/06/21 19:36:13 gul * Fixed remote ip check * * Revision 2.67.2.1 2003/06/06 16:27:44 gul * Workaround winsock bug - giveup CPU when sending file * * Revision 2.67 2003/06/04 20:59:43 gul * bugfix: do not force NR-mode if remote uses binkp/1.0 * * Revision 2.66 2003/06/02 17:56:03 gul * Workaround old binkd bug in asymmetric NR-mode * * Revision 2.65 2003/06/02 17:29:28 gul * Bugfix in asymmetric ND-mode * * Revision 2.64 2003/05/30 17:15:22 gul * Asymmetric ND-mode, new protocol option NDA * * Revision 2.63 2003/05/30 16:03:10 gul * Asymmetric NR-mode * * Revision 2.62 2003/05/22 06:39:41 gul * Send CRYPT option only in crypt-mode sessions on answer * * Revision 2.61 2003/05/17 15:37:48 gul * Improve logging * * Revision 2.60 2003/05/17 15:33:51 gul * Improve logging * * Revision 2.59 2003/05/15 06:08:46 gul * Crypt bug with asymmetric secure settings * * Revision 2.58 2003/05/04 10:29:54 gul * Say "OPT ND" on answer only if this option specified in config for this node * * Revision 2.57 2003/05/04 08:45:30 gul * Lock semaphores more safely for resolve and IP-addr print * * Revision 2.56 2003/05/03 20:36:45 gul * Print diagnostic message to log on failed session * * Revision 2.55 2003/05/03 11:04:58 gul * Fix typo * * Revision 2.54 2003/05/03 10:56:00 gul * Bugfix in protocol logic (when file already exists) * * Revision 2.53 2003/05/03 08:41:16 gul * bugfix in protocol, when file already exists * * Revision 2.52 2003/05/01 09:55:01 gul * Remove -crypt option, add global -r option (disable crypt). * * Revision 2.51 2003/04/30 13:38:17 gul * Avoid warnings * * Revision 2.50 2003/04/28 07:30:16 gul * Bugfix: Log() changes TCPERRNO * * Revision 2.49 2003/04/04 13:54:28 gul * Bugfix in localtime detection * * Revision 2.48 2003/04/02 13:12:57 gul * Try to use workaround for buggy windows time functions (timezone) * * Revision 2.47 2003/03/31 20:28:24 gul * safe_localtime() and safe_gmtime() functions * * Revision 2.46 2003/03/31 14:25:36 gul * Segfault under FreeBSD * * Revision 2.45 2003/03/25 14:08:30 gul * Do not save empty partial files * * Revision 2.44 2003/03/11 00:04:25 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.43 2003/03/10 17:32:37 gul * Use socklen_t * * Revision 2.42 2003/03/10 10:39:23 gul * New include file common.h * * Revision 2.41 2003/03/05 13:21:51 gul * Fix warnings * * Revision 2.40 2003/03/04 13:46:27 gul * Small bugfix in binkp protocol logic * * Revision 2.39 2003/03/04 13:10:39 gul * Do not report errors when threads exits by exitfunc * * Revision 2.38 2003/03/04 09:50:58 gul * Cosmetics changes * * Revision 2.37 2003/03/03 20:16:32 gul * Fixed bug in previous patch * * Revision 2.36 2003/03/02 18:08:56 gul * Do not scan outbound twice: on prescan (for TRF report) and at complete_login * * Revision 2.35 2003/03/02 17:51:37 gul * Close received file before send M_GOT * * Revision 2.34 2003/03/02 14:30:02 gul * Drop unsecure AKA with bad source IP address, no drop session * * Revision 2.33 2003/03/01 20:49:21 gul * Fix spelling * * Revision 2.32 2003/03/01 18:29:52 gul * Change size_t to off_t for file sizes and offsets * * Revision 2.31 2003/03/01 18:16:04 gul * Use HAVE_SYS_TIME_H macro * * Revision 2.30 2003/03/01 15:55:02 gul * Current outgoing address is now attibute of session, but not node * * Revision 2.29 2003/03/01 15:00:16 gul * Join skipmask and overwrite into common maskchain * * Revision 2.28 2003/02/28 19:52:24 gul * Small optimize * * Revision 2.27 2003/02/23 16:47:07 gul * change restrictIP logic * * Revision 2.26 2003/02/23 16:31:21 gul * Add "-sip" option in node string. * Change "-ip" check logic. * * Revision 2.25 2003/02/22 20:19:54 gul * Update copyrightes, 2002->2003 * * Revision 2.24 2003/02/22 15:53:46 gul * Bugfix with locking array of nodes in multithread version * * Revision 2.23 2003/02/22 12:56:00 gul * Do not give unsecure mail to secure link when send-if-pwd * * Revision 2.22 2003/02/22 12:12:34 gul * Cleanup sources * * Revision 2.21 2003/02/22 11:45:41 gul * Do not resolve hosts if proxy or socks5 using * * Revision 2.20 2003/02/13 19:31:56 gul * Ignore non-MD5 challanges * * Revision 2.19 2003/01/29 20:53:34 gul * Assume default domain for remote 4D address * * Revision 2.18 2003/01/28 16:14:05 gul * Bugfix: binkd did not remove lo-files with empty lines * * Revision 2.17 2003/01/16 13:35:26 gul * Fixed crash on bad incoming packets * * Revision 2.16 2002/11/22 14:40:42 gul * Check free space on inbox if defined * * Revision 2.15 2002/10/22 20:29:46 gul * Do not send zero-length data packet as EOF * Prevent incorrect "remote already has ..." message * * Revision 2.14 2002/05/11 10:28:11 gul * fix spelling * * Revision 2.13 2002/05/11 10:27:22 gul * Do not send empty (60-bytes) pkt-files * * Revision 2.12 2002/02/22 08:57:23 gul * Pring warning if remote says "OK non-secure" and we have password * for the session * * Revision 2.11 2002/02/22 00:18:34 gul * Run by-file events with the same command-line once after session * * Revision 2.10 2001/07/28 17:26:26 gul * Avoid compiler warnings * * Revision 2.9 2001/07/28 09:56:39 gul * NR-mode bugfix * * Revision 2.8 2001/07/28 09:10:04 gul * minor fix in log messages * * Revision 2.7 2001/07/28 08:53:07 gul * set ND-mode bugfix * * Revision 2.6 2001/05/23 16:48:03 gul * msvc warnings fixed * * Revision 2.5 2001/04/13 20:16:10 gul * "OPT CRYPT" was send only in NR-mode * * Revision 2.4 2001/02/20 12:01:50 gul * rename encrypt to encrypt_buf to avoid conflict with unistd.h * * Revision 2.3 2001/02/16 09:13:25 gul * Disable crypt with plaintext password * * Revision 2.2 2001/02/15 16:05:59 gul * crypt bugfix * * Revision 2.1 2001/02/15 11:03:18 gul * Added crypt traffic possibility * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.35 1997/11/04 23:37:11 mff * send_block() changed to send as many msgs as possible with one send() * * Revision 1.34 1997/10/23 03:56:21 mff * authentication fixes, new binary log, more? * * 1997/07/11 11:56:55 maxb * Added more informative percents (I think mff won't kill me for this :) * * Revision 1.33 1997/06/27 01:05:09 mff * Now we close link after M_ERR or M_BSY * * Revision 1.32 1997/06/16 05:45:21 mff * Binkd could not correctly ACK receiving of files with some names. * Binary log in T-Mail format. Binkd didn't strip disk labels. * Session would never end if remote skips files being sent * from our outbound filebox. New keyword: `send-if-pwd'. * * Revision 1.31 1997/05/17 08:42:49 mff * Binkd could not ACK some filenames * * Revision 1.30 1997/05/08 05:30:29 mff * End-of-session is now logged verbosely * * Revision 1.29 1997/03/28 06:47:39 mff * SRIF support, prothlp.*, etc? * * Revision 1.28 1997/03/15 05:06:44 mff * Binkp/1.1 finished(?): NR mode, multiple batches. *.bsy touching. * * Revision 1.26 1997/02/13 07:08:39 mff * Support for fileboxes * * Revision 1.24 1997/01/09 05:31:29 mff * minfree and minfree_nonsecure * * Revision 1.23 1997/01/08 03:59:54 mff * Support for mail events flags * * Revision 1.22 1996/12/29 09:45:05 mff * Fixed NONBIO bug * * Revision 1.18 1996/12/07 12:14:04 mff * max_servers limits the number of server processes/threads running * * Revision 1.12 1996/12/03 11:27:33 mff * NT port by ufm */ #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_TIME_H #include #endif #include "Config.h" #include "sys.h" #include "iphdr.h" #include "common.h" #include "iptools.h" #include "tools.h" #include "readcfg.h" #include "ftnq.h" #include "bsy.h" #include "inbound.h" #include "srif.h" #include "readflo.h" #include "protocol.h" #include "prothlp.h" #include "protoco2.h" #include "assert.h" #include "binlog.h" #include "setpttl.h" #include "sem.h" #include "md5b.h" #include "crypt.h" static char *scommand[] = {"NUL", "ADR", "PWD", "FILE", "OK", "EOB", "GOT", "ERR", "BSY", "GET", "SKIP"}; /* * Fills <> with initial values, allocates buffers, etc. */ static int init_protocol (STATE *state, SOCKET socket, FTN_NODE *to) { memset (state, 0, sizeof (STATE)); state->major = 1; state->minor = 0; state->msgs_in_batch = 0; state->off_req_sent = 0; state->waiting_for_GOT = 0; state->send_eof = 0; state->inbound = inbound_nonsecure; state->io_error = 0; state->ibuf = xalloc (MAX_BLKSIZE + BLK_HDR_SIZE + 1); state->isize = -1; state->obuf = xalloc (MAX_BLKSIZE + BLK_HDR_SIZE + 1); state->optr = 0; state->oleft = 0; state->bytes_sent = state->bytes_rcvd = 0; state->files_sent = state->files_rcvd = 0; state->to = to; state->NR_flag = (to && (to->NR_flag == NR_ON || to->ND_flag == ND_ON)) ? WANT_NR : NO_NR; state->ND_flag = (to && to->ND_flag == ND_ON) ? THEY_ND : NO_ND; state->MD_flag = 0; state->MD_challenge = NULL; state->crypt_flag = no_crypt ? NO_CRYPT : WE_CRYPT; strcpy (state->expected_pwd, "-"); state->skip_all_flag = state->r_skipped_flag = 0; state->maxflvr = 'h'; state->listed_flag = 0; state->fa = NULL; state->nfa = state->nallfa = 0; setsockopts (state->s = socket); TF_ZERO (&state->in); TF_ZERO (&state->out); TF_ZERO (&state->flo); TF_ZERO (&state->in_complete); state->ND_addr.z = -1; state->start_time = safe_time(); state->evt_queue = NULL; Log (6, "binkp init done, socket # is %i", state->s); return 1; } /* * Close file currently receiving, * remove .hr and .dt if it's partial pkt or zero-length */ static int close_partial (STATE *state) { off_t s; if (state->in.f) { if (ispkt (state->in.netname)) { Log (2, "%s: partial .pkt", state->in.netname); s = 0; } else { if ((s = ftell (state->in.f)) == 0) Log (4, "%s: empty partial", state->in.netname); } fclose (state->in.f); if (s == 0) inb_reject (state->in.netname, state->in.size, state->in.time, state->fa, state->nallfa, state->inbound); } TF_ZERO (&state->in); return 0; } /* * Clears protocol buffers and queues, closes files, etc. */ static int deinit_protocol (STATE *state) { int i; close_partial(state); if (state->out.f) fclose (state->out.f); if (state->flo.f) fclose (state->flo.f); if (state->killlist) free_killlist (&state->killlist, &state->n_killlist); if (state->rcvdlist) free_rcvdlist (&state->rcvdlist, &state->n_rcvdlist); if (state->ibuf) free (state->ibuf); if (state->obuf) free (state->obuf); if (state->msgs) free (state->msgs); if (state->sent_fls) free (state->sent_fls); if (state->q) q_free (state->q); for (i = 0; i < state->nfa; ++i) bsy_remove (state->fa + i, F_BSY); if (state->fa) free (state->fa); if (state->MD_challenge) free (state->MD_challenge); rel_grow_handles(-state->nfa); Log (6, "binkp deinit done..."); return 0; } /* Process rcvdlist */ FTNQ *process_rcvdlist (STATE *state, FTNQ *q) { int i; Log (6, "processing rcvd list"); for (i = 0; i < state->n_rcvdlist; ++i) { q = evt_run(&(state->evt_queue), q, state->rcvdlist[i].name, state->fa, state->nfa, state->state == P_SECURE, state->listed_flag, state->peer_name, NULL); } return q; } /* Fills s[0] and s[1] with binkp frame header using value of u */ static void mkhdr (char *s, unsigned u) { s[0] = (char) (u >> 8); s[1] = (char) u; } /* * Puts a message to the output msg. queue. These msgs will be send * right after the current data block. */ static void msg_send2 (STATE *state, t_msg m, char *s1, char *s2) { if (!s1) s1 = ""; if (!s2) s2 = ""; state->msgs = xrealloc (state->msgs, sizeof (BMSG) * (state->n_msgs + 1)); state->msgs[state->n_msgs].t = m; /* We will check for sz correctness (sz <= 0x7fff) later, when sending * messages from the queue. */ state->msgs[state->n_msgs].sz = strlen (s1) + strlen (s2) + 1; state->msgs[state->n_msgs].s = xalloc (state->msgs[state->n_msgs].sz + 3); mkhdr (state->msgs[state->n_msgs].s, (unsigned) (state->msgs[state->n_msgs].sz | 0x8000)); state->msgs[state->n_msgs].s[2] = m; strcpy (state->msgs[state->n_msgs].s + 3, s1); strcat (state->msgs[state->n_msgs].s + 3, s2); state->msgs[state->n_msgs].sz += 2; if (state->crypt_flag == YES_CRYPT) encrypt_buf(state->msgs[state->n_msgs].s, state->msgs[state->n_msgs].sz, state->keys_out); ++state->n_msgs; ++state->msgs_in_batch; Log (5, "send message %s %s%s", scommand[m], s1, s2); } /* * Sends a message using format string */ static void msg_sendf (STATE *state, t_msg m, char *s,...) { char msg_text[max (MAXPATHLEN, MAX_NETNAME) + 80]; va_list ap; va_start (ap, s); #ifdef HAVE_SNPRINTF vsnprintf (msg_text, sizeof (msg_text), s, ap); #else vsprintf (msg_text, s, ap); #endif va_end (ap); msg_send2 (state, m, msg_text, 0); } static void current_file_was_sent (STATE *state) { fclose (state->out.f); state->sent_fls = xrealloc (state->sent_fls, ++(state->n_sent_fls) * sizeof (TFILE)); memcpy (state->sent_fls + state->n_sent_fls - 1, &state->out, sizeof (TFILE)); TF_ZERO (&state->out); if (state->ND_flag & WE_ND) { state->waiting_for_GOT = 1; Log(4, "Waiting for M_GOT"); } } /* * Sends next msg from the msg queue or next data block */ static int send_block (STATE *state) { int i, n, save_errno; const char *save_err; /* Have something to send in buffers */ if (state->optr && state->oleft) { Log (7, "sending %li byte(s)", (long) (state->oleft)); n = send (state->s, state->optr, state->oleft, MSG_NOSIGNAL); save_errno = TCPERRNO; save_err = TCPERR (); Log (7, "send() done, rc=%i", n); if (n == state->oleft) { state->optr = 0; state->oleft = 0; Log (7, "data sent"); } else if (n == SOCKET_ERROR) { if (save_errno != TCPERR_WOULDBLOCK && save_errno != TCPERR_AGAIN) { state->io_error = 1; if (!binkd_exit) { Log (1, "send: %s", save_err); if (state->to) bad_try (&state->to->fa, save_err); } return 0; } Log (7, "data transfer would block"); return 2; } else { state->optr += n; state->oleft -= n; Log (7, "partially sent, %li byte(s) left", state->oleft); } } else { /* There is no data partially sent */ if (state->msgs) { /* There are unsent msgs */ state->optr = state->obuf; state->oleft = 0; for (i = 0; i < state->n_msgs; ++i) { if (state->msgs[i].s) { /* Check for possible internal error */ if (state->msgs[i].sz - 2 > MAX_BLKSIZE) { Log (1, "size of msg we want to send is too big (%i)", state->msgs[i].sz - 2); return 0; } /* Is there some space for the new msg? */ if (state->oleft + state->msgs[i].sz > MAX_BLKSIZE) break; Log (7, "put next msg to obuf, %li", (long) state->msgs[i].sz); memcpy (state->optr, state->msgs[i].s, state->msgs[i].sz); state->oleft += state->msgs[i].sz; state->optr += state->msgs[i].sz; free (state->msgs[i].s); state->msgs[i].s = 0; } } /* Optr should be non-NULL if there are some data to send */ if (state->oleft == 0) state->optr = 0; else state->optr = state->obuf; /* If the message queue is empty, free it */ if (i >= state->n_msgs) { free (state->msgs); state->msgs = 0; state->n_msgs = 0; } return 1; } else if ((state->out.f && !state->off_req_sent && !state->waiting_for_GOT) || state->send_eof) { /* There is a file in transfer and we don't wait for an answer for * * * "FILE ... -1" */ unsigned sz; if (state->out.f) { sz = min ((off_t) oblksize, state->out.size - ftell (state->out.f)); if (percents && state->out.size > 0) { printf ("%-20.20s %3.0f%%\r", state->out.netname, 100.0 * ftell (state->out.f) / (float) state->out.size); fflush (stdout); } } else { state->send_eof = 0; sz = 0; } Log (7, "next block to send: %u byte(s)", sz); mkhdr (state->obuf, sz); if (sz != 0) { Log (7, "freading %u byte(s)", sz); if ((n = fread (state->obuf + BLK_HDR_SIZE, 1, sz, state->out.f)) < (int) sz) { Log (1, "error reading %s: expected %u, read %i", state->out.path, sz, n); return 0; } } if (state->out.f && (sz == 0 || state->out.size == ftell(state->out.f))) /* The current file have been sent */ current_file_was_sent (state); state->optr = state->obuf; state->oleft = sz + BLK_HDR_SIZE; if (state->crypt_flag == YES_CRYPT) encrypt_buf(state->optr, state->oleft, state->keys_out); } } return 1; } /* * Extends parse_args() by sending error message to the remote */ static int parse_msg_args (int ac, char **av, char *s, char *ID, STATE *state) { int rc = parse_args (ac, av, s, ID); if (!rc) msg_send2 (state, M_ERR, ID, ": cannot parse args"); return rc; } /* * Truncates the file if action == 't' * Removes the file if action == 'd' * Removes on successful session if action == 's' * Otherwise lefts the file unchanged */ static int perform_action (STATE *state, char *path, char action) { if (action == 'd') { delete (path); } else if (action == 't') { trunc_file (path); } else if (action == 's') { add_to_killlist (&state->killlist, &state->n_killlist, path, 's'); } return 1; } /* * Marks the file in flopath as sent. (Empty .?lo will be removed) * If file == 0 just tryes to unlink flopath. * If flopath == 0 performs action on file. */ static int remove_from_spool (STATE *state, char *flopath, char *file, char action) { char buf[MAXPATHLEN + 1], *w = 0; FILE *flo = 0; off_t offset = 0, curr_offset; int i; int seek_flag = 0; /* Seek _state->flo.f_ to */ /* _offset_ after processing */ int empty_flo_flag = 1; if (file) Log (5, "removing from spool: %s", file); else if (flopath) Log (5, "removing flo: %s", flopath); else Log (1, "internal error in remove_from_spool!"); if (flopath && *flopath) /* A file attached via .?lo */ { if (state->flo.f && !strcmp (state->flo.path, flopath)) { flo = state->flo.f; offset = ftell (flo); fseek (flo, 0, SEEK_SET); seek_flag = 1; } else { if ((flo = fopen (flopath, "r+b")) == 0) { Log (5, "remove_from_spool: %s: %s", flopath, strerror (errno)); return 0; } } while (!feof (flo)) { curr_offset = ftell (flo); if (!fgets (buf, MAXPATHLEN, flo)) break; for (i = strlen (buf) - 1; i >= 0 && isspace (buf[i]); --i) buf[i] = 0; if (buf[0] == '\0') continue; if (file && (!strcmp (file, buf) || ((*buf == '^' || *buf == '#') && !strcmp (file, buf + 1)))) { clearerr (flo); if (fseek (flo, curr_offset, SEEK_SET) == EOF) Log (1, "remove_from_spool: fseek(%s): %s", flopath, strerror (errno)); else if (putc ('~', flo) == EOF) Log (1, "remove_from_spool: fputc(%s): %s", flopath, strerror (errno)); fflush (flo); /* The line was marked, now skip it */ fgets (buf, MAXPATHLEN, flo); /* We've found the file in flo, so try to translate it's name before * the action */ if (w == 0 && (w = trans_flo_line (file)) != 0) { Log (5, "%s mapped to %s", file, w); } } else if (*buf && *buf != '~') { empty_flo_flag = 0; } } if (seek_flag) { fseek (flo, offset, SEEK_SET); fflush (flo); } else { fclose (flo); if (empty_flo_flag) delete (flopath); } } if (w) { perform_action (state, w, action); free (w); } else if (file) perform_action (state, file, action); return 1; } /* * Removes n-th element from the sent files queue, * free()'s the queue if it's empty */ static void remove_from_sent_files_queue (STATE *state, int n) { state->sent_fls[n].netname[0] = 0; for (n = 0; n < state->n_sent_fls; ++n) if (state->sent_fls[n].netname[0]) return; if (n >= state->n_sent_fls) { free (state->sent_fls); state->sent_fls = 0; state->n_sent_fls = 0; } } static void do_prescan(STATE *state) { char s[64]; unsigned long netsize, filessize; if (OK_SEND_FILES (state) && prescan) { state->q = q_scan_addrs (0, state->fa, state->nfa, state->to ? 1 : 0); q_get_sizes (state->q, &netsize, &filessize); sprintf(s, "%lu %lu", netsize, filessize); msg_send2 (state, M_NUL, "TRF ", s); } } /* * These functions down to recv_block() handle binkp msgs * * They should return 0 on fatal error, otherwise 1 */ /* * Parses if needed and logs down the M_NUL message data */ static int NUL (STATE *state, char *buf, int sz) { char *s, *a, *b; Log (3, "%s", s = strquote (buf, SQ_CNTRL)); if (!memcmp (s, "VER ", 4) && (a = strstr (s, PRTCLNAME "/")) != 0 && (b = strstr (a, ".")) != 0) { state->major = atoi (a + 6); state->minor = atoi (b + 1); Log (6, "remote uses " PRTCLNAME " v.%i.%i", state->major, state->minor); } else if (!memcmp (s, "TRF ", 4)) { char *mail, *files; if ((mail = getwordx (s + 4, 1, 0)) != NULL && (files = getwordx (s + 4, 2, 0)) != NULL) { Log (2, "Remote has %sb of mail and %sb of files for us", mail, files); free(files); } if (mail) free(mail); } else if (!memcmp (s, "OPT ", 4)) { char *w; int i; for (i = 1; (w = getwordx (s + 4, i, 0)) != 0; ++i) { if (!strcmp (w, "NR")) { state->NR_flag |= WE_NR; /* They want NR mode - turn it on */ Log(2, "Remote requests NR mode"); } if (!strcmp (w, "ND")) { state->ND_flag |= WE_ND; /* They want ND mode - turn it on */ Log(2, "Remote requests ND mode"); } if (!strcmp (w, "NDA")) { state->ND_flag |= CAN_NDA; /* They supports asymmetric ND */ Log(2, "Remote supports asymmetric ND mode"); } if (!strcmp (w, "CRYPT")) { state->crypt_flag |= THEY_CRYPT; /* They want crypt mode */ Log(2, "Remote requests CRYPT mode"); } if (!strncmp(w, "CRAM-MD5-", 9) && !no_MD5 && state->to && (state->to->MD_flag>=0)) { Log(2, "Remote requests MD mode"); if(state->MD_challenge) free(state->MD_challenge); state->MD_challenge=MD_getChallenge(w, NULL); } free (w); } } else if (!memcmp (s, "SYS ", 4)) strnzcpy (state->sysname, s + 4, sizeof (state->sysname)); else if (!memcmp (s, "ZYZ ", 4)) strnzcpy (state->sysop, s + 4, sizeof (state->sysop)); else if (!memcmp (s, "LOC ", 4)) strnzcpy (state->location, s + 4, sizeof (state->location)); free (s); return 1; } /* * Handles M_ERR msg from the remote */ static int RError (STATE *state, char *buf, int sz) { char *s; Log (1, "rerror: %s", s = strquote (buf, SQ_CNTRL)); if (state->to) bad_try (&state->to->fa, s); free (s); return 0; } static int BSY (STATE *state, char *buf, int sz) { char *s; Log (1, "got M_BSY: %s", s = strquote (buf, SQ_CNTRL)); if (state->to) bad_try (&state->to->fa, s); free (s); return 0; } static int ADR (STATE *state, char *s, int sz) { int i, j, main_AKA_ok = 0, ip_verified = 0; char *w; FTN_ADDR fa; FTN_NODE n, *pn; char szFTNAddr[FTN_ADDR_SZ + 1]; int secure_NR, unsecure_NR; int secure_ND, unsecure_ND; s[sz] = 0; secure_NR = unsecure_NR = NO_NR; secure_ND = unsecure_ND = NO_ND; /* set expected password on outgoing session * for drop remote AKAs with another passwords */ if (state->to) memcpy (state->expected_pwd, state->to->pwd, sizeof (state->expected_pwd)); for (i = 1; (w = getwordx (s, i, 0)) != 0; ++i) { if (!parse_ftnaddress (w, &fa) || !is4D (&fa)) { char *q = strquote (s, SQ_CNTRL); msg_send2 (state, M_ERR, "Bad address", 0); Log (1, "remote passed bad address: `%s'", q); free (w); free (q); return 0; } free (w); if (!fa.domain[0]) strcpy (fa.domain, get_def_domain()->name); ftnaddress_to_str (szFTNAddr, &fa); pn = get_node(&fa, &n); if (state->to == 0 && pn && n.restrictIP) { int i, ipok = 0, rc; struct hostent *hp; struct in_addr defaddr; char **cp; char host[MAXHOSTNAMELEN + 1]; /* current host/port */ unsigned short port; struct sockaddr_in sin; socklen_t si; si = sizeof (struct sockaddr_in); if (getpeername (state->s, (struct sockaddr *) &sin, &si) == -1) { Log (1, "Can't getpeername(): %s", TCPERR()); ipok = 2; } for (i = 1; n.hosts && (rc = get_host_and_port(i, host, &port, n.hosts, &n.fa)) != -1; ++i) { if (rc == 0) { Log (1, "%s: %i: error parsing host list", n.hosts, i); continue; } if (strcmp(host, "-") == 0) continue; if (!isdigit (host[0]) || (defaddr.s_addr = inet_addr (host)) == INADDR_NONE) { /* If not a raw ip address, try nameserver */ Log (5, "resolving `%s'...", host); lockresolvsem(); if ((hp = gethostbyname (host)) == NULL) { releaseresolvsem(); Log (1, "%s: unknown host", host); continue; } for (cp = hp->h_addr_list; cp && *cp; cp++) if (((struct in_addr *) * cp)->s_addr == sin.sin_addr.s_addr) { ipok = 1; break; } else if (ipok == 0) ipok = -1; /* resolved and not match */ releaseresolvsem(); } else { if (defaddr.s_addr == sin.sin_addr.s_addr) ipok = 1; else if (ipok == 0) ipok = -1; /* resolved and not match */ } if (ipok == 1) break; } if (ipok == 1) { /* matched */ ip_verified = 2; } else if (ipok<0 || n.restrictIP == 2) { /* not matched or unresolvable with strict check */ if (n.pwd && strcmp(n.pwd, "-") && state->to == NULL) { if (ipok == 0) Log (1, "addr: %s (unresolvable)", szFTNAddr); else Log (1, "addr: %s (not from allowed remote address)", szFTNAddr); msg_send2 (state, M_ERR, "Bad source IP", 0); return 0; } else { /* drop unsecure AKA with bad IP-addr */ if (ip_verified == 0) ip_verified = -1; if (ipok == 0) Log(2, "Addr %s dropped - unresolvable", szFTNAddr); else Log(2, "Addr %s dropped - not from allowed IP", szFTNAddr); continue; } } } else if (pn) { /* no check ip -> reset restrict */ ip_verified = 1; } if (state->expected_pwd[0] && pn) { state->listed_flag = 1; if (!strcmp (state->expected_pwd, "-")) { memcpy (state->expected_pwd, n.pwd, sizeof (state->expected_pwd)); state->MD_flag=n.MD_flag; } else if (n.pwd && strcmp(n.pwd, "-") && strcmp(state->expected_pwd, n.pwd)) { if (state->to) Log (2, "inconsistent pwd settings for this node, aka %s dropped", szFTNAddr); else { /* drop incoming session with M_ERR "Bad password" */ Log (1, "inconsistent pwd settings for this node"); state->expected_pwd[0] = 0; } continue; } } if (bsy_add (&fa, F_BSY)) { Log (2, "addr: %s", szFTNAddr); if (state->nfa == 0) setproctitle ("%c %s [%s]", state->to ? 'o' : 'i', szFTNAddr, state->peer_name); state->fa = xrealloc (state->fa, sizeof (FTN_ADDR) * ++state->nallfa); ++state->nfa; rel_grow_handles(1); for (j = state->nallfa - 1; j >= state->nfa; j--) memcpy (state->fa + j, state->fa + j - 1, sizeof (FTN_ADDR)); memcpy (state->fa + state->nfa - 1, &fa, sizeof (FTN_ADDR)); if (state->to && !ftnaddress_cmp (state->fa + state->nfa - 1, &state->to->fa)) { main_AKA_ok = 1; } } else { Log (2, "addr: %s (n/a or busy)", szFTNAddr); state->fa = xrealloc (state->fa, sizeof (FTN_ADDR) * ++state->nallfa); memcpy (state->fa + state->nallfa - 1, &fa, sizeof (FTN_ADDR)); } if (!state->to && pn) { if (n.ND_flag) { if (n.pwd && strcmp(n.pwd, "-")) { secure_ND = THEY_ND; secure_NR = WANT_NR; } else { unsecure_ND = THEY_ND; unsecure_NR = WANT_NR; } } else if (n.NR_flag) { if (n.pwd && strcmp(n.pwd, "-")) secure_NR = WANT_NR; else unsecure_NR = WANT_NR; } } } if (state->nfa == 0) { Log (1, "no AKAs in common domains or all AKAs are busy"); msg_send2 (state, M_BSY, "No AKAs in common domains or all AKAs are busy", 0); return 0; } if (state->to != 0 && main_AKA_ok == 0) { ftnaddress_to_str (szFTNAddr, &state->to->fa); Log (1, "called %s, but remote has no such AKA", szFTNAddr); bad_try (&state->to->fa, "Remote has no needed AKA"); return 0; } if (ip_verified < 0) { /* strict IP check and no address resolved */ Log (1, "Source IP check failed"); msg_send2 (state, M_ERR, "Bad source IP", 0); return 0; } else if (ip_verified == 2) Log (4, "Source IP matched"); else Log (5, "Source IP not checked"); if (!state->to) { if (state->expected_pwd[0] && strcmp(state->expected_pwd, "-")) { state->ND_flag |= secure_ND; state->NR_flag |= secure_NR; } else { state->ND_flag |= unsecure_ND; state->NR_flag |= unsecure_NR; } } if (state->to) { do_prescan (state); if(state->MD_challenge) { char *tp=MD_buildDigest(state->to->pwd, state->MD_challenge); if(!tp) { Log(2, "Unable to build MD5 digest"); bad_try (&state->to->fa, "Unable to build MD5 digest"); return 0; } msg_send2 (state, M_PWD, tp, 0); state->MD_flag=1; free(tp); } else if ((state->to->MD_flag == 1) && !no_MD5) /* We do not want to talk without MD5 */ { Log(2, "CRAM-MD5 is not supported by remote"); bad_try (&state->to->fa, "CRAM-MD5 is not supported by remote"); return 0; } else msg_send2 (state, M_PWD, state->to->pwd, 0); } return 1; } static char *select_inbound (FTN_ADDR *fa, int secure_flag) { FTN_NODE *node; char *p; if (!fa) return inbound_nonsecure; /* or drop the session? */ locknodesem(); node = get_node_info(fa); p = ((node && node->ibox) ? node->ibox : (secure_flag == P_SECURE ? inbound : inbound_nonsecure)); releasenodesem(); return p; } static void complete_login (STATE *state) { state->inbound = select_inbound (state->fa, state->state); if (OK_SEND_FILES (state) && state->q == NULL) state->q = q_scan_addrs (0, state->fa, state->nfa, state->to ? 1 : 0); state->msgs_in_batch = 0; /* Forget about login msgs */ if (state->state == P_SECURE) Log (2, "pwd protected session (%s)", (state->MD_flag == 1) ? "MD5" : "plain text"); if (state->ND_flag & WE_ND) { state->NR_flag |= WE_NR; Log (3, "we are in ND mode"); } if (state->ND_flag & THEY_ND) Log (3, "remote is in ND mode"); else if (state->NR_flag == WE_NR) Log (3, "we are in NR mode"); if (state->state != P_SECURE) state->crypt_flag = NO_CRYPT; else if (state->crypt_flag == (WE_CRYPT|THEY_CRYPT) && !state->MD_flag) { state->crypt_flag = NO_CRYPT; Log (3, "Crypt allowed only with MD5 authorization"); } else if (state->crypt_flag == (WE_CRYPT|THEY_CRYPT)) { char *p; state->crypt_flag = YES_CRYPT; Log (3, "session in CRYPT mode"); if (state->to) { init_keys(state->keys_out, state->to->pwd); init_keys(state->keys_in, "-"); for (p=state->to->pwd; *p; p++) update_keys(state->keys_in, (int)*p); } else { init_keys(state->keys_in, state->expected_pwd); init_keys(state->keys_out, "-"); for (p=state->expected_pwd; *p; p++) update_keys(state->keys_out, (int)*p); } } if (state->crypt_flag!=YES_CRYPT) state->crypt_flag=NO_CRYPT; } static int PWD (STATE *state, char *pwd, int sz) { int bad_pwd=STRNICMP(pwd, "CRAM-", 5); int no_password=!strcmp (state->expected_pwd, "-"); if (state->to) { Log (1, "unexpected password from the remote on outgoing call: `%s'", pwd); return 1; } if ((no_password)&&(bad_pwd)) { do_prescan (state); state->state = P_NONSECURE; if (strcmp (pwd, "-")) Log (1, "unexpected password from the remote: `%s'", pwd); } else { if((state->MD_flag == 1) || ((!bad_pwd) && (state->MD_challenge))) { char *sp; if((bad_pwd)&&(state->MD_flag)) { msg_send2(state, M_ERR, "You must support MD5", 0); Log(1, "Caller does not support MD5"); return 0; } if((sp=MD_buildDigest(state->expected_pwd, state->MD_challenge))!=NULL) { if((bad_pwd=STRICMP(sp, pwd))==0) state->MD_flag=1; free(sp); sp=NULL; } else { Log(2, "Unable to build Digest"); bad_pwd=1; } } else bad_pwd=(state->expected_pwd[0] == 0 || strcmp (state->expected_pwd, pwd)); if ((bad_pwd)&&(!no_password)) /* I don't check password if we do not need one */ { msg_send2 (state, M_ERR, "Bad password", 0); Log (1, "`%s': incorrect password", pwd); return 0; } else { if(no_password) { state->state = P_NONSECURE; do_prescan (state); if(bad_pwd) Log (1, "unexpected password digest from the remote"); } else { state->state = P_SECURE; do_prescan (state); } } } if (state->state != P_SECURE) state->crypt_flag = NO_CRYPT; else if (state->crypt_flag == (THEY_CRYPT | WE_CRYPT) && !state->MD_flag) { state->crypt_flag = NO_CRYPT; Log (4, "Crypt allowed only with MD5 authorization"); } if ((state->ND_flag & WE_ND) && (state->ND_flag & CAN_NDA) == 0) state->ND_flag |= THEY_ND; if ((state->ND_flag & WE_ND) == 0 && (state->ND_flag & CAN_NDA) == 0) state->ND_flag &= ~THEY_ND; if ((state->NR_flag & WANT_NR) && !(state->ND_flag & CAN_NDA) && !(state->ND_flag & WE_ND)) { /* workaround bug of old binkd */ /* force symmetric NR-mode with it */ #if 1 if (state->major * 100 + state->minor > 100) state->NR_flag |= WE_NR; else #endif state->NR_flag &= ~WANT_NR; } if ((state->NR_flag & WANT_NR) || (state->crypt_flag == (WE_CRYPT | THEY_CRYPT)) || (state->ND_flag & (WE_ND|THEY_ND))) msg_sendf (state, M_NUL, "OPT%s%s%s%s", (state->NR_flag & WANT_NR) ? " NR" : "", (state->ND_flag & THEY_ND) ? " ND" : "", (!(state->ND_flag & WE_ND)) != (!(state->ND_flag & THEY_ND)) ? " NDA" : "", (state->crypt_flag == (WE_CRYPT | THEY_CRYPT)) ? " CRYPT" : ""); msg_send2 (state, M_OK, state->state==P_SECURE ? "secure" : "non-secure", 0); complete_login (state); return 1; } static int OK (STATE *state, char *buf, int sz) { if (!state->to) return 0; state->state = !strcmp (state->to->pwd, "-") ? P_NONSECURE : P_SECURE; if (state->state == P_SECURE && strcmp(buf, "non-secure") == 0) { state->crypt_flag=NO_CRYPT; /* some development binkd versions send OPT CRYPT with unsecure session */ Log (1, "Warning: remote set UNSECURE session"); } if (state->ND_flag == WE_ND || state->ND_flag == THEY_ND) state->ND_flag = 0; /* remote does not support asymmetric ND-mode */ complete_login (state); return 1; } /* * Handles M_FILE msg from the remote * M_FILE args: "%s %li %li %li", filename, size, time, offset */ static int start_file_recv (STATE *state, char *args, int sz) { const int argc = 4; char *argv[4]; off_t offset; if (parse_msg_args (argc, argv, args, "M_FILE", state)) { /* They request us for offset (M_FILE "name size time -1") */ int off_req = 0; if (state->in.f && /* Already receiving smthing */ strcmp (argv[0], state->in.netname)) /* ...a file with another * * name! */ { Log (1, "receiving of %s interrupted", state->in.netname); close_partial (state); } if ((state->ND_flag & THEY_ND) && state->in_complete.netname[0]) { /* rename complete received file to its true form */ char realname[MAXPATHLEN + 1]; char szAddr[FTN_ADDR_SZ + 1]; if (inb_done (state->in_complete.netname, state->in_complete.size, state->in_complete.time, state->fa, state->nallfa, state->inbound, realname) == 0) return 0; /* error, drop session */ if (*realname) { /* Set flags */ if(evt_test(&(state->evt_queue), realname)) state->q = evt_run(&(state->evt_queue), state->q, realname, state->fa, state->nfa, state->state == P_SECURE, state->listed_flag, state->peer_name, state); /* We will run external programs using this list */ add_to_rcvdlist (&state->rcvdlist, &state->n_rcvdlist, realname); } ftnaddress_to_str (szAddr, state->fa); state->bytes_rcvd += state->in_complete.size; ++state->files_rcvd; Log (2, "rcvd: %s (%li, %.2f CPS, %s)", state->in_complete.netname, (long) state->in_complete.size, (double) (state->in_complete.size) / (safe_time() == state->in_complete.start ? 1 : (safe_time() - state->in_complete.start)), szAddr); TF_ZERO (&state->in_complete); } if (state->in.f == 0) { state->in.start = safe_time(); strnzcpy (state->in.netname, argv[0], MAX_NETNAME); state->in.size = atol (argv[1]); state->in.time = atol (argv[2]); } offset = (off_t) atol (argv[3]); if (!strcmp (argv[3], "-1")) { off_req = 1; Log (6, "got offset request for %s", state->in.netname); if ((state->NR_flag & THEY_NR) == 0) { state->NR_flag |= THEY_NR; if ((state->ND_flag & THEY_ND) == 0) Log (3, "remote is in NR mode"); } } if (state->in.f == 0) { char realname[MAXPATHLEN + 1], *mask; if ((mask = mask_test (state->in.netname, skipmask)) != NULL) { Log (1, "skipping %s (destructive, %li byte(s), skipmask %s)", state->in.netname, (long) state->in.size, mask); msg_sendf (state, M_GOT, "%s %li %li", state->in.netname, (long) state->in.size, (long) state->in.time); return 1; } if (inb_test (state->in.netname, state->in.size, state->in.time, state->inbound, realname)) { Log (2, "already have %s (%s, %li byte(s))", state->in.netname, realname, (long) state->in.size); msg_sendf (state, M_GOT, "%s %li %li", state->in.netname, (long) state->in.size, (long) state->in.time); return 1; } else if (!state->skip_all_flag) { if ((state->in.f = inb_fopen (state->in.netname, state->in.size, state->in.time, state->fa, state->nallfa, state->inbound, state->state)) == 0) { state->skip_all_flag = 1; } } #if defined(DOS) && defined(__MSC__) if (!state->skip_all_flag && (state->n_rcvdlist+1ul) * sizeof(RCVDLIST) > 64535ul) { Log (1, "ReceivedList has reached max size 64K"); state->skip_all_flag = 1; } #endif if (state->skip_all_flag) { Log (2, "skipping %s (non-destructive)", state->in.netname); msg_sendf (state, M_SKIP, "%s %li %li", state->in.netname, (long) state->in.size, (long) state->in.time); if (state->in.f) fclose (state->in.f); TF_ZERO (&state->in); return 1; } } if (off_req || offset != (off_t) ftell (state->in.f)) { Log (2, "have %li byte(s) of %s", (long) ftell (state->in.f), state->in.netname); msg_sendf (state, M_GET, "%s %li %li %li", state->in.netname, (long) state->in.size, (long) state->in.time, (long) ftell (state->in.f)); ++state->GET_FILE_balance; fclose (state->in.f); TF_ZERO (&state->in); return 1; } else if (offset != 0 || (state->NR_flag & THEY_NR)) { --state->GET_FILE_balance; } Log (3, "receiving %s (%li byte(s), off %li)", state->in.netname, (long) (state->in.size), (long) offset); if (fseek (state->in.f, offset, SEEK_SET) == -1) { Log (1, "fseek: %s", strerror (errno)); return 0; } else return 1; } else return 0; } static int ND_set_status(char *status, FTN_ADDR *fa, STATE *state) { char buf[MAXPATHLEN+1]; FILE *f; int rc; if ((state->NR_flag & WE_NR) == 0) return 1; /* ignoring status if no NR mode */ if (fa->z==-1) { Log(8, "ND_set_status: unknown address for '%s'", status); return 0; } Log(4, "Set link status with %u:%u/%u.%u to '%s'", fa->z, fa->net, fa->node, fa->p, status ? status : ""); ftnaddress_to_filename (buf, fa); if (*buf=='\0') return 0; strnzcat(buf, ".stc", sizeof(buf)); if (!status || !*status) return (unlink(buf) && errno != ENOENT) ? 0 : 1; else { f=fopen(buf, "w"); if (f==NULL) { Log(1, "Can't write to %s: %s", buf, strerror(errno)); return 0; } rc=1; if (fputs(status, f)==EOF) rc=0; if (fclose(f)==EOF) rc=0; return rc; } } /* * M_GET message from the remote: Resend file from offset * M_GET args: "%s %li %li %li", filename, size, time, offset */ static int GET (STATE *state, char *args, int sz) { const int argc = 4; char *argv[4]; int i, rc = 0; off_t offset; if (parse_msg_args (argc, argv, args, "M_GET", state)) { /* Check if the file was already sent */ for (i = 0; i < state->n_sent_fls; ++i) { if (!tfile_cmp (state->sent_fls + i, argv[0], atol (argv[1]), atol (argv[2]))) { if (state->out.f) { TFILE tfile_buf; fclose (state->out.f); state->out.f = NULL; memcpy (&tfile_buf, &state->out, sizeof (TFILE)); memcpy (&state->out, state->sent_fls + i, sizeof (TFILE)); memcpy (state->sent_fls + i, &tfile_buf, sizeof (TFILE)); } else { memcpy (&state->out, state->sent_fls + i, sizeof (TFILE)); remove_from_sent_files_queue (state, i); } if ((state->out.f = fopen (state->out.path, "rb")) == 0) { Log (1, "GET: %s: %s", state->out.path, strerror (errno)); TF_ZERO (&state->out); } break; } } if ((state->out.f || state->off_req_sent) && !tfile_cmp (&state->out, argv[0], atol (argv[1]), atol (argv[2]))) { if (!state->out.f) { /* response for status */ rc = 1; /* to satisfy remote GET_FILE_balance */ msg_sendf (state, M_FILE, "%s %li %li %li", state->out.netname, (long) state->out.size, (long) state->out.time, atol(argv[3])); if (atol(argv[3])==(long)state->out.size && (state->ND_flag & WE_ND)) { state->send_eof = 1; state->waiting_for_GOT = 1; Log(4, "Waiting for M_GOT"); state->off_req_sent = 0; return rc; } else /* request from offset 0 - file already renamed */ ND_set_status("", &state->out_addr, state); TF_ZERO(&state->out); } else if ((offset = atol (argv[3])) > state->out.size || fseek (state->out.f, offset, SEEK_SET) == -1) { Log (1, "GET: error seeking %s to %li: %s", argv[0], offset, strerror (errno)); /* touch the file and drop session */ fclose(state->out.f); state->out.f=NULL; touch(state->out.path, time(NULL)); rc = 0; } else { Log (2, "sending %s from %li", argv[0], offset); msg_sendf (state, M_FILE, "%s %li %li %li", state->out.netname, (long) state->out.size, (long) state->out.time, offset); rc = 1; } } else Log (1, "unexpected M_GET for %s", argv[0]); ND_set_status("", &state->ND_addr, state); state->ND_addr.z=-1; if (state->ND_flag & WE_ND) { state->waiting_for_GOT = 0; Log(9, "Don't waiting for M_GOT"); } state->off_req_sent = 0; return rc; } else return 0; } /* * M_SKIP: Remote asks us to skip a file. Only a file currently in * transfer will be skipped! * * M_SKIP args: "%s %li %li", filename, size, time */ static int SKIP (STATE *state, char *args, int sz) { const int argc = 3; char *argv[3]; int n; if (parse_msg_args (argc, argv, args, "M_SKIP", state)) { for (n = 0; n < state->n_sent_fls; ++n) { if (!tfile_cmp (state->sent_fls + n, argv[0], atol (argv[1]), atol (argv[2]))) { state->r_skipped_flag = 1; Log (2, "%s skipped by remote", state->sent_fls[n].netname); remove_from_sent_files_queue (state, n); } } if (state->out.f && !tfile_cmp (&state->out, argv[0], atol (argv[1]), atol (argv[2]))) { state->r_skipped_flag = 1; fclose (state->out.f); Log (2, "%s skipped by remote", state->out.netname); TF_ZERO (&state->out); } ND_set_status("", &state->ND_addr, state); state->ND_addr.z=-1; if ((state->ND_flag & WE_ND) || (state->NR_flag & WE_NR)) { state->waiting_for_GOT = state->off_req_sent = 0; Log(9, "Don't waiting for M_GOT"); } return 1; } else return 0; } /* * M_GOT args: "%s %li %li", filename, size, time */ static int GOT (STATE *state, char *args, int sz) { const int argc = 3; char *argv[3]; int n, rc=1; char *status = NULL; char *saved_args; saved_args = xstrdup(args); if (parse_msg_args (argc, argv, args, "M_GOT", state)) { if (state->ND_flag & WE_ND) status = saved_args; else ND_set_status("", &state->ND_addr, state); if (!tfile_cmp (&state->out, argv[0], atol (argv[1]), atol (argv[2]))) { Log (2, "remote already has %s", state->out.netname); if (state->out.f) { fclose (state->out.f); state->out.f = NULL; } memcpy(&state->ND_addr, &state->out_addr, sizeof(state->out_addr)); if (state->ND_flag & WE_ND) Log (7, "Set ND_addr to %u:%u/%u.%u", state->ND_addr.z, state->ND_addr.net, state->ND_addr.node, state->ND_addr.p); if (status) { if (state->off_req_sent) rc = ND_set_status("", &state->ND_addr, state); else rc = ND_set_status(status, &state->ND_addr, state); } state->waiting_for_GOT = state->off_req_sent = 0; Log(9, "Don't waiting for M_GOT"); remove_from_spool (state, state->out.flo, state->out.path, state->out.action); TF_ZERO (&state->out); } else { for (n = 0; n < state->n_sent_fls; ++n) { if (!tfile_cmp (state->sent_fls + n, argv[0], atol (argv[1]), atol (argv[2]))) { char szAddr[FTN_ADDR_SZ + 1]; ftnaddress_to_str (szAddr, &state->out_addr); state->bytes_sent += state->sent_fls[n].size; ++state->files_sent; memcpy(&state->ND_addr, &state->out_addr, sizeof(state->out_addr)); if (state->ND_flag & WE_ND) Log (7, "Set ND_addr to %u:%u/%u.%u", state->ND_addr.z, state->ND_addr.net, state->ND_addr.node, state->ND_addr.p); Log (2, "sent: %s (%li, %.2f CPS, %s)", state->sent_fls[n].path, (long) state->sent_fls[n].size, (double) (state->sent_fls[n].size) / (safe_time() == state->sent_fls[n].start ? 1 : (safe_time() - state->sent_fls[n].start)), szAddr); if (status) { if (state->off_req_sent) rc = ND_set_status("", &state->ND_addr, state); else rc = ND_set_status(status, &state->ND_addr, state); } state->waiting_for_GOT = 0; Log(9, "Don't waiting for M_GOT"); remove_from_spool (state, state->sent_fls[n].flo, state->sent_fls[n].path, state->sent_fls[n].action); remove_from_sent_files_queue (state, n); break; /* we have ACK for _ONE_ file */ } } } } else rc = 0; free(saved_args); return rc; } static int EOB (STATE *state, char *buf, int sz) { state->remote_EOB = 1; if (state->in.f) { off_t offset; Log (1, "receiving of %s interrupted", state->in.netname); offset = ftell (state->in.f); if ((state->NR_flag & THEY_NR) == 0 && offset != 0) { fclose (state->in.f); state->in.f = NULL; Log (2, "Remove partially received %s (%li of %li bytes) due to remote bug", state->in.netname, (long) offset, (long) state->in.size); inb_reject (state->in.netname, state->in.size, state->in.time, state->fa, state->nallfa, state->inbound); TF_ZERO (&state->in); } else close_partial (state); } if ((state->ND_flag & THEY_ND) && state->in_complete.netname[0]) { /* rename complete received file to its true form */ char realname[MAXPATHLEN + 1]; char szAddr[FTN_ADDR_SZ + 1]; if (inb_done (state->in_complete.netname, state->in_complete.size, state->in_complete.time, state->fa, state->nallfa, state->inbound, realname) == 0) return 0; if (*realname) { /* Set flags */ if (evt_test(&(state->evt_queue), realname)) state->q = evt_run(&(state->evt_queue), state->q, realname, state->fa, state->nfa, state->state == P_SECURE, state->listed_flag, state->peer_name, state); /* We will run external programs using this list */ add_to_rcvdlist (&state->rcvdlist, &state->n_rcvdlist, realname); } ftnaddress_to_str (szAddr, state->fa); state->bytes_rcvd += state->in_complete.size; ++state->files_rcvd; Log (2, "rcvd: %s (%li, %.2f CPS, %s)", state->in_complete.netname, (long) state->in_complete.size, (double) (state->in_complete.size) / (safe_time() == state->in_complete.start ? 1 : (safe_time() - state->in_complete.start)), szAddr); TF_ZERO (&state->in_complete); } return 1; } typedef int command (STATE *state, char *buf, int sz); command *commands[] = { NUL, ADR, PWD, start_file_recv, OK, EOB, GOT, RError, BSY, GET, SKIP }; /* Recvs next block, processes msgs or writes down the data from the remote */ static int recv_block (STATE *state) { int no; int sz = state->isize == -1 ? BLK_HDR_SIZE : state->isize; if (sz == 0) no = 0; else if ((no = recv (state->s, state->ibuf + state->iread, sz - state->iread, 0)) == SOCKET_ERROR) { if (TCPERRNO == TCPERR_WOULDBLOCK || TCPERRNO == TCPERR_AGAIN) { return 1; } else { const char *save_err = TCPERR(); state->io_error = 1; if (!binkd_exit) { Log (1, "recv: %s", save_err); if (state->to) bad_try (&state->to->fa, save_err); } return 0; } } if (state->crypt_flag == YES_CRYPT) decrypt_buf(state->ibuf + state->iread, no, state->keys_in); state->iread += no; /* assert (state->iread <= sz); */ if (state->iread == sz) { if (state->isize == -1) /* reading block header */ { state->imsg = state->ibuf[0] >> 7; state->isize = ((((unsigned char *) state->ibuf)[0] & ~0x80) << 8) + ((unsigned char *) state->ibuf)[1]; Log (7, "recvd hdr: %i (%s)", state->isize, state->imsg ? "msg" : "data"); if (state->isize == 0) goto DoNotEvenTryToRecvZeroLengthBlock; } else { DoNotEvenTryToRecvZeroLengthBlock: Log (7, "got block: %i (%s)", state->isize, state->imsg ? "msg" : "data"); if (state->imsg) { int rc = 1; ++state->msgs_in_batch; if (state->isize == 0) Log (1, "zero length command from remote (must be at least 1)"); else if ((unsigned) (state->ibuf[0]) > M_MAX) Log (1, "unknown msg type from remote: %u", state->ibuf[0]); else { state->ibuf[state->isize] = 0; Log (5, "rcvd msg %s %s", scommand[(unsigned char)(state->ibuf[0])], state->ibuf+1); rc = commands[(unsigned) (state->ibuf[0])] (state, state->ibuf + 1, state->isize - 1); } if (rc == 0) { state->iread = 0; return 0; } } else if (state->in.f) { if (state->isize != 0 && (fwrite (state->ibuf, state->isize, 1, state->in.f) < 1 || fflush (state->in.f))) { Log (1, "write error: %s", strerror(errno)); return 0; } if (percents && state->in.size > 0) { printf ("%-20.20s %3.0f%%\r", state->in.netname, 100.0 * ftell (state->in.f) / (float) state->in.size); fflush (stdout); } if ((off_t) ftell (state->in.f) == state->in.size) { char szAddr[FTN_ADDR_SZ + 1]; char realname[MAXPATHLEN + 1]; if (fclose (state->in.f)) { Log (1, "Cannot fclose(%s): %s!", state->in.netname, strerror (errno)); state->in.f = NULL; return 0; } state->in.f = NULL; if (state->ND_flag & THEY_ND) { Log (5, "File %s complete received, waiting for renaming", state->in.netname); memcpy(&state->in_complete, &state->in, sizeof(state->in_complete)); } else { if (inb_done (state->in.netname, state->in.size, state->in.time, state->fa, state->nallfa, state->inbound, realname) == 0) return 0; if (*realname) { /* Set flags */ if (evt_test(&(state->evt_queue), realname)) state->q = evt_run(&(state->evt_queue), state->q, realname, state->fa, state->nfa, state->state == P_SECURE, state->listed_flag, state->peer_name, state); /* We will run external programs using this list */ add_to_rcvdlist (&state->rcvdlist, &state->n_rcvdlist, realname); } ftnaddress_to_str (szAddr, state->fa); state->bytes_rcvd += state->in.size; ++state->files_rcvd; Log (2, "rcvd: %s (%li, %.2f CPS, %s)", state->in.netname, (long) state->in.size, (double) (state->in.size) / (safe_time() == state->in.start ? 1 : (safe_time() - state->in.start)), szAddr); } msg_sendf (state, M_GOT, "%s %li %li", state->in.netname, (long) state->in.size, (long) state->in.time); TF_ZERO (&state->in); } else if ((off_t) ftell (state->in.f) > state->in.size) { Log (1, "rcvd %li extra bytes!", (long) ftell (state->in.f) - state->in.size); return 0; } } else if (state->isize > 0) { Log (7, "ignoring data block (%li byte(s))", (long) state->isize); } state->isize = -1; } state->iread = 0; } if (no == 0 && sz > 0) { state->io_error = 1; if (!binkd_exit) { const char *s_err = "connection closed by foreign host"; Log (1, "recv: %s", s_err); if (state->to) bad_try (&state->to->fa, s_err); } return 0; } else return 1; } static void banner (STATE *state) { char szFTNAddr[FTN_ADDR_SZ + 1]; char *szAkas; int i, tz; char szLocalTime[60]; time_t t, gt; struct tm tm; char *dayweek[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; char *month[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; if ((!no_MD5) && (!state->to) && ((state->MD_challenge=MD_getChallenge(NULL, state))!=NULL)) { /* Answering side MUST send CRAM message as a very first M_NUL */ char s[MD_CHALLENGE_LEN*2+15]; /* max. length of opt string */ strcpy(s, "OPT "); MD_toString(s+4, state->MD_challenge[0], state->MD_challenge+1); state->MD_flag=1; msg_send2 (state, M_NUL, s, ""); } else state->MD_flag=0; msg_send2 (state, M_NUL, "SYS ", sysname); msg_send2 (state, M_NUL, "ZYZ ", sysop); msg_send2 (state, M_NUL, "LOC ", location); msg_send2 (state, M_NUL, "NDL ", nodeinfo); tzset(); t = safe_time(); safe_gmtime (&t, &tm); tm.tm_isdst = 0; gt = mktime(&tm); safe_localtime (&t, &tm); tm.tm_isdst = 0; tz = (int)(((long)mktime(&tm)-(long)gt)/60); safe_localtime (&t, &tm); #if 0 sprintf (szLocalTime, "%s, %2d %s %d %02d:%02d:%02d %c%02d%02d (%s)", dayweek[tm->tm_wday], tm->tm_mday, month[tm->tm_mon], tm->tm_year+1900, tm->tm_hour, tm->tm_min, tm->tm_sec, (tz>=0) ? '+' : '-', abs(tz)/60, abs(tz)%60, tzname[tm->tm_isdst>0 ? 1 : 0]); #else sprintf (szLocalTime, "%s, %2d %s %d %02d:%02d:%02d %c%02d%02d", dayweek[tm.tm_wday], tm.tm_mday, month[tm.tm_mon], tm.tm_year+1900, tm.tm_hour, tm.tm_min, tm.tm_sec, (tz>=0) ? '+' : '-', abs(tz)/60, abs(tz)%60); #endif msg_send2 (state, M_NUL, "TIME ", szLocalTime); msg_sendf (state, M_NUL, "VER " MYNAME "/" MYVER "%s " PRTCLNAME "/" PRTCLVER, get_os_string ()); szAkas = xalloc (nAddr * (FTN_ADDR_SZ + 1)); *szAkas = 0; for (i = 0; i < nAddr; ++i) { ftnaddress_to_str (szFTNAddr, pAddr + i); strcat (szAkas, " "); strcat (szAkas, szFTNAddr); } msg_send2 (state, M_ADR, szAkas, 0); if (state->to) msg_sendf (state, M_NUL, "OPT NDA%s%s%s", (state->NR_flag & WANT_NR) ? " NR" : "", (state->ND_flag & THEY_ND) ? " ND" : "", (state->crypt_flag & WE_CRYPT) ? " CRYPT" : ""); free (szAkas); } static int start_file_transfer (STATE *state, FTNQ *file) { struct stat sb; FILE *f = NULL; int action = -1; if (state->out.f) fclose (state->out.f); TF_ZERO (&state->out); /* No file in transfer */ if (state->flo.f == 0) /* There is no open .?lo */ { state->maxflvr = MAXFLVR (state->maxflvr, file->flvr); /* Try to open the suggested file */ if (file->type == 's') { sb.st_size = file->size; sb.st_ctime = sb.st_mtime = file->time; f = NULL; } else { if ((f = fopen (file->path, (file->type == 'l') ? "r+b" : "rb")) == 0 || fstat (fileno (f), &sb) == -1) { Log (1, "%s: cannot open: %s", file->path, strerror (errno)); return 0; } /* We've opened a .?lo */ if (file->type == 'l') { state->flo.action = file->action; strcpy (state->flo.path, file->path); state->flo.f = f; } } memcpy(&state->out_addr, &file->fa, sizeof(state->out_addr)); if ((state->ND_flag & WE_ND) == 0) memcpy(&state->ND_addr, &file->fa, sizeof(state->out_addr)); Log (8, "cur remote addr is %u:%u/%u.%u", file->fa.z, file->fa.net, file->fa.node, file->fa.p); } if (state->flo.f != 0) { strcpy (state->out.flo, state->flo.path); while (1) { char *w; if (!read_flo_line (state->out.path, &action, state->flo.f)) { fclose (state->flo.f); state->flo.f = 0; /* .?lo closed, remove_from_spool() will now unlink it */ remove_from_spool (state, state->flo.path, 0, 0); TF_ZERO (&state->flo); return 0; } if ((w = trans_flo_line (state->out.path)) != 0) Log (5, "%s mapped to %s", state->out.path, w); if ((f = fopen (w ? w : state->out.path, "rb")) == 0 || fstat (fileno (f), &sb) == -1 || (sb.st_mode & S_IFDIR) != 0) { Log (1, "start_file_transfer: %s: %s", w ? w : state->out.path, strerror (errno)); if (f) fclose(f); if (w) free (w); remove_from_spool (state, state->out.flo, state->out.path, state->out.action); } else { if (w) free (w); break; } } } if (action == -1) { strcpy (state->out.path, file->path); state->out.flo[0] = 0; state->out.action = file->action; state->out.type = file->type; } else { state->out.action = action; state->out.type = 0; } state->out.f = f; state->out.size = sb.st_size; state->out.time = sb.st_mtime; state->waiting_for_GOT = 0; Log(9, "Dont waiting for M_GOT"); state->out.start = safe_time(); netname (state->out.netname, &state->out); if (ispkt(state->out.netname) && state->out.size <= 60) { Log (3, "skip empty pkt %s, %li bytes", state->out.path, state->out.size); if (state->out.f) fclose(state->out.f); remove_from_spool (state, state->out.flo, state->out.path, state->out.action); TF_ZERO (&state->out); return 0; } Log (3, "sending %s as %s (%li)", state->out.path, state->out.netname, (long) state->out.size); if (state->NR_flag & WE_NR) { msg_sendf (state, M_FILE, "%s %li %li -1", state->out.netname, (long) state->out.size, (long) state->out.time); state->off_req_sent = 1; } else msg_sendf (state, M_FILE, "%s %li %li 0", state->out.netname, (long) state->out.size, (long) state->out.time); return 1; } void log_end_of_session (char *status, STATE *state) { char szFTNAddr[FTN_ADDR_SZ + 1]; BinLogStat (status, state); if (state->to) ftnaddress_to_str (szFTNAddr, &state->to->fa); else if (state->fa) ftnaddress_to_str (szFTNAddr, state->fa); else strcpy (szFTNAddr, "?"); Log (2, "done (%s%s, %s, S/R: %i/%i (%lu/%lu bytes))", state->to ? "to " : (state->fa ? "from " : ""), szFTNAddr, status, state->files_sent, state->files_rcvd, state->bytes_sent, state->bytes_rcvd); } void protocol (SOCKET socket, FTN_NODE *to, char *current_addr) { STATE state; struct timeval tv; fd_set r, w; int no, rd; #ifdef WIN32 unsigned long t_out = 0; unsigned long u_nettimeout = nettimeout*1000000l; #endif struct sockaddr_in peer_name; socklen_t peer_name_len = sizeof (peer_name); char host[MAXHOSTNAMELEN + 1]; const char *save_err = NULL; if (!init_protocol (&state, socket, to)) return; if (getpeername (socket, (struct sockaddr *) & peer_name, &peer_name_len) == -1) { Log (1, "getpeername: %s", TCPERR ()); memset(&peer_name, 0, sizeof (peer_name)); } if (to && current_addr) state.peer_name = current_addr; else { get_hostname(&peer_name, host, sizeof(host)); state.peer_name = host; } setproctitle ("%c [%s]", to ? 'o' : 'i', state.peer_name); lockhostsem(); Log (2, "session with %s (%s)", state.peer_name, inet_ntoa (peer_name.sin_addr)); releasehostsem(); if (getsockname (socket, (struct sockaddr *) & peer_name, &peer_name_len) == -1) { Log (1, "getsockname: %s", TCPERR ()); memset(&peer_name, 0, sizeof (peer_name)); } else state.our_ip=peer_name.sin_addr.s_addr; banner (&state); if (n_servers > max_servers && !to) { Log (1, "too many servers"); msg_send2 (&state, M_BSY, "Too many servers", 0); } else { while (1) { /* If the queue is not empty and there is no file in tranafer */ if (!state.local_EOB && state.q && state.out.f == 0 && !state.waiting_for_GOT && !state.off_req_sent && state.state!=P_NULL) { FTNQ *q; while (1) { /* Next .pkt, .flo or a file */ q = 0; if (state.flo.f || (q = select_next_file (state.q, state.fa, state.nfa)) != 0) { if (q && (q->type=='s') && (state.NR_flag & WE_NR) == 0) { /* TODO: wait for send queue and switch to NR mode */ Log(1, "WARNING: status present and no NR mode!"); continue; } if (start_file_transfer (&state, q)) break; } else { q_free (state.q); state.q = 0; break; } } } /* No more files to send in this batch, so send EOB */ if (!state.out.f && !state.q && !state.local_EOB && state.state != P_NULL && state.sent_fls == 0) { state.local_EOB = 1; msg_send2 (&state, M_EOB, 0, 0); } FD_ZERO (&r); FD_ZERO (&w); FD_SET (socket, &r); if (state.msgs || (state.out.f && !state.off_req_sent && !state.waiting_for_GOT) || state.oleft || state.send_eof) FD_SET (socket, &w); if (state.remote_EOB && state.sent_fls == 0 && state.local_EOB && state.GET_FILE_balance == 0 && state.in.f == 0 && state.out.f == 0) { /* End of the current batch */ if (state.rcvdlist) { state.q = process_rcvdlist (&state, state.q); q_to_killlist (&state.killlist, &state.n_killlist, state.q); free_rcvdlist (&state.rcvdlist, &state.n_rcvdlist); } Log (6, "there were %i msgs in this batch", state.msgs_in_batch); if (state.msgs_in_batch <= 2 || (state.major * 100 + state.minor <= 100)) { ND_set_status("", &state.ND_addr, &state); state.ND_addr.z=-1; break; } else { /* Start the next batch */ state.msgs_in_batch = 0; state.remote_EOB = state.local_EOB = 0; if (OK_SEND_FILES (&state)) state.q = q_scan_boxes (state.q, state.fa, state.nfa, state.to ? 1 : 0); continue; } } #if defined(WIN32) /* workaround winsock bug */ if (t_out < u_nettimeout) { #endif tv.tv_sec = nettimeout; /* Set up timeout for select() */ tv.tv_usec = 0; Log (8, "tv.tv_sec=%li, tv.tv_usec=%li", (long) tv.tv_sec, (long) tv.tv_usec); no = select (socket + 1, &r, &w, 0, &tv); if (no < 0) save_err = TCPERR (); Log (8, "selected %i (r=%i, w=%i)", no, FD_ISSET (socket, &r), FD_ISSET (socket, &w)); #if defined(WIN32) /* workaround winsock bug */ } else { Log (8, "win9x winsock workaround: timeout detected (nettimeout=%u sec, t_out=%lu sec)", nettimeout, t_out/1000000); no = 0; } #endif bsy_touch (); /* touch *.bsy's */ if (no == 0) { state.io_error = 1; Log (1, "timeout!"); if (to) bad_try (&to->fa, "Timeout!"); break; } else if (no < 0) { state.io_error = 1; if (!binkd_exit) { Log (1, "select: %s (args: %i %i)", save_err, socket, tv.tv_sec); if (to) bad_try (&to->fa, save_err); } break; } rd = FD_ISSET (socket, &r); if (rd) /* Have something to read */ { if (!recv_block (&state)) break; } if (FD_ISSET (socket, &w)) /* Clear to send */ { no = send_block (&state); #if defined(WIN32) /* workaround winsock bug - give up CPU */ if (!rd && no == 2) { FD_ZERO (&r); FD_SET (socket, &r); tv.tv_sec = 0; tv.tv_usec = w9x_workaround_sleep; /* see iphdr.h */ if (!select (socket + 1, &r, 0, 0, &tv)) { t_out += w9x_workaround_sleep; } else { t_out = 0; } } else { t_out = 0; } #endif if (!no) break; } #if defined(WIN32) /* workaround winsock bug - give up CPU */ else { t_out = 0; } #endif } } /* Flush input queue */ while (!state.io_error) { if ((no = recv(socket, state.ibuf, BLK_HDR_SIZE + MAX_BLKSIZE, 0)) == 0) break; if (no < 0) { if (TCPERRNO != TCPERR_WOULDBLOCK && TCPERRNO != TCPERR_AGAIN) state.io_error = 1; break; } else Log (9, "Purged %d bytes from input queue", no); } /* Still have something to send */ while (!state.io_error && (state.msgs || (state.optr && state.oleft)) && send_block (&state)); if (state.local_EOB && state.remote_EOB && state.sent_fls == 0 && state.GET_FILE_balance == 0 && state.in.f == 0 && state.out.f == 0) { /* Successful session */ log_end_of_session ("OK", &state); process_killlist (state.killlist, state.n_killlist, 's'); if (to) good_try (&to->fa, "CONNECT/BND"); } else { /* Unsuccessful session */ log_end_of_session ("failed", &state); process_killlist (state.killlist, state.n_killlist, 0); if (to) { /* We called and there were still files in transfer -- restore poll */ if (tolower (state.maxflvr) != 'h') { Log (4, "restoring poll with `%c' flavour", state.maxflvr); create_poll (&state.to->fa, state.maxflvr); } } } if (to && state.r_skipped_flag && hold_skipped > 0) { Log (2, "holding skipped mail for %li sec", (long) hold_skipped); hold_node (&to->fa, safe_time() + hold_skipped); } Log (4, "session closed, quitting..."); deinit_protocol (&state); evt_set (state.evt_queue); state.evt_queue = NULL; } binkd/getw.h0000664000076400007640000000166507227050666011460 0ustar gulgul/* * getwordx public domain library v.2.0 * (c) 1995,1996,1997 */ /* * $Id: getw.h,v 2.0 2001/01/10 12:12:38 gul Exp $ * * $Log: getw.h,v $ * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * */ #define MAX_ENV_VAR_NAME 256 /* * Supported flags: */ #define GWX_SUBST 1 /* Perform %VAR% substs */ #define GWX_HASH 2 /* Process `#' comments */ #define GWX_NOESC 4 /* Treat `\' as a regular character */ /* Example: fldsep == ":", fldskip == " \t" */ #define DEF_FLDSEP " \t\n\r" #define DEF_FLDSKIP " \t\n\r" /* * Src is a source string, n is a word number (1...), returned string must * be free()'d. Returns 0 if there is no word #n. */ char *getwordx2 (char *src, int n, int flags, char *fldsep, char *fldskip); #define getwordx(src,n,flags) \ getwordx2(src, n, flags, DEF_FLDSEP, DEF_FLDSKIP) #define getword(src,n) getwordx(src, n, GWX_SUBST | GWX_HASH) binkd/sys.h0000664000076400007640000001006610461230764011314 0ustar gulgul/* * sys.h -- 1) very system dependent functions and macros * 2) include for or * 3) defines for u8, u16, u32 * * sys.h is a part of binkd project * * Copyright (C) 1996 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: sys.h,v 2.11.2.3 2006/07/24 20:47:48 gul Exp $ * * $Log: sys.h,v $ * Revision 2.11.2.3 2006/07/24 20:47:48 gul * Use MSG_NOSIGNAL flag for send() * * Revision 2.11.2.2 2004/08/24 11:32:44 gul * Fix typo in prev patch * * Revision 2.11.2.1 2004/08/03 19:52:56 gul * Change SIGCHLD handling, make signal handler more clean, * prevent occasional hanging (mutex deadlock) under linux kernel 2.6. * * Revision 2.11 2003/04/06 13:50:11 gul * dos sleep() realization * * Revision 2.10 2003/03/26 13:53:28 gul * Fix OS/2 compilation * * Revision 2.9 2003/03/11 09:21:30 gul * Fixed OS/2 Watcom compilation * * Revision 2.8 2003/03/11 00:04:26 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.7 2003/03/10 12:16:54 gul * Use HAVE_DOS_H macro * * Revision 2.6 2003/03/10 10:39:23 gul * New include file common.h * * Revision 2.5 2003/03/05 11:40:12 gul * Fix win32 compilation * * Revision 2.4 2003/03/03 23:41:20 gul * Try to resolve problem with active threads while exitproc running * * Revision 2.3 2003/03/01 20:16:27 gul * OS/2 IBM C support * * Revision 2.2 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.1 2003/02/22 12:12:34 gul * Cleanup sources * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.3 1997/10/23 03:34:15 mff * many, many changes (forget to ci a version or two) * * Revision 1.1 1996/12/14 07:13:04 mff * Initial revision * */ #ifndef _sys_h #define _sys_h #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_IO_H #include #endif #ifdef HAVE_DOS_H #include #endif #if defined(__WATCOMC__) && !defined(__IBMC__) #include #ifdef __UTILS_32H /* toolkit 4.x or less */ #pragma library("so32dll.lib") #pragma library("tcp32dll.lib") #else /* using toolkit 5.x */ #define HAVE_ARPA_INET_H #define __IBMC__ 0 #define __IBMCPP__ 0 #endif #endif #if defined(WIN32) #include #include #endif #ifdef OS2 #define INCL_DOS #define INCL_ERRORS #include #include #endif #ifdef HAVE_THREADS #include #if defined(OS2) int gettid (void); #define PID() gettid() #elif defined(WIN32) #define PID() ((int)(0xffff & GetCurrentThreadId())) #else #define PID() ((int)gettid()) #endif #elif defined(__MSC__) #include #define PID() ((int)getpid()) void dos_sleep(int); #define sleep(s) dos_sleep(s) #else #include #define PID() ((int)getpid()) #endif #if defined(HAVE_FORK) && defined(HAVE_SIGPROCMASK) && defined(HAVE_WAITPID) && defined(SIG_BLOCK) void switchsignal(int how); #define blockchld() switchsignal(SIG_BLOCK) #define unblockchld() switchsignal(SIG_UNBLOCK) #define BLOCK_CHLD 1 #else #define blockchld() #define unblockchld() #endif #ifndef F_OK #define F_OK 0 #endif #ifndef HAVE_MSG_NOSIGNAL #define MSG_NOSIGNAL 0 #endif #if defined(UNIX) || defined(AMIGA) /* To be sure rename will fail if the target exists */ extern int o_rename (const char *from, const char *to); #define RENAME(f,t) o_rename(f,t) #else #define RENAME(f,t) rename(f,t) #endif #ifdef VISUALCPP #define sleep(a) Sleep(a*1000) #define _beginthread(a,b,c,d) _beginthread(a,c,d) #endif #if defined(EBADTYPE) && !defined(ENOTDIR) #define ENOTDIR EBADTYPE /* __IBMC__ */ #endif typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32; #endif binkd/branch.c0000664000076400007640000000625707633224011011730 0ustar gulgul/* * branch.c -- Create co-processes * * branch.c is a part of binkd project * * Copyright (C) 1996-1998 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: branch.c,v 2.4 2003/03/11 00:04:25 gul Exp $ * * $Log: branch.c,v $ * Revision 2.4 2003/03/11 00:04:25 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.3 2003/03/10 12:16:53 gul * Use HAVE_DOS_H macro * * Revision 2.2 2003/03/01 20:16:27 gul * OS/2 IBM C support * * Revision 2.1 2001/09/24 10:31:39 gul * Build under mingw32 * * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * Revision 1.3 1997/10/23 04:19:38 mff * Amiga port, argument copying (DUP() removed) * * Revision 1.2 1996/12/29 09:37:30 mff * Misc changes * * Revision 1.1 1996/12/14 07:01:58 mff * Initial revision */ #include #include #include #if defined(HAVE_FORK) && defined(HAVE_THREADS) #error You cannot define both HAVE_FORK and HAVE_THREADS! #endif #if !defined(HAVE_FORK) && !defined(HAVE_THREADS) && !defined(DOS) #error Must define either HAVE_FORK or HAVE_THREADS! #endif #if defined(HAVE_THREADS) || defined(DOS) #ifdef HAVE_DOS_H #include #endif #include #endif #include "Config.h" #include "sys.h" #include "tools.h" #ifdef AMIGA int ix_vfork (void); void vfork_setup_child (void); void ix_vfork_resume (void); #endif int branch (register void (*F) (void *), register void *arg, register size_t size) { register int rc; char *tmp; /* We make our own copy of arg for the child as the parent may destroy it * before the child finish to use it. It's not really needed with fork() * but we do not want extra checks for HAVE_FORK before free(arg) in the * child. */ if (size > 0) { if ((tmp = malloc (size)) == NULL) { Log (1, "malloc failed"); return -1; } else { memcpy (tmp, arg, size); arg = tmp; } } else arg = 0; #if defined(HAVE_FORK) && !defined(AMIGA) again: if (!(rc = fork ())) { /* new process */ F (arg); exit (0); } else if (rc < 0) { if (errno == EINTR) goto again; /* parent, error */ Log (1, "fork: %s", strerror (errno)); } else { /* parent, free our copy of args */ if (arg) free (arg); } #endif #ifdef HAVE_THREADS #ifdef __MINGW32__ if ((rc = _beginthread (F, STACKSIZE, arg)) < 0) #else if ((rc = _beginthread (F, 0, STACKSIZE, arg)) < 0) #endif { Log (1, "_beginthread: %s", strerror (errno)); } #endif #ifdef AMIGA /* this is rather bizzare. this function pretends to be a fork and behaves * like one, but actually it's a kind of a thread. so we'll need semaphores */ if (!(rc = ix_vfork ())) { vfork_setup_child (); ix_vfork_resume (); F (arg); exit (0); } else if (rc < 0) { Log (1, "ix_vfork: %s", strerror (errno)); } #endif #ifdef DOS rc = 0; F (arg); #endif return rc; } binkd/ftnaddr.h0000664000076400007640000000300507227050665012121 0ustar gulgul/* * $Id: ftnaddr.h,v 2.0 2001/01/10 12:12:37 gul Exp $ * * $Log: ftnaddr.h,v $ * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * */ #ifndef _ftnaddr_h #define _ftnaddr_h #define MAX_DOMAIN 32 #define FTN_ADDR_SZ (80+MAX_DOMAIN) /* Max length of a stringized fido address */ typedef struct _FTN_ADDR FTN_ADDR; struct _FTN_ADDR { char domain[MAX_DOMAIN + 1]; int z, net, node, p; /* -1==unknown or wildcard */ }; /* * 1 -- parsed ok, 0 -- syntax error */ int parse_ftnaddress (char *s, FTN_ADDR *fa); /* * Not safe! Give it at least FTN_ADDR_SZ buffer. */ void ftnaddress_to_str (char *s, FTN_ADDR *fa); /* * Expands an address using pAddr[0] (pAddr[0] is my main a.k.a.) */ void exp_ftnaddress (FTN_ADDR *fa); /* * Returns 0 if match. */ int ftnaddress_cmp (FTN_ADDR *, FTN_ADDR *); /* * S should have space for MAXPATHLEN chars, sets s to "" if no domain. */ void ftnaddress_to_filename (char *s, FTN_ADDR *fa); /* * 2:5047/13.1 -> p1.f13.n5047.z2.fidonet.net. * S should have space for MAXHOSTNAMELEN chars. */ void ftnaddress_to_domain (char *s, FTN_ADDR *fa); #define is4D(fa) ((fa)->z != -1 && (fa)->node != -1 && \ (fa)->net != -1 && (fa)->p != -1) #define is5D(fa) (is4D(fa) && (fa)->domain[0]) #define FA_ZERO(fa) (memset((fa)->domain, 0, sizeof((fa)->domain)), \ (fa)->z = (fa)->net = (fa)->node = (fa)->p = -1) #define FA_ISNULL(fa) (!((fa)->domain[0]) && (fa)->z == -1 && \ (fa)->net == -1 && (fa)->node == -1 && (fa)->p == -1) #endif binkd/ftnq.h0000664000076400007640000001130410317775567011461 0ustar gulgul/* * ftnq.h -- BSO interface * * ftnq.h is a part of binkd project * * Copyright (C) 1996-1998 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* $Id: ftnq.h,v 2.4.2.3 2005/10/02 15:23:35 gul Exp $ * * $Log: ftnq.h,v $ * Revision 2.4.2.3 2005/10/02 15:23:35 gul * Fileboxes was not scanned for unlisted links * * Revision 2.4.2.2 2005/05/13 10:03:59 stas * update comment for the _FTNQ.type values * * Revision 2.4.2.1 2003/09/14 12:20:05 gul * Clean use pointers to pNod array * * Revision 2.4 2003/05/28 14:32:57 gul * new function q_add_last_file() - add file to the end of queue * * Revision 2.3 2003/03/01 18:04:30 gul * Remove redundrant include * * Revision 2.2 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.1 2003/02/22 12:56:00 gul * Do not give unsecure mail to secuse link when send-if-pwd * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.8 1998/05/05 23:59:33 mff * Added comment about FTNQ.time. * * Revision 1.7 1997/10/23 04:04:45 mff * q_not_empty() returns FTN_NODE now * * Revision 1.6 1997/06/16 05:47:13 mff * Remove old .bsy/.csy files, queue handling changed again. * * Revision 1.5 1997/02/13 07:08:39 mff * Support for fileboxes * * Revision 1.2 1996/12/14 07:04:39 mff * Addedd q_scan_addrs() */ #ifndef _ftnq_h #define _ftnq_h #include #include "Config.h" #include "ftnaddr.h" #include "ftnnode.h" typedef struct _FTNQ FTNQ; struct _FTNQ { FTNQ *next; FTNQ *prev; FTN_ADDR fa; char flvr; /* 'I', 'i', 'C', 'c', 'D', 'd', 'O', * 'o', 'F', 'f', 'H', 'h' */ char action; /* 'd'elete, 't'runcate, '\0' -- none, * remove on 's'uccessful session, * after 'a'ny session */ char type; /* 'm' -- a mail packet (.?ut), * 'l' -- a flow file (.?lo), * 's' -- a ND-mode status file (.stc), * '*' -- a file from .?lo (just for * stats, it will never be selected for * sending right from the queue, it * will be send when parsing its .flo * instead, now it's obsolete), * other -- a file to send. */ char path[MAXPATHLEN + 1]; unsigned long size; time_t time; /* this field seems to be used only in * cmp_filebox_files(), when sorting * files from a filebox before sending */ int sent; /* == 1, if the file have been sent */ }; #define SCAN_LISTED ((FTNQ*)-1) /* * Scans outbound. Return value must be q_free()'d. */ FTNQ *q_scan (FTNQ *q); void q_free (FTNQ *q); /* * Add a file to the queue. */ FTNQ *q_add_file (FTNQ *q, char *filename, FTN_ADDR *fa1, char flvr, char action, char type); /* * Add a file to the end of queue. */ FTNQ *q_add_last_file (FTNQ *q, char *filename, FTN_ADDR *fa1, char flvr, char action, char type); /* * Adds to the q all files for n akas stored in fa */ FTNQ *q_scan_addrs (FTNQ *q, FTN_ADDR *fa, int n, int to); /* * Scans fileboxes for n akas stored in fa */ FTNQ *q_scan_boxes (FTNQ *q, FTN_ADDR *fa, int n, int to); /* * 0 = the queue is empty. */ int q_not_empty (FTN_NODE *r); /* * Selects a node to make the next call. (It's alost like * q_not_empty(), but it will never select a node twice) */ int q_next_node (FTN_NODE *r); /* * Selects from q the next file for fa (Returns a pointer to a q element) */ FTNQ *select_next_file (FTNQ *q, FTN_ADDR *fa, int nAka); /* * Just lists q, not more */ void q_list (FILE *out, FTNQ *q); /* * Creates an empty .?lo */ int create_poll (FTN_ADDR *fa, int flvr); /* * Set .hld for a node */ void hold_node (FTN_ADDR *fa, time_t hold_until); /* * get size of files in the queue */ void q_get_sizes (FTNQ *q, unsigned long *netsize, unsigned long *filessize); #define FQ_ZERO(x) (memset(x, 0, sizeof(*(x))), FA_ZERO(&((x)->fa))) #define FQ_ISNULL(x) (FA_ISNULL(&((x)->fa))) /* * Is F a good flavour letter? */ extern const char prio[]; #define isflvr(F) ((F) && strchr(prio,(F))) /* * Compare flavours. `I' is the best, `\0' is the worst. */ #define MAXFLVR(a,b) ((strchr(prio, (a)) < strchr(prio, (b))) ? (a) : (b)) void bad_try (FTN_ADDR *fa, const char *error); void good_try (FTN_ADDR *fa, char *comment); void read_try (FTN_ADDR *fa, unsigned *nok, unsigned *nbad); void write_try (FTN_ADDR *fa, unsigned *nok, unsigned *nbad, char *comment); #endif binkd/run.c0000664000076400007640000000520507644340730011300 0ustar gulgul/* * run.c -- Run external programs * * run.c is a part of binkd project * * Copyright (C) 1996-1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: run.c,v 2.4 2003/04/07 18:22:16 gul Exp $ * * $Log: run.c,v $ * Revision 2.4 2003/04/07 18:22:16 gul * Wait for external process under win32 bugfix * * Revision 2.3 2003/04/06 08:01:32 gul * Close handles after CreateProcess() * * Revision 2.2 2003/04/06 07:54:41 gul * Change wait for child process function for win32 * * Revision 2.1 2001/10/27 08:07:17 gul * run and run_args returns exit code of calling process * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.1 1997/03/28 06:16:56 mff * Initial revision * */ #include #include #include #if defined WIN32 #include #endif #include "run.h" #include "tools.h" int run (char *cmd) { int rc=-1; #if !defined(WIN32) && !defined(EMX) Log (3, "executing `%s'", cmd); Log (3, "rc=%i", (rc=system (cmd))); #elif defined(EMX) sigset_t s; sigemptyset(&s); sigaddset(&s, SIGCHLD); sigprocmask(SIG_BLOCK, &s, NULL); Log (3, "executing `%s'", cmd); Log (3, "rc=%i", (rc=system (cmd))); sigprocmask(SIG_UNBLOCK, &s, NULL); #else /* WIN32 */ STARTUPINFO si; PROCESS_INFORMATION pi; DWORD dw; char *cs, *sp=getenv("COMSPEC"); Log (3, "executing `%s'", cmd); memset(&si, 0, sizeof(si)); si.cb=sizeof(si); if(!sp) sp="command"; cs=(char*)malloc(strlen(sp)+strlen(cmd)+6); dw=CREATE_DEFAULT_ERROR_MODE; strcpy(cs, sp); strcat(cs, " /C "); sp=cmd; if (sp[0]=='@') { dw|=CREATE_NEW_CONSOLE|CREATE_NEW_PROCESS_GROUP; sp++; if (sp[0]=='@') { si.dwFlags=STARTF_USESHOWWINDOW; si.wShowWindow=SW_HIDE; sp++; } else si.lpTitle=sp; } strcat(cs, sp); if (!CreateProcess(NULL, cs, NULL, NULL, 0, dw, NULL, NULL, &si, &pi)) Log (1, "Error in CreateProcess()=%ld", (long)GetLastError()); else if (sp==cmd) { if (WaitForSingleObject(pi.hProcess, INFINITE) != WAIT_OBJECT_0) Log (1, "Error in WaitForSingleObject()=%ld", (long)GetLastError()); else if (!GetExitCodeProcess(pi.hProcess, &dw)) Log (1, "Error in GetExitCodeProcess()=%ld", (long)GetLastError()); else Log (3, "rc=%i", rc = (int)dw); } free(cs); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); #endif return rc; } binkd/client.c0000664000076400007640000003171710103766430011752 0ustar gulgul/* * client.c -- Outbound calls * * client.c is a part of binkd project * * Copyright (C) 1996-1998 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: client.c,v 2.39.2.2 2004/08/03 19:52:56 gul Exp $ * * $Log: client.c,v $ * Revision 2.39.2.2 2004/08/03 19:52:56 gul * Change SIGCHLD handling, make signal handler more clean, * prevent occasional hanging (mutex deadlock) under linux kernel 2.6. * * Revision 2.39.2.1 2003/09/14 12:20:04 gul * Clean use pointers to pNod array * * Revision 2.39 2003/06/02 14:10:17 gul * write domain and IP to logfile on outgoing connections * * Revision 2.38 2003/04/30 13:38:17 gul * Avoid warnings * * Revision 2.37 2003/04/28 07:30:16 gul * Bugfix: Log() changes TCPERRNO * * Revision 2.36 2003/04/25 12:51:18 gul * Fix diagnostics on exit * * Revision 2.35 2003/04/22 22:26:17 gul * Fix previous patch * * Revision 2.34 2003/04/22 20:13:49 gul * Fixed possible premature exit in -p mode * * Revision 2.33 2003/04/18 08:30:33 hbrew * Fix memory fault when use proxy. Path from Stas Degteff 2:5080/102 * * Revision 2.32 2003/04/06 13:50:11 gul * dos sleep() realization * * Revision 2.31 2003/04/06 08:38:47 gul * Log port number for outgoing connections to non-standard port * * Revision 2.30 2003/03/31 16:28:09 gul * Fix previous patch * * Revision 2.29 2003/03/28 14:01:10 gul * Do not call _endthread() without _beginthread() in client only mode * * Revision 2.28 2003/03/26 10:44:40 gul * Code cleanup * * Revision 2.27 2003/03/25 20:37:46 gul * free_hostent() function * * Revision 2.26 2003/03/19 14:36:03 gul * Fix typo * * Revision 2.25 2003/03/14 21:58:33 gul * Changed function SLEEP() to define for multithread version * * Revision 2.24 2003/03/11 14:11:01 gul * Bugfix * * Revision 2.23 2003/03/11 11:42:23 gul * Use event semaphores for exit threads * * Revision 2.22 2003/03/11 00:04:25 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.21 2003/03/10 15:57:52 gul * Fixed segfault on unresolvable host * * Revision 2.20 2003/03/10 12:16:53 gul * Use HAVE_DOS_H macro * * Revision 2.19 2003/03/10 10:39:23 gul * New include file common.h * * Revision 2.18 2003/03/10 08:38:07 gul * Make n_servers/n_clients changes thread-safe * * Revision 2.17 2003/03/06 18:24:00 gul * Fix exitfunc with threads * * Revision 2.16 2003/03/05 13:21:50 gul * Fix warnings * * Revision 2.15 2003/03/05 11:40:12 gul * Fix win32 compilation * * Revision 2.14 2003/03/04 09:56:00 gul * Fix threads compilation * * Revision 2.13 2003/03/03 23:41:20 gul * Try to resolve problem with active threads while exitproc running * * Revision 2.12 2003/03/01 20:16:27 gul * OS/2 IBM C support * * Revision 2.11 2003/03/01 15:55:02 gul * Current outgoing address is now attibute of session, but not node * * Revision 2.10 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.9 2003/02/28 08:53:38 gul * Fixed proxy usage * * Revision 2.8 2003/02/27 20:34:37 gul * Fix proxy usage * * Revision 2.7 2003/02/27 18:52:37 gul * bugfix in proxy using * * Revision 2.6 2003/02/23 07:20:11 gul * Restore lost comment * * Revision 2.5 2003/02/22 19:30:22 gul * Fix compiler warning * * Revision 2.4 2003/02/22 12:12:33 gul * Cleanup sources * * Revision 2.3 2003/02/22 11:45:41 gul * Do not resolve hosts if proxy or socks5 using * * Revision 2.2 2002/04/02 13:10:32 gul * Put real remote addr to log "session with ..." if connect via socks or proxy * * Revision 2.1 2001/09/14 07:24:20 gul * bindaddr works on outgoing connections now * * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * Revision 1.12 1998/06/19 05:21:12 mff * Oport was broken * * Revision 1.11 1997/11/04 23:33:55 mff * Fixed a minor bug in walking through hostlists * * Revision 1.10 1997/10/23 04:16:36 mff * host lists, more? * * Revision 1.9 1997/03/09 07:17:59 mff * Support for -p key * * Revision 1.8 1997/02/07 07:11:53 mff * We now restart sleep() after signals * * Revision 1.7 1997/02/01 05:55:24 mff * Changed SIGCHLD support * * Revision 1.6 1997/02/01 05:37:22 mff * Support for new queue scanning * * Revision 1.4 1996/12/14 07:03:26 mff * Now we use branch() * * Revision 1.3 1996/12/09 03:37:21 mff * Changed call-out logic * * Revision 1.2 1996/12/07 12:03:02 mff * Now fork()'s or _beginthread()'s */ #include #include #include #include #ifdef HAVE_FORK #include #include #elif defined(HAVE_THREADS) #ifdef HAVE_DOS_H #include #endif #include #elif !defined(DOS) #error Must define either HAVE_FORK or HAVE_THREADS! #endif #include "Config.h" #include "sys.h" #include "iphdr.h" #include "client.h" #include "readcfg.h" #include "common.h" #include "iptools.h" #include "ftnq.h" #include "tools.h" #include "protocol.h" #include "bsy.h" #include "assert.h" #include "setpttl.h" #include "sem.h" #ifdef HTTPS #include "https.h" #endif static void call (void *arg); int n_clients = 0; #ifdef HAVE_FORK static jmp_buf jmpbuf; static void chld (int signo) { if (signo == SIGALRM) longjmp(jmpbuf, 1); #define CHILDCOUNT n_clients #include "reapchld.inc" } #endif #if defined(HAVE_THREADS) #define SLEEP(x) WaitSem(&exitcmgr, x) #elif defined(VOID_SLEEP) || !defined(HAVE_FORK) #define SLEEP(x) sleep(x) #else void SLEEP (time_t s) { while ((s = sleep (s)) > 0 && !binkd_exit); } #endif #if defined(HAVE_THREADS) && defined(OS2) void rel_grow_handles(int nh) { LONG addfh=0; static ULONG curmaxfh=0; LockSem(&fhsem); if (curmaxfh == 0) { if (DosSetRelMaxFH(&addfh, &curmaxfh)) { Log(1, "Cannot DosSetRelMaxFH"); return; } } #ifdef __WATCOMC__ if ((addfh=_grow_handles((int)(curmaxfh += nh))) < curmaxfh) #else addfh=nh; if (DosSetRelMaxFH(&addfh, &curmaxfh)) #endif Log(1, "Cannot grow handles to %ld (now %ld): %s", curmaxfh, addfh, strerror(errno)); else Log(6, "Set MaxFH to %ld (res %ld)", curmaxfh, addfh); ReleaseSem(&fhsem); } #endif void clientmgr (void *arg) { int pid; int q_empty = 1; int n_cl = n_clients; #ifdef HAVE_FORK pidcmgr = 0; signal (SIGCHLD, chld); #elif HAVE_THREADS pidcmgr = PID(); #endif setproctitle ("client manager"); Log (4, "clientmgr started"); while (!binkd_exit) { FTN_NODE r; blockchld(); if (checkcfg_flag && client_flag && !server_flag && !poll_flag) checkcfg(); if (q_empty) { q_free (SCAN_LISTED); if (printq) Log (-1, "scan\r"); n_cl = n_clients; q_scan (SCAN_LISTED); q_empty = !q_not_empty (NULL); if (printq) { q_list (stderr, SCAN_LISTED); Log (-1, "idle\r"); } } if (n_clients < max_clients) { if (q_next_node (&r) != 0 && bsy_test (&r.fa, F_BSY) && bsy_test (&r.fa, F_CSY)) { rel_grow_handles (6); threadsafe(++n_clients); if ((pid = branch (call, (void *) &r, sizeof (r))) < 0) { rel_grow_handles (-6); threadsafe(--n_clients); PostSem(&eothread); Log (1, "cannot branch out"); unblockchld(); SLEEP(1); } else { Log (5, "started client #%i, id=%i", n_clients, pid); } } else { if (poll_flag && n_cl <= 0 && n_clients <= 0 && q_not_empty (NULL) == 0) { Log (4, "the queue is empty, quitting..."); break; } q_empty = 1; unblockchld(); SLEEP (rescan_delay); } } else { unblockchld(); SLEEP (call_delay); } } unblockchld(); #ifdef HAVE_THREADS pidcmgr = 0; if (server_flag) { PostSem(&eothread); _endthread(); } #else exit (0); #endif } static int call0 (FTN_NODE *node) { int sockfd = INVALID_SOCKET; struct hostent he; struct hostent *hp = NULL; /* prevent compiler warning */ struct sockaddr_in sin; char **cp; char szDestAddr[FTN_ADDR_SZ + 1]; struct in_addr defaddr; int i, rc; char host[MAXHOSTNAMELEN + 5 + 1]; /* current host/port */ unsigned short port; const char *save_err; ftnaddress_to_str (szDestAddr, &node->fa); Log (2, "call to %s", szDestAddr); setproctitle ("call to %s", szDestAddr); memset(&sin, 0, sizeof(sin)); #ifdef HTTPS if (proxy[0] || socks[0]) { char *sp, *sport; strncpy(host, proxy[0] ? proxy: socks, sizeof(host)); if ((sp=strchr(host, ':')) != NULL) { *sp++ = '\0'; sport = sp; if ((sp=strchr(sp, '/')) != NULL) *sp++ = '\0'; } else { if((sp=strchr(host, '/')) != NULL) *sp++ = '\0'; sport = proxy[0] ? "squid" : "socks"; /* default port */ } if (!isdigit(*sport)) { struct servent *se; lockhostsem(); if ((se = getservbyname(sport, "tcp")) == NULL) { Log(2, "Port %s not found, try default %d", sp, proxy[0] ? 3128 : 1080); sin.sin_port = htons((unsigned short)(proxy[0] ? 3128 : 1080)); } else sin.sin_port = se->s_port; releasehostsem(); } else sin.sin_port = htons((unsigned short)atoi(sport)); /* resolve proxy host */ if ((hp = find_host(host, &he, &defaddr)) == NULL) { Log(1, "%s host %s not found", proxy[0] ? "Proxy" : "Socks", host); return 0; } } #endif for (i = 1; sockfd == INVALID_SOCKET && (rc = get_host_and_port (i, host, &port, node->hosts, &node->fa)) != -1; ++i) { if (rc == 0) { Log (1, "%s: %i: error parsing host list", node->hosts, i); continue; } #ifdef HTTPS if (!proxy[0] && !socks[0]) /* don't resolve if proxy or socks specified */ #endif { if ((hp = find_host(host, &he, &defaddr)) == NULL) { bad_try(&node->fa, "Cannot gethostbyname"); continue; } sin.sin_port = htons(port); } /* Trying... */ for (cp = hp->h_addr_list; cp && *cp; cp++) { if ((sockfd = socket (hp->h_addrtype, SOCK_STREAM, 0)) == INVALID_SOCKET) { Log (1, "socket: %s", TCPERR ()); return 0; } add_socket(sockfd); sin.sin_addr = *((struct in_addr *) * cp); sin.sin_family = hp->h_addrtype; lockhostsem(); #ifdef HTTPS if (proxy[0] || socks[0]) { char *sp = strchr(host, ':'); if (sp) *sp = '\0'; if (port == oport) Log (4, "trying %s via %s %s:%u...", host, proxy[0] ? "proxy" : "socks", inet_ntoa (sin.sin_addr), ntohs(sin.sin_port)); else Log (4, "trying %s:%u via %s %s:%u...", host, port, proxy[0] ? "proxy" : "socks", inet_ntoa (sin.sin_addr), ntohs(sin.sin_port)); sprintf(host+strlen(host), ":%u", port); } else #endif { if (port == oport) Log (4, "trying %s...", inet_ntoa (sin.sin_addr)); else Log (4, "trying %s:%u...", inet_ntoa (sin.sin_addr), port); } releasehostsem(); if (bindaddr[0]) { struct sockaddr_in src_sin; memset(&src_sin, 0, sizeof(src_sin)); src_sin.sin_addr.s_addr = inet_addr(bindaddr); src_sin.sin_family = AF_INET; if (bind(sockfd, (struct sockaddr *)&src_sin, sizeof(src_sin))) Log(4, "bind: %s", TCPERR()); } #ifdef HAVE_FORK if (connect_timeout) { if (setjmp(jmpbuf)) { save_err = strerror (ETIMEDOUT); goto badtry; } signal(SIGALRM, chld); alarm(connect_timeout); } #endif if (connect (sockfd, (struct sockaddr *) & sin, sizeof (sin)) == 0) { #ifdef HAVE_FORK alarm(0); signal(SIGALRM, SIG_DFL); #endif Log (4, "connected"); break; } save_err = TCPERR (); #ifdef HAVE_FORK badtry: alarm(0); signal(SIGALRM, SIG_DFL); #endif if (!binkd_exit) { Log (1, "unable to connect: %s", save_err); bad_try (&node->fa, save_err); } del_socket(sockfd); soclose (sockfd); sockfd = INVALID_SOCKET; } #ifdef HAVE_THREADS #ifdef HTTPS if (!proxy[0] && !socks[0]) #endif free_hostent(hp); #endif #ifdef HTTPS if (sockfd != INVALID_SOCKET && (proxy[0] || socks[0])) { if (h_connect(sockfd, host) != 0) { if (!binkd_exit) bad_try (&node->fa, TCPERR ()); del_socket(sockfd); soclose (sockfd); sockfd = INVALID_SOCKET; } else if (port == oport) { char *pp; if( (pp = strchr(host, ':')) ){ *pp = '\0'; } } } #endif } #if defined(HAVE_THREADS) && defined(HTTPS) if (proxy[0] || socks[0]) free_hostent(hp); #endif if (sockfd == INVALID_SOCKET) return 0; protocol (sockfd, node, host); del_socket(sockfd); soclose (sockfd); return 1; } static void call (void *arg) { FTN_NODE *node = (FTN_NODE *) arg; if (bsy_add (&node->fa, F_CSY)) { call0 (node); bsy_remove (&node->fa, F_CSY); } free (arg); rel_grow_handles(-6); #ifdef HAVE_THREADS threadsafe(--n_clients); PostSem(&eothread); _endthread(); #elif defined(DOS) --n_clients; #endif } binkd/inbound.c0000664000076400007640000003003611112744722012124 0ustar gulgul/* * inbound.c -- inbound handling * * inbound.c is a part of binkd project * * Copyright (C) 1996-1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: inbound.c,v 2.12.2.7 2008/11/25 09:48:02 gul Exp $ * * $Log: inbound.c,v $ * Revision 2.12.2.7 2008/11/25 09:48:02 gul * Segfault if garbage in *.hr * * Revision 2.12.2.6 2008/01/14 20:46:39 gul * Workaroud bug of earlyer binkd versions with partial files and not NR-mode * * Revision 2.12.2.5 2006/05/22 19:03:32 stas * Fix deletion fault .hr/.dt pair. Bugreport from Alexey Fayans 2:5030/1997 * * Revision 2.12.2.4 2005/08/08 11:07:45 gul * Applied patch from current: * fix segfault when a remote doesn't provide an address but sends a file * (bug reported by andrew clarke, fixed by val khokhlov) * * Revision 2.12.2.3 2004/10/21 17:02:02 gul * Rename trunc() -> trunc_file() due to conflicts under OS/2 EMX and SuSE * * Revision 2.12.2.2 2003/08/28 07:38:09 gul * Cosmetics in log * * Revision 2.12.2.1 2003/08/27 06:46:37 gul * Migrate from stable branch: * remove partial if received part more then total size, * flush buffer after receive data frame, * drop session if extra bytes received. * * Revision 2.12 2003/03/10 10:39:23 gul * New include file common.h * * Revision 2.11 2003/03/05 13:21:50 gul * Fix warnings * * Revision 2.10 2003/03/01 18:29:52 gul * Change size_t to off_t for file sizes and offsets * * Revision 2.9 2003/03/01 15:00:16 gul * Join skipmask and overwrite into common maskchain * * Revision 2.8 2003/02/27 15:37:19 gul * Bugfix in disk free space check * * Revision 2.7 2002/11/22 14:40:42 gul * Check free space on inbox if defined * * Revision 2.6 2002/10/03 10:23:26 gul * Check fprintf() & fclose() retcodes * * Revision 2.5 2002/07/22 19:38:23 gul * overwrite minor fix * * Revision 2.4 2002/07/21 10:35:44 gul * overwrite option * * Revision 2.3 2002/05/06 19:25:39 gul * new keyword inboundCase in config * * Revision 2.2 2001/10/23 08:33:44 gul * Change filename (not ext) in incoming *.req if already exists * * Revision 2.1 2001/04/23 07:58:57 gul * getfree() on large drives fixed * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.10 1997/10/23 04:03:07 mff * minor fixes * * Revision 1.9 1997/05/17 08:42:35 mff * Added realname param to inb_test() * * Revision 1.8 1997/03/15 05:08:17 mff * utime() replaced with touch() * * Revision 1.7 1997/03/09 07:19:37 mff * Fixed bugs with `#' in filenames and incorrect killing of * partial packets * * Revision 1.6 1997/02/13 07:08:39 mff * Support for fileboxes * * Revision 1.5 1997/02/07 07:03:16 mff * Added more paranoia */ #include #include #include #include #include #include #include #include #include "Config.h" #include "sys.h" #include "common.h" #include "readcfg.h" #include "inbound.h" #include "tools.h" #include "protocol.h" #include "readdir.h" /* Removes both xxxxx.hr and it's xxxxx.dt */ static void remove_hr (char *path) { strcpy (strrchr (path, '.'), ".dt"); delete (path); strcpy (strrchr (path, '.'), ".hr"); delete (path); } static int creat_tmp_name (char *s, char *file, off_t size, time_t time, FTN_ADDR *from, char *inbound) { FILE *f; char tmp[20]; char *t; char node[FTN_ADDR_SZ + 1]; strnzcpy (s, inbound, MAXPATHLEN); strnzcat (s, PATH_SEPARATOR, MAXPATHLEN); t = s + strlen (s); while (1) { sprintf (tmp, "%08lx.hr", rnd ()); strnzcat (s, tmp, MAXPATHLEN); if (create_empty_sem_file (s)) { if ((f = fopen (s, "w")) == 0) { Log (1, "%s: %s", s, strerror (errno)); delete (s); return 0; } if (from) ftnaddress_to_str (node, from); else strcpy(node, "0:0/0.0@unknown"); if (fprintf (f, "%s %li %li %s\n", file, (long int) size, (long int) time, node) <= 0) { Log (1, "%s: %s", s, strerror (errno)); fclose (f); delete (s); return 0; } if (fclose (f)) { Log (1, "%s: %s", s, strerror (errno)); delete (s); return 0; } break; } *t = 0; } return 1; } static int to_be_deleted (char *tmp_name, char *netname) { struct stat sb; strcpy (strrchr (tmp_name, '.'), ".dt"); if (stat (tmp_name, &sb) == 0 && kill_old_partial_files != 0 && time (0) - sb.st_mtime > kill_old_partial_files) { Log (4, "found old .dt/.hr files for %s", netname); return 1; } strcpy (strrchr (tmp_name, '.'), ".hr"); return 0; } /* * Searches for the ``file'' in the inbound and returns it's tmp name in s. * S must have MAXPATHLEN chars. Returns 0 on error, 1=found, 2=created. */ int find_tmp_name (char *s, char *file, off_t size, time_t time, FTN_ADDR *from, int nfa, char *inbound) { char buf[MAXPATHLEN + 80]; DIR *dp; struct dirent *de; FILE *f; int i, found = 0; char *t; if (temp_inbound[0]) inbound = temp_inbound; if ((dp = opendir (inbound)) == 0) { Log (1, "cannot opendir %s: %s", inbound, strerror (errno)); return 0; } strnzcpy (s, inbound, MAXPATHLEN); strnzcat (s, PATH_SEPARATOR, MAXPATHLEN); t = s + strlen (s); while ((de = readdir (dp)) != 0) { for (i = 0; i < 8; ++i) if (!isxdigit (de->d_name[i])) break; if (i < 8 || STRICMP (de->d_name + 8, ".hr")) continue; strnzcat (s, de->d_name, MAXPATHLEN); if ((f = fopen (s, "r")) == 0 || !fgets (buf, sizeof (buf), f)) { Log (1, "find_tmp_name: %s: %s", de->d_name, strerror (errno)); if (f) fclose (f); } else { char *w[4]; FTN_ADDR fa; fclose (f); FA_ZERO (&fa); for (i = 0; i < 4; ++i) w[i] = getwordx (buf, i + 1, GWX_NOESC); if (w[3] && !strcmp (w[0], file) && parse_ftnaddress (w[3], &fa)) { for (i = 0; i < nfa; i++) if (!ftnaddress_cmp (&fa, from + i)) break; if (size == (off_t) atol (w[1]) && (time & ~1) == (atol (w[2]) & ~1) && i < nfa) { found = 1; } else if (kill_dup_partial_files && i < nfa) { Log (5, "dup partial file %s removed", w[0]); remove_hr (s); } } else if (to_be_deleted (s, w[0] ? w[0] : "unknown")) { remove_hr (s); } for (i = 0; i < 4; ++i) if (w[i]) free (w[i]); } if (found) break; else *t = 0; } closedir (dp); /* New file */ if (!found) { Log (5, "file not found, trying to create a tmpname"); if (creat_tmp_name (s, file, size, time, from, inbound)) found = 2; else return 0; } /* Replacing .hr with .dt */ strcpy (strrchr (s, '.'), ".dt"); return found; } FILE *inb_fopen (char *netname, off_t size, time_t time, FTN_ADDR *from, int nfa, char *inbound, int secure_flag) { char buf[MAXPATHLEN + 1]; struct stat sb; FILE *f; if (!find_tmp_name (buf, netname, size, time, from, nfa, inbound)) return 0; fopen_again: if ((f = fopen (buf, "ab")) == 0) { Log (1, "%s: %s", buf, strerror (errno)); return 0; } fseek (f, 0, SEEK_END); /* Work-around MSVC bug */ #if defined(OS2) DosSetFHState(fileno(f), OPEN_FLAGS_NOINHERIT); #elif defined(EMX) fcntl(fileno(f), F_SETFD, FD_CLOEXEC); #endif /* Checking for free space */ if (fstat (fileno (f), &sb) == 0) { /* Free space req-d (Kbytes) */ unsigned long freespace, freespace2; int req_free = ((secure_flag == P_SECURE) ? minfree : minfree_nonsecure); freespace = getfree(buf); freespace2 = getfree(inbound); if (freespace > freespace2) freespace = freespace2; if (sb.st_size > size) { Log (1, "Partial size %lu > %lu (file size), delete partial", (unsigned long) sb.st_size, (unsigned long) size); fclose (f); if (trunc_file (buf) && delete (buf)) return 0; goto fopen_again; } if (req_free >= 0 && freespace < (unsigned long)(size - sb.st_size + 1023) / 1024 + req_free) { Log (1, "no enough free space in %s (%luK, req-d %luK)", (freespace == freespace2) ? inbound : temp_inbound, freespace, (unsigned long) (size - sb.st_size + 1023) / 1024 + req_free); fclose (f); return 0; } } else Log (1, "%s: fstat: %s", netname, strerror (errno)); return f; } int inb_reject (char *netname, off_t size, time_t time, FTN_ADDR *from, int nfa, char *inbound) { char tmp_name[MAXPATHLEN + 1]; if (find_tmp_name (tmp_name, netname, size, time, from, nfa, inbound) != 1) { Log (1, "missing tmp file for %s!", netname); return 0; } else { /* Replacing .dt with .hr and removing temp. file */ strcpy (strrchr (tmp_name, '.'), ".hr"); remove_hr (tmp_name); return 1; } } /* * File is complete, rename it to it's realname. 1=ok, 0=failed. * Sets realname[MAXPATHLEN] */ int inb_done (char *netname, off_t size, time_t time, FTN_ADDR *from, int nfa, char *inbound, char *real_name) { char tmp_name[MAXPATHLEN + 1]; char *s, *u; int unlinked = 0, i; *real_name = 0; if (find_tmp_name (tmp_name, netname, size, time, from, nfa, inbound) != 1) { Log (1, "missing tmp file for %s!", netname); return 0; } strnzcpy (real_name, inbound, MAXPATHLEN); strnzcat (real_name, PATH_SEPARATOR, MAXPATHLEN); s = real_name + strlen (real_name); strnzcat (real_name, u = makeinboundcase (strdequote (netname)), MAXPATHLEN); free (u); strwipe (s); if (mask_test(netname, overwrite) && !ispkt(netname) && !isarcmail(netname)) { for(i=0; ; i++) { unlinked |= (unlink(real_name) == 0); if (!RENAME (tmp_name, real_name)) { Log (1, "%s -> %s%s", netname, real_name, unlinked?" (overwrited)":""); break; } if ((errno != EEXIST && errno != EACCES && errno != EAGAIN) || i==10) { Log (1, "cannot rename %s to it's realname: %s! (data stored in %s)", netname, strerror (errno), tmp_name); *real_name = 0; return 0; } } } else { s = real_name + strlen (real_name) - 1; /* gul: for *.pkt and *.?ic (tic, zic etc.) change name but not extension */ /* ditto for arcmail -- mff */ if (ispkt (netname) || istic (netname) || isarcmail (netname) || isreq (netname)) s -= 4; if (touch (tmp_name, time) != 0) Log (1, "touch %s: %s", tmp_name, strerror (errno)); while (1) { if (!RENAME (tmp_name, real_name)) { Log (2, "%s -> %s", netname, real_name); break; } else { if (errno != EEXIST && errno != EACCES && errno != EAGAIN) { Log (1, "cannot rename %s to it's realname: %s! (data stored in %s)", netname, strerror (errno), tmp_name); *real_name = 0; return 0; } Log (2, "error renaming `%s' to `%s': %s", netname, real_name, strerror (errno)); } if (isalpha (*s) && toupper (*s) != 'Z') ++*s; else if (isdigit (*s) && toupper (*s) != '9') ++*s; else if (*s == '9') *s = 'a'; else if (*--s == '.' || *s == '\\' || *s == '/') { Log (1, "cannot rename %s to it's realname! (data stored in %s)", netname, tmp_name); *real_name = 0; return 0; } } } /* Replacing .dt with .hr and removing temp. file */ strcpy (strrchr (tmp_name, '.'), ".hr"); delete (tmp_name); return 1; } /* * Checks if the file already exists in our inbound. !0=ok, 0=failed. * Sets realname[MAXPATHLEN] */ int inb_test (char *filename, off_t size, time_t t, char *inbound, char fp[]) { char *s, *u; struct stat sb; strnzcpy (fp, inbound, MAXPATHLEN); strnzcat (fp, PATH_SEPARATOR, MAXPATHLEN); s = fp + strlen (fp); strnzcat (fp, u = strdequote (filename), MAXPATHLEN); free (u); strwipe (s); return stat (fp, &sb) == 0 && sb.st_size == size && (sb.st_mtime & ~1) == (t & ~1); } binkd/prothlp.c0000664000076400007640000001030211001665633012150 0ustar gulgul/* * prothlp.c -- Some tools for protocol.c * * prothlp.c is a part of binkd project * * Copyright (C) 1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: prothlp.c,v 2.2.2.3 2008/04/17 15:24:11 gul Exp $ * * $Log: prothlp.c,v $ * Revision 2.2.2.3 2008/04/17 15:24:11 gul * Fixed sending files with space or control chars in name * * Revision 2.2.2.2 2005/09/22 12:13:16 gul * Dequote filenames for compare in M_GET processing * * Revision 2.2.2.1 2003/06/30 22:46:03 hbrew * Print only binkd name (without path) in error messages * * Revision 2.2 2003/03/01 18:29:52 gul * Change size_t to off_t for file sizes and offsets * * Revision 2.1 2003/02/22 21:32:46 gul * Amiga Style Outbound support * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.3 1997/11/05 01:11:29 mff * bt+ arcshield * * Revision 1.2 1997/10/23 04:00:17 mff * minor changes * * Revision 1.1 1997/03/28 06:49:13 mff * Initial revision * */ #include #include #include #include #include #include "Config.h" #include "sys.h" #include "ftnq.h" #include "prothlp.h" #include "srif.h" #include "assert.h" #include "tools.h" int tfile_cmp (TFILE *a, char *netname, off_t size, time_t time) { int rc; char *anetname; anetname = strdequote(a->netname); netname = strdequote(netname); rc = strcmp (anetname, netname); free(anetname); free(netname); if (rc) return rc; if (a->size != size) return a->size - size; if (a->time != time) return a->time - time; return 0; } /* Adds a file to killlist */ void add_to_killlist (KILLLIST **killlist, int *n_killlist, char *name, int cond) { *killlist = xrealloc (*killlist, sizeof (KILLLIST) * (*n_killlist + 1)); memset (*killlist + *n_killlist, 0, sizeof (KILLLIST)); strnzcpy ((*killlist)[*n_killlist].name, name, MAXPATHLEN); (*killlist)[*n_killlist].cond = cond; ++*n_killlist; } void q_to_killlist (KILLLIST **killlist, int *n_killlist, FTNQ *q) { FTNQ *curr; for (curr = q; curr; curr = curr->next) { if (curr->action == 'a') { curr->action = 0; add_to_killlist (killlist, n_killlist, curr->path, 0); } } } void free_killlist (KILLLIST **killlist, int *n_killlist) { free (*killlist); *killlist = 0; *n_killlist = 0; } /* * Process killlist. flag == 's': successful session */ void process_killlist (KILLLIST *killlist, int n_killlist, int flag) { int i; Log (6, "processing kill list"); for (i = 0; i < n_killlist; ++i) if (killlist[i].cond != 's' || (flag == 's' && killlist[i].cond == 's')) delete (killlist[i].name); } /* Adds a file to rcvdlist */ void add_to_rcvdlist (RCVDLIST **rcvdlist, int *n_rcvdlist, char *name) { *rcvdlist = xrealloc (*rcvdlist, sizeof (RCVDLIST) * (*n_rcvdlist + 1)); memset (*rcvdlist + *n_rcvdlist, 0, sizeof (RCVDLIST)); strnzcpy ((*rcvdlist)[*n_rcvdlist].name, name, MAXPATHLEN); ++*n_rcvdlist; } void free_rcvdlist (RCVDLIST **rcvdlist, int *n_rcvdlist) { free (*rcvdlist); *rcvdlist = 0; *n_rcvdlist = 0; } void netname (char *s, TFILE *q) { static char *weekext[] = {"su", "mo", "tu", "we", "th", "fr", "sa"}; if (q->type == 'm') { sprintf (s, "%08lx.pkt", rnd ()); } else if (q->type == 'r') { sprintf (s, "%08lx.req", rnd ()); } else { char *z = extract_filename(q->path); strnzcpy (s, z, MAX_NETNAME); /* gul: bt+ arcshield */ if ((z = strrchr (s, '.')) != NULL) if (strlen (++z) == 3) { if ((*z >= '0') && (*z < '7') && (z[1] == '#')) memcpy (z, weekext[*z - '0'], 2); #ifdef AMIGADOS_4D_OUTBOUND if (aso && isarcmail(s)) { /* "2:2/0 aso name shorter then bso */ char ext[4]; unsigned zone, net, node, p; if (sscanf(s, "%u.%u.%u.%u.%3s", &zone, &net, &node, &p, ext) == 5) sprintf(s, "%08lx.%s", rnd(), ext); } #endif } z = strquote(s, SQ_CNTRL | SQ_SPACE); strnzcpy (s, z, MAX_NETNAME); free (z); } } binkd/https.h0000664000076400007640000000152607630174344011646 0ustar gulgul/* * https.h -- header for https & socks4/5 proxy * * https.h is an addition part of binkd project * * Copyright (C) 1996-1998 Dima Maloff, 5047/13 * Copyright (C) 1998-2000 Dima Afanasiev, 5020/463 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: https.h,v 2.2 2003/03/01 18:16:04 gul Exp $ * * $Log: https.h,v $ * Revision 2.2 2003/03/01 18:16:04 gul * Use HAVE_SYS_TIME_H macro * * Revision 2.1 2003/02/22 11:45:41 gul * Do not resolve hosts if proxy or socks5 using * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * */ int h_connect(int socket, char *host); binkd/inbound.h0000664000076400007640000000262707630176040012140 0ustar gulgul/* * $Id: inbound.h,v 2.2 2003/03/01 18:29:52 gul Exp $ * * $Log: inbound.h,v $ * Revision 2.2 2003/03/01 18:29:52 gul * Change size_t to off_t for file sizes and offsets * * Revision 2.1 2002/11/22 14:40:42 gul * Check free space on inbox if defined * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * */ #ifndef _inbound_h #define _inbound_h /* * Checks if the file already exists in our inbound. !0=ok, 0=failed. * Sets realname[MAXPATHLEN] */ int inb_test (char *filename, off_t size, time_t t, char *inbound, char *realname); /* * Open a partial file in the inbound directory for appending. * Creates it if the file does not exist */ FILE *inb_fopen (char *netname, off_t size, time_t t, FTN_ADDR *from, int nfa, char *inbound, int state); /* * File is complete, rename it to it's realname. 1=ok, 0=failed. * Sets realname[MAXPATHLEN] */ int inb_done (char *netname, off_t size, time_t t, FTN_ADDR *from, int nfa, char *inbound, char *realname); /* * Remove partial file */ int inb_reject (char *netname, off_t size, time_t time, FTN_ADDR *from, int nfa, char *inbound); /* * Searches for the ``file'' in the inbound and returns it's tmp name in s. * S must have MAXPATHLEN chars. Returns 0 on error, 1=found, 2=created. */ int find_tmp_name (char *s, char *file, off_t size, time_t time, FTN_ADDR *from, int nfa, char *inbound); #endif binkd/readdir.h0000664000076400007640000000321507633573222012114 0ustar gulgul/* * readdir.h -- The header to get POSIX directory interface out of * misc compilers * * ftnq.h is a part of binkd project * * Copyright (C) 1996 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: readdir.h,v 2.6 2003/03/12 08:57:54 gul Exp $ * * $Log: readdir.h,v $ * Revision 2.6 2003/03/12 08:57:54 gul * Fix for MSVC * * Revision 2.5 2003/03/11 00:04:26 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.4 2003/03/10 12:16:53 gul * Use HAVE_DOS_H macro * * Revision 2.3 2003/03/10 11:40:09 gul * Use self opendir/readdir/closedir functions for watcom * * Revision 2.2 2003/03/01 20:16:27 gul * OS/2 IBM C support * * Revision 2.1 2001/09/24 10:31:39 gul * Build under mingw32 * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.1 1996/12/29 09:46:20 mff * Initial revision * */ #ifndef _readdir_h #define _readdir_h #if defined(__WATCOMC__) #include #elif defined(VISUALCPP) || defined(IBMC) || defined(__MSC__) #include #include #elif defined(__MINGW32__) #include #include #else #include #include #endif #if defined(VISUALCPP) #include "nt/dirwin32.h" #endif #if defined(IBMC) || defined(__WATCOMC__) #include "os2/dirent.h" #endif #if defined(__MSC__) #include "dos/dirent.h" #endif #endif binkd/protoco2.h0000664000076400007640000001262007665710652012256 0ustar gulgul/* * $Id: protoco2.h,v 2.6 2003/05/30 17:15:22 gul Exp $ * * $Log: protoco2.h,v $ * Revision 2.6 2003/05/30 17:15:22 gul * Asymmetric ND-mode, new protocol option NDA * * Revision 2.5 2003/05/30 16:03:10 gul * Asymmetric NR-mode * * Revision 2.4 2003/03/05 13:21:51 gul * Fix warnings * * Revision 2.3 2002/02/22 00:18:34 gul * Run by-file events with the same command-line once after session * * Revision 2.2 2001/02/15 16:05:59 gul * crypt bugfix * * Revision 2.1 2001/02/15 11:03:18 gul * Added crypt traffic possibility * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * */ /* binkp's frames: +---------------------- 0=data block, 1=message(command) | +---- data block size / msg's argument size | | 7 6543210 76543210 +-+-------+--------+--- ... ---+ | | HI LO | | -- data block / msg's argument +-+-------+--------+--- ... ---+ */ #ifndef _PROTOCO2_H_ #define _PROTOCO2_H_ #define BLK_HDR_SIZE 2 typedef unsigned char t_msg; #define M_NUL 0 /* Ignored by binkp (data * optionally Logged) */ #define M_ADR 1 #define M_PWD 2 #define M_FILE 3 #define M_OK 4 /* The password is ok (data * ignored) */ #define M_EOB 5 /* End-of-batch (data ignored) */ #define M_GOT 6 /* File received */ #define M_ERR 7 /* Misc errors */ #define M_BSY 8 /* All AKAs are busy */ #define M_GET 9 /* Get a file from offset */ #define M_SKIP 10 /* Skip a file */ #define M_MAX 10 typedef struct _BMSG BMSG; struct _BMSG { t_msg t; /* msg type */ int sz; /* msg size */ char *s; /* msg text */ }; /* Protocol's state */ typedef struct _STATE STATE; struct _STATE { SOCKET s; FTN_NODE *to; /* Dest. address (if an outbound * connection) */ char expected_pwd[MAXPWDLEN + 1]; /* binkp buffres */ char *obuf; char *optr; /* Next byte to send */ int oleft; /* Bytes left to send at optr */ char *ibuf; int isize; /* Current block's size. * -1=expecting block header */ int iread; /* Number of bytes read already */ int imsg; /* 0=data block, * 1=message(command) */ /* binkp queues and data */ BMSG *msgs; /* Output msg queue */ int n_msgs; TFILE in, out; /* Files in transfer */ TFILE flo; /* A .?lo in transfer */ TFILE *sent_fls; /* Sent files: waiting for GOT */ int n_sent_fls; /* The number of... */ FTNQ *q; /* Queue */ FTN_ADDR *fa; /* Foreign akas */ int nfa; /* How many... */ int nallfa; /* How many remote akas including busy & n/a */ int maxflvr; int skip_all_flag; /* We'd skip all */ int r_skipped_flag; /* Remote skipped smthng */ int listed_flag; /* Listed? */ char *inbound; /* The current inbound dir */ char *peer_name; /* Remote host's name */ unsigned long our_ip; /* Local IP */ int io_error; int msgs_in_batch; int minor, major; /* Version of remote binkp */ KILLLIST *killlist; /* Files to kill _after_ session */ int n_killlist; RCVDLIST *rcvdlist; /* List of files rcvd in the curr.batch */ int n_rcvdlist; /* binkp stats */ int files_sent; /* Files sent/rcvd during the session */ int files_rcvd; unsigned long bytes_sent; unsigned long bytes_rcvd; time_t start_time; /* Start of session */ char sysname[MAXSYSTEMNAME + 1]; char sysop[MAXSYSOPNAME + 1]; char location[MAXLOCATIONNAME + 1]; /* binkp state description */ int local_EOB, remote_EOB; int GET_FILE_balance; /* Prevent quitting without * waiting for GET results */ int off_req_sent; /* "M_FILE ... -1" sent, waiting * for M_GET */ int state; int NR_flag; /* State of binkp when in NR mode */ int ND_flag; /* State of binkp when in ND mode */ int MD_flag; /* State of binkp when in MD mode */ unsigned char *MD_challenge; /* Received CRAM challenge data */ int waiting_for_GOT; /* File sent, waiting for M_GOT in ND-mode */ int send_eof; /* Need to send zero-length data block */ char *ND_status; /* ND status file name */ TFILE in_complete; /* M_GOT sent, need to rename */ FTN_ADDR ND_addr; /* Address for current ND status */ FTN_ADDR out_addr; /* Currently precessing remote AKA */ int crypt_flag; /* Is session encrypted? */ unsigned long keys_out[3]; /* Encription keys for outbound */ unsigned long keys_in[3]; /* Encription keys for inbound */ EVTQ *evt_queue; /* Queue of by-files events */ }; #define STATE_DEFINED 1 /* * Do we have to give up files for this node in this session? We send files if * send-if-pwd not set or * it's a secure session or * it's an outbound session AND they don't skip what we send */ #define OK_SEND_FILES(S) \ ((send_if_pwd == 0 || (S)->state == P_SECURE || (S)->to) \ && (S)->r_skipped_flag == 0) /* state.NR_flag: state of binkp when in NR mode */ #define NO_NR 0 #define WANT_NR 1 #define WE_NR 2 #define THEY_NR 4 /* state.ND_flag: state of binkp when in ND mode */ #define NO_ND 0 #define WE_ND 1 #define THEY_ND 2 #define CAN_NDA 4 /* they supports asymmetric ND-mode */ /* state.crypt_flag: state of binkp when in crypt mode */ #define NO_CRYPT 0 #define WE_CRYPT 1 #define THEY_CRYPT 2 #define YES_CRYPT 4 #endif binkd/https.c0000664000076400007640000002611510315002771011626 0ustar gulgul/* * https.c -- connect procedure for https & socks4/5 proxy * * https.c is an addition part of binkd project * * Copyright (C) 1996-1998 Dima Maloff, 5047/13 * Copyright (C) 1998-2000 Dima Afanasiev, 5020/463 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: https.c,v 2.15.2.2 2005/09/23 13:41:13 gul Exp $ * * $Log: https.c,v $ * Revision 2.15.2.2 2005/09/23 13:41:13 gul * Bugfix in work via proxy with authorization * * Revision 2.15.2.1 2003/09/05 07:52:50 gul * Fix OS/2 version, improve diagnostics * * Revision 2.15 2003/04/28 09:46:58 gul * Bugfix: free() changes TCPERRNO * * Revision 2.14 2003/04/28 07:30:16 gul * Bugfix: Log() changes TCPERRNO * * Revision 2.13 2003/03/26 10:44:40 gul * Code cleanup * * Revision 2.12 2003/03/25 21:09:04 gul * Memory leak * * Revision 2.11 2003/03/10 17:24:28 gul * Fixed signed/unsigned char conversions * * Revision 2.10 2003/03/05 13:21:50 gul * Fix warnings * * Revision 2.9 2003/03/01 18:16:04 gul * Use HAVE_SYS_TIME_H macro * * Revision 2.8 2003/02/28 08:53:38 gul * Fixed proxy usage * * Revision 2.7 2003/02/22 19:29:40 gul * Fix typo * * Revision 2.6 2003/02/22 17:49:16 gul * Fix compilation error * * Revision 2.5 2003/02/22 12:12:33 gul * Cleanup sources * * Revision 2.4 2003/02/22 11:45:41 gul * Do not resolve hosts if proxy or socks5 using * * Revision 2.3 2001/09/14 07:24:20 gul * bindaddr works on outgoing connections now * * Revision 2.2 2001/07/28 17:26:26 gul * Avoid compiler warnings * * Revision 2.1 2001/06/19 15:49:13 da * *** empty log message *** * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * */ #include #include #include #ifdef HAVE_SYS_TIME_H #include #endif #include "Config.h" #include "readcfg.h" #include "sys.h" #include "tools.h" #include "https.h" #include "iptools.h" #include "sem.h" #ifdef NTLM #include "ntlm/helpers.h" #endif static char b64t[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static int enbase64(char *data, int size, char *p) { int i; int c; unsigned char *q; char *s = p; q = (unsigned char*)data; i=0; for(i = 0; i < size;){ c=q[i++]; c*=256; if(i < size) c+=q[i]; i++; c*=256; if(i < size) c+=q[i]; i++; p[0]=b64t[(c&0x00fc0000) >> 18]; p[1]=b64t[(c&0x0003f000) >> 12]; p[2]=b64t[(c&0x00000fc0) >> 6]; p[3]=b64t[(c&0x0000003f) >> 0]; if(i > size) p[3]='='; if(i > size+1) p[2]='='; p+=4; } return p - s; } #ifdef WIN32 #define SetTCPError(x) WSASetLastError(x) #define PR_ERROR WSABASEERR+13 #else #define SetTCPError(x) errno=x #define PR_ERROR EACCES #endif int h_connect(int so, char *host) { int ntlm = 0; #ifdef NTLM char *ntlmsp = NULL; #endif int i, n; struct hostent he, *hp; char buf[1024], *pbuf; char *sp, *sauth, **cp; struct in_addr defaddr; unsigned port; if (proxy[0]) { strncpy(buf, proxy, sizeof(buf)); buf[sizeof(buf)-1] = '\0'; if ((sp=strchr(buf, '/')) != NULL) *sp++ = '\0'; Log(4, "connected to proxy %s", buf); if(sp) { char *sp1; #ifdef NTLM if(strchr(sp, '/') != strrchr(sp, '/')) { ntlm = 1; ntlmsp = sp = strdup(sp); } else #endif { if((sp1=strchr(sp, '/'))!=NULL) sp1[0]=':'; sp1=malloc(strlen(sp)*4/3 + 4); sp1[enbase64(sp, strlen(sp), sp1)] = 0; sp = sp1; } } memset(buf, 0, sizeof(buf)); if (socks[0]) { char *sp1; strncpy(buf, socks, sizeof(buf)); buf[sizeof(buf)-6] = '\0'; if((sp1=strchr(buf, '/'))!=NULL) sp1[0]=0; if((sp1=strchr(buf, ':'))==NULL) strcat(buf, ":1080"); sp1=strdup(buf); i=sprintf(buf, "CONNECT %s HTTP/1.%d\r\n", sp1, ntlm); free(sp1); } else i=sprintf(buf, "CONNECT %s HTTP/1.%d\r\n", host, ntlm); if(sp) { #ifdef NTLM if (ntlm) { i+=sprintf(buf+i, "Connection: keep-alive\r\n"); i+=sprintf(buf+i, "Proxy-Authorization: NTLM "); getNTLM1(sp, buf+i); strcat(buf, "\r\n"); i = strlen(buf); } else #endif { i+=sprintf(buf+i, "Proxy-Authorization: basic %s\r\n", sp); free(sp); } } buf[i++]='\r'; buf[i++]='\n'; if (send(so, buf, i, 0)<0) { Log(4, "send: %s", TCPERR()); SetTCPError(PR_ERROR); return 1; } Log(10, "sent proxy sockfd %d request: %s", so, buf); for(i=0; i 0 ? &tv : NULL)) < 0) { Log(4, "select(%d): %s", so, TCPERR()); SetTCPError(PR_ERROR); return 1; } else if (n == 0) { Log(4, "proxy timeout..."); SetTCPError(PR_ERROR); return 1; } if ((n=recv(so, buf+i, 1, 0))<0) { Log(4, "recv: %s", TCPERR()); SetTCPError(PR_ERROR); return 1; } else if (n == 0) { Log(2, "Connection closed by proxy..."); SetTCPError(PR_ERROR); return 1; } buf[i+1]=0; if((i+1>=sizeof(buf))||((sp=strstr(buf, "\r\n\r\n"))!=NULL)||((sp=strstr(buf, "\n\n"))!=NULL)) { #ifdef NTLM if ((ntlm) && ((sp=strstr(buf, "uthenticate: NTLM "))!=NULL)) { char *sp1 = strstr(buf, "Content-Length: "); sp = strdup(sp+18); if (sp1) { int j=atoi(sp1+16); for(;j>0; j--) { if(recv(so, buf+i, 1, 0)<1) break; } } memset(buf, 0, sizeof(buf)); i=sprintf(buf, "CONNECT %s HTTP/1.%d\r\nProxy-Authorization: NTLM ", host, ntlm); i = getNTLM2(ntlmsp, sp, buf + i); free(sp); if (i) Log(2, "Invalid username/password/host/domain string (%s) %d", ntlmsp, i); free(ntlmsp); if(!i) { ntlm = 0; strcat(buf, "\r\n\r\n"); send(so, buf, strlen(buf), 0); i=0; continue; } } #endif if((sp=strchr(buf, '\n'))!=NULL) { sp[0]=0; sp--; if(sp[0]=='\r') sp[0]=0; } if(strstr(buf, " 200 ")) break; Log(2, "Connection rejected by proxy (%s)", buf); SetTCPError(PR_ERROR); return 1; } } } if(socks[0]) { strcpy(buf, socks); if ((sauth=strchr(buf, '/')) != NULL) *sauth++ = '\0'; Log(4, "connected to socks%c %s", sauth ? '5' : '4', buf); if ((sp = strchr(host, ':')) != NULL) { *sp++ = '\0'; port = atoi(sp); } else port = oport; /* should never happens */ if (!sauth) { if ((hp=find_host(host, &he, &defaddr)) == NULL) { SetTCPError(PR_ERROR); return 1; } } else { hp = find_host("127.0.0.1", &he, &defaddr); sauth=strdup(sauth); sp=strchr(sauth, '/'); buf[0]=5; buf[2]=0; if(!sauth[0]) { buf[1]=1; send(so, buf, 3, 0); } else { buf[1]=2; if(sp) buf[3]=2; else buf[3]=1; send(so, buf, 4, 0); } if((recv(so, buf, 2, 0)!=2)||((buf[1])&&(buf[1]!=1)&&(buf[1]!=2))) { Log(1, "Auth. method not supported by socks5 server"); free(sauth); free_hostent(hp); SetTCPError(PR_ERROR); return 1; } Log(6, "Socks5, Auth=%d", buf[1]); if(buf[1]==2) /* username/password method */ { buf[0]=1; if(!sp) i=strlen(sauth); else i=(sp-sauth); buf[1]=i; memcpy(buf+2, sauth, i); i+=2; if(!sp) buf[i++]=0; else { sp++; buf[i++]=strlen(sp); strcpy(buf+i, sp); i+=strlen(sp); } send(so, buf, i, 0); buf[0]=buf[1]=0; if((recv(so, buf, 2, 0)<2)||(buf[1])) { Log(1, "Authentication failed (socks5 returns %02X%02X)", (unsigned char)buf[0], (unsigned char)buf[1]); free(sauth); free_hostent(hp); SetTCPError(PR_ERROR); return 1; } } } for (cp = hp->h_addr_list; cp && *cp; cp++) { if (!sauth) { buf[0]=4; buf[1]=1; lockhostsem(); Log (4, port == (unsigned short)oport ? "trying %s..." : "trying %s:%u...", inet_ntoa(*((struct in_addr *)*cp)), port); releasehostsem(); buf[2]=(unsigned char)((port>>8)&0xFF); buf[3]=(unsigned char)(port&0xFF); memcpy(buf+4, *cp, 4); buf[8]=0; send(so, buf, 9, 0); } else { buf[0]=5; buf[1]=1; buf[2]=0; if (isdigit(host[0]) && (defaddr.s_addr = inet_addr (host)) != INADDR_NONE) { buf[3]=1; memcpy(buf+4, &defaddr, 4); pbuf = buf+8; } else { buf[3]=3; i = strlen(host); buf[4]=(unsigned char)i; memcpy(buf+5, host, i); pbuf = buf+5+i; } *pbuf++=(unsigned char)((port>>8)&0xFF); *pbuf++=(unsigned char)(port&0xFF); send(so, buf, pbuf-buf, 0); } for (i=0; i 0 ? &tv : NULL))<0) { Log(4, "socks error: %s", TCPERR()); if (sauth) free(sauth); free_hostent(hp); SetTCPError(PR_ERROR); return 1; } else if (n == 0) { Log(4, "socks timeout..."); if (sauth) free(sauth); free_hostent(hp); SetTCPError(PR_ERROR); return 1; } if ((n=recv(so, buf+i, 1, 0)) < 0) { Log(2, "socks error: %s", TCPERR()); if (sauth) free(sauth); free_hostent(hp); SetTCPError(PR_ERROR); return 1; } else if (n == 0) { Log(2, "connection closed by socks server..."); if (sauth) free(sauth); free_hostent(hp); SetTCPError(PR_ERROR); return 1; } if (!sauth && i>6) /* 8th byte received */ { if (buf[0]!=0) { Log(2, "Bad reply from socks server"); free_hostent(hp); SetTCPError(PR_ERROR); return 1; } if (buf[1]!=90) { Log(2, "connection rejected by socks4 server (%d)", (unsigned char)buf[1]); SetTCPError(PR_ERROR); break; /* try next IP */ } else { free_hostent(hp); return 0; } } else if (sauth && i>5) { if (buf[0]!=5) { Log(2, "Bad reply from socks server"); free(sauth); free_hostent(hp); SetTCPError(PR_ERROR); return 1; } if ((buf[3]==1) && (i<9)) continue; if ((buf[3]==3) && (i<(6+(unsigned char)buf[4]))) continue; if ((buf[3]==4) && (i<21)) continue; free(sauth); free_hostent(hp); if (!buf[1]) return 0; switch (buf[1]) { case 1: Log (2, "general SOCKS5 server failure"); break; case 2: Log (2, "connection not allowed by ruleset (socks5)"); break; case 3: Log (2, "Network unreachable (socks5)"); break; case 4: Log (2, "Host unreachable (socks5)"); break; case 5: Log (2, "Connection refused (socks5)"); break; case 6: Log (2, "TTL expired (socks5)"); break; case 7: Log (2, "Command not supported by socks5"); break; case 8: Log (2, "Address type not supported"); break; default: Log (2, "Unknown reply (0x%02X) from socks5 server", (unsigned char)buf[1]); } SetTCPError(PR_ERROR); return 1; } } } free_hostent(hp); } return 0; } binkd/run.h0000664000076400007640000000142107366465466011320 0ustar gulgul/* * run.h -- Run external programs * * run.h is a part of binkd project * * Copyright (C) 1996-1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: run.h,v 2.1 2001/10/27 08:07:18 gul Exp $ * * $Log: run.h,v $ * Revision 2.1 2001/10/27 08:07:18 gul * run and run_args returns exit code of calling process * * Revision 2.0 2001/01/10 12:12:39 gul * Binkd is under CVS again * * Revision 1.1 1997/03/28 06:16:56 mff * Initial revision * */ #ifndef _run_h #define _run_h int run (char *); #endif binkd/ftnq.c0000664000076400007640000006662610317775567011475 0ustar gulgul/* * ftnq.c -- BSO methods implementation * * ftnq.c is a part of binkd project * * Copyright (C) 1996-1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: ftnq.c,v 2.19.2.6 2005/10/02 15:23:35 gul Exp $ * * $Log: ftnq.c,v $ * Revision 2.19.2.6 2005/10/02 15:23:35 gul * Fileboxes was not scanned for unlisted links * * Revision 2.19.2.5 2005/01/09 19:39:42 stream * Nodes in beginning of queue were ignored if a node with higher flavour * appeared later in the queue. * * Revision 2.19.2.4 2003/12/02 19:28:48 gul * Prevent several clients calls to the same node * * Revision 2.19.2.3 2003/10/19 12:51:42 stream * Missing return value for q_scan_boxes() * * Revision 2.19.2.2 2003/09/15 19:57:40 gul * Fixed double-locking pNod array * * Revision 2.19.2.1 2003/09/14 12:20:05 gul * Clean use pointers to pNod array * * Revision 2.19 2003/05/28 14:32:57 gul * new function q_add_last_file() - add file to the end of queue * * Revision 2.18 2003/04/24 20:07:38 gul * Send freq first * * Revision 2.17 2003/04/22 22:30:18 gul * rtl workaround, incorrect diagnostics if poll already exists * * Revision 2.16 2003/04/02 13:12:57 gul * Try to use workaround for buggy windows time functions (timezone) * * Revision 2.15 2003/03/31 20:28:24 gul * safe_localtime() and safe_gmtime() functions * * Revision 2.14 2003/03/25 13:45:16 gul * Case-insencitive t-mail "hold" long filebox search * * Revision 2.13 2003/03/25 09:18:54 gul * Case-insencitive t-mail "hold" long filebox search * * Revision 2.12 2003/03/10 12:16:53 gul * Use HAVE_DOS_H macro * * Revision 2.11 2003/03/10 10:57:45 gul * Extern declarations moved to header files * * Revision 2.10 2003/03/05 13:21:50 gul * Fix warnings * * Revision 2.9 2003/03/01 20:16:27 gul * OS/2 IBM C support * * Revision 2.8 2003/03/01 15:26:50 gul * *** empty log message *** * * Revision 2.7 2003/03/01 15:17:48 gul * *** empty log message *** * * Revision 2.6 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.5 2003/02/28 19:40:47 gul * Outbound scan bugfix if defnode used * * Revision 2.4 2003/02/22 21:32:46 gul * Amiga Style Outbound support * * Revision 2.3 2003/02/22 15:53:46 gul * Bugfix with locking array of nodes in multithread version * * Revision 2.2 2003/02/22 12:56:00 gul * Do not give unsecure mail to secuse link when send-if-pwd * * Revision 2.1 2002/03/15 15:49:30 gul * Do not check/create *.try if "try" is not defined in config * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.14 1998/05/05 04:23:52 mff * create_poll() now makes all the required intermediate * directories in the outbound. * * Revision 1.13 1997/11/03 06:12:08 mff * an #ifdef for amiga added * * Revision 1.12 1997/10/23 04:05:55 mff * many changes, mostly to hide pNod into ftnnode.c * * Revision 1.11 1997/08/19 21:49:59 mff * Changes to support multiple hosts per node, more?.. * * Revision 1.10 1997/06/16 05:47:13 mff * Remove old .bsy/.csy files, queue handling changed again. * * Revision 1.9 1997/03/15 05:08:53 mff * `.Olo' bug fixed * * Revision 1.7 1997/02/13 07:08:39 mff * Support for fileboxes * * Revision 1.6 1997/02/07 07:05:20 mff * .hld support, added .bsy handling, more * * Revision 1.4 1996/12/14 07:04:21 mff * Addedd q_scan_addrs() */ #include #include #include #include #include #include #include #include #include "assert.h" #include "Config.h" #include "ftnq.h" #include "readcfg.h" #include "tools.h" #include "readdir.h" const char prio[] = "IiCcDdOoFfHh"; static const char flo_flvrs[] = "icdfhICDFH"; static const char out_flvrs[] = "icdohICDOH"; static FTNQ *q_add_dir (FTNQ *q, char *dir, FTN_ADDR *fa1); FTNQ *q_add_file (FTNQ *q, char *filename, FTN_ADDR *fa1, char flvr, char action, char type); static FTNQ *q_scan_boxes_nolock (FTNQ *q, FTN_ADDR *fa, int n, int to); /* * q_free(): frees memory allocated by q_scan() */ static int qn_free (FTN_NODE *fn, void *arg) { fn->hold_until = 0; fn->mail_flvr = fn->files_flvr = 0; fn->busy = 0; return 0; } void q_free (FTNQ *q) { if (q != SCAN_LISTED) { FTNQ *last = 0; while (q) { last = q; q = q->next; } while (last) { if (!last->prev) { free (last); break; } else { last = last->prev; if (last->next) free (last->next); } } } else foreach_node (qn_free, 0); } /* * q_scan: scans outbound. Return value must be q_free()'d. */ static int qn_scan (FTN_NODE *fn, void *arg) { *(FTNQ **) arg = q_scan_boxes_nolock (*(FTNQ **) arg, &fn->fa, 1, 1); return 0; } FTNQ *q_scan (FTNQ *q) { char *s; char buf[MAXPATHLEN + 1], outb_path[MAXPATHLEN + 1]; FTN_DOMAIN *curr_domain; for (curr_domain = pDomains; curr_domain; curr_domain = curr_domain->next) { DIR *dp; struct dirent *de; int len; if (curr_domain->alias4 == 0) { strnzcpy (outb_path, curr_domain->path, sizeof (buf) - 1); /* `FOO:/bar means FOO:\..\bar on Amiga */ #ifndef AMIGA if (outb_path[strlen (outb_path) - 1] == ':') strcat (outb_path, PATH_SEPARATOR); #endif if ((dp = opendir (outb_path)) == 0) { Log (1, "cannot opendir %s: %s", outb_path, strerror (errno)); continue; } len = strlen (curr_domain->dir); strnzcpy (buf, curr_domain->path, sizeof (buf)); strnzcpy (buf + strlen (buf), PATH_SEPARATOR, sizeof (buf) - strlen (buf)); s = buf + strlen (buf); while ((de = readdir (dp)) != 0) { if (!STRNICMP (de->d_name, curr_domain->dir, len) && (de->d_name[len] == 0 || (de->d_name[len] == '.' && isxdigit (de->d_name[len + 1])))) { FTN_ADDR fa; FA_ZERO (&fa); #ifdef AMIGADOS_4D_OUTBOUND if (!aso) #endif fa.z = ((de->d_name[len] == '.') ? strtol (de->d_name + len + 1, (char **) NULL, 16) : curr_domain->z[0]); if (de->d_name[len] == 0 || fa.z != curr_domain->z[0]) { strcpy (fa.domain, curr_domain->name); strnzcpy (buf + strlen (buf), de->d_name, sizeof (buf) - strlen (buf)); q = q_add_dir (q, buf, &fa); } *s = 0; } } closedir (dp); } } foreach_node (qn_scan, &q); return q; } /* * Adds to the q all files for n akas stored in fa */ FTNQ *q_scan_addrs (FTNQ *q, FTN_ADDR *fa, int n, int to) { char buf[MAXPATHLEN + 1]; int i; char *s; for (i = 0; i < n; ++i) { if (!to && send_if_pwd) { /* do not give unsecure mail even to secure link when send-if-pwd */ FTN_NODE *fn; locknodesem(); if ((fn = get_node_info(fa+i)) == NULL || fn->pwd == NULL || strcmp(fn->pwd, "-") == 0) { releasenodesem(); continue; } releasenodesem(); } ftnaddress_to_filename (buf, fa + i); if (*buf) { if ((s = max (strrchr (buf, '\\'), strrchr (buf, '/'))) != 0) { *s = 0; q = q_add_dir (q, buf, fa + i); } } } q = q_scan_boxes (q, fa, n, 1); return q; } static int weight_by_name (char *s) { if (ispkt (s)) return 100; if (isarcmail (s)) return 50; if (istic (s)) return -100; return 0; } static int cmp_filebox_files (FTNQ *a, FTNQ *b) { int w_a = weight_by_name (a->path); int w_b = weight_by_name (b->path); if (w_a - w_b == 0) return b->time - a->time; else return w_a - w_b; } #ifdef MAILBOX static char to32(int N) { if ((N >= 0) && (N <=9)) return '0'+N; if ((N > 9) && (N < 32)) return 'A'+ N - 10; return 'Z'; /* fake return */ } static struct { char * ext; char flv; } brakeExt[] = { #ifdef UNIX {"immediate", 'i'}, {"crash", 'c'}, {"direct", 'd'}, {"normal", 'f'}, {"hold", 'h'}, #endif {"Immediate", 'i'}, {"Crash", 'c'}, {"Direct", 'd'}, {"Normal", 'f'}, {"Hold", 'h'} }; #endif static FTNQ *q_scan_box (FTNQ *q, FTN_ADDR *fa, char *boxpath, char flvr, int deleteempty) { FTNQ *files = NULL; int n_files = 0, i; DIR *dp; char buf[MAXPATHLEN + 1], *s; struct dirent *de; struct stat sb; strnzcpy (buf, boxpath, sizeof (buf)); strnzcat (buf, PATH_SEPARATOR, sizeof (buf)); s = buf + strlen (buf); if ((dp = opendir (boxpath)) != NULL) { while ((de = readdir (dp)) != 0) { strnzcat (buf, de->d_name, sizeof (buf)); if (stat (buf, &sb) == 0 && (sb.st_mode & S_IFDIR) == 0 && de->d_name[0] != '.' #if defined(OS2) && !defined(IBMC) && !defined(__WATCOMC__) && (de->d_attr & 0x02) == 0 /* not hidden */ #endif ) { files = xrealloc (files, sizeof (FTNQ) * (n_files + 1)); strcpy (files[n_files].path, buf); files[n_files].time = sb.st_mtime; memcpy (&files[n_files].fa, fa, sizeof (FTN_ADDR)); files[n_files].flvr = flvr; ++n_files; } *s = 0; } closedir (dp); if (n_files == 0 && deleteempty) { if (rmdir (boxpath) == 0) Log (3, "Empty filebox %s deleted", boxpath); else Log (1, "Cannot delete empty filebox %s: %s", boxpath, strerror (errno)); } } if (files) { qsort (files, n_files, sizeof (FTNQ), (int (*) (const void *, const void *)) cmp_filebox_files); for (i = 0; i < n_files; ++i) q = q_add_file (q, files[i].path, &files[i].fa, files[i].flvr, 'd', 0); free (files); } return q; } /* * Scans fileboxes for n akas stored in fa */ static FTNQ *q_scan_boxes_nolock (FTNQ *q, FTN_ADDR *fa, int n, int to) { FTN_NODE *node; int i; #ifdef MAILBOX char buf[MAXPATHLEN + 1]; char *s; int j; #endif for (i = 0; i < n; ++i) { node = get_node_info (fa + i); if (!to && send_if_pwd) { /* do not give unsecure mail even to secure link when send-if-pwd */ if (node == NULL || node->pwd == NULL || strcmp(node->pwd, "-") == 0) continue; } #ifndef MAILBOX if (node && node->obox) { q = q_scan_box (q, fa+i, node->obox, node->obox_flvr, 0); } #else if ((node && node->obox) || tfilebox[0] || bfilebox[0]) { if (node && node->obox) q = q_scan_box (q, fa+i, node->obox, node->obox_flvr, 0); if (bfilebox[0]) { strnzcpy (buf, bfilebox, sizeof (buf)); strnzcat (buf, PATH_SEPARATOR, sizeof (buf)); #ifdef HAVE_SNPRINTF snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), #else sprintf(buf + strlen(buf), #endif "%s.%u.%u.%u.%u.", fa[i].domain, fa[i].z, fa[i].net, fa[i].node, fa[i].p); s = buf + strlen(buf); for (j = 0; j < sizeof(brakeExt)/sizeof(brakeExt[0]); j++) { strnzcat (buf, brakeExt[j].ext, sizeof (buf)); q = q_scan_box (q, fa+i, buf, brakeExt[j].flv, deleteablebox); *s = '\0'; } } if (tfilebox[0]) { strnzcpy ( buf, tfilebox, sizeof (buf)); strnzcat ( buf, PATH_SEPARATOR, sizeof (buf)); #ifdef HAVE_SNPRINTF snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), #else sprintf(buf + strlen(buf), #endif "%u.%u.%u.%u", fa[i].z, fa[i].net, fa[i].node, fa[i].p); q = q_scan_box (q, fa+i, buf, 'f', deleteablebox); strnzcat ( buf, ".H", sizeof (buf)); #ifdef UNIX { struct stat st; if (stat(buf, &st) != 0 || (st.st_mode & S_IFDIR) == 0) buf[strlen(buf) - 1] = 'h'; } #endif q = q_scan_box (q, fa+i, buf, 'h', deleteablebox); strnzcpy ( buf, tfilebox, sizeof (buf)); strnzcat ( buf, PATH_SEPARATOR, sizeof (buf)); #ifdef HAVE_SNPRINTF snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), #else sprintf(buf + strlen(buf), #endif "%c%c%c%c%c%c%c%c.%c%c", to32(fa[i].z/32), to32(fa[i].z%32), to32(fa[i].net/1024), to32((fa[i].net/32)%32), to32(fa[i].net%32), to32(fa[i].node/1024),to32((fa[i].node/32)%32),to32(fa[i].node%32), to32(fa[i].p/32), to32(fa[i].p%32)); q = q_scan_box (q, fa+i, buf, 'f', deleteablebox); strnzcat (buf, "H", sizeof (buf)); #ifdef UNIX { struct stat st; if (stat(buf, &st) != 0 || (st.st_mode & S_IFDIR) == 0) buf[strlen(buf) - 1] = 'h'; } #endif q = q_scan_box (q, fa+i, buf, 'h', deleteablebox); } } #endif } return q; } FTNQ *q_scan_boxes (FTNQ *q, FTN_ADDR *fa, int n, int to) { locknodesem(); q = q_scan_boxes_nolock (q, fa, n, to); releasenodesem(); return q; } void process_hld (FTN_ADDR *fa, char *path) { FTN_NODE *node; long hold_until_tmp; locknodesem(); if ((node = get_node_info(fa)) != NULL) { FILE *f; if ((f = fopen (path, "r")) == NULL || fscanf (f, "%ld", &hold_until_tmp) != 1) { node->hold_until = 0; } node->hold_until = (time_t)hold_until_tmp; if (f) fclose (f); if (node->hold_until <= safe_time()) { node->hold_until = 0; delete (path); } } releasenodesem(); } static void process_bsy (FTN_ADDR *fa, char *path) { char *s = path + strlen (path) - 4; FTN_NODE *node; struct stat sb; if (stat (path, &sb) == 0 && kill_old_bsy != 0 && time (0) - sb.st_mtime > kill_old_bsy) { char buf[FTN_ADDR_SZ + 1]; ftnaddress_to_str (buf, fa); Log (2, "found old %s file for %s", s, buf); delete (path); } else { locknodesem(); if ((node = get_node_info (fa)) != 0 && node->busy != 'b' && (!STRICMP (s, ".bsy") || !STRICMP (s, ".csy"))) { node->busy = tolower (s[1]); } releasenodesem(); } } /* * Adds files from outbound directory _dir_ to _q_. _fa1_ is * the address wildcard for this outbound. E.g. * c:\bbs\outbound\ fa1 = 2:-1/-1.-1@fidonet * or * c:\bbs\outbound\00030004.pnt\ fa1 = 2:3/4.-1@fidonet * or even * c:\bbs\outbound\00030004.pnt\ fa1 = 2:3/4.5@fidonet */ static FTNQ *q_add_dir (FTNQ *q, char *dir, FTN_ADDR *fa1) { DIR *dp; FTN_ADDR fa2; char buf[MAXPATHLEN + 1]; int j; char *s; if ((dp = opendir (dir)) != 0) { struct dirent *de; while ((de = readdir (dp)) != 0) { #ifdef AMIGADOS_4D_OUTBOUND if (aso) { char ext[4]; int matched = 0; size_t nlen = strlen(s = de->d_name); for (; *s && isgraph(*s) != 0; s++); if ((size_t)(s - de->d_name) != nlen) continue; memcpy (&fa2, fa1, sizeof(FTN_ADDR)); if (sscanf(s = de->d_name, "%u.%u.%u.%u.%3s%n", &fa2.z, &fa2.net, &fa2.node, &fa2.p, ext, &matched) != 5 || (size_t)matched != nlen || strlen(ext) != 3) continue; if ((fa1->z != -1 && fa1->z != fa2.z) || (fa1->net != -1 && fa1->net != fa2.net) || (fa1->node != -1 && fa1->node != fa2.node) || (fa1->p != -1 && fa1->p != fa2.p)) continue; strnzcpy(buf, dir, sizeof(buf)); strnzcpy(buf + strlen(buf), PATH_SEPARATOR, sizeof(buf) - strlen(buf)); strnzcpy(buf + strlen(buf), s, sizeof(buf) - strlen(buf)); if (!STRICMP(ext, "bsy") || !STRICMP(ext, "csy")) process_bsy(&fa2, buf); locknodesem(); if (!get_node_info(&fa2) && !is5D(fa1)) { releasenodesem(); continue; } releasenodesem(); if (strchr(out_flvrs, ext[0]) && tolower(ext[1]) == 'u' && tolower(ext[2]) == 't') /* Adding *.?ut */ q = q_add_file(q, buf, &fa2, ext[0], 'd', 'm'); else if (!STRICMP(ext, "req")) /* Adding *.req */ q = q_add_file(q, buf, &fa2, 'h', 's', 'r'); else if (!STRICMP(ext, "hld")) process_hld(&fa2, buf); else if (strchr(flo_flvrs, ext[0]) && tolower(ext[1]) == 'l' && tolower(ext[2]) == 'o') /* Adding *.?lo */ q = q_add_file(q, buf, &fa2, ext[0], 'd', 'l'); else if (!STRICMP (s + 9, "stc")) { /* Adding *.stc */ q = q_add_file (q, buf, &fa2, 'h', 0, 's'); } } else #endif /* AMIGADOS_4D_OUTBOUND */ { s = de->d_name; for (j = 0; j < 8; ++j) if (!isxdigit (s[j])) break; if (j != 8 || strlen(s) != 12 || s[8] != '.' || strchr(s+9, '.')) continue; /* fa2 will store dest.address for the current (de->d_name) file */ memcpy (&fa2, fa1, sizeof (FTN_ADDR)); if (fa1->node != -1 && fa1->p != 0) sscanf (s, "%8x", (unsigned *)&fa2.p); /* We now in /xxxxyyyy.pnt */ else sscanf (s, "%4x%4x", (unsigned *)&fa2.net, (unsigned *)&fa2.node); /* add the file if wildcard (f1) match the address (fa2) */ if (fa1->node != -1 && fa1->p != -1 && ftnaddress_cmp (fa1, &fa2)) continue; strnzcpy (buf, dir, sizeof (buf)); strnzcpy (buf + strlen (buf), PATH_SEPARATOR, sizeof (buf) - strlen (buf)); strnzcpy (buf + strlen (buf), s, sizeof (buf) - strlen (buf)); if (!STRICMP (s + 9, "pnt") && fa2.p == -1) { struct stat sb; if (stat (buf, &sb) == 0 && (sb.st_mode & S_IFDIR)) q = q_add_dir (q, buf, &fa2); continue; } if (fa2.p == -1) fa2.p = 0; if (!STRICMP (s + 9, "bsy") || !STRICMP (s + 9, "csy")) process_bsy (&fa2, buf); locknodesem(); if (!havedefnode && !get_node_info (&fa2) && !is5D (fa1)) { releasenodesem(); continue; } releasenodesem(); if (strchr (out_flvrs, s[9]) && tolower (s[10]) == 'u' && tolower (s[11]) == 't') { /* Adding *.?ut */ q = q_add_file (q, buf, &fa2, s[9], 'd', 'm'); } else if (!STRICMP (s + 9, "req")) { /* Adding *.req */ q = q_add_file (q, buf, &fa2, 'h', 's', 'r'); } else if (!STRICMP (s + 9, "hld")) process_hld (&fa2, buf); else if (strchr (flo_flvrs, s[9]) && tolower (s[10]) == 'l' && tolower (s[11]) == 'o') { /* Adding *.?lo */ q = q_add_file (q, buf, &fa2, s[9], 'd', 'l'); } else if (!STRICMP (s + 9, "stc")) { /* Adding *.stc */ q = q_add_file (q, buf, &fa2, 'h', 0, 's'); } } } closedir (dp); } else Log (1, "cannot opendir %s: %s", dir, strerror (errno)); return q; } /* * Add a file to the queue. */ FTNQ *q_add_file (FTNQ *q, char *filename, FTN_ADDR *fa1, char flvr, char action, char type) { const int argc=3; char *argv[3]; char str[MAXPATHLEN+1]; if (q != SCAN_LISTED) { FTNQ *new_file; if (type == 's') { char *p; FILE *f; f = fopen(filename, "r"); if (f == NULL) { Log(1, "Can't open %s: %s", filename, strerror(errno)); return q; } if (!fgets(str, sizeof(str), f)) { Log(1, "Incorrect status (can't fgets), ignored"); fclose(f); return q; } fclose(f); if (*str && isspace(*str)) { Log(1, "Incorrect status (space first), ignored"); return q; } for (p=str+strlen(str)-1; isspace(*p); *p--='\0'); Log(2, "Status is '%s'", str); if (!parse_args (argc, argv, str, "Status")) { Log(1, "Incorrect status, ignored"); return q; } } new_file = xalloc (sizeof (FTNQ)); FQ_ZERO (new_file); new_file->next = q; if (q) q->prev = new_file; q = new_file; if (fa1) memcpy (&q->fa, fa1, sizeof (FTN_ADDR)); q->flvr = flvr; q->action = action; q->type = type; q->sent = 0; if (type == 's') { q->size = atol(argv[1]); q->time = atol(argv[2]); strnzcpy (q->path, argv[0], MAXPATHLEN); } else strnzcpy (q->path, filename, MAXPATHLEN); } else { FTN_NODE *node; locknodesem(); if ((node = get_node_info (fa1)) != NULL) { if (type == 'm') node->mail_flvr = MAXFLVR (flvr, node->mail_flvr); else node->files_flvr = MAXFLVR (flvr, node->files_flvr); } releasenodesem(); } return q; } /* * Add a file to the end of queue. */ FTNQ *q_add_last_file (FTNQ *q, char *filename, FTN_ADDR *fa1, char flvr, char action, char type) { FTNQ *new_file, *pq; new_file = q_add_file (NULL, filename, fa1, flvr, action, type); if (new_file == NULL) return q; if (q == NULL) return new_file; for (pq = q; pq->next; pq = pq->next); new_file->prev = pq; pq->next = new_file; return q; } /* * q_list: just lists q, not more */ typedef struct { int first_pass; FILE *out; } qn_list_arg; static int qn_list (FTN_NODE *fn, void *arg) { char tmp[60], buf[FTN_ADDR_SZ + 1]; qn_list_arg *a = (qn_list_arg *) arg; if (fn->mail_flvr || fn->files_flvr || fn->busy) { if (fn->hold_until > 0) { struct tm tm; safe_localtime (&fn->hold_until, &tm); strftime (tmp, sizeof (tmp), " (hold until %Y/%m/%d %H:%M:%S)", &tm); } else *tmp = 0; ftnaddress_to_str (buf, &fn->fa); fprintf (a->out, "%c %c%c %s%s%s\n", a->first_pass ? '$' : ' ', fn->mail_flvr ? fn->mail_flvr : '-', fn->files_flvr ? fn->files_flvr : '-', buf, tmp, fn->busy ? (fn->busy == 'c' ? "\tcall" : "\tbusy") : ""); if (a->first_pass) a->first_pass = 0; } return 0; } void q_list (FILE *out, FTNQ *q) { char buf[FTN_ADDR_SZ + 1]; if (q == SCAN_LISTED) { qn_list_arg qnla; qnla.first_pass = 1; qnla.out = out; foreach_node (qn_list, &qnla); } else { for (; q; q = q->next) { if (!q->sent) { ftnaddress_to_str (buf, &q->fa); fprintf (out, "%-20s %c%c%c %8lu %s\n", buf, q->flvr, q->action ? q->action : '-', q->type ? q->type : '-', q->size, q->path); } } } } /* * Selects from q the next file for fa (Returns a pointer to a q element) */ FTNQ *select_next_file (FTNQ *q, FTN_ADDR *fa, int nAka) { int j, k; FTNQ *curr; for (k = 0; k < nAka; ++k) { for (curr = q; curr; curr = curr->next) /* Status first */ { if (!curr->sent && (FA_ISNULL (&curr->fa) || !ftnaddress_cmp (&curr->fa, fa + k)) && curr->type == 's') { curr->sent = 1; return curr; } } for (curr = q; curr; curr = curr->next) /* Freq before netmail */ { if (!curr->sent && (FA_ISNULL (&curr->fa) || !ftnaddress_cmp (&curr->fa, fa + k)) && curr->type == 'r') { curr->sent = 1; return curr; } } for (j = 0; prio[j]; ++j) { for (curr = q; curr; curr = curr->next) /* Netmail before files */ { if (!curr->sent && (FA_ISNULL (&curr->fa) || !ftnaddress_cmp (&curr->fa, fa + k)) && curr->flvr == prio[j] && curr->type == 'm') { curr->sent = 1; return curr; } } } for (j = 0; prio[j]; ++j) { for (curr = q; curr; curr = curr->next) /* Then go files and .flo */ { if (!curr->sent && (FA_ISNULL (&curr->fa) || !ftnaddress_cmp (&curr->fa, fa + k)) && curr->flvr == prio[j]) { curr->sent = 1; return curr; } } } } return 0; } /* * get size of files in the queue */ void q_get_sizes (FTNQ *q, unsigned long *netsize, unsigned long *filessize) { FTNQ *curr; struct stat st; char *p; *netsize = *filessize = 0; for (curr = q; curr; curr = curr->next) { if (curr->type == 'l') { FILE *f; char str[MAXPATHLEN+2]; if ((f = fopen(curr->path, "r")) != NULL) { while (fgets (str, sizeof(str), f)) { if (*str == '~' || *str == '$') continue; if ((p = strchr(str, '\n')) != NULL) *p='\0'; p=str; if (*str == '#' || *str == '^') p++; if (stat(p, &st) == 0) *filessize += st.st_size; } fclose(f); } } else if (curr->type == 's') *filessize += curr->size; else if (stat(curr->path, &st) == 0) *(curr->type == 'm' ? netsize : filessize) += st.st_size; } } /* * q_not_empty () == 0: the queue is empty. */ typedef struct { int maxflvr; FTN_NODE *fn; FTN_NODE *prevCandidate; } qn_not_empty_arg; static int qn_not_empty (FTN_NODE *fn, void *arg) { qn_not_empty_arg *a = (qn_not_empty_arg *) arg; if (!fn->busy && strcmp (fn->hosts, "-") && fn->hold_until < safe_time()) { if (a->maxflvr != MAXFLVR (fn->mail_flvr, MAXFLVR (fn->files_flvr, a->maxflvr))) { a->maxflvr = MAXFLVR (fn->mail_flvr, fn->files_flvr); if (a->fn) { if (a->prevCandidate) a->prevCandidate->busy = 0; a->prevCandidate = fn; memcpy (a->fn, fn, sizeof (*fn)); fn->busy = 'c'; } } } return 0; } int q_not_empty (FTN_NODE *fn) { qn_not_empty_arg arg; arg.maxflvr = 0; arg.fn = fn; arg.prevCandidate = NULL; foreach_node (qn_not_empty, &arg); if (arg.maxflvr && tolower (arg.maxflvr) != 'h') return -1; else return 0; } int q_next_node (FTN_NODE *fn) { if (q_not_empty(fn) == 0) return 0; else { fn->mail_flvr = fn->files_flvr = 0; return -1; } } /* * Creates an empty .?lo */ int create_poll (FTN_ADDR *fa, int flvr) { char buf[MAXPATHLEN + 1]; char ext[5]; int rc = 0; struct stat st; strcpy (ext, ".flo"); if (flvr && strchr (flo_flvrs, flvr)) ext[1] = tolower (flvr); ftnaddress_to_filename (buf, fa); if (*buf) { mkpath (buf); strnzcat (buf, ext, sizeof (buf)); if (stat (buf, &st) == 0) return 1; /* already exists */ if ((rc = create_empty_sem_file (buf)) == 0) if (errno != EEXIST) Log (1, "cannot create %s: %s", buf, strerror (errno)); } else Log (1, "%s: unknown domain", fa->domain); return rc; } /* * Set .hld for a node */ void hold_node (FTN_ADDR *fa, time_t hold_until) { char buf[MAXPATHLEN + 1]; char addr[FTN_ADDR_SZ + 1]; char time[80]; struct tm tm; safe_localtime (&hold_until, &tm); strftime (time, sizeof (time), "%Y/%m/%d %H:%M:%S", &tm); ftnaddress_to_str (addr, fa); ftnaddress_to_filename (buf, fa); Log (2, "holding %s (%s)", addr, time); if (*buf) { FILE *f; FTN_NODE *fn; strnzcat (buf, ".hld", sizeof (buf)); if ((f = fopen (buf, "w")) != NULL) { fprintf (f, "%li", (long int) hold_until); fclose (f); locknodesem(); if ((fn = get_node_info (fa)) != NULL) fn->hold_until = hold_until; releasenodesem(); } else { Log (1, "%s: %s", buf, strerror (errno)); } } } void write_try (FTN_ADDR *fa, unsigned *nok, unsigned *nbad, char *comment) { char buf[MAXPATHLEN + 1]; if (tries > 0) { ftnaddress_to_filename (buf, fa); if (*buf) { FILE *f; strnzcat (buf, ".try", sizeof (buf)); if ((f = fopen (buf, "wb")) != NULL) { fprintf (f, "%c%c%c%c%c%s", *nok & 0xff, *nok >> 8, *nbad & 0xff, *nbad >> 8, (int) strlen (comment), comment); fclose (f); } } } } void read_try (FTN_ADDR *fa, unsigned *nok, unsigned *nbad) { char buf[MAXPATHLEN + 1]; ftnaddress_to_filename (buf, fa); if (*buf) { FILE *f; unsigned char ch1, ch2, ch3, ch4; strnzcat (buf, ".try", sizeof (buf)); if ((f = fopen (buf, "rb")) != NULL && fscanf (f, "%c%c%c%c", &ch1, &ch2, &ch3, &ch4) == 4) { *nok = ch1 + (ch2 << 8); *nbad = ch3 + (ch4 << 8); } else { *nok = *nbad = 0; } if (f) fclose (f); } } void bad_try (FTN_ADDR *fa, const char *error) { unsigned nok, nbad; if (tries == 0) return; read_try (fa, &nok, &nbad); if (tries > 0 && ++nbad >= (unsigned) tries) { nok = nbad = 0; hold_node (fa, safe_time() + hold); } write_try (fa, &nok, &nbad, (char *) error); } void good_try (FTN_ADDR *fa, char *comment) { unsigned nok, nbad; if (tries == 0) return; read_try (fa, &nok, &nbad); nbad = 0; ++nok; write_try (fa, &nok, &nbad, comment); } binkd/common.h0000664000076400007640000000340307654167365012003 0ustar gulgul/* * common.h -- common binkd declarations * * common.h is a part of binkd project * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: common.h,v 2.3 2003/05/01 09:55:01 gul Exp $ * * $Log: common.h,v $ * Revision 2.3 2003/05/01 09:55:01 gul * Remove -crypt option, add global -r option (disable crypt). * * Revision 2.2 2003/03/10 10:57:45 gul * Extern declarations moved to header files * * Revision 2.1 2003/03/10 10:34:52 gul * *** empty log message *** * * */ #ifndef _common_h #define _common_h #include "iphdr.h" #ifdef HAVE_THREADS int add_socket(SOCKET sockfd); int del_socket(SOCKET sockfd); #else #define add_socket(sockfd) #define del_socket(sockfd) #endif #if defined(OS2) && defined(HAVE_THREADS) void rel_grow_handles(int nh); #else #define rel_grow_handles(nh) #endif /* * Get free space in a directory */ unsigned long getfree (char *path); /* * Set up break handler, set up exit list if needed */ int set_break_handlers (void); /* * Runs a new thread or forks */ int branch (void (*) (void *), void *, size_t); /* * From breaksig.c -- binkd runs this from exitlist or * from signal handler (Under NT) */ void exitfunc (void); int checkcfg (void); extern int n_servers, n_clients; extern int binkd_exit; extern int checkcfg_flag; /* exit(3) on config change */ extern int pidcmgr; /* pid for clientmgr */ extern int pidsmgr; /* pid for server */ extern int no_MD5; extern int no_crypt; extern int server_flag, client_flag; extern int poll_flag; extern int inetd_flag; extern int isService; #endif binkd/CVS/0000775000076400007640000000000011700610241010742 5ustar gulgulbinkd/CVS/Tag0000664000076400007640000000001611700610241011375 0ustar gulgulNbinkd-0_9_11 binkd/CVS/Repository0000664000076400007640000000000611700610237013045 0ustar gulgulbinkd binkd/CVS/Entries0000664000076400007640000000752211700610241012304 0ustar gulgul/!README/2.1.2.6/Thu Oct 2 06:11:12 2008//Tbinkd-0_9_11 /!README.FIX/2.24.2.20/Tue Jan 3 14:24:24 2012//Tbinkd-0_9_11 /!SRIF.TXT/2.0/Wed Jan 10 12:12:37 2001//Tbinkd-0_9_11 /COPYING/2.0/Wed Jan 10 12:12:37 2001//Tbinkd-0_9_11 /Config.h/2.10.2.25/Wed Aug 17 15:44:48 2011//Tbinkd-0_9_11 /assert.h/2.0/Wed Jan 10 12:12:37 2001//Tbinkd-0_9_11 /binkd.8/2.3.2.5/Thu Oct 2 06:01:47 2008//Tbinkd-0_9_11 /binkd.c/2.30.2.12/Thu Oct 2 05:38:43 2008//Tbinkd-0_9_11 /binkd.cfg/2.13.2.9/Wed Aug 17 15:44:48 2011//Tbinkd-0_9_11 /binkd.txt/2.2.2.4/Thu Oct 2 06:01:47 2008//Tbinkd-0_9_11 /binkd9x.txt/2.8.2.2/Fri Oct 15 04:05:42 2004//Tbinkd-0_9_11 /binkd9x.txt.en/1.1/Wed Jan 16 06:15:07 2008//Tbinkd-0_9_11 /binlog.c/2.4/Wed Apr 2 13:12:57 2003//Tbinkd-0_9_11 /binlog.h/2.0/Wed Jan 10 12:12:37 2001//Tbinkd-0_9_11 /branch.c/2.4/Tue Mar 11 00:04:25 2003//Tbinkd-0_9_11 /breaksig.c/2.2/Mon Mar 10 10:39:23 2003//Tbinkd-0_9_11 /bsy.c/2.4.2.1/Wed Jun 11 13:27:22 2003//Tbinkd-0_9_11 /bsy.h/2.1/Fri Feb 28 20:39:08 2003//Tbinkd-0_9_11 /client.c/2.39.2.2/Tue Aug 3 19:52:56 2004//Tbinkd-0_9_11 /client.h/2.0/Wed Jan 10 12:12:37 2001//Tbinkd-0_9_11 /common.h/2.3/Thu May 1 09:55:01 2003//Tbinkd-0_9_11 /crypt.c/2.3/Wed Feb 21 06:25:21 2001//Tbinkd-0_9_11 /crypt.h/2.2/Wed Feb 21 06:25:21 2001//Tbinkd-0_9_11 /exitproc.c/2.15.2.1/Wed Oct 8 10:32:46 2003//Tbinkd-0_9_11 /ftnaddr.c/2.2.2.1/Sat Apr 14 12:09:32 2007//Tbinkd-0_9_11 /ftnaddr.h/2.0/Wed Jan 10 12:12:37 2001//Tbinkd-0_9_11 /ftndom.c/2.1/Fri Feb 28 20:39:08 2003//Tbinkd-0_9_11 /ftndom.h/2.2/Mon Mar 10 10:57:45 2003//Tbinkd-0_9_11 /ftnnode.c/2.12.2.2/Sat Jul 12 18:14:08 2003//Tbinkd-0_9_11 /ftnnode.h/2.8.2.1/Mon Jun 30 22:49:39 2003//Tbinkd-0_9_11 /ftnq.c/2.19.2.6/Sun Oct 2 15:23:35 2005//Tbinkd-0_9_11 /ftnq.h/2.4.2.3/Sun Oct 2 15:23:35 2005//Tbinkd-0_9_11 /getw.c/2.5/Tue May 27 18:58:42 2003//Tbinkd-0_9_11 /getw.h/2.0/Wed Jan 10 12:12:38 2001//Tbinkd-0_9_11 /https.c/2.15.2.2/Fri Sep 23 13:41:13 2005//Tbinkd-0_9_11 /https.h/2.2/Sat Mar 1 18:16:04 2003//Tbinkd-0_9_11 /inbound.c/2.12.2.7/Tue Nov 25 09:48:02 2008//Tbinkd-0_9_11 /inbound.h/2.2/Sat Mar 1 18:29:52 2003//Tbinkd-0_9_11 /iphdr.h/2.10.2.4/Tue Jul 13 17:31:10 2004//Tbinkd-0_9_11 /iptools.c/2.10/Mon May 26 20:37:59 2003//Tbinkd-0_9_11 /iptools.h/2.5/Wed Mar 26 10:44:40 2003//Tbinkd-0_9_11 /md5b.c/2.6.2.1/Mon Oct 18 10:45:30 2004//Tbinkd-0_9_11 /md5b.h/2.4/Mon Mar 10 10:57:45 2003//Tbinkd-0_9_11 /pmatch.c/2.0/Wed Jan 10 12:12:38 2001//Tbinkd-0_9_11 /prothlp.c/2.2.2.3/Thu Apr 17 15:24:11 2008//Tbinkd-0_9_11 /prothlp.h/2.2/Sat Mar 1 18:29:52 2003//Tbinkd-0_9_11 /protoco2.h/2.6/Fri May 30 17:15:22 2003//Tbinkd-0_9_11 /protocol.c/2.67.2.26/Sat Feb 14 13:16:10 2009//Tbinkd-0_9_11 /protocol.h/2.1/Sat Mar 1 15:55:02 2003//Tbinkd-0_9_11 /readcfg.c/2.26.2.5/Wed Aug 17 15:44:48 2011//Tbinkd-0_9_11 /readcfg.h/2.9/Mon Mar 10 10:57:45 2003//Tbinkd-0_9_11 /readdir.h/2.6/Wed Mar 12 08:57:54 2003//Tbinkd-0_9_11 /readflo.c/2.1/Tue Nov 12 17:27:46 2002//Tbinkd-0_9_11 /readflo.h/2.0/Wed Jan 10 12:12:39 2001//Tbinkd-0_9_11 /readme.ND/2.1/Thu Feb 13 19:44:44 2003//Tbinkd-0_9_11 /reapchld.inc/2.1/Mon Mar 10 08:38:07 2003//Tbinkd-0_9_11 /run.c/2.4/Mon Apr 7 18:22:16 2003//Tbinkd-0_9_11 /run.h/2.1/Sat Oct 27 08:07:18 2001//Tbinkd-0_9_11 /sem.h/2.8/Sun May 4 08:45:30 2003//Tbinkd-0_9_11 /server.c/2.23.2.3/Fri Feb 6 06:41:57 2009//Tbinkd-0_9_11 /server.h/2.2/Mon Mar 10 10:57:45 2003//Tbinkd-0_9_11 /setpttl.c/2.0/Wed Jan 10 12:12:39 2001//Tbinkd-0_9_11 /setpttl.h/2.0/Wed Jan 10 12:12:39 2001//Tbinkd-0_9_11 /srif.c/2.9.2.3/Mon Jul 4 18:08:29 2005//Tbinkd-0_9_11 /srif.h/2.1/Fri Feb 22 00:18:34 2002//Tbinkd-0_9_11 /sys.h/2.11.2.3/Mon Jul 24 20:47:48 2006//Tbinkd-0_9_11 /todo.lst/2.27.2.1/Sat Jun 7 07:43:36 2003//Tbinkd-0_9_11 /tools.c/2.22.2.4/Wed Aug 9 07:09:49 2006//Tbinkd-0_9_11 /tools.h/2.9.2.2/Thu Oct 21 17:02:05 2004//Tbinkd-0_9_11 /xalloc.c/2.1/Sun Apr 6 20:28:43 2003//Tbinkd-0_9_11 D binkd/CVS/Entries.Log0000664000076400007640000000023511700610242013017 0ustar gulgulA D/amiga//// A D/debian//// A D/doc//// A D/dos//// A D/misc//// A D/mkfls//// A D/nt//// A D/ntlm//// A D/os2//// A D/unix//// R D/misc//// R D/debian//// binkd/CVS/Root0000664000076400007640000000004611700610237011615 0ustar gulgul:pserver:binkd@cvs.happy.kiev.ua:/cvs binkd/client.h0000664000076400007640000000045707227050665011765 0ustar gulgul/* * $Id: client.h,v 2.0 2001/01/10 12:12:37 gul Exp $ * * $Log: client.h,v $ * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * */ #ifndef _client_h #define _client_h /* * Scans queue, makes outbound ``call'', than calls protocol() */ void clientmgr(void *arg); #endif binkd/assert.h0000664000076400007640000000223207227050665012001 0ustar gulgul/* * assert.h -- ... * * assert.h is a part of binkd project * * Copyright (C) 1997 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: assert.h,v 2.0 2001/01/10 12:12:37 gul Exp $ * * $Log: assert.h,v $ * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * Revision 1.1 1997/03/28 06:56:22 mff * Initial revision * */ #ifndef _assert_h #define _assert_h #include "tools.h" #if defined (NDEBUG) #define assert(exp) ((void)0) #else #if defined (EMX) #define assert(exp) if ((exp)==0) \ { int hcore=open("c:\\binkd.core",O_BINARY|O_RDWR|O_CREAT,0600); \ if (hcore!=-1) _core(hcore), close(hcore); \ Log (0, "%s: %i: %s: assertion failed", __FILE__, __LINE__, #exp); \ abort(); } #else #define assert(exp) ((exp) ? (void)0 : \ Log (0, "%s: %i: %s: assertion failed", __FILE__, __LINE__, #exp)) #endif #endif #endif binkd/binkd.c0000664000076400007640000004135211071057143011556 0ustar gulgul/* * binkd.c -- binkd's main * * binkd.c is a part of binkd project * * Copyright (C) 1996-2008 Dima Maloff 5047/13 and others * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: binkd.c,v 2.30.2.12 2008/10/02 05:38:43 gul Exp $ * * $Log: binkd.c,v $ * Revision 2.30.2.12 2008/10/02 05:38:43 gul * Copyright date * * Revision 2.30.2.11 2006/08/09 07:35:18 gul * Minor fix in binkd restart * * Revision 2.30.2.10 2005/11/07 18:56:28 stas * MFC: New option '-n', may be used to config check with option '-d' or to make poll with '-P' * * Revision 2.30.2.9 2004/11/08 12:05:33 gul * 0.9.8 release * * Revision 2.30.2.8 2004/08/03 19:52:56 gul * Change SIGCHLD handling, make signal handler more clean, * prevent occasional hanging (mutex deadlock) under linux kernel 2.6. * * Revision 2.30.2.7 2003/08/28 09:22:25 stas * Cosmetics * * Revision 2.30.2.6 2003/08/28 06:29:51 hbrew * Update binkd9x for compability with binkd 0.9.6 commandline; put binkd9x.txt from current * * Revision 2.30.2.5 2003/08/27 12:59:35 stas * Update usage(), optimize code * * Revision 2.30.2.4 2003/08/27 12:00:46 stas * Fix binkd9x build * * Revision 2.30.2.3 2003/08/27 10:22:28 stas * Make binkd 0.9.5 command line compatible with binkd 0.9.6 * * Revision 2.30.2.2 2003/07/17 04:35:23 hbrew * Fix "No prototype found for 'isdigit'" warning. * * Revision 2.30.2.1 2003/06/30 22:46:03 hbrew * Print only binkd name (without path) in error messages * * Revision 2.30 2003/05/10 00:30:36 hbrew * binkd9x: -u option now support '--all' service name (uninstall all services). * Unneeded spaces cleanup. * * Revision 2.29 2003/05/04 08:45:30 gul * Lock semaphores more safely for resolve and IP-addr print * * Revision 2.28 2003/05/01 09:55:01 gul * Remove -crypt option, add global -r option (disable crypt). * * Revision 2.27 2003/03/31 21:48:59 gul * Avoid infinite recursion * * Revision 2.26 2003/03/31 19:53:08 gul * Close socket before exit * * Revision 2.25 2003/03/31 19:35:16 gul * Clean semaphores usage * * Revision 2.24 2003/03/11 11:42:23 gul * Use event semaphores for exit threads * * Revision 2.23 2003/03/11 00:04:25 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.22 2003/03/10 10:39:23 gul * New include file common.h * * Revision 2.21 2003/03/10 08:38:07 gul * Make n_servers/n_clients changes thread-safe * * Revision 2.20 2003/03/05 13:21:50 gul * Fix warnings * * Revision 2.19 2003/03/04 07:27:11 gul * Put OS to log on start * * Revision 2.18 2003/03/03 09:43:07 gul * Cosmetics changes * * Revision 2.17 2003/03/01 17:42:32 gul * Added tzset() call to main() start * * Revision 2.16 2003/03/01 17:33:25 gul * Clean daemonize code * * Revision 2.15 2003/03/01 15:55:02 gul * Current outgoing address is now attibute of session, but not node * * Revision 2.14 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.13 2003/02/22 20:19:54 gul * Update copyrightes, 2002->2003 * * Revision 2.12 2003/02/22 14:30:18 gul * Make nNod var static * * Revision 2.11 2003/02/21 16:47:57 gul * Remove file and USE_SOCKS macro * * Revision 2.10 2002/12/10 22:05:29 gul * binkd/win32 bugfix * * Revision 2.9 2002/11/13 07:49:27 gul * Fix typo * * Revision 2.8 2002/11/12 16:55:58 gul * Run as service under win9x * * Revision 2.7 2002/07/22 19:48:30 gul * Update usage * * Revision 2.6 2001/11/07 13:46:20 gul * bugfix (added saved_argc) * * Revision 2.5 2001/10/29 19:31:44 gul * Added -h option (print usage) * * Revision 2.4 2001/10/28 14:52:58 gul * Cyrillic filenames fix * * Revision 2.3 2001/08/24 13:23:28 da * binkd/binkd.c * binkd/readcfg.c * binkd/readcfg.h * binkd/server.c * binkd/nt/service.c * * Revision 2.2 2001/05/23 15:44:09 gul * help-message fixed (-C option) * * Revision 2.1 2001/01/16 03:53:23 gul * Added -D switch (run as daemon) * * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * * nsoveiko@doe.carleton.ca 1998/12/14 * creation of pid_file is now logged and warnings produced * * Revision 1.15 1998/05/08 03:35:47 mff * Added -P switch, brushed up error msgs * * Revision 1.14 1997/11/03 06:10:39 mff * +nodes_init() * * Revision 1.13 1997/10/23 04:20:53 mff * pidfiles fixed, ... * * Revision 1.12 1997/06/16 05:52:07 mff * Added -C, copyright note * * Revision 1.10 1997/05/17 08:44:42 mff * Changed cmd line processing a bit * * Revision 1.9 1997/03/09 07:16:31 mff * Added command line parsing, support for inetd * * Revision 1.8 1997/02/07 06:42:59 mff * Under UNIXs SIGHUP forces binkd to restart * * Revision 1.7 1997/02/01 05:55:24 mff * Changed SIGCHLD support * * Revision 1.5 1996/12/14 07:00:32 mff * Now we use branch() and set_break_handlers() * * Revision 1.3 1996/12/07 12:26:37 mff * SOCKS support by msh * * Revision 1.1.1 1996/12/02 18:26:00 ufm * Port to NT */ #include #include #include #include #include #include #include #include #include "Config.h" #include "sys.h" #include "iphdr.h" #include "common.h" #include "readcfg.h" #include "server.h" #include "client.h" #include "tools.h" #include "bsy.h" #include "protocol.h" #include "assert.h" #include "binlog.h" #include "setpttl.h" #include "sem.h" #ifdef UNIX #include "unix/daemonize.h" #endif #ifdef WIN32 #include #include "nt/service.h" #ifdef BINKDW9X #include "nt/win9x.h" #endif #endif #ifdef HAVE_THREADS #include "sem.h" MUTEXSEM hostsem = 0; MUTEXSEM resolvsem = 0; MUTEXSEM varsem = 0; EVENTSEM eothread = 0; EVENTSEM exitcmgr = 0; #ifdef OS2 MUTEXSEM fhsem = 0; #endif #endif /* * Global variables */ int pidcmgr = 0; /* pid for clientmgr */ int pidsmgr = 0; /* pid for server */ SOCKET inetd_socket = 0; #ifdef HAVE_FORK static void chld (int signo) { #include "reapchld.inc" } #endif #if defined(UNIX) || defined(AMIGA) || (defined(OS2) && defined(HAVE_FORK)) jmp_buf jb; static void hup (int signo) { Log (2, "got SIGHUP"); longjmp (jb, 1); } #endif #if defined(BLOCK_CHLD) void switchsignal(int how) { sigset_t sigset; sigemptyset(&sigset); sigaddset(&sigset, SIGCHLD); sigprocmask(how, &sigset, NULL); } #endif void usage (void) { #if defined(WIN32) && !defined(BINKDW9X) char *s=NULL; if(checkservice() > 0) { s="iu\0 -i install WindowsNT service\n" " -u uninstall WindowsNT service\n" " -S srvn name of WindowsNT service (default: " DEFAULT_SRVNAME ")" "\n"; } #endif #if defined(BINKDW9X) AllocTempConsole(); #endif printf ("usage: binkd [-nCcpqrsvmh" #if defined(HAVE_DAEMON) || defined(HAVE_SETSID) || defined(HAVE_TIOCNOTTY) "D" #endif #if defined(UNIX) || defined(OS2) || defined(AMIGA) "i" #elif defined(BINKDW9X) "iu] [-S name] [-t cmd" #elif defined(WIN32) "T%s] [-S srvn" #endif "] [-P node] config" #ifdef OS2 " [socket]" #endif "\n" #ifdef BINKD_DAEMONIZE " -D run as daemon\n" #endif #if defined(HAVE_FORK) || defined(BINKDW9X) " -C reload on config change\n" #else " -C exit(3) on config change\n" #endif " -c run client only\n" #if defined(UNIX) || defined(OS2) || defined(AMIGA) " -i run from inetd\n" #elif defined(BINKDW9X) " -i install Win9x service\n" " -u uninstall Win9x service\n" " -t cmd (start|stop|restart|status) service(s)\n" " -S name set Win9x service name, all - use all services\n" #elif defined(WIN32) " -T minimize to System Tray\n" "%s" #endif " -P node poll a node\n" " -p run client only, poll, quit\n" " -q be quiet\n" " -r disable crypt traffic\n" " -s run server only\n" " -v be verbose / dump version and quit\n" " -m disable CRAM-MD5 authorization\n" " -n doing not call or listen (only check cfg and make polls)\n" " -h print this help\n" "\n" "Copyright (c) 1996-2008 Dima Maloff and others.\n" #if defined(WIN32) && !defined(BINKDW9X) ,s?s:"", s?s+3:"" #endif ); puts ("\n" "This program is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation. See COPYING.\n" "\n" "Report bugs to 2:463/68 or binkd-bugs@happy.kiev.ua."); exit (1); } /* Command line flags */ int inetd_flag = 0; /* Run from inetd (-i) */ #ifdef BINKD_DAEMONIZE int daemon_flag = 0; /* Run as daemon (-D) */ #endif int server_flag = 0; /* Run servermgr (-s) */ int client_flag = 0; /* Run clientmgr (-c) */ int poll_flag = 0; /* Run clientmgr, make all jobs, quit * (-p) */ int quiet_flag = 0; /* Be quiet (-q) */ int verbose_flag = 0; /* Be verbose / print version (-v) */ int checkcfg_flag = 0; /* exit(3) on config change (-C) */ int no_MD5 = 0; /* disable MD5 flag (-m) */ int no_crypt = 0; /* disable CRYPT (-r) */ int no_flag = 0; /* do not run server and client */ #ifdef BINKDW9X extern const char *Win9xStartService; /* 'Run as win9x service' option */ #endif #ifdef BINKDW9X int binkd_main (int argc, char *argv[], char *envp[]) #else int main (int argc, char *argv[], char *envp[]) #endif { char tmp[128]; int i; /* Config file name */ char *config = NULL; char **saved_argv; int saved_argc; #if defined(HAVE_DAEMON) || defined(HAVE_SETSID) || defined(HAVE_TIOCNOTTY) int nochdir; #endif tzset(); #if defined(WIN32) && !defined(BINKDW9X) service(argc, argv, envp); #endif /* save argv as setproctitle() under some systems will change it */ saved_argv = mkargv (argc, argv); saved_argc = argc; InitSem (&hostsem); InitSem (&resolvsem); InitSem (&varsem); InitEventSem (&eothread); InitEventSem (&exitcmgr); #ifdef OS2 InitSem (&fhsem); #endif for (i = 1; i < argc; ++i) { if (argv[i][0] == '-') { char *s = argv[i] + 1; do { switch (*s) { case '-': /* GNU-style options */ if (!strcmp (s + 1, "help")) { #if defined(WIN32) && !defined (BINKDW9X) if (!isService) #endif usage (); } #if defined (BINKDW9X) else if (!strcmp(argv[i], Win9xStartService)) goto BREAK_WHILE; #endif else Log (0, "%s: --%s: unknown command line switch", extract_filename(argv[0]), s + 1); case 'C': checkcfg_flag = 1; break; case 'c': client_flag = 1; break; #if defined(UNIX) || defined(OS2) || defined(AMIGA) case 'i': inetd_flag = 1; break; #endif #if defined (WIN32) #if !defined (BINKDW9X) case 'T': /* Skip option in win32 version */ break; #endif case 'S': /* Skip option and parameter in all win* versions */ #if defined (BINKDW9X) case 't': /* Skip option and parameter in win9x version */ #endif if (!s[1]){ ++i; } goto BREAK_WHILE; #endif case 'P': if (argv[i][2] == 0) { ++i; if (argv[i] == 0) Log (0, "%s: -P: missing requred argument", extract_filename(argv[0])); } goto BREAK_WHILE; case 'p': poll_flag = client_flag = 1; break; case 'q': quiet_flag = 1; break; case 's': server_flag = 1; break; case 'm': no_MD5 = 1; /* fallthrough */ case 'r': no_crypt = 1; break; case 'n': no_flag = 1; break; case 'v': ++verbose_flag; break; #ifdef BINKD_DAEMONIZE case 'D': if (daemon_flag) continue; daemon_flag = 1; /* remove this switch from saved_argv */ if (argv[i][2]) strcpy(saved_argv[i]+(s-argv[i]), saved_argv[i]+(s-argv[i])+1); else { int j; free(saved_argv[i]); for (j=i; j= 3) debugcfg = 1; /* Init for ftnnode.c */ nodes_init (); if (config) readcfg (config); else if (verbose_flag) { #if defined(WIN32) && defined(BINKDW9X) AllocTempConsole(); #endif printf ("Binkd " MYVER " (" __DATE__ " " __TIME__ "%s)\n", get_os_string ()); exit (0); } else if (argc == 1) usage (); else { Log (0, "%s: invalid command line: config name must be specified", extract_filename(argv[0])); exit (1); } if (quiet_flag) { percents = 0; conlog = 0; printq = 0; } switch (verbose_flag) { case 0: break; case 1: percents = printq = 1; loglevel = conlog = 4; break; case 2: case 3: default: percents = printq = 1; loglevel = conlog = 6; break; } print_args (tmp, sizeof (tmp), argc - 1, argv + 1); Log (4, "BEGIN, " MYNAME "/" MYVER "%s%s", get_os_string(), tmp); if (sock_init ()) Log (0, "sock_init: %s", TCPERR ()); bsy_init (); BinLogInit (); rnd (); initsetproctitle (argc, argv, envp); #ifdef WIN32 SetFileApisToOEM(); #endif /* Set up break handler, set up exit list if needed */ if (!set_break_handlers ()) Log (0, "cannot install break handlers"); #ifdef HAVE_FORK signal (SIGCHLD, chld); #endif for (i = 1; i < argc; ++i) if (argv[i][0] == '-' && argv[i][1] == 'P') { if (argv[i][2] == 0) poll_node (argv[++i]); else poll_node (argv[i] + 2); } #if defined(UNIX) || defined(OS2) || defined(AMIGA) if (inetd_flag) { protocol (inetd_socket, 0, NULL); soclose (inetd_socket); exit (0); } #endif if (no_flag) { Log(0, "Exit on option '-n'"); } #ifdef BINKD_DAEMONIZE if (daemon_flag) { if (!server_flag) Log (0, "Only server can be run in the daemon mode"); else { if (saved_argv[0][0] == '/') nochdir = 0; else { nochdir = 1; /* Log (6, "Run with relative path, will not chdir to /"); */ } if (binkd_daemonize(nochdir) < 0) Log (0, "Cannot daemonize"); } } #endif if (client_flag && !server_flag) { #if defined(UNIX) || defined(AMIGA) || (defined(OS2) && defined(HAVE_FORK)) if (setjmp(jb)) goto binkdrestart; else signal (SIGHUP, hup); #endif clientmgr (0); exit (0); } pidsmgr = (int) getpid (); if (client_flag && (pidcmgr = branch (clientmgr, 0, 0)) < 0) { Log (0, "cannot branch out"); } #if defined(UNIX) || defined(AMIGA) || (defined(OS2) && defined(HAVE_FORK)) if (setjmp (jb)) { binkdrestart: exitfunc(); print_args (tmp, sizeof (tmp), saved_argc - 1, saved_argv + 1); Log (2, "exec %s%s", saved_argv[0], tmp); if (execvp (saved_argv[0], saved_argv) == -1) Log (1, "execvp: %s", strerror (errno)); } else { signal (SIGHUP, hup); } #endif if (*pid_file) { if ( unlink (pid_file) == 0 ) /* successfully unlinked, i.e. an old pid_file was found */ Log (1, "unexpected pid_file: %s: unlinked", pid_file); else { int current_log_level = 1; switch ( errno ) { case ENOENT : /* file not found or null pathname */ current_log_level = 8; /* it's ok */ break; default : break; } Log (current_log_level, "unlink_pid_file: %s: %s", pid_file, strerror (errno)); } if ( create_sem_file (pid_file) == 0 ) /* could not create pid_file */ if (loglevel < 5) /* not logged in create_sem_file() */ Log (1, "create_sem_file: %s: %s", pid_file, strerror (errno)); } servmgr (0); return 0; } binkd/ftndom.h0000664000076400007640000000262107633067651011775 0ustar gulgul/* * ftndom.h -- Source to handle FTN Domains * * ftndom.h is a part of binkd project * * Copyright (C) 1996 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: ftndom.h,v 2.2 2003/03/10 10:57:45 gul Exp $ * * $Log: ftndom.h,v $ * Revision 2.2 2003/03/10 10:57:45 gul * Extern declarations moved to header files * * Revision 2.1 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.1 1996/12/29 09:41:28 mff * Initial revision * */ #ifndef _ftndomain_h #define _ftndomain_h #include "ftnaddr.h" typedef struct _FTN_DOMAIN FTN_DOMAIN; struct _FTN_DOMAIN { char name[MAX_DOMAIN + 1]; char *path; /* Outbound dir's path, ie * "/var/spool/fido" */ char *dir; /* Outbound dir's name, ie "outb" */ int *z; FTN_DOMAIN *alias4; FTN_DOMAIN *next; }; extern FTN_DOMAIN *pDomains; /* * 0 == domain not found */ FTN_DOMAIN *get_domain_info (char *domain_name); /* * Returns the default domain */ FTN_DOMAIN *get_def_domain (void); #endif binkd/crypt.h0000664000076400007640000000125507244657521011650 0ustar gulgul/* * $Id: crypt.h,v 2.2 2001/02/21 06:25:21 gul Exp $ * * Revision history: * $Log: crypt.h,v $ * Revision 2.2 2001/02/21 06:25:21 gul * changed crlf to cr in the source file * * Revision 2.1 2001/02/20 12:01:50 gul * rename encrypt to encrypt_buf to avoid conflict with unistd.h * * Revision 2.0 2001/02/15 11:02:16 gul * Added crypt traffic possibility * * */ int update_keys (unsigned long keys[3], int c); void init_keys (unsigned long keys[3], const char *passwd); int decrypt_byte (unsigned long keys[3]); void decrypt_buf (char *buf, unsigned int bufsize, unsigned long keys[3]); void encrypt_buf (char *buf, unsigned int bufsize, unsigned long keys[3]); binkd/Config.h0000664000076400007640000001401511622760760011705 0ustar gulgul/* * Config.h -- misc defines * * Config.h is a part of binkd project * * Copyright (C) 1996-1998 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: Config.h,v 2.10.2.25 2011/08/17 15:44:48 stas Exp $ * * $Log: Config.h,v $ * Revision 2.10.2.25 2011/08/17 15:44:48 stas * Default root-domain fidonet.net changed to binkp.net. binkd 0.9.11 is released * * Revision 2.10.2.24 2008/10/02 06:11:12 gul * 0.9.11-stable * * Revision 2.10.2.23 2008/10/02 05:48:16 gul * 0.9.10 release * * Revision 2.10.2.22 2008/02/24 09:19:27 gul * 0.9.10-stable continues (I hope) * * Revision 2.10.2.21 2008/02/24 09:15:20 gul * 0.9.9 release * * Revision 2.10.2.20 2005/01/25 20:58:59 gul * 0.9.9-stable * * Revision 2.10.2.19 2004/11/08 12:05:32 gul * 0.9.8 release * * Revision 2.10.2.18 2004/08/03 19:52:55 gul * Change SIGCHLD handling, make signal handler more clean, * prevent occasional hanging (mutex deadlock) under linux kernel 2.6. * * Revision 2.10.2.17 2004/06/15 08:22:58 gul * Set version 0.9.7 * * Revision 2.10.2.16 2003/12/02 14:24:13 gul * Use vsnprintf() if exists * * Revision 2.10.2.15 2003/10/28 06:02:25 gul * Set version tag 0.9.6 * * Revision 2.10.2.14 2003/10/24 17:31:55 stas * Auto increase patchlevel, set 0.9.5p8-stable * Fix pathnames in #include statements * * Revision 2.10.2.13 2003/10/19 12:51:44 stream * Auto increase patchlevel, set 0.9.5p7-stable * Missing return value for q_scan_boxes() * * Revision 2.10.2.12 2003/10/16 06:09:20 gul * Auto increase patchlevel, set 0.9.5p6-stable * Removed erroneous tag binkd-0_9_5-stable from files * which exists only in current branch * * Revision 2.10.2.11 2003/10/16 06:08:50 gul * Auto increase patchlevel, set 0.9.5p5-stable * Removed erroneous tag binkd-0_9_5-stable from files * which exists only in current branch * * Revision 2.10.2.10 2003/10/15 14:48:16 stas * Auto increase patchlevel, set 0.9.5p4-stable * Fix NT service stop * * Revision 2.10.2.9 2003/10/08 10:32:50 gul * Auto increase patchlevel, set 0.9.5p3-stable * Fix exit threads in exitfunc() * * Revision 2.10.2.8 2003/10/07 08:54:22 hbrew * Auto increase patchlevel, set 0.9.5p2-stable * '\r\n' --> '\n' * * Revision 2.10.2.7 2003/09/14 12:20:04 gul * Clean use pointers to pNod array * * Revision 2.10.2.6 2003/09/04 18:18:04 gul * *** empty log message *** * * Revision 2.10.2.5 2003/06/11 18:21:15 gul * *** empty log message *** * * Revision 2.10.2.4 2003/06/11 18:10:19 stas * Auto increase patchlevel * * Revision 2.10.2.3 2003/06/11 18:10:16 stas * Fix script's bug * * Revision 2.10.2.2 2003/06/11 13:27:24 gul * Auto increase patchlevel * * Revision 2.10.2.1 2003/06/06 16:17:38 gul * Change version * * Revision 2.10 2003/03/11 09:21:29 gul * Fixed OS/2 Watcom compilation * * Revision 2.9 2003/03/11 00:04:25 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.8 2003/03/10 12:16:53 gul * Use HAVE_DOS_H macro * * Revision 2.7 2003/03/10 10:39:23 gul * New include file common.h * * Revision 2.6 2003/03/01 20:16:27 gul * OS/2 IBM C support * * Revision 2.5 2003/02/28 19:13:55 gul * Added prodcode * * Revision 2.4 2003/02/22 21:53:39 gul * Typo in comment * * Revision 2.3 2002/11/12 16:55:58 gul * Run as service under win9x * * Revision 2.2 2001/12/25 17:13:15 gul * mingw _sleep() fix * * Revision 2.1 2001/09/24 10:31:39 gul * Build under mingw32 * * Revision 2.0 2001/01/10 12:12:37 gul * Binkd is under CVS again * * Revision 1.6 1997/10/23 04:22:28 mff * Important -- MAX_BLKSIZE is now 0x7FFF (32*1024 was error) */ #ifndef _Config_h #define _Config_h #ifdef __WATCOMC__ #include #ifndef MAXPATHLEN #define MAXPATHLEN _MAX_PATH #endif #elif defined (VISUALCPP) #include #ifndef MAXPATHLEN #define MAXPATHLEN _MAX_PATH #endif #elif defined (__MINGW32__) #include #ifndef MAXPATHLEN #define MAXPATHLEN PATH_MAX #endif #elif defined (IBMC) || defined(__MSC__) #ifndef _MAX_PATH #include #endif #ifndef MAXPATHLEN #define MAXPATHLEN _MAX_PATH #endif #else #include #endif /* Please, no spaces here! */ #define PRTCLNAME "binkp" #define PRTCLVER "1.1" #define MYNAME "binkd" #define MYVER "0.9.11" #define PRODCODE 0x13FF /* by FTSCPROD */ /* Environment */ #define MAX_ENV_VAR_NAME 256 #if defined(OS2) || defined(WIN32) || defined(DOS) #define PATH_SEPARATOR "\\" #else #define PATH_SEPARATOR "/" #endif /* Protocol */ #define DEF_PORT 24554 #define DEF_TIMEOUT (5*60) #define MIN_BLKSIZE 128 #define MAX_BLKSIZE 0x7fffu /* Don't change! */ #define DEF_BLKSIZE (4*1024u) #define MAX_NETNAME 255 #ifndef CHECKCFG_INTERVAL /* Can be defined in Makefile */ #define CHECKCFG_INTERVAL rescan_delay #endif #define MAILBOX /* fileboxes suport */ #define ROOT_DOMAIN "binkp.net." /* default root_domain */ /* System... */ #define STACKSIZE (256*1024) #define MKTMPFILE_TRYES 20 #ifndef O_BINARY #define O_BINARY 0 #endif #if defined(__WATCOMC__) || defined(VISUALCPP) || defined(__MINGW32__) || defined(IBMC) || defined(__MSC__) #define MKDIR(s) mkdir(s) #else #define MKDIR(s) mkdir(s, 0755) #endif #ifndef OS #if defined(BINKDW9X) #define OS "Win9x" #elif defined(WIN32) #define OS "Win32" #elif defined(OS2) #define OS "OS2" #elif defined(DOS) #define OS "DOS" #endif #endif #ifdef __MINGW32__ #define open _open #define close _close #define read _read #define write _write #define stat _stat #define fstat _fstat #define sleep(sec) _sleep((sec)*1000ul) #define snprintf _snprintf #define vsnprintf _vsnprintf #endif /* Pragmas */ #ifdef __WATCOMC__ #pragma off (unreferenced); #endif #endif binkd/doc/0000775000076400007640000000000011700610241011054 5ustar gulgulbinkd/doc/binkd-ug-ru.htm0000775000076400007640000060636011071063001013725 0ustar gulgul

╨єъютюфёЄтю яюы№чютрЄхы  binkd

0. ┬тхфхэшх.

0.0. ╬с ¤Єюь ЁєъютюфёЄтх.

─юъєьхэЄ, ъюЄюЁ√щ ┬√ ўшЄрхЄх, яЁхфырурхЄё  ъръ ЁєъютюфёЄтю яю шёяюы№чютрэш■ яЁюуЁрьь√ binkd. ╧ЁхфяюырурхЄё , ўЄю ўшЄрЄхы№ їюЄ  с√ яютхЁїэюёЄэю чэръюь ё яюэ Єш ьш «FIDOnet», «FIDOnet Technology Network» («FTN»), ё ёшёЄхьющ рфЁхёрЎшш ш ёЄЁєъЄєЁющ ёхЄш FIDOnet, ё яюўЄют√ьш юўхЁхф ьш, шёяюы№чєхь√ьш т FIDOnet, ё яюэ Єш ьш «mailer» («ьхщыхЁ»), «tosser» («ЄюёёхЁ»), «netmail tracker» («ЄЁхъхЁ»), «File Request» («FREQ»), «FREQ processor» («FREQ-яЁюЎхёёюЁ»), «netmail», «echomail», «outbound», «domain», «flavour», «DNS», «Internet», «protocol» («яЁюЄюъюы»), «IP», «TCP», «proxy» («яЁюъёш»). ═х яюьх°рхЄ Єръцх чэръюьёЄтю ё ёхьшєЁютэхтющ ьюфхы№■ OSI. ═рышўшх яЁхфёЄртыхэшщ ю яхЁхўшёыхээюь эх  ты хЄё  юс чрЄхы№э√ь, эю яюьюцхЄ т яюэшьрэшш ЄхъёЄр ш, т шЄюух, яюьюцхЄ т яюшёъх ю°шсюъ т эрёЄЁющъх binkd.

╧Ёш ёюёЄртыхэшш ¤Єюую фюъєьхэЄр шёяюы№чютрышё№: ёЄЁрэшЎр man binkd, ъюььхэЄрЁшш ъ Їрщыє ъюэЇшуєЁрЎшш шч фшёЄЁшсєЄштр binkd, шёїюфэ√х ЄхъёЄ√ binkd ш ЁєъютюфёЄтю яюы№чютрЄхы  яю binkd тхЁёшш 0.9.2, эряшёрээюх Nick Soveiko (рфЁхё email nsoveiko@doe.carleton.ca), ш юяєсышъютрээюх т Internet эр ёЄЁрэшЎх http://www.doe.carleton.ca/~nsoveiko/fido/binkd/man/. ╚ёяюы№чютрырё№ Єръцх шэЇюЁьрЎш , яюыєўхээр  юЄ фЁєушї ЁрчЁрсюЄўшъют binkd.

└тЄюЁ ¤Єюую ЁєъютюфёЄтр: ╤Єрё ─╕уЄхт (Stas Degteff 2:5080/102@FIDOnet, g@grumbler.org, stas.grumbler@gmail.com) ш фЁєушх єўрёЄэшъш ёююс∙хёЄтр ЁрчЁрсюЄъш binkd.

▌ЄюЄ фюъєьхэЄ ЁрёяЁюёЄЁрэ хЄё  эр єёыютш ї ётюсюфэющ ышЎхэчшш GNU фы  фюъєьхэЄрЎшш (Free Documentation License, FDL).

0.1. ╫Єю Єръюх binkd.

┴шэъф (binkd) – яЁюуЁрььр, ЁрчЁрсюЄрээр  фы  яхЁхфрўш яюўЄ√ ш Їрщыют (ьхщыхЁ) яю Єхїэюыюушш FTN т ьхцфєэрЁюфэющ ы■сшЄхы№ёъющ ёхЄш FIDOnet. ┬ юЄышўшх юЄ ъырёёшўхёъшї FTN-ьхщыхЁют, binkd ЁрсюЄрхЄ яю ёяхЎшры№эю ЁрчЁрсюЄрээюьє фы  эхую яЁюЄюъюыє binkp, шёяюы№чє  т ърўхёЄтх ЄЁрэёяюЁЄр TCP/IP. ╥ръшь юсЁрчюь, binkd яючтюы хЄ яхЁхфртрЄ№ яюўЄє FIDOnet ўхЁхч Internet ш яю ыюъры№э√ь ёхЄ ь.

┬ яЁхфёЄртыхээюь фюъєьхэЄх юяшёрэ binkd тхЁёшш 0.9.11.

0.2. ╬ёэютэ√х тючьюцэюёЄш binkd.

  • Binkd – юЄъЁ√Єюх ╧╬: freeware, ЁрёяЁюёЄЁрэ хЄё  яюф ышЎхэчшхщ GNU. ╚ёїюфэ√х ЄхъёЄ√ ш юЁшушэры№эр  фюъєьхэЄрЎш  ЁрёяЁюёЄЁрэ ■Єё  ётюсюфэю эрЁртэх ё уюЄют√ьш шёяюы хь√ьш Їрщырьш.

  • Binkd – яхЁхэюёшьюх ╧╬. ╤є∙хёЄтє■Є тхЁёшш фы  Windows (32-сшэ√ї ш 16-сшЄэ√ї), фы  ъыюэют UNIX, фы  OS/2, фы  DOS, фы  AmigaDOS. ╨рчЁрсюЄўшъш яЁштхЄёЄтє■Є рфряЄрЎш■ binkd фы  Ёрчэ√ї юяхЁрЎшюээ√ї ёшёЄхь ш ряярЁрЄэ√ї яырЄЇюЁь.

  • Binkd шёяюы№чєхЄ юўхЁхфш эр юЄяЁртъє Binkley Style Outbound (BSO), Long BSO (LBSO) ышсю Amiga Style Outbound (ASO). (╚ фы  эрёЄЁющъш binkd цхырЄхы№эю чэрэшх яЁшэЎшяют юЁурэшчрЎшш ¤Єшї тшфют яюўЄют√ї юўхЁхфхщ.)

  • Binkd яю ьръёшьєьє шёяюы№чєхЄ яЁюяєёъэє■ ёяюёюсэюёЄ№ юЄтхф╕ээюую хьє ърэрыр ёт чш сыруюфрЁ  эхсюы№°юьє ъюышўхёЄтє ёыєцхсэ√ї фрээ√ї т яЁюЄюъюых binkp, ўхь т√уюфэю юЄышўрхЄё  юЄ ьхщыхЁют, шёяюы№чє■∙шї ьюфхьэ√х яЁюЄюъюы√ фы  ёт чш яю IP.

  • Binkd яЁхфэрчэрўхэ фы  ЁрсюЄ√ фхьюэюь т ■эшъёюяюфюсэ√ї юяхЁрЎшюээ√ї ёшёЄхьрї ш ёхЁтшёюь т 32-ї сшЄэ√ї ╬╤ ёхьхщёЄтр Windows. ╧юффхЁцштрхЄё  Єръцх юфэюъЁрЄэр  ЁрсюЄр, эряЁшьхЁ, ё Ўхы№■ яЁшэ Є№-яхЁхфрЄ№ яюўЄє эр сюёёр.

  • Binkd шёяюы№чєхЄ DNS фы  юяЁхфхыхэш  рфЁхёр IP єфры╕ээюую єчыр, яЁш ¤Єюь ьюцхЄ ЄЁрэёышЁютрЄ№ рфЁхё FTN т фюьхээюх шь  DNS.

  • ╚ьххЄё  тючьюцэюёЄ№ яЁютхЁъш ёююЄтхЄёЄтш  рфЁхёр IP єфры╕ээюую єчыр яЁхф· тыхээюьє шь рфЁхёє FTN.

  • ╤юхфшэхэш  чр∙ш∙хэ√ ярЁюыхь. ╚ьххЄё  тючьюцэюёЄ№ схчюярёэющ яхЁхфрўш ярЁюы  яю юЄъЁ√Є√ь ърэрырь ёт чш ё шёяюы№чютрэшхь ї¤°хщ MD5 яЁш єёыютшш яюффхЁцъш ¤Єющ тючьюцэюёЄш эр єфры╕ээющ ёЄюЁюэх (тъы■ўхэю яю єьюыўрэш■).

  • ┬ючьюцэю °шЇЁютрэшх тёхую ЄЁрЇшър яЁш єёыютшш яюффхЁцъш ¤Єющ тючьюцэюёЄш эр єфры╕ээющ ёЄюЁюэх.

  • ┬ючьюцэр ЄЁрэёы Ўш  яєЄхщ ъ Їрщырь яюўЄютющ юўхЁхфш. ▌Єр тючьюцэюёЄ№ шёяюы№чєхЄё  яЁш ёютьхёЄэющ ЁрсюЄх Ёрчэ√ї яЁюуЁрьь єчыр FTN эр Ёрчэ√ї ъюья№■ЄхЁрї ё Ёрчэ√ьш ╬╤, ъюуфр яюўЄютр  юўхЁхф№ Ёрчьх∙рхЄё  эр ёхЄхтюь фшёъх.

  • ┬ючьюцэю шёяюы№чютрэшх Їрщы-сюъёют ёЄшыхщ T-Mail ш The Brake!.

  • ┬ючьюцэю шёяюы№чютрэшх яхЁёюэры№э√ї Їрщы-сюъёют эр юЄяЁртъє ш яЁш╕ь яюўЄ√ ш Їрщыют фы  ъюэъЁхЄэюую ышэър.

  • Binkd яюффхЁцштрхЄ Їрщы√ ярЁюыхщ ёЄшы  T-Mail, quico ш ifmail (ifcico)

  • Binkd яюффхЁцштрхЄ чряЁюё√ Їрщыют (FREQ) ёЄшы  WAZOO. ╧Ёш ¤Єюь т√ч√трхЄё  тэх°э   яЁюуЁрььр фы  юсЁрсюЄъш чряЁюёр. ┬ючьюцэю шёяюы№чютрэшх яЁюуЁрьь, ЁрсюЄр■∙шї яю ёЄрэфрЁЄє SRIF (эряЁшьхЁ, Allfix, ViReq, tmafreq).

  • Binkd ьюцхЄ ёюхфшэ Є№ё  ё єфры╕ээ√ьш єчырьш ўхЁхч яЁюъёш, ЁрсюЄр■∙шх яю ёЄрэфрЁЄрь HTTPS ш Socks. ╧Ёш ¤Єюь ьюцхЄ шёяюы№чютрЄ№ё  ярЁюы№эр  рєЄхэЄшЇшърЎш  эр ёхЁтхЁх яЁюъёш.

  • ┬ючьюцхэ юЄърч юЄ яЁш╕ьр Їрщыют яю ьрёъх шьхэш Їрщыр.

  • ┬ючьюцэю ёючфрэшх Їрщыют-Їыруют ш чряєёър тэх°эшї яЁюуЁрьь яю ёюс√Єш■ яюыєўхэш  Їрщыр (яю ьрёъх шьхэш Їрщыр). ╟ряєёъ яЁюуЁрьь√ юёє∙хёЄты хЄё  ышсю эхьхфыхээю, ышсю яю юъюэўрэш■ ёхрэёр ёт чш.

0.3. ╚ёЄюўэшъш яюыєўхэш  binkd.

Binkd ЁрчЁрсрЄ√трхЄё  яюф ётюсюфэющ ышЎхэчшхщ GNU ш ЁрёяЁюёЄЁрэ хЄё  схёяырЄэю, яю¤Єюьє хую фшёЄЁшсєЄшт√ ш шёїюфэ√х ЄхъёЄ√ ьюцэю схёяырЄэю ёърўрЄ№ ё юЇшЎшры№э√ї ёрщЄют ш ърЄрыюуют FTP, ёърўрЄ№ c BBS, яюыєўшЄ№ яю Їрщы-¤їх FIDOnet ышсю тч Є№ шч фЁєушї шёЄюўэшъют.

0.3.1. ╬ЇшЎшры№э√х шёЄюўэшъш яю ЁрёяЁюёЄЁрэхэш■ binkd.

┬ ёхЄш FIDOnet:

  • ╘рщы-¤їр «AFTNBINKD»

┬ ёхЄш Internet:

  • ftp://cvs.happy.kiev.ua/pub/fidosoft/mailer/binkd/
    ╬ёэютэющ FTP. ╤юфхЁцшЄ Ёхышч√, ёэря°юЄ√, шёїюфэ√х ЄхъёЄ√, рэрышчрЄюЁ√ ыюуют ш яЁ. └фьшэшёЄЁшЁєхЄё  ЁєъютюфшЄхыхь ъюьрэф√ ЁрчЁрсюЄўшъют ╧ртыюь ├єы№ўєъюь (Pavel Gulchouck 2:463/68@FIDONET, gul@gul.kiev.ua).

  • ftp://fido.thunderdome.ws/pub/mirror/binkd/
    ╟хЁърыю юёэютэюую FTP. └фьшэшёЄЁшЁєхЄё  Matt Bedynek 1:106/1@FIDONET

  • ftp://ftp.alexblues.ru/pub/binkd/
    ╟хЁърыю юёэютэюую FTP. └фьшэшёЄЁшЁєхЄё  └ыхъёрэфЁюь ├ырфўхэъю 2:5080/111@FIDONET

  • ftp://cube.sut.ru/pub/mirror/binkd/
    ╟хЁърыю юёэютэюую FTP. └фьшэшёЄЁшЁєхЄё  ─ьшЄЁшхь ┼Ёьръют√ь 2:5030/1115@FIDONET

  • http://binkd.spb.ru
    ╟хЁърыю юёэютэюую FTP. └фьшэшёЄЁшЁєхЄё  └эфЁххь ╬ёЄрэютёъшь 2:5030/1957@FIDONET

  • ╧єсышўэ√щ CVS :pserver:binkd@cvs.happy.kiev.ua:/cvs , ьюфєы№ binkd, ярЁюы№ яєёЄющ, Є¤у binkd-0_9_5-stable.
    ╚ёїюфэ√х ЄхъёЄ√ ш фюъєьхэЄрЎш  тёхї тхЁёшщ binkd. └фьшэшёЄЁшЁєхЄё  ╧ртыюь ├єы№ўєъюь.

  • http://binkd.grumbler.org/
    ╚ёяюыэ хь√х Їрщы√ фы  Windows, ёЄЁрэшЎ√ man, FAQ, фюъєьхэЄрЎш  яю binkd ш яЁюЄюъюыє binkp. └фьшэшёЄЁшЁєхЄё  юфэшь шч ЁрчЁрсюЄўшъют ╤Єрёюь ─╕уЄхт√ь (Stas Degteff 2:5080/102 g@grumbler.org)

0.4. ╚ёЄюЁш  ёючфрэш  binkd.

╤ ЁрёяЁюёЄЁрэхэшхь Internet т ╨юёёшш є Їшфю°эюую ёююс∙хёЄтр ёЇюЁьшЁютрырё№ шфх  шёяюы№чютрЄ№ эют√щ ЄЁрэёяюЁЄ фы  яхЁхфрўш ЄЁрЇшър. ╧юэрўрыє шёяюы№чютрыюё№ юс√ўэюх ╧╬, ЁрчЁрсюЄрээюх фы  ьюфхьэ√ї ёюхфшэхэшщ, эю ¤Єю с√ыю ъЁрщэх эх¤ЇЇхъЄштэю ш т эхъюЄюЁ√ї ёшЄєрЎш ї ёхрэё ёт чш FTN эх єёЄрэртыштрыё  эхёьюЄЁ  эр эюЁьры№эє■ ЁрсюЄє яЁюЄюъюыют Internet. Binkd ёючфртрыё  ─ьшЄЁшхь ╠рыют√ь т 1996 уюфє ъръ яЁшыюцхэшх фы  Internet ё Єхь, ўЄюс√ ьръёшьры№эю шёяюы№чютрЄ№ яЁхшьє∙хёЄтр ¤Єюую ЄЁрэёяюЁЄр TCP/IP. ┬ фры№эхщ°хь ъ ЁрчЁрсюЄъх яюфъы■ўшышё№ фЁєушх ы■фш, р ╠рыют т яюёыхфэшх уюф√ юЄю°╕ы юЄ ЁрсюЄ√ эрф binkd. ╧хЁт√х тхЁёшш binkd ЁрчЁрсрЄ√трышё№ фы  ╬╤ ъырёёр UNIX, т фры№эхщ°хь binkd с√ы рфряЄшЁютрэ фы  OS/2, чрЄхь фы  Windows, MSDOS (PCDOS) ш AmigaOS.

═рчтрэшх «binkd» с√ыю ёюёЄртыхэю шч ёыют «Bink Daemon», шыш «Bink-style Daemon». (╚эюуфр хую фрцх яш°єЄ ё яхЁтющ ш яюёыхфэхщ чруыртэ√ьш сєътрьш, яюыэюёЄ№■ ъюяшЁє  ўрёЄш шёїюфэ√ї ёыют: «BinkD».) ╥ръшь юсЁрчюь, эрчтрэшх т эхъюЄюЁющ ьхЁх юяшё√трхЄ эрчэрўхэшх яЁюуЁрьь√: фхьюэ фы  ЁрсюЄ√ ё bink style outbound. ╚ шьхээю яю¤Єюьє binkd эрч√тр■Є т ьєцёъюь Ёюфх.

1. ╘шыюёюЇш  binkd.

1.1. ╧ЁюЄюъюы.

─ьшЄЁшщ ╠рыют ЁрчЁрсюЄры фы  binkd ёюсёЄтхээ√щ яЁюЄюъюы, шёїюф  шч яЁшэЎшяют ёъюЁюёЄш, яЁюёЄюЄ√ т ЁхрышчрЎшш ш Ёрё°шЁ хьюёЄш. ╧ЁюЄюъюы с√ы эрчтрэ хую ртЄюЁюь «binkp»: ёюъЁр∙хэшх юЄ ёыют «binkd's protocol».

╧ЁюЄюъюы binkp ЁрчЁрсюЄрэ т Ёрёў╕Єх эр шёяюы№чютрэшх яютхЁї яЁюЄюъюыр ЄЁрэёяюЁЄэюую єЁютэ , юсхёяхўштр■∙хую ЎхыюёЄэюёЄ№ яхЁхфртрхь√ї фрээ√ї, Єръюую ъръ TCP. ┴рчют√щ яЁюЄюъюы binkp шёяюы№чєхЄ ьшэшьры№эюх ъюышўхёЄтю ёыєцхсэющ шэЇюЁьрЎшш яЁш яхЁхфрўх ш яЁшхьх фрээ√ї (Їрщыют), яхЁхфрўр Їрщыют яЁюшчтюфшЄё  схч ярєч яюёыхфютрЄхы№эю фЁєу чр фЁєуюь, яхЁхфрўр ш яЁш╕ь эр ърцфющ ёЄюЁюэх яЁюшчтюф Єё  юфэютЁхьхээю. ▌Єшь юсхёяхўштрхЄё  ¤ЇЇхъЄштэюх шёяюы№чютрэшх яюыюё√ яЁюяєёърэш  ърэрыр ёт чш.

╨рё°шЁхэш  срчютюую яЁюЄюъюыр єёЄЁрэ ■Є ю°шсъш, тючэшър■∙шх яЁш ўрёЄ√ї юсЁ√трї т ърэрых ёт чш (чр ёў╕Є ёэшцхэш  ¤ЇЇхъЄштэюёЄш), юсхёяхўштр■Є схчюярёэ√щ юсьхэ ярЁюы ьш яю юЄъЁ√Є√ь ышэш ь ёт чш, °шЇЁютрэшх яхЁхфртрхь√ї фрээ√ї, ёцрЄшх фрээ√ї, чряЁюё√ Їрщыют, т√сюЁюўэ√щ яЁш╕ь Їрщыют ш фЁєушх тючьюцэюёЄш.

╧ЁюЄюъюы binkp тхЁёшш 1.0 юяшёрэ т фюъєьхэЄх FSP-1018, т фЁєушї фюъєьхэЄрї FTSC юяшёрэ√ Ёрё°шЁхэш  ш эют√х тхЁёшш яЁюЄюъюыр. (╧юфЁюсэхх ёь. эр ёрщЄх FTSC ш эр ёрщЄх binkd.) ╬с∙хх юяшёрэшх binkp тъы■ўхэю т ёюёЄрт фшёЄЁшсєЄштр binkd.

1.2. ╨рчфхыхэшх ЇєэъЎшюэры№эюёЄш.

┬ ьшЁх UNIX яЁшэ Є яюфїюф ъ яЁюхъЄшЁютрэш■ яЁшыюцхэшщ, яЁш ъюЄюЁюь фы  т√яюыэхэш  эхъюЄюЁющ чрфрўш ёючфр╕Єё  ш шёяюы№чєхЄё  яЁюуЁрььр ё ьръёшьры№эю єчъющ ёяхЎшрышчрЎшхщ. Binkd ёючфртрыё  ё єў╕Єюь Єръюую яюфїюфр: ¤Єю яЁюуЁрььр-фхьюэ, ъюЄюЁр  ЁрсюЄрхЄ схч эхяюёЁхфёЄтхээюую тьх°рЄхы№ёЄтр ўхыютхър ш т√яюыэ хЄ єчъє■ чрфрўє яю яЁш╕ьє ш яхЁхфрўх Їрщыют ьхцфє єчырьш ёхЄхщ, яюёЄЁюхээ√ї яю Єхїэюыюушш FTN (т ўрёЄэюёЄш, FIDOnet). ┬ юЄышўшх юЄ ёыєўрхт шёяюы№чютрэш  яюўЄют√ї яЁюуЁрьь, юЁшхэЄшЁютрээ√ї эр ЁрсюЄє ўхЁхч ьюфхь√, т ёыєўрх шёяюы№чютрэш  binkd яюфуюЄютър яюўЄ√ ъ юЄяЁртъх (ЇръЄшўхёъш яЁхтЁр∙хэшх яшёхь шч яюўЄютющ срч√ т Їрщы√ – єяръютър яюўЄ√) юёє∙хёЄты хЄё  юЄфхы№э√ьш яЁюуЁрььрьш: ЄюёёхЁрьш (tosser) т ёыєўрх ¤їюьхщыр ш ЄЁхъхЁрьш (netmail tracker) т ёыєўрх эхЄьхщыр. яюфуюЄютър Їрщыют ъ яхЁхё√ыъх яю Їрщы-¤їрь юёє∙хёЄты хЄё  Єюцх ёяхЎшрышчшЁютрээ√ьш яЁюуЁрььрьш – Їрщы¤їюяЁюЎёёюЁрьш. ┴юыхх Єюую, юсЁрсюЄър Їрщыют√ї чряЁюёют т binkd Ёхрышчютрэр Єюы№ъю яЁш шёяюы№чютрэшш ёяхЎшрышчшЁютрээющ яЁюуЁрьь√ FREQ-ьхэхфцхЁр.

1.3. ╩ышхэЄ ш ёхЁтхЁ.

Binkd  ты хЄё  яЁшыюцхэшхь, яЁхфэрчэрўхээ√ь фы  ЁрсюЄ√ т Internet (Єюўэхх, фы  ЁрсюЄ√ т ёхЄ ї, яюёЄЁюхээ√ї яю Єхїэюыюушш TCP/IP). ╩рцфюх яЁшыюцхэшх Internet ЁрсюЄрхЄ ышсю ъръ ёхЁтхЁ, яЁшэшьр■∙шщ ёюхфшэхэш , ышсю ъръ ъышхэЄ, юёє∙хёЄты ■∙шщ ёюхфшэхэшх ё ёхЁтхЁэ√ь яЁшыюцхэшхь. ┬ binkd ¤Єш фтх ўрёЄш ёюхфшэхэ√ т юфэюь яЁшыюцхэшш, яюёъюы№ъє рыуюЁшЄь√ ЁрсюЄ√ т ¤Єшї трЁшрэЄрї Ёрчышўр■Єё  эхёъюы№ъшьш фхЄры ьш ш юёэютэр  ўрёЄ№ ъюфр яЁш ЁрсюЄх яю яЁюЄюъюыє binkp є ъышхэЄр ш є ёхЁтхЁр ёютярфрхЄ. ╬фэръю яюы№чютрЄхы№ ьюцхЄ эрёЄЁюшЄ№ binkd эр ЁрсюЄє Єюы№ъю ёхЁтхЁюь ышсю Єюы№ъю ъышхэЄюь. ┬ючьюцхэ Єръцх юфэюъЁрЄэ√щ чряєёъ binkd ё тъы■ўхээющ Єюы№ъю юфэющ ЇєэъЎшхщ (ёхЁтхЁр ышсю ъышхэЄр), яЁш ¤Єюь єърч√тр■Єё  ёяхЎшры№э√х юяЎшш ъюьрэфэющ ёЄЁюъш. ┬ ЄхЁьшэюыюушш binkd ёхЁтхЁэр  ўрёЄ№ ЇєэъЎшюэрыр ЁхрышчєхЄё  ёхЁтхЁ-ьхэхфцхЁюь (server manager), р ъышхэЄёър  – ъышхэЄ-ьхэхфцхЁюь (client manager).

╧юёъюы№ъє т ёхЄ ї TCP/IP эхЄ ьюэюяюы№э√ї ЁхёєЁёют, эряЁшьхЁ, Єръшї ъръ хфшэёЄтхээр  ЄхыхЇюээр  ышэш  т ёыєўрх ьюфхьэ√ї ъюььєЄшЁєхь√ї ёюхфшэхэшщ, ёхЁтхЁ ьюцхЄ яЁшэшьрЄ№, р ъышхэЄ - юёє∙хёЄты Є№ юфэютЁхьхээю ьэюцхёЄтю ёюхфшэхэшщ, эхчртшёшь√ї фЁєу юЄ фЁєур. ╧Ёш ¤Єюь фы  ърцфюую ёюхфшэхэш  binkd ёючфр╕Є юЄфхы№э√щ яЁюЎхёё (шыш яюЄюъ – т ьэюуюяюЄюўэ√ї юяхЁрЎшюээ√ї ёшёЄхьрї), ш ярЁрыыхы№эр  ЁрсюЄр binkd ё Ёрчэ√ьш єфры╕ээ√ьш єчырьш юсхёяхўштрхЄё  ёЁхфёЄтрьш юяхЁрЎшюээющ ёшёЄхь√. ╥ръющ яюфїюф яючтюышы эх ёючфртрЄ№ ёюсёЄтхээ√щ ьхэхфцхЁ яЁюЎхёёют, ўЄю чэрўшЄхы№эю єяЁюёЄшыю яЁюуЁрьшЁютрэшх. (╧Ёшьхўрэшх. ┬ юфэючрфрўэ√ї ╬╤, эряЁшьхЁ, т MSDOS, binkd ьюцхЄ ЁрсюЄрЄ№ ышсю ъышхэЄюь, ышсю ёхЁтхЁюь, яЁшўхь ярЁрыыхы№эр  ЁрсюЄр ё Ёрчэ√ьш ышэърьш шёъы■ўрхЄё .)

╤хЁтхЁ-ьхэхфцхЁ binkd яЁшэшьрхЄ чряЁюё эр єёЄрэютыхэшх TCP-ёюхфшэхэш  ш чряєёърхЄ юўхЁхфэющ ¤ъчхьяы Ё ёхЁтхЁэюую яЁюЎхёёр (яюЄюър) ышсю чръЁ√трхЄ ёюхфшэхэшх т ёыєўрх, хёыш ўшёыю ЁрсюЄр■∙шї ёхЁтхЁэ√ї яЁюЎхёёют (яюЄюъют) єцх фюёЄшуыю ьръёшьры№эю ЁрчЁх°хээюую т ъюэЇшуєЁрЎшш binkd ўшёыр. ┬ яюёыхфэхь ёыєўрх ёхЁтхЁ-ьхэхфцхЁ юЄяЁрты хЄ єфры╕ээюьє ъышхэЄє ёююс∙хэшх ю ётюхщ чрэ ЄюёЄш (яхЁхуЁєцхээюёЄш).

╩ышхэЄ-ьхэхфцхЁ яхЁшюфшўхёъш яЁюёьрЄЁштрхЄ яюўЄютє■ юўхЁхф№ (outbound) ш яЁш юсэрЁєцхэшш Їрщыют, яЁхфэрчэрўхээ√ї ъ юЄяЁртъх эр шчтхёЄэ√щ хьє єчхы, эр ъюЄюЁ√щ ЁрчЁх°хэр юЄяЁртър, чряєёърхЄ юўхЁхфэющ ¤ъчхьяы Ё ъышхэЄёъюую яЁюЎхёёр (яюЄюър). ╧Ёш ¤Єюь, хёыш ўшёыю ЁрсюЄр■∙шї ъышхэЄёъшї яЁюЎхёёют (яюЄюъют) єцх фюёЄшуыю ьръёшьры№эю ЁрчЁх°хээюую т ъюэЇшуєЁрЎшш ўшёыр, ёърэшЁютрэшх юўхЁхфш ш чряєёъ эют√ї ъышхэЄёъшї яЁюЎхёёют (яюЄюъют) эх яЁюшчтюфшЄё .

1.4. ┬хЁёшш binkd.

╧хЁт√х тхЁёшш binkd эєьхЁютрышё№, эрўшэр  ё эєы : 0.1, 0.2, ...0.9. ╩Ёюьх Єюую, яюёых эхсюы№°шї фюЁрсюЄюъ (шёяЁртыхэшх ю°шсюъ, эхсюы№°шх єыєў°хэш ) фюсрты ырё№ ш єтхышўштрырё№ ЄЁхЄ№  ЎшЇЁр: 0.9.1, 0.9.2, .... ╩ яЁюьхцєЄюўэ√ь т√яєёърь, ЁрёяЁюёЄЁрэ хь√ь фы  юЄырфъш, фюсрты ырё№ сєътр.

═рўшэр  ё тхЁёшш 0.9.5 ёфхырэ√ фтх тхЄъш: ёЄрсшы№эр , т ъюЄюЁющ Єюы№ъю шёяЁрты ышё№ ю°шсъш, ш тхЄър ръЄштэющ ЁрчЁрсюЄъш. ╤Єрсшы№эр  тхЄър эрчтрэр 0.9.5-stable ш ъ эхщ юЄэюё Єё  тхЁёшш 0.9.6, 0.9.7, 0.9.8, 0.9.9, 0.9.10, 0.9.11,  ты ■∙шхё  шёяЁртыхээ√ьш Ёхышчрьш яюёых 0.9.5. ╤ыхфє■∙р  тхЄър юсючэрўхэр ъръ 1.0 ш тхЁёшш т эхщ эєьхЁє■Єё  Єръ: 1.0a-эюьхЁ_шёяЁртыхэш , эряЁшьхЁ binkd 1.0a-295. ╧ю юъюэўрэшш ЁрчЁрсюЄъш тхЁёшш 1.0 сєфхЄ т√яє∙хэ Ёхышч 1.0 ш юЄ эхую сєфхЄ тхёЄшё№ тхЄър 1.0-stable, т ёыєўрх юсэрЁєцхэш  ш шёяЁртыхэш  ю°шсюъ сєфєЄ т√яє∙хэ√ шёяЁртыхээ√х тхЁёшш 1.0.1, 1.0.2 ш фрыхх. ╧юёых т√яєёър Ёхышчр 1.0 эрўэ╕Єё  ЁрчЁрсюЄър тхЁёшш 1.1 яю Єръюьє цх ёЎхэрЁш■, ъръ ш 1.0.

1.5. ╬ёюсхээюёЄш binkd т Ёрчэ√ї ╬╤.

Binkd шчэрўры№эю ЁрчЁрсрЄ√трыё  фы  юяхЁрЎшюээ√ї ёшёЄхь ёхьщёЄтр UNIX, эю т эрёЄю ∙хх тЁхь  шч юфэшї ш Єхї цх шёїюфэ√ї ЄхъёЄют ъюьяшышЁє■Єё  тхЁёшш Єръцх фы  OS/2, Amiga, DOS, Windows 3.x, Windows 9x, Windows NT/2000/XP/2003. ╧Ёш ¤Єюь яюыєўрхЄё  юЄфэр ш Єр цх тхЁёш , эю эр Ёрчэ√ї яырЄЇюЁьрї, юЄышўш  ьхцфє ъюЄюЁ√ьш ьшэшьры№э√ ш юяЁхфхы ■Єё  юёюсхээюёЄ ьш яырЄЇюЁь√ ш, шэюуфр, ъюьяшы ЄюЁр.

─ы  OS/2 ёє∙хёЄтєхЄ ўхЄ√Ёх трЁшрэЄр binkd: ёъюьяшышЁютрээ√щ ъюьяшы ЄюЁюь Watcom C, фтр трЁшрэЄр, ёъюьяшышЁютрээ√х EMX (GNU C) ш трЁшрэЄ, ёъюьяшышЁютрээ√щ ICC (IBM C Compiler) ┬ яхЁтюь ш ўхЄт╕ЁЄюь трЁшрэЄрї яюыєўрхЄё  яюыэ√щ шёяюыэ хь√щ Їрщы, тю тЄюЁюь ш ЄЁхЄ№хь фы  ЁрсюЄ√ binkd ЄЁхсєхЄё  єёЄрэютыхээ√щ т ёшёЄхьх EMX run-time. ╤ююЄтхЄёЄтхээю ёъюьяшышЁютрээ√щ Watcom шёяюыэ хь√щ Їрщы binkd шьххЄ сюы№°шщ ЁрчьхЁ ш яюЄЁхсы хЄ сюы№°х ЁхёєЁёют. ╩Ёюьх Єюую, шч-чр ю°шсюъ ъюьяшы ЄюЁют т ърцфюь трЁшрэЄх хёЄ№ ётюш эхфюёЄрЄъш. ╚ёяюыэ хь√щ Їрщы, ёюсЁрээ√щ яюёЁхфёЄтюь Watcom C, шьххЄ шь  binkd2.exe, ёюсЁрээ√щ яюёЁхфёЄтюь ICC – binkd.exe, р ёюсЁрээ√щ EMX – binkd2eo.exe ышсю binkd2e.exe т чртшёшьюёЄш юЄ Єюую, ёюсЁрэ юэ ё т Ёхцшьх OMF шыш эхЄ.

┬ DOS binkd ьюцхЄ ЁрсюЄрЄ№ Єюы№ъю т ёЁхфх IBM TCP/IP for PC-DOS, яю¤Єюьє ЄЁхсєхЄё  Ёрч√ёърЄ№ ш єёЄрэютшЄ№ ¤ЄюЄ яръхЄ яюффхЁцъш ёхЄш. ╚ёЄюўэшъш IBM TCP/IP for PC-DOS єърчрэ√ т Binkd FAQ.

─ы  32-сшЄэ√ї тхЁёшщ Windows ёє∙хёЄтєхЄ эхёъюы№ъю трЁшрэЄют ъюьяшы Ўшш шёяюыэ хьюую Їрщыр binkd: трЁшрэЄ√, ЁрсюЄр■∙шх ёхЁтшёрьш Єюы№ъю т ышэхщъх Windows NT (¤Єю NT, 2000, XP, 2003) ш трЁшрэЄ√, ЁрсюЄр■∙шх ёхЁтшёрьш Єюы№ъю т ышэхщъх Windows 95 (¤Єю 95, 98, Me). ─Ёєуюх фхыхэшх – трЁшрэЄ√, ёюсЁрээ√х т яюыэ√щ шёяюыэ хь√щ Їрщы (ёю тёхьш сшсышюЄхърьш, «ёЄрЄшўхёър » ёсюЁър) ш т шёяюыэ хь√щ Їрщы, ъюЄюЁ√щ шёяюы№чєхЄ DLL (т яхЁтє■ юўхЁхф№, msvcrt.dll). ╩Ёюьх Єюую, ёюсЁрЄ№ binkd фы  Windows ьюцэю фтєь  ъюьяшы ЄюЁрьш: Microsoft Visual C шч яръхЄр Visual Studio ш GNU C шч яръхЄр MinGW32 шыш Cygwin. ─ы  ЁрсюЄ√ binkd, ёъюьяшышЁютрээюую MinGW32, тёхуфр эхюсїюфшьр сшсышюЄхър msvcrt.dll (MS Visual C run-time DLL), р фы  ёЄрЄшўхёъш ёюсЁрээюую ё яюью∙№■ Microsoft Visual C юэр эх ЄЁхсєхЄё . (╒юЄ  юёюсюую ёь√ёыр ёюсшЁрЄ№ ёЄрЄшўхёъє■ win32-тхЁёш■ binkd эхЄ, яюёъюы№ъє юўхэ№ ьэюушх яЁюуЁрьь√ шёяюы№чє■Є сшсышюЄхъє msvcrt.dll.)

┬рЁшэрЄ binkd, ЁрсюЄр■∙шщ ёхЁтшёюь т Windows 95 (98, Me) юЄышўрхЄё  юЄ фЁєушї Єхь, ўЄю эх шьххЄ ЄхъёЄютющ ъюэёюыш ш эшўхую эх т√тюфшЄ эр ¤ъЁрэ тю тЁхь  ЁрсюЄ√. ╬ёЄрэютшЄ№ хую тЁєўэє■ ьюцэю Єюы№ъю чртхЁ°шт яЁюЎхёё шч ьхэхфцхЁр чрфрў Windows. ╬э эрч√трхЄё  bink/w9x ш шёяюыэ хь√щ Їрщы шьххЄ шь  binkdw9x.exe. ╬с√ўэ√щ ъюэёюы№э√щ binkd/w32 эх ёяюёюсхэ ЁрсюЄрЄ№ ёхЁтшёюь т Windows 95 шч-чр юёюсхээюёЄхщ ЁхрышчрЎшш ъюэёюыш win32 т ¤Єющ ╬╤.

─ы  16-сшЄэ√ї тхЁёшщ Windows (Windows 3.1, Windows 3.11) binkd ьюцхЄ ЁрсюЄрЄ№ Єюы№ъю ъышхэЄюь ышсю Єюы№ъю ёхЁтхЁюь. ╧ю¤Єюьє, ўЄюс√ ш юёє∙хёЄты Є№ т√чют√, ш яЁшэшьрЄ№ ёюхфшэхэш , эхюсїюфшью чряєёърЄ№ фтх ъюяшш binkd/w16 ё Ёрчэ√ьш ярЁрьхЄЁрьш.

2. ╙ёЄрэютър binkd.

2.1. ╙ёЄрэютър ёъюьяшышЁютрээюую яръхЄр шч фшёЄЁшсєЄштр.

┼ёыш т√  ты хЄхё№ юс√ўэ√ь яюы№чютрЄхыхь (юёюсхээю ¤Єю ръЄєры№эю т юяхЁрЎшюээ√ї ёшёЄхьрї ё чръЁ√Є√ь шёїюфэ√ь ъюфюь), ┬рь яЁю∙х тч Є№ уюЄют√щ (ёъюьяшышЁютрээ√щ) яръхЄ, ЁрчтхЁэєЄ№ хую т ётюхщ ёшёЄхьх ш т√яюыэшЄ№ эрёЄЁющъє.

═ряюьшэр■, ўЄю Ёхў№ шф╕Є ю binkd тхЁёшш 0.9.11 (Єюўэхх – ю тхЄъх 0.9.5-stable, Єю хёЄ№ тё╕ эряшёрээюх фхщёЄтшЄхы№эю ш фы  тхЁёшщ 0.9.5, 0.9.6, 0.9.7, 0.9.8, 0.9.9, 0.9.10, Єръцх сєфхЄ фхщёЄтшЄхы№эю фы  тхЁёшщ 0.9.12, 0.9.13 ш Є.ф. - хёыш юэш сєфєЄ т√яє∙хэ√). ─ы  эрїюф ∙шїё  т ЁрчЁрсюЄъх тхЁёшщ 1.x ¤Єю ЁєъютюфёЄтю яЁшьхэшью ё яюяЁртърьш.

2.1.1. ╩юьяыхъЄрЎш  фшёЄЁшсєЄштэюую яръхЄр.

─шёЄЁшсєЄштэ√х яръхЄ√ binkd, яюфуюЄютыхээ√х ЁрчЁрсюЄўшърьш, ёюфхЁцрЄ (т ёъюсърї єърчрэю шь  Їрщыр/ют):

  • шёяюыэ хь√щ Їрщы (binkd, binkd.exe, binkd2.exe шыш фЁєующ);

  • яЁшьхЁ Їрщыр ъюэЇшуєЁрЎшш ёю тёхьш тючьюцэ√ьш фшЁхъЄштрьш ъюэЇшуєЁрЎшш (binkd.cfg);

  • ъЁрЄър  шэёЄЁєъЎш  яю єёЄрэютъх binkd ёю ёё√ыърьш эр фюъєьхэЄрЎш■ (!README);

  • Binkd FAQ – юЄтхЄ√ эр ўрёЄю чрфртрхь√х тюяЁюё√ ю binkd (Ёєёёъшщ binkdfaq.txt.ru ш яхЁхтюф эр рэуышщёъшщ binkdfaq.txt.en);

  • ёЄЁрэшЎр man binkd (binkd.8 – Єюы№ъю фы  ╬╤ ёхьхщёЄтр UNIX ш binkd.txt – фы  юёЄры№э√ї ╬╤);

  • юяшёрэшх трЁшрэЄр binkd фы  ЁрсюЄ√ ёхЁтшёюь т ╬╤ Windows 9x (binkd9x.txt);

  • юяшёрэшх ЁрсюЄ√ binkd т «Ёхцшьх схч фєяют» (No Dupes Mode, ND mode), фЁєушьш ёыютрьш – юяшёрэшх Ёрё°шЁхэш  ND mode яЁюЄюъюыр binkp яЁшьхэшЄхы№эю ъ binkd (readme.ND);

  • юяшёрэшх ьхїрэшчьр Їрщыют√ї чряЁюёют SRIF - Standard Request Information File (!SRIF.TXT);

  • ёяшёюъ шчьхэхэшщ ьхцфє тхЁёш ьш (!README.FIX);

  • ёяшёюъ шчьхэхэшщ т Їрщырї шёїюфэ√ї ЄхъёЄют (HISTORY);

  • ёяшёюъ яырэшЁєхь√ї шчьхэхэшщ (todo.lst);

  • ышЎхэчш  (COPYING);

  • т фшcЄЁшсєЄштрї фы  Windows, OS/2, DOS: Їрщы ё ъЁрЄъшь юяшёрэшхь ёюфхЁцшьюую рЁїштр (File-Id.Diz).

┬ яюёыхфє■∙хь ёюёЄрт яръхЄют ьюцхЄ с√Є№ шчьхэ╕э.

2.1.2. ╧юёыхфютрЄхы№эюёЄ№ фхщёЄтшщ фы  ╬╤ ёхьхщёЄтр UNIX.

  1. ┬юч№ьшЄх рЁїшт фшёЄЁшсєЄштр ё яюёыхфэхщ тхЁёшхщ binkd тхЄъш 0.9.5-stable шч юфэюую шч юЇшЎшры№э√ї шёЄюўэшъют (ышсю шч шёЄюўэшър, ъюЄюЁюьє ┬√ фютхЁ хЄх). ─ы  Ёрчэ√ї ╬╤ ш фшёЄЁшсєЄштют ╬╤ юэ сєфхЄ юЄышўрЄ№ё , эряЁшьхЁ, фы  Red Hat Linux ¤Єю яръхЄ RPM, фы  Debian Linux – яръхЄ DEB.

  2. ┬√яюыэшЄх єёЄрэютъє (Ёрёяръютъє) яръхЄр т ёююЄтхЄёЄтшш ё фюъєьхэЄрЎшхщ эр ╬╤.

  3. ═рщфшЄх яЁшьхЁ Їрщыр ъюэЇшуєЁрЎшш: binkd.conf-dist. (╬с√ўэю юэ яюьх∙рхЄё  т ърЄрыюу /usr/local/etc.)

  4. ╤ъюяшЁєщЄх binkd.conf-dist т binkd.conf, юЄЁхфръЄшЁєщЄх binkd.conf т ёююЄтхЄёЄтшш ё ярЁрьхЄЁрьш ┬р°хщ FTN-ёЄрэЎшш ш цхырхьющ ЇєэъЎшюэры№эюёЄ№■ binkd. ╧юфЁюсэю эрёЄЁющър binkd юяшёрэр т уыртх 3.

  5. ╧ЁютхЁ№Єх яЁртшы№эюёЄ№ ъюэЇшуєЁрЎшш, фы  ўхую єърцшЄх т Їрщых ъюэЇшуєЁрЎшш яхЁтющ ёЄЁюъющ ёыютю debugcfg ш чряєёЄшЄх binkd, єърчрт т ъюьрэфэющ ёЄЁюъх ярЁрьхЄЁ – шь  Їрщыр ъюэЇшуєЁрЎшш:
    binkd binkd.conf
    ышсю чряєёЄшЄх binkd, єърчрт т ъюьрэфэющ ёЄЁюъх юяЎш■ -vvv ш ярЁрьхЄЁ – шь  Їрщыр ъюэЇшуєЁрЎшш:
    binkd -vvv binkd.conf
    (┬ яюёыхфє■∙шї тхЁёш ї binkd фрья ъюэЇшуєЁрЎшш ёфхырэ шэрўх.)

  6. ┼ёыш ъюэЇшуєЁрЎш  эхтхЁэр, binkd т√тхфхЄ фшруэюёЄшўхёъюх ёююс∙хэшх юс ю°шсъх ш чртхЁ°шЄ ЁрсюЄє. ┬ ¤Єюь ёыєўрх яЁшф╕Єё  шёяЁртшЄ№ ю°шсъш. ┬ ёыєўрх яЁртшы№эющ ъюэЇшуєЁрЎшш binkd сєфхЄ я√ЄрЄ№ё  юёє∙хёЄтшЄ№ т√чют, ышсю сєфхЄ цфрЄ№ ёюхфшэхэш , ышсю чртхЁ°шЄё  яю яЁю°хёЄтшш тЁхьхэш, єърчрээюую т фшЁхъЄштх rescan-delay Їрщыр ъюэЇшуєЁрЎшш. ╧ЁшэєфшЄхы№эю чртхЁ°шЄ№ ЁрсюЄє binkd ьюцэю эрцрЄшхь ёюўхЄрэш  ъыртш° Ctrl-C.

  7. ┼ёыш ┬√ їюЄшЄх, ўЄюс√ binkd ЁрсюЄры фхьюэюь ш чряєёърыё  яЁш ёЄрЁЄх ╬╤, тёЄрт№Єх ёыхфє■∙є■ ёЄЁюъє т√чютр binkd т ёЄрЁЄют√щ ёъЁшяЄ ╬╤ ёюуырёэю фюъєьхэЄрЎшш эр тр°є ╬╤:
    binkd -Dq binkd.conf

2.1.3. ╧юёыхфютрЄхы№эюёЄ№ фхщёЄтшщ фы  фЁєушї ╬╤ (Windows Ёрчэ√ї тхЁёшщ, OS/2, DOS ш яЁ.).

  1. ┬юч№ьшЄх т√сЁрээ√щ ┬рьш рЁїшт фшёЄЁшсєЄштр ё яюёыхфэхщ тхЁёшхщ binkd тхЄъш 0.9.5-stable фы  тр°хщ ╬╤ шч юфэюую шч юЇшЎшры№э√ї шёЄюўэшъют (ышсю шч шёЄюўэшър, ъюЄюЁюьє ┬√ фютхЁ хЄх).
    ─ы  Windows ёє∙хёЄтєхЄ фтх тхЁёшш binkd: єэштхЁёры№эр  ъюэёюы№эр  тхЁёш  (binkd/w32) ш ёяхЎшрышчшЁютрээр  фы  ЁрсюЄ√ ёхЁтшёюь т ╬╤ Windows 95/98/Me (binkd/w9x). ╬Єышўшх яюёыхфэхщ т Єюь, ўЄю ЁрсюЄрхЄ юэр схч тё ъюую т√тюфр шэЇюЁьрЎшш эр ¤ъЁрэ ш яЁхЁтрЄ№ х╕ ЁрсюЄє ьюцэю, Єюы№ъю чртхЁ°шт яЁюЎхёё binkdw9x. ╩юэёюы№эр  цх тхЁёш  ёючфр╕Є ЄхъёЄютюх юъэю ъюэёюыш win32 ш т ¤Єю юъэю т√тюф Єё  ёююс∙хэш  яЁюЄюъюыр ЁрсюЄ√ (хёыш яЁш чряєёъх binkd эх єърчрэр юяЎш  -q).
    ─ы  OS/2 ёє∙хёЄтєхЄ фтр трЁшрэЄр шёяюыэ хь√ї Їрщыют binkd: ёюсЁрээ√щ ъюьяшы ЄюЁюь Watcom C ш ёюсЁрээ√щ ъюьяшы ЄюЁюь EMX (GNU C). ┬рЁшрэЄ, ёюсЁрээ√щ Watcom C, эх ЄЁхсєхЄ фюяюыэшЄхы№э√ї яЁюуЁрьь (эрчтрэшх рЁїштр ш шёяюыэ хьюую Їрщыр эрўшэрхЄё  ё «binkd2»). ┬рЁшрэЄ, ёюсЁрээ√щ EMX, фы  ЁрсюЄ√ ЄЁхсєхЄ єёЄрэютыхээюую яръхЄр EMX run-time тхЁёшш эх эшцх 0.9c. ┼ую ьюцэю ёърўрЄ№ ё ёхЁтхЁр Hobbes (ftp://hobbes.nmsu.edu/pub/os2/unix/emx09c/), ё CDROM.COM ( ftp://ftp.cdrom.com/pub/hobbes/emx09c/) ш шч фЁєушї шёЄюўэшъют.

  2. ╤ючфрщЄх ърЄрыюу, т ъюЄюЁюь сєфхЄ ЁрёяюырурЄ№ё  binkd, эряЁшьхЁ, C:\ftn\binkd

  3. ╨рёяръєщЄх рЁїшт т яЁшуюЄютыхээ√щ ърЄрыюу.

  4. ╬ЄЁхфръЄшЁєщЄх ъюэЇшуєЁрЎшюээ√щ Їрщы binkd.cfg т ёююЄтхЄёЄтшш ё ярЁрьхЄЁрьш ┬р°хщ FTN-ёЄрэЎшш ш цхырхьющ ЇєэъЎшюэры№эюёЄ№■ binkd.

  5. ╧ЁютхЁ№Єх яЁртшы№эюёЄ№ ъюэЇшуєЁрЎшш, фы  ўхую єърцшЄх т Їрщых ъюэЇшуєЁрЎшш яхЁтющ ёЄЁюъющ ёыютю debugcfg ш чряєёЄшЄх binkd, єърчрт т ъюьрэфэющ ёЄЁюъх ярЁрьхЄЁ – шь  Їрщыр ъюэЇшуєЁрЎшш:
    binkd binkd.cfg
    ышсю чряєёЄшЄх binkd, єърчрт т ъюьрэфэющ ёЄЁюъх юяЎш■ -vvv ш ярЁрьхЄЁ – шь  Їрщыр ъюэЇшуєЁрЎшш:
    binkd -vvv binkd.cfg
    (┬ яюёыхфє■∙шї тхЁёш ї binkd фрья ъюэЇшуєЁрЎшш ёфхырэ шэрўх.)

  6. ┼ёыш ъюэЇшуєЁрЎш  эхтхЁэр, binkd т√тхфхЄ фшруэюёЄшўхёъюх ёююс∙хэшх юс ю°шсъх ш чртхЁ°шЄ ЁрсюЄє. ┬ ¤Єюь ёыєўрх яЁшф╕Єё  шёяЁртшЄ№ ю°шсъш. ┬ ёыєўрх яЁртшы№эющ ъюэЇшуєЁрЎшш binkd сєфхЄ я√ЄрЄ№ё  юёє∙хёЄтшЄ№ т√чют, ышсю сєфхЄ цфрЄ№ ёюхфшэхэш , ышсю чртхЁ°шЄё  яю яЁю°хёЄтшш тЁхьхэш, єърчрээюую т фшЁхъЄштх rescan-delay Їрщыр ъюэЇшуєЁрЎшш. ╧ЁшэєфшЄхы№эю чртхЁ°шЄ№ ЁрсюЄє binkd ьюцэю эрцрЄшхь ёюўхЄрэш  ъыртш° Ctrl-C.

  7. (╥юы№ъю фы  32-сшЄэ√ї тхЁёшщ Windows) ┬ ёыєўрх, хёыш ┬√ їюЄшЄх, ўЄюс√ binkd ЁрсюЄры ёхЁтшёюь, т√яюыэшЄх єёЄрэютъє ёхЁтшёр юфэющ шч ъюьрэф:
    binkd -i binkd.cfg
    binkd -i -S binkd-service binkd.cfg
    уфх binkd-service – шь  ёхЁтшёр, ъюЄюЁюх ┬√ ьюцхЄх єърчрЄ№ (яю єьюыўрэш■ шёяюы№чєхЄё  «binkd-service»).
    ┬ ёыєўрх Windows NT (Windows 2000, Windows XP, Windows Server 2003) эєцэю шёяюы№чютрЄ№ трЁшрэЄ binkd/w32, р т ёыєўрх Windows 95 (Windows 98, Windows Me) – binkd/w9x. ┼ёыш ┬√ яюяЁюсєхЄх єёЄрэютшЄ№ ёхЁтшёюь эхяюфїюф ∙шщ трЁшрэЄ binkd, Ёхчєы№ЄрЄ фюёЄшуэєЄ эх сєфхЄ. ┬ ёыєўрх єёях°эющ єёЄрэютъш ёхЁтшёюь binkd юэ сєфхЄ ёЁрчє чряє∙хэ (яЁш єёыютшш фюёЄрЄюўэ√ї яЁрт яюы№чютрЄхы  є ┬р°хщ єўхЄэющ чряшёш т ╬╤).

2.2. ╩юьяшы Ўш  ш єёЄрэютър binkd шч шёїюфэ√ї ЄхъёЄют.

─ы  ъюьяшы Ўшш шёїюфэ√ї ЄхъёЄют ┬рь яюэрфюсшЄё  ъюьяыхъЄ ъюьяшы ЄюЁр ш ышэъют∙шър (ўрёЄю яюёЄрты хЄё  т хфшэюь яръхЄх). ┬ юяхЁрЎшюээ√ї ёшёЄхьрї ёхьхщёЄтр UNIX (юёэютрээ√ї эр UNIX, ёютьхёЄшь√ї ё UNIX, яюфюсэ√ї UNIX), трь яюэрфюсшЄё  ъюьяшы ЄюЁ GNU C тхЁёшш 2.94 ышсю 3.2. ┬ 32-сшЄэ√ї юяхЁрЎшюээ√ї ёшёЄхьрї Windows яюэрфюсшЄё  ышсю Microsoft Visual C (Visual Studio), ышсю MinGW32 (GNU C фы  Win32, юЄфхы№э√ь яръхЄюь ышсю т ъюьяыхъЄх ё cygwin). ─ы  OS/2 яюэрфюсшЄё  ышсю Watcom C тхЁёшш 10.0 шыш 11.0, ышсю яръхЄ EMX 0.9c (GNU C фы  OS/2), ышсю IBM C Compiler (ICC). ─ы  MSDOS (PCDOS) яюэрфюсшЄё  Microsoft C 6.0 ш яръхЄ IBM TCP/IP for DOS. ─ы  яырЄЇюЁь√ Amiga яюэрфюсшЄё  Amiga Development Environment.

┬ сюы№°шэёЄтх яырЄЇюЁь ьюцэю ёюсЁрЄ№ Ёрчэ√х трЁшрэЄ√ binkd: ё ьшэшьєьюь тючьюцэюёЄхщ (¤Єю трЁшрэЄ яю єьюыўрэш■), ё Ёрё°шЁхээ√ь (юЄырфюўэ√ь) т√тюфюь, ё яюффхЁцъющ ёхЁтшёют Windows 9x (т тхЁёшш фы  Windows). ┬рЁшрэЄ ъюьяшы Ўшш чрфр■Є ярЁрьхЄЁ√ ъюьрэфэющ ёЄЁюъш ъюьрэф√ make (nmake, wmake, ...), юэш яхЁхўшёыхэ√ т эрўрых Їрщыр ё яЁюуЁрьющ ёсюЁъш (Їрщы ё шьхэхь Makefile). ╨рё°шЇЁютър:

  • DEBUG – фюяюыэшЄхы№э√щ юЄырфюўэ√щ т√тюф;

  • DEBUGCHILD – ёюсЁрЄ№ юЄырфюўэ√щ трЁшрэЄ, ъюЄюЁ√щ ЁрсюЄрхЄ т юфэюь яЁюЎхёёх;

  • STATIC – ёсюЁър ё сшсышюЄхърьш, тъы■ўхээ√ьш т шёяюыэ хь√щ Їрщы (яЁш ЁрсюЄх эх эєцэ√ фшэрьшўхёъш яюфуЁєцрхь√х сшсышюЄхъш), шьххЄ ёь√ёы Єюы№ъю фы  ╬╤ ёхьхщёЄтр UNIX ш фы  OS/2;

  • BINKD9X – тхЁёш  фы  ЁрсюЄ√ ёхЁтшёюь т Windows 95/98/Me.

═рёЄЁющър binkd яЁш єёЄрэютъх ёрьюёЄю Єхы№эю ёъюьяшышЁютрээюую binkd яЁютюфшЄё  Єръ цх, ъръ ш яЁш єёЄрэютъх шч уюЄютюую фшёЄЁшсєЄштр.

2.2.1. ╩юьяшы Ўш  ш єёЄрэютър binkd т ╬╤ ёхьхщёЄтр UNIX.

╨рёяръєщЄх рЁїшт, ёюфхЁцр∙шщ шёїюфэ√х ЄхъёЄ√ binkd т эхъюЄюЁ√щ ърЄрыюу яю ┬р°хьє т√сюЁє. ╨рёяръют√трЄ№ эєцэю ё ёюїЁрэхэшхь тёхую фхЁхтр яюфърЄрыюуют. ╟рЄхь т√яюыэшЄх ёыхфє■∙є■ яюёыхфютрЄхы№эюёЄ№ ъюьрэф ($ - яЁшуыр°хэшх ъюьрэфэюую яЁюЎхёёюЁр ╬╤, чр эшь ўхЁхч яЁюсхы єърчрэр ъюьрэфр, ъюЄюЁє■ эєцэю ттхёЄш, т ёъюсърї юяшёрэ√ фхщёЄтш  ёъЁшяЄр ш ёфхырэ√ яю ёыхэш ):

$ cp mkfls/unix/* ./
$ sh configure --help
(╤ъЁшяЄ configure т√тхфхЄ шэЇюЁьрЎш■ ю фюёЄєяэ√ї юяЎш ї ёсюЁъш, т√схЁшЄх эєцэ√х ┬рь ш шёяюы№чєщЄх ъръ ярЁрьхЄЁ√ т ёыхфє■∙хщ ъюьрэфх. ═ряЁшьхЁ, яюффхЁцър яЁюъёш, яюффхЁцър NTLM рєЄхэЄшЇшърЎшш эр яЁюъёш ш яюффхЁцър ASO яю єьюыўрэш■ т√ъы■ўхэ√)
$ sh configure –witn-aso –with-https --with-ntlm
(ёъЁшяЄ configure сєфхЄ т√тюфшЄ№ шэЇюЁьрЎш■ ю ьэюцхёЄтх яЁютхЁюъ)
$ make depend
(┴єфхЄ яЁютхфхэю юЄёыхцштрэшх чртшёшьюёЄхщ.)
$ make
(┴єфхЄ яЁютхфхэр ъюьяшы Ўш .)
$ make install
(┴єфхЄ т√яюыэхэр єёЄрэютър яЁюуЁрьь√, Їрщыр ъюэЇшуєЁрЎшш ш ёЄЁрэшЎ√ man.)
$ make clean
(┴єфхЄ т√яюыэхэю єфрыхэшх яЁюьхцєЄюўэ√ї Їрщыют.)

┼ёыш Ёрёяръютрээ√х шёїюфэ√х ЄхъёЄ√ ┬рь сюыхх эх эєцэ√, ┬√ ьюцхЄх єфрышЄ№ ърЄрыюу ё эшьш.

2.2.2. ╩юьяшы Ўш  ш єёЄрэютър binkd т 32-сшЄэ√ї тхЁёш ї Windows.

┬ Windows 95/98/Me ышсю т Windows NT/2000/XP/2003 ыєў°шх Ёхчєы№ЄрЄ√ фр╕Є ъюьяшы ЄюЁ Microsoft Visual C, цхырЄхы№эю яюёыхфэхщ тхЁёшш. ╨рчЁрсюЄўшъш шёяюы№чютрыш фы  ёсюЁъш binkd ъюьяшы ЄюЁ√ MS Visual C тхЁёшщ 6 ш 7 (шч ёюёЄртр яръхЄют Visual Studio 6.0 ш Visual Studio .NET). ╤сюЁър binkd т√яюыэ хЄё  ъюьрэфющ nmake. ┬ ёЄЁюъх чряєёър ьюцэю шёяюы№чютрЄ№ эхёъюы№ъю ярЁрьхЄЁют, юэш юяшёрэ√ т эрўрых Їрщыр Makefile (ЁрёяюырурхЄё  т яюфърЄрыюух mkfls\nt95-msvc т фхЁхтх ърЄрыюуют ё шёїюфэ√ьш ЄхъёЄрьш).

─Ёєующ трЁшрэЄ – шёяюы№чютрЄ№ яръхЄ MinGW32, яЁхфёЄрты ■∙шщ ёюсющ ъюьяшы ЄюЁ GNU C, яюЁЄшЁютрэ√щ фы  яырЄЇюЁь√ Win32. ╬э ьюцхЄ с√Є№ юЄфхы№э√ь яръхЄюь ышсю т ёюёЄртх яръхЄр Cygwin. ┬ ёыєўрх шёяюы№чютрэш  MinGW32 ёсюЁър binkd юёє∙хёЄты хЄё  ъюьрэфющ make ш шёяюы№чєхЄ Їрщы Makefile, Ёрёяюыюцхээ√щ т яюфърЄрыюух mkfls\nt95-mingw. ┬ ёЄЁюъх чряєёър make ьюцэю шёяюы№чютрЄ№ эхёъюы№ъю ярЁрьхЄЁют, юэш юяшёрэ√ т эрўрых Їрщыр Makefile. ╥ръцх т ёЁхфх Cygwin ьюцэю шёяюы№чютрЄ№ Єє цх яюёыхфютрЄхы№эюёЄ№ фхщёЄтшщ, ўЄю ш фы  ╬╤ ёхьхщёЄтр UNIX, эю яюыєўхээ√щ Єръшь юсЁрчюь шёяюыэ хь√щ Їрщы сєфхЄ ЁрсюЄрЄ№ ьхфыхээхх ш хьє яюЄЁхсєхЄё  фшэрьшўхёъш яюфуЁєцрхьр  сшсышюЄхър cygwin1.dll.

┬ ёыєўрх ъюьяшы Ўшш DLL-трЁшрэЄр ёю тёЄЁюхээ√ь Perl, єўЄшЄх, ърър  тхЁёш  ш ъръющ трЁшрэЄ perl шёяюы№чєхЄё  ъюьяшы ЄюЁюь ш ъръющ єёЄрэютыхэ т ёшёЄхьх. ╥ю цх ёрьюх юЄэюёшЄё  ш ъ сшсышюЄхърь ъюьяЁхёёшш.

╨рёяръєщЄх рЁїшт, ёюфхЁцр∙шщ шёїюфэ√х ЄхъёЄ√ binkd т эхъюЄюЁ√щ ърЄрыюу яю ┬р°хьє т√сюЁє. ╨рёяръют√трЄ№ эєцэю ё ёюїЁрэхэшхь тёхую фхЁхтр яюфърЄрыюуют. ╟рЄхь ёъюяшЁєщЄх т ¤ЄюЄ ърЄрыюу тёх Їрщы√ шч яюфърЄрыюур, ёююЄтхЄёЄтє■∙хую т√сЁрээюьє ┬рьш ъюьяшы ЄюЁє: mkfls\nt95-msvc т ёыєўрх MS Visual C ш mkfls\nt95-mingw т ёыєўрх MinGW32. ╟рЄхь чряєёЄшЄх ъюьрэфє ъюьяшы Ўшш: nmake т ёыєўрх MS Visual C ш make т ёыєўрх MinGW32.

╧ЁшьхЁ√ ъюьяшы Ўшш ё шёяюы№чютрэшхь MS Visual C:

nmake
nmake DLLRTL=1
nmake BINKD9X=1
nmake DLLRTL=1 BINKD9X=1

╧ЁшьхЁ√ ъюьяшы Ўшш ё шёяюы№чютрэшхь MinGW32:

make
make DEBUG=1
make BINKD9X=1

╧юёых єёях°эющ ёсюЁъш ё яюью∙№■ Ms Visual C т чртшёшьюёЄш юЄ шёяюы№чютрээ√ї юяЎшщ ъюьяшы Ўшш ┬√ яюыєўшЄх ърЄрыюу Release, Release-w9x, Release-dll ышсю Release-w9x-dll ё яюьх∙╕ээ√ь т эхую шёяюыэ хь√ь Їрщыюь (binkd.exe, binkd9x.exe, binkd-dll.exe ышсю binkd9x-dll.exe).

╧юёых єёях°эющ ёсюЁъш ё яюью∙№■ MinGW32 шёяюыэ хь√щ Їрщы сєфхЄ ЁрёяюырурЄ№ё  т ърЄрыюух ё шёїюфэ√ьш ЄхъёЄрьш.

╤ъюяшЁєщЄх т ърЄрыюу, яЁхфэрчэрўхээ√щ фы  Ёрсюўхщ ъюяшш binkd, яюыєўшт°шщё  шёяюыэ хь√щ Їрщы ш ёыхфє■∙шх Їрщы√ шч срчютюую ърЄрыюур ё шёїюфэ√ьш ЄхъёЄрьш binkd: Їрщы ъюэЇшуєЁрЎшш binkd.cfg ш Їрщы√ фюъєьхэЄрЎшш binkd-faq.txt.ru (шыш binkd-faq.txt.en) ш тёх юёЄры№э√х Їрщы√, шьхэр ъюЄюЁ√ї яюфїюф Є яюф ьрёъш *.txt ш *.htm. ─ы  ЁрсюЄ√ binkd эхюсїюфшь√ Єюы№ъю шёяюыэ хь√щ Їрщы ш Їрщы ъюэЇшуєЁрЎшш, эю фюъєьхэЄрЎш■ шьхЄ№ яюф Ёєъющ эх яютЁхфшЄ.

2.2.3. ╩юьяшы Ўш  ш єёЄрэютър binkd т OS/2.

┬ OS/2 ыєў°шх Ёхчєы№ЄрЄ√ фр╕Є ъюьяшы ЄюЁ ICC (IBM C Compiler), їюЄ  юэ яю тшыё  эх Єръ фртэю ш Ёхчєы№ЄрЄ хую ЁрсюЄ√ ЄхёЄшЁютрыё  ьрыю. ╩ръ ш ICC, Watcom C фр╕Є хфшэ√щ шёяюыэ хь√щ Їрщы, ш ёъюьяшышЁютрээ√щ шь binkd Є∙рЄхы№эю юЄЄхёЄшЁютрэ. Binkd, ёюсЁрээ√щ EMX, эршсюыхх сышчюъ ъ тхЁёшш фы  UNIX (EMX-тхЁёш   ты хЄё  ьэюуюяЁюЎхёёэющ, Єюуфр ъръ юёЄры№э√х - ьэюуюяюЄюўэ√ьш), эю юэ ш яюЄЁхсы хЄ сюы№°х ЁхёєЁёют.

╧Ёш ъюьяшы Ўшш єўЄшЄх, ърър  тхЁёш  фЁрщтхЁр ёЄхър TCP/IP єёЄрэютыхэр т ёшёЄхьх ш ърър  сєфхЄ шёяюы№чютрэр яЁш ъюьяшы Ўшш (DLL ьюуєЄ юЄышўрЄ№ё ). ╥ръцх, т ёыєўрх ъюьяшы Ўшш ёю тёЄЁюхээ√ь Perl ш ё ъюьяЁхёёшхщ фрээ√ї, єўЄшЄх, ърър  тхЁёш  ш ъръющ трЁшрэЄ perl шёяюы№чєхЄё . ╚, т ёыєўрх ъюьяшы Ўшш ё яюью∙№■ EMX, єсхфшЄхё№ т ёютьхёЄшьюёЄш сшсышюЄхъ ъюьяшы ЄюЁр ш єёЄрэютыхээ√ї т ёшёЄхьх. ╦єў°х тёхую шёяюы№чютрЄ№ юфэш ш Єх цх сшсышюЄхъш яЁш ёсюЁъх ш тю тЁхь  ЁрсюЄ√ binkd.

╨рёяръєщЄх рЁїшт, ёюфхЁцр∙шщ шёїюфэ√х ЄхъёЄ√ binkd, т эхъюЄюЁ√щ ърЄрыюу яю ┬р°хьє т√сюЁє. ╨рёяръют√трЄ№ эєцэю ё ёюїЁрэхэшхь тёхую фхЁхтр яюфърЄрыюуют. ╟рЄхь ёъюяшЁєщЄх т ¤ЄюЄ ърЄрыюу тёх Їрщы√ шч яюфърЄрыюур, ёююЄтхЄёЄтє■∙хую т√сЁрээюьє ┬рьш ъюьяшы ЄюЁє: mkfls\os2-wc т ёыєўрх шёяюы№чютрэш  Watcom C, mkfls\os2-emx т ёыєўрх шёяюы№чютрэш  EMX, mkfls\os2-icc т ёыєўрх шёяюы№чютрэш  ICC. ╟рЄхь чряєёЄшЄх ъюьрэфє ъюьяшы Ўшш: wmake т ёыєўрх Watcom C, make шыш make -f Makefile.emo т ёыєўрх EMX. ┬ эрўрых шёяюы№чєхьюую Makefile яхЁхўшёыхэ√ тючьюцэ√х ярЁрьхЄЁ√ чряєёър, чрфр■∙шх Ёрчэ√х трЁшрэЄ√ ъюьяшы Ўшш.

╧юёых єёях°эющ ёсюЁъш т чртшёшьюёЄш юЄ шёяюы№чютрээюую ъюьяшы ЄюЁр ш Makefile ┬√ яюыєўшЄх Їрщы binkd.exe, binkd2.exe, binkd2e.exe ышсю binkd2eo.exe.

╤ъюяшЁєщЄх т ърЄрыюу, яЁхфэрчэрўхээ√щ фы  Ёрсюўхщ ъюяшш binkd, яюыєўшт°шщё  шёяюыэ хь√щ Їрщы ш ёыхфє■∙шх Їрщы√ шч срчютюую ърЄрыюур ё шёїюфэ√ьш ЄхъёЄрьш binkd: Їрщы ъюэЇшуєЁрЎшш binkd.cfg ш Їрщы√ фюъєьхэЄрЎшш binkd-faq.txt.ru (шыш binkd-faq.txt.en) ш тёх юёЄры№э√х Їрщы√, шьхэр ъюЄюЁ√ї яюфїюф Є яюф ьрёъш *.txt ш *.htm. ─ы  ЁрсюЄ√ binkd эхюсїюфшь√ Єюы№ъю шёяюыэ хь√щ Їрщы ш Їрщы ъюэЇшуєЁрЎшш, эю фюъєьхэЄрЎш■ шьхЄ№ яюф Ёєъющ эх яютЁхфшЄ.

2.2.4. ╩юьяшы Ўш  ш єёЄрэютър binkd т DOS.

╤сюЁър binkd т DOS тючьюцэр (тю тё ъюь ёыєўрх яюър) Єюы№ъю ъюьяшы ЄюЁюь Microsoft C 6.0 яЁш эрышўшш яръхЄр IBM TCP/IP for DOS.

╨рёяръєщЄх рЁїшт, ёюфхЁцр∙шщ шёїюфэ√х ЄхъёЄ√ binkd, т эхъюЄюЁ√щ ърЄрыюу яю ┬р°хьє т√сюЁє. ╨рёяръют√трЄ№ эєцэю ё ёюїЁрэхэшхь тёхую фхЁхтр яюфърЄрыюуют. ╟рЄхь ёъюяшЁєщЄх т ¤ЄюЄ ърЄрыюу тёх Їрщы√ шч яюфърЄрыюур mkfls\dos-msc6 ш чряєёЄшЄх make.

╧юёых єёях°эющ ёсюЁъш ┬√ яюыєўшЄх Їрщы binkd.exe.

╤ъюяшЁєщЄх т ърЄрыюу, яЁхфэрчэрўхээ√щ фы  Ёрсюўхщ ъюяшш binkd, яюыєўшт°шщё  шёяюыэ хь√щ Їрщы ш ёыхфє■∙шх Їрщы√ шч срчютюую ърЄрыюур ё шёїюфэ√ьш ЄхъёЄрьш binkd: Їрщы ъюэЇшуєЁрЎшш binkd.cfg ш Їрщы√ фюъєьхэЄрЎшш binkd-faq.txt.ru (шыш binkd-faq.txt.en) ш тёх юёЄры№э√х Їрщы√, шьхэр ъюЄюЁ√ї яюфїюф Є яюф ьрёъш *.txt ш *.htm. ─ы  ЁрсюЄ√ binkd эхюсїюфшь√ Єюы№ъю шёяюыэ хь√щ Їрщы ш Їрщы ъюэЇшуєЁрЎшш, эю фюъєьхэЄрЎш■ шьхЄ№ яюф Ёєъющ эх яютЁхфшЄ.

2.2.5. ╩юьяшы Ўш  ш єёЄрэютър binkd фы  Amiga.

╤сюЁър binkd эр яырЄЇюЁьх Amiga тючьюцэр ё шёяюы№чютрэшхь ADE (Amiga Development Environment) яЁш эрышўшш сшсышюЄхъш ixemul тхЁёшш эх эшцх 0.47 (ёь. Їрщы README т яюфърЄрыюух mkfls\amiga т ърЄрыюух ё шёїюфэ√ьш ЄхъёЄрьш binkd).

╨рёяръєщЄх рЁїшт, ёюфхЁцр∙шщ шёїюфэ√х ЄхъёЄ√ binkd, т эхъюЄюЁ√щ ърЄрыюу яю ┬р°хьє т√сюЁє. ╨рёяръют√трЄ№ эєцэю ё ёюїЁрэхэшхь тёхую фхЁхтр яюфърЄрыюуют. ╟рЄхь ёъюяшЁєщЄх т ¤ЄюЄ ърЄрыюу тёх Їрщы√ шч яюфърЄрыюур mkfls\amiga ш чряєёЄшЄх make.

╧юёых єёях°эющ ёсюЁъш ┬√ яюыєўшЄх Їрщы binkd.

╤ъюяшЁєщЄх т ърЄрыюу, яЁхфэрчэрўхээ√щ фы  Ёрсюўхщ ъюяшш binkd, яюыєўшт°шщё  шёяюыэ хь√щ Їрщы ш ёыхфє■∙шх Їрщы√ шч срчютюую ърЄрыюур ё шёїюфэ√ьш ЄхъёЄрьш binkd: Їрщы ъюэЇшуєЁрЎшш binkd.cfg ш Їрщы√ фюъєьхэЄрЎшш binkd-faq.txt.ru (шыш binkd-faq.txt.en) ш тёх юёЄры№э√х Їрщы√, шьхэр ъюЄюЁ√ї яюфїюф Є яюф ьрёъш *.txt ш *.htm. ─ы  ЁрсюЄ√ binkd эхюсїюфшь√ Єюы№ъю шёяюыэ хь√щ Їрщы ш Їрщы ъюэЇшуєЁрЎшш, эю фюъєьхэЄрЎш■ шьхЄ№ яюф Ёєъющ эх яютЁхфшЄ.

3. ╧хЁтшўэр  эрёЄЁющър binkd.

┬ ¤Єющ уыртх юяшёрэр яЁюёЄхщ°р  эрёЄЁющър binkd. ─Ёєушьш ёыютрьш: т√яюыэшт юяшёрээ√х т ¤Єющ уыртх фхщёЄтш , т√ яюыєўшЄх ЁрсюЄюёяюёюсэ√щ ьхщыхЁ, эю схч яюыэющ рфряЄрЎшш ъ ┬р°шь єёыютш ь. ╫Єюс√ т√яюыэшЄ№ Єюэъє■ эрёЄЁющъє, эрфю шчєўшЄ№ уыртє ю Їрщых ъюэЇшуєЁрЎшш ш уырт√ ю ЁрсюЄх binkd.

─ы  эрёЄЁющъш binkd трь яюэрфюсшЄё  ы■сющ ЄхъёЄют√щ ЁхфръЄюЁ, яЁхфэрчэрўхээ√щ фы  ЁхфръЄшЁютрэш  яЁюёЄ√ї ЄхъёЄют√ї Їрщыют (Є.х. схч юЇюЁьыхэш  °ЁшЇЄрьш, ЎтхЄюь ш яЁ.). ┬ Windows єфюсхэ тёЄЁюхээ√щ ЁхфръЄюЁ Їрщыютюую ьхэхфцхЁр FAR, їюЄ  ьюцэю шёяюы№чютрЄ№ ш яюёЄрты ■∙шщё  ё ╬╤ ЁхфръЄюЁ ┴ыюъэюЄ (Notepad). ┬ OS/2 ьюцэю шёяюы№чютрЄ№ E шыш EE, т MS-DOS – Edit, edlin шыш тёЄЁюхээ√щ ЁхфръЄюЁ Norton Commander, т ■эшъёюяюфюсэ√ї ╬╤ – vi, ed, ee. ╩Ёюьх яхЁхўшёыхээ√ї, яюфющф╕Є ы■сющ ЄхъёЄют√щ ЁхфръЄюЁ, эх тёЄрты ■∙шщ ъюф√ ЇюЁьрЄшЁютрэш  т ЄхъёЄ.

╧ЁюЎхёё эрёЄЁющъш binkd чръы■ўрхЄё  т ЁхфръЄшЁютрэшш Їрщыр ъюэЇшуєЁрЎшш (binkd.cfg ышсю эрчтрээюую яю ┬р°хьє т√сюЁє) ш т ёючфрэшш юяшёрээ√ї т Їрщых ъюэЇшуєЁрЎшш ърЄрыюуют. ┬ю тЁхь  ЁхфръЄшЁютрэш  Їрщыр ъюэЇшуєЁрЎшш ёьюЄЁшЄх эр яЁштхф╕ээ√х т э╕ь яЁшьхЁ√ ш ъюььхэЄрЁшш (ЄхъёЄ, яюьх∙╕ээ√щ ёяЁртр юЄ чэрър Ёх°╕Єъш «#»).

┬ёх чэръш «\» т Їрщых ъюэЇшуєЁрЎшш фюыцэ√ фєсышЁютрЄ№ё , яюёъюы№ъє ¤ЄюЄ ёшьтюы  ты хЄё  ёшьтюыюь шёъхщяшэур (яюфёЄрэютъш ёяхЎёшьтюыют).

╤фхырщЄх ЁхчхЁтэє■ ъюяш■ Їрщыр ъюэЇшуєЁрЎшш яхЁхф тэхёхэшхь шчьхэхэшщ, ўЄюс√ эх яюЄхЁ Є№ шёїюфэ√щ Їрщы. ╟рЄхь юЄъЁющЄх Їрщы ъюэЇшуєЁрЎшш т т√сЁрээюь ┬рьш ЁхфръЄюЁх.

3.1. ╬с чрЄхы№э√х ярЁрьхЄЁ√ эрёЄЁющъш.

┬ ¤Єюь Ёрчфхых юяшёрэр эрёЄЁющър ьшэшьры№эю эхюсїюфшь√ї фшЁхъЄшт Їрщыр ъюэЇшуєЁрЎшш binkd, схч ъюЄюЁ√ї юэ эх сєфхЄ ЁрсюЄрЄ№.

3.1.1. └фЁхёр ш юс∙р  шэЇюЁьрЎш .

╬ЄЁхфръЄшЁєщЄх ёЄЁюъє address - єърцшЄх ётющ рфЁхё т ёхЄш FIDOnet шыш т фЁєующ FTN-ёхЄш. └фЁхё эєцэю єърч√трЄ№ т ЇюЁьрЄх 5D, Є.х. т тшфх чюэр:ёхЄ№/єчхы.яющэЄ@фюьхэ. ┼ёыш рфЁхёют эхёъюы№ъю – єърцшЄх шї тёх, Ёрчфхы   ёюёхфэшх яЁюсхыюь.

╥ръцх чрьхэшЄх шэЇюЁьрЎш■ т ёЄЁюъх «sysop» эр ┬р°ш ышўэ√х фрээ√х, ъръ юэш яЁхфёЄртыхэ√ т ёхЄш, єърцшЄх т ёЄЁюъх «location» шэЇюЁьрЎш■ ю Ёрёяюыюцхэшш ш т ёЄЁюъх «sysname» эрчтрэшх FTN-ёшёЄхь√ (FTN-ёЄрэЎшш). ┬ ёЄЁюъх «nodeinfo» єърцшЄх ёъюЁюёЄ№ ърэрыр, ышсю яюыюёє яЁюяєёърэш , юЄтхф╕ээє■ binkd ш, яюёых чря Єющ, Їыруш, юяшё√тр■∙шх ярЁрьхЄЁ√ ёЄрэЎшш, Ёрчфхы   шї чря Є√ьш.

╧ЁшьхЁ:

address 2:5047/999@fidonet 2:5020/999.1@fidonet
sysop "Ivan Ivanov"
sysname "Ivan's BBS"
location "Magadan, Russia"
nodeinfo 115200,TCP,BINKP

3.1.2. ╩рЄрыюуш ш Їрщы√.

╙ърцшЄх т ёЄЁюъх «domain» шёяюы№чє■∙шщё  т ┬р°хщ ёхЄш фюьхэ FTN (фы  ёхЄш FIDOnet єърцшЄх ёыютю fidonet), ўхЁхч яЁюсхы єърцшЄх яєЄ№ ъ ърЄрыюує яюўЄютющ юўхЁхфш фы  чюэ√ ┬р°хую рфЁхёр ш чрЄхь ўхЁхч яЁюсхы – эюьхЁ ¤Єющ чюэ√. ╚ёяюы№чєхь√х т ърўхёЄтх ЁрчфхышЄхыхщ ърЄрыюуют юсЁрЄэ√х ёы¤°ш «\» эхюсїюфшью фєсышЁютрЄ№. (┬ ╬╤ ёхьхщёЄтр unix ЁрчфхышЄхыш ърЄрыюуют - яЁ ь√х ёы¤°ш ш шї фєсышЁютрЄ№ эх эєцэю.)

╙ърцшЄх т ёЄЁюъх «inbound» яєЄ№ ъ ърЄрыюує, т ъюЄюЁ√щ сєфєЄ яюьх∙рЄ№ё  Їрщы√, яЁшэ Є√х тю тЁхь  ёхрэёют ёт чш, чр∙ш∙хээ√ї ярЁюыхь. ▌ЄюЄ ърЄрыюу фюыцхэ ёютярфрЄ№ ё ърЄрыюуюь, шёяюы№чєхь√ь яЁюуЁрььрьш Ёрёяръютъш яюўЄ√ ш Їрщыют (tosser, netmail tracker, fileechoprocessor, FREQ manager ш фЁ.)

╙ърцшЄх т ёЄЁюъх «inbound-nonsecure» яєЄ№ ъ ърЄрыюує, т ъюЄюЁ√щ сєфєЄ яюьх∙рЄ№ё  Їрщы√, яЁшэ Є√х тю тЁхь  ёхрэёют ёт чш, эх чр∙ш∙хээ√ї ярЁюыхь. ╬э Єръцх фюыцхэ ёютярфрЄ№ ё рэрыюушўэ√ь фы  фЁєушї яЁюуЁрьь.

╙ърцшЄх т ёЄЁюъх «log» яєЄ№ ъ Їрщыє, т ъюЄюЁ√щ сєфхЄ чряшё√трЄ№ё  яЁюЄюъюы ЁрсюЄ√ binkd.

╧ЁшьхЁ:

domain fidonet c:\\bbs\\outbound 2
log c:\\bbs\\log\\binkd.log
inbound c:\\bbs\\inbound
inbound-nonsecure c:\\bbs\\inbound\\unknown

3.1.3. ╦шэъш.

┬ ёЄЁюърї «node» юяш°шЄх FTN-ёшёЄхь√, ё ъюЄюЁ√ьш сєфхЄ ёюхфшэ Є№ё  ┬р° binkd (Єю хёЄ№ ышэъш ┬р°хщ FTN-ёшёЄхь√). ┬ яЁюёЄхщ°хь ёыєўрх эєцэю єърчрЄ№ ЄЁш ярЁрьхЄЁр: рфЁхё єфры╕ээющ ёшёЄхь√, х╕ рфЁхё IP ышсю фюьхээюх шь , ярЁюы№. ┼ёыш цх рфЁхё єфры╕ээющ ёшёЄхь√ юяшёрэ т DNS т фюьхэх fidonet.net, тьхёЄю рфЁхёр IP ьюцэю єърчрЄ№ чэръ «чт╕чфюўър» («*»). ┬√ Єръцх ьюцхЄх юяшёрЄ№ FTN-ёшёЄхь√, ёт ч№ ё ъюЄюЁ√ьш сєфхЄ юёє∙хёЄты Є№ё  яю шї шэшЎшрЄштх. ─ы  ¤Єюую тьхёЄю рфЁхёр єфры╕ээющ ёшёЄхь√ єърцшЄх чэръ «ьшэєё» («-»), ш binkd эх сєфхЄ я√ЄрЄ№ё  ёюхфшэшЄ№ё  ё Єръшь ышэъюь.

╧ЁшьхЁ√:

node 2:5047/996@fidonet 123.45.67.89 password996
node 2:5047/997@fidonet hostname997 password997
node 2:5047/998@fidonet * password998
node 2:5047/999.2@fidonet – password999.2

3.2. ═хюс чрЄхы№э√х ярЁрьхЄЁ√ эрёЄЁющъш.

═шцх яхЁхўшёыхэ√ фшЁхъЄшт√ Їрщыр ъюэЇшуєЁрЎшш, чрфрээ√х ЁрчЁрсюЄўшърьш (т Єюь тшфх, т ъюЄюЁюь юэш яЁшёєЄёЄтє■Є т яЁшьхЁх Їрщыр ъюэЇшуєЁрЎшш шч фшёЄЁшсєЄштр), эю ъюЄюЁ√х ьюцэю яЁюёЄю чръюььхэЄшЁютрЄ№ (Є.х. тёЄртшЄ№ т яхЁтє■ яючшЎш■ чэръ «Ёх°╕Єър» - «#»):

temp-inbound c:\\bbs\\inbound\\incomplete
filebox d:\\fido\\tmail\\boxes
brakebox d:\\fido\\brake\\boxes

┬ёх юёЄры№э√х фшЁхъЄшт√ Їрщыр ъюэЇшуєЁрЎшш ьюцэю юёЄртшЄ№ схч шчьхэхэшщ.

3.3. ╧ЁютхЁър ъюэЇшуєЁрЎшш.

╫Єюс√ яЁютхЁшЄ№, яЁртшы№эю ыш єърчрэ√ яєЄш ш тёх ыш эхюсїюфшь√х ярЁрьхЄЁ√ чрфрэ√, чряєёЄшЄх binkd ё єърчрэшхь шьхэш Їрщыр ъюэЇшуєЁрЎшш т ърўхёЄтх ярЁрьхЄЁр т ёЄЁюъх чряєёър:

binkd binkd.cfg

┼ёыш binkd сєфхЄ ЁрсюЄрЄ№ (р эх чртхЁ°шЄё  ё фшруэюёЄшўхёъшь ёююс∙хэшхь) – тё╕ эхюсїюфшь√х ярЁрьхЄЁ√ чрфрэ√.

┬ЄюЁющ ¤Єря яЁютхЁъш чръы■ўрхЄё  т рэрышчх фрьяр ъюэЇшуєЁрЎшш, ъюЄюЁ√щ т√тюфшЄ binkd яЁш єърчрэшш т ъюьрэфэющ ёЄЁюъх юяЎшш «-vvv»:

binkd -vvv binkd.cfg

ышсю яЁш фюсртыхэшш т эрўрыю Їрщыр ъюэЇшуєЁрЎшш фшЁхъЄшт√ «debugcfg» ш юс√ўэ√ь чряєёъюь binkd.

(╬яшёрэ√ ёяюёюс√ яюыєўхэш  фрьяр ъюэЇшуєЁрЎшш фы  тхЁёшщ 0.9.5 ш сюыхх яючфэшї 0.9.x. ┬ яюёыхфє■∙шї тхЁёш ї binkd 1.x фрья ъюэЇшуєЁрЎшш т√тюфшЄё  фЁєушь ёяюёюсюь.)

╟ртхЁ°шЄ№ ЁрсюЄє binkd ьюцэю эрцрЄшхь эр ъыртшрЄєЁх ёюўхЄрэш  ъыртш° Ctrl-C.

4. ─шЁхъЄшт√ Їрщыр ъюэЇшуєЁрЎшш.

╘рщы ъюэЇшуєЁрЎшш ёюёЄюшЄ шч фшЁхъЄшт, ъюььхэЄрЁшхт ш яєёЄ√ї ёЄЁюъ. ╧єёЄ√х ёЄЁюъш шёяюы№чє■Єё  фы  ЇюЁьрЄшЁютрэш  ЄхъёЄр ш шуэюЁшЁє■Єё  binkd. ╩юььхэЄрЁшш яЁхфэрчэрўхэ√ фы  яю ёэ ■∙шї (ярь Єэ√ї) чряшёхщ ш Єръцх шуэюЁшЁє■Єё .

╩юььхэЄрЁшщ эрўшэрхЄё  ёю чэрър «Ёх°╕Єър» («#»), ъюЄюЁ√щ ьюцхЄ ЁрёяюырурЄ№ё  т ы■сющ яючшЎшш ёЄЁюъш. ┬ё╕, ўЄю Ёрёяюыюцхэю ёяЁртр юЄ чэрър «Ёх°╕Єър», шуэюЁшЁєхЄё  binkd.

╩рцфр  фшЁхъЄштр Їрщыр ъюэЇшуєЁрЎшш эрўшэрхЄё  ё ъы■ўхтюую ёыютр, ъюЄюЁюх ьюцхЄ ЁрёяюырурЄ№ё  т ы■сющ яючшЎшш ёЄЁюъш, эю яхЁхф ъы■ўхт√ь ёыютюь фюяєёър■Єё  Єюы№ъю яЁюсхы√ шыш чэръш Єрсєы Ўшш (ёшьтюы√ ё ъюфрьш 32 ш 9). ─шЁхъЄштр ьюцхЄ ёюёЄю Є№ Єюы№ъю шч ъы■ўхтюую ёыютр, ышсю чр ъы■ўхт√ь ёыютюь ьюуєЄ ёыхфютрЄ№ юфшэ шыш эхёъюы№ъю ярЁрьхЄЁют, Ёрчфхыхээ√х яЁюсхырьш шыш чэрърьш Єрсєы Ўшш. ┼ёыш ярЁрьхЄЁ (эряЁшьхЁ, ярЁюы№) ёюфхЁцшЄ яЁюсхы, чэръ ъюььхэЄрЁш  («Ёх°╕Єъє») шыш чэръ Єрсєы Ўшш, юэ фюыцхэ с√Є№ чръы■ў╕э т ърт√ўъш ышсю єърчрээ√щ чэръ фюыцхэ яЁхфтрЁ Є№ё  чэръюь «юсЁрЄэр  ъюёр  ўхЁЄр» («\»). ┼ёыш ярЁрьхЄЁ ёюфхЁцшЄ чэръ «юсЁрЄэр  ъюёр  ўхЁЄр» («\»), ¤ЄюЄ чэръ фюыцхэ фєсышЁютрЄ№ё , р т эхъюЄюЁ√ї ёыєўр ї ш єўхЄтхЁ Є№ё  (Єръшх ёыєўрш ёяхЎшры№эю юуютюЁхэ√).

╧юЁ фюъ ёыхфютрэш  т Їрщых ъюэЇшуєЁрЎшш фы  эхъюЄюЁ√ї фшЁхъЄшт шьххЄ чэрўхэшх, яюёъюы№ъє binkd яЁюёьрЄЁштрхЄ Їрщы ъюэЇшуєЁрЎшш ётхЁїє тэшч. ┬ ЄхъёЄх уырт√ фшЁхъЄшт√ яЁштхфхэ√ т рыЇртшЄэюь яюЁ фъх фы  юсыхуўхэш  яюшёър.

┬ Їрщых ъюэЇшуєЁрЎшш ьюцэю шёяюы№чютрЄ№ ёё√ыъш эр яхЁхьхээ√х юъЁєцхэш  (environment variables). ═рчтрэшх яхЁхьхээющ юъЁєцхэш  ё юсхшї ёЄюЁюэ чръы■ўрхЄё  т чэръш яЁюЎхэЄр («%»).

┬ фры№эхщ°хь фы  яЁюёЄюЄ√ яюф ёыютюь «яЁюсхы» яюфЁрчєьхтрхЄё  чэръ яЁюсхыр ышсю чэръ Єрсєы Ўшш.

«═р°хщ» FTN-ёшёЄхьющ эрчтрэр ёшёЄхьр, ъюЄюЁє■ ь√ ъюэЇшуєЁшЁєхь. «╙фры╕ээющ» FTN-ёшёЄхьющ эрчтрэр ёшёЄхьр, ё ъюЄюЁющ тючьюцэю ёюхфшэхэшх эр°хщ FTN-ёшёЄхь√ яю яЁюЄюъюыє binkp.

4.01. address

╧хЁхўшёыхэшх рфЁхёют эр°хщ FTN-ёшёЄхь√, Ёрчфхы╕ээ√ї яЁюсхырьш. └фЁхёр єърч√тр■Єё  т ЇюЁьрЄх 5D, їюЄ  тючьюцэю ш єърчрэшх шї т ёюъЁр∙хээющ ЇюЁьх (3D шыш 4D). ┬ ёыєўрх ёюъЁр∙хээющ чряшёш рфЁхёр, яюфёЄрты хЄё  ЄюЄ фюьхэ, ъюЄюЁ√щ єърчрэ т яхЁтющ ёЄЁюъх «domain» Їрщыр ъюэЇшуєЁрЎшш (т тхЁёш ї 1.x Єръюх яютхфхэшх сєфхЄ шчьхэхэю). ═єыхтющ эюьхЁ яющэЄр є рфЁхёр єчыр єърч√трЄ№ эх ЁхъюьхэфєхЄё .

▌Єр фшЁхъЄштр  ты хЄё  юс чрЄхы№эющ.

╧ЁшьхЁ:

address 2:5047/999@fidonet 2:5020/999.1@fidonet

4.02. aso

┼ёыш фшЁхъЄштр aso єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd сєфхЄ ЁрсюЄрЄ№ ё яюўЄютющ юўхЁхф№■ ёЄрэфрЁЄр Amiga Style Outbound (ASO) тьхёЄю Binkley Style Outbound (BSO), шёяюы№чєхьюую яю єьюыўрэш■.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

aso

4.03. backresolv

┼ёыш фшЁхъЄштр backresolv єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd сєфхЄ яЁютюфшЄ№ яюшёъ фюьхээюую шьхэш яю рфЁхёє єфры╕ээющ FTN-ёшёЄхь√, ъюЄюЁр  юсЁрЄшырё№ ъ binkd эр°хщ FTN-ёшёЄхь√. ╥рър  юяхЁрЎш  ЄЁхсєхЄ эхъюЄюЁюую тЁхьхэш (юёюсхээю т ёыєўрх юЄёєЄёЄтш  рфЁхёр єфры╕ээющ ёшёЄхь√ т DNS), эр ъюЄюЁюх яЁюшчющф╕Є чрфхЁцър т яЁюЎхёёх єёЄрэютыхэшш ёхрэёр ёт чш.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

backresolv

4.04. bindaddr

─шЁхъЄштр bindaddr чрфр╕Є рфЁхё IP, ъюЄюЁ√щ сєфхЄ «ёыє°рЄ№» ёхЁтхЁэр  ўрёЄ№ binkd. ▌Єр фшЁхъЄштр юс√ўэю шёяюы№чєхЄё  яЁш эхюсїюфшьюёЄш шёяюы№чютрЄ№ эхёъюы№ъю ъюяшщ binkd ё Ёрчэ√ьш ъюэЇшуєЁрЎш ьш эр Ёрчэ√ї рфЁхёрї ышсю юуЁрэшўшЄ№ шёяюы№чютрэшх binkd юфэшь рфЁхёюь IP.

╧рЁрьхЄЁ – рфЁхё IP т юъЄхЄэющ чряшёш. ╟эрўхэшх яю єьюыўрэш■ – 0.0.0.0 (тёх рфЁхёр, шьх■∙шхё  эр їюёЄх).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

bindaddr 192.168.0.3

4.05. binlog

─шЁхъЄштр binlog чрфр╕Є Їрщы, т ъюЄюЁ√щ binkd сєфхЄ чряшё√трЄ№ ёЄрЄшёЄшъє ърцфюую ёюхфшэхэш . ▌ЄюЄ Їрщы ёютьхёЄшь ё шёяюы№чєхь√ь т ьхщыхЁх T-Mail ш ьюцхЄ с√Є№ юсЁрсюЄрэ ы■сющ яЁюуЁрььющ, ЁрсюЄр■∙хщ ё фтюшўэ√ь ыюуЇрщыюь T-Mail, эряЁшьхЁ, яЁюуЁрььющ T-Hist. ╧рЁрьхЄЁ – ёЄЁюър, ёюфхЁцр∙р  шь  Їрщыр, юс√ўэю ё яєЄ╕ь. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (эхЄ Їрщыр, яЁюЄюъюы т фтюшўэюь тшфх эх тхфхЄё ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

binlog c:\\bbs\\log\\binkd.sts

4.06. brakebox

─шЁхъЄштр brakebox чрфр╕Є яєЄ№ ъ ърЄрыюує Їрщы-сюъёют т ёЄшых ьхщыхЁр «The Brake!». ╧єЄ№ єърч√трхЄё  ярЁрьхЄЁюь ¤Єющ фшЁхъЄшт√. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (Їрщысюъё√ эх шёяюы№чє■Єё ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

brakebox C:\\fido\\brakebox

4.07. call-delay

─шЁхъЄштр call-delay чрфр╕Є чрфхЁцъє яхЁхф чряєёъюь эют√ї ъышхэЄёъшї яЁюЎхёёют (яюЄюъют) яЁш фюёЄшцхэшш ьръёшьры№эю ЁрчЁх°╕ээюую ўшёыр чряє∙хээ√ї ъышхэЄёъшї яЁюЎхёёют (яюЄюъют), єърчрээюую т фшЁхъЄштх maxclients. ╧юсюўэюх фхщёЄтшх: эр тЁхь  ¤Єющ чрфхЁъш эх яЁютюфшЄё  ёърэшЁютрэшх яюўЄютющ юўхЁхфш. ╧рЁрьхЄЁ – Ўхыюх эхюЄЁшЎрЄхы№эюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 60 (ёхъєэф).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

call-delay 60

4.08. conlog

─шЁхъЄштр conlog чрфр╕Є єЁютхэ№ яЁюЄюъюышЁютрэш , ъюЄюЁ√щ сєфхЄ шёяюы№чютрЄ№ё  яЁш т√тюфх фшруэюёЄшўхёъшї ёююс∙хэшщ эр ъюэёюы№ binkd. ╧рЁрьхЄЁ фшЁхъЄшт√ – ўшёыю (яюыюцшЄхы№эюх шыш юЄЁшЎрЄхы№эюх т яЁхфхырї -32768..32767 ышсю -2147483648..2147483647 т чртшёшьюёЄш юЄ ъюьяшы ЄюЁр, Ёхры№э√щ ёь√ёы шьх■Є чэрўхэш  юЄ -1 фю 10). ╫Єюс√ яюыэюёЄ№■ чряЁхЄшЄ№ т√тюф эр ¤ъЁрэ, фюёЄрЄюўэю єърчрЄ№ чэрўхэшх, ьхэ№°хх -1. ╟эрўхэшх яю єьюыўрэш■ – 0.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

conlog 4

4.09. connect-timeout

─шЁхъЄштр connect-timeout чрфр╕Є тЁхь  юцшфрэш  яЁш єёЄрэютыхэшш ёюхфшэхэш  TCP. ╧рЁрьхЄЁ – Ўхыюх эхюЄЁшЎрЄхы№эюх ўшёыю. ┼фшэшЎ√ шчьхЁхэш  – ёхъєэф√. ╟эрўхэшх яю єьюыўрэш■ – 0 (шёяюы№чєхЄё  ЄрщьрєЄ, чрыюцхээ√щ т ╬╤). ▌Єр фшЁхъЄштр шьххЄ ёь√ёы, хёыш єърчрээюх чэрўхэшх ьхэ№°х ЄрщьрєЄр TCP ёхЄхтюую фЁрщтхЁр юяхЁрЎшюээющ ёшёЄхь√.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

connect-timeout 300

4.10. debugcfg

┼ёыш фшЁхъЄштр debugcfg єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd яхЁхф эрўрыюь ЁрсюЄ√ т√тхфхЄ юсЁрсюЄрээє■ шь ъюэЇшуєЁрЎш■, яЁюўшЄрээє■ шч Їрщыр. ╚ёяюы№чєхЄё  фы  яЁютхЁъш ъюэЇшуєЁрЎшш. ▌ътштрыхэЄэр єърчрэш■ юяЎшш «-vvv» т ёЄЁюъх чряєёър binkd. ▌Єр фшЁхъЄштр єёЄрЁхыр ш т тхЁёш ї binkd 1.x сєфхЄ єсЁрэр.

╧ЁшьхЁ:

debugcfg

4.11. defnode

─шЁхъЄштр defnode юяшё√трхЄ єьюыўрэш  фы  єчыют, эх юяшёрээ√ї  тэю т Їрщых ъюэЇшуєЁрЎшш (т ёЄЁюърї node). ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (эхЄ єьюыўрэшщ). ╧рЁрьхЄЁ√ Єх цх, ўЄю ш фшЁхъЄшт√ node.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

defnode -nd *

4.12. deletebox

┼ёыш фшЁхъЄштр deletebox єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd яЁш ёърэшЁютрэшш сєфхЄ єфры Є№ яєёЄ√х Їрщысюъё√. ▌Єє фшЁхъЄштє эєцэю шёяюы№чютрЄ№ ё юёЄюЁюцэюёЄ№■, яюёъюы№ъє т ёыєўрх ЁрсюЄ√ т ьэюуючрфрўэющ ╬╤ тючьюцэю чртхЁ°хэшх ЁрсюЄ√ ЄюёёхЁр ё ю°шсъющ, эряЁшьхЁ, т ёшЄєрЎшш, ъюуфр ЄюёёхЁ я√ЄрхЄё  чряшёрЄ№ Їрщы т Їрщысюъё, эхяюёЁхфёЄтхээю яхЁхф ¤Єшь єфры╕ээ√щ т binkd (ЄюёёхЁ эх ёьюцхЄ ёючфрЄ№ Їрщы).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

deletebox

4.13. deletedirs

┼ёыш фшЁхъЄштр deletedirs єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd яЁш чртхЁ°хэшш ёхрэёр ёт чш ё ышэъюь сєфхЄ єфры Є№ юЄэюё ∙шхё  ъ эхьє яєёЄ√х ърЄрыюуш т яюўЄютющ юўхЁхфш. ─хщёЄтшх ¤Єющ фшЁхъЄшт√ ЁрёяЁюёЄЁрэ хЄё  эр яющэЄют√х рфЁхёр ышэър (Є.х. рфЁхёр ё эхэєыхт√ь эюьхЁюь яющэЄр). ╚ёяюы№чютрэшх ¤Єющ фшЁхъЄшт√ ёютхЁ°хээю схчюярёэю т юЄышўшх юЄ фшЁхъЄшт√ deletebox.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

deletedirs

4.14. domain

─шЁхъЄштр domain ьюцхЄ єърч√трЄ№ё  т фтєї ЇюЁьрЄрї. ╬ёэютэющ ЇюЁьрЄ юяшё√трхЄ FTN-фюьхэ√ ё єърчрэшхь юёэютэюую ърЄрыюур яюўЄютющ юўхЁхфш (рєЄсрєэфр, outbound) ш юёэютэющ эюьхЁ чюэ√ фы  ърцфюую фюьхэр. «╬ёэютэющ эюьхЁ чюэ√» - ¤Єю эюьхЁ чюэ√, ъюЄюЁ√щ эх фюсрты хЄё  ъ яєЄш ъ ърЄрыюує рєЄсрєэфр. ╧юфЁюсэюёЄш ёь. т юяшёрэшш Binkley Style Outbound (BSO). ─юяюыэшЄхы№э√щ ЇюЁьрЄ єърч√трхЄ яёхтфюэшь (фюяюыэшЄхы№эюх шь , рышрё) фы  Ёрэхх чрфрээюую фюьхэр.

╧хЁт√щ ЇюЁьрЄ:

domain <фюьхэ> <яєЄ№> <эюьхЁ чюэ√>

┬ЄюЁющ ЇюЁьрЄ:

domain <яёхтфюэшь> alias-for <фюьхэ>

▌Єр фшЁхъЄштр  ты хЄё  юс чрЄхы№эющ.

╧ЁшьхЁ√:

domain fidonet c:\\bbs\\outbound\\fidonet 2
domain musicnet c:\\bbs\\outbound\\musicnet 333
domain fido alias-for fidonet
domain fidonet.org alias-for fidonet

┬ яЁштхф╕ээ√ї яЁшьхЁрї фы  чюэ√ 2 FTN-фюьхэр fidonet шёяюы№чєхЄё  ърЄрыюу c:\bbs\outbound\fidonet, фы  юёЄры№э√ї чюэ FTN-фюьхэр fidonet шёяюы№чє■Єё  ърЄрыюуш c:\bbs\outbound\fidonet.<эюьхЁ_чюэ√> (Єръ, фы  чюэ√ 1 – c:\bbs\outbound\fidonet.1). ─ы  чюэ√ 333 FTN-фюьхэр musicnet шёяюы№чєхЄё  ърЄрыюу c:\bbs\outbound\musicnet, фы  юёЄры№э√ї чюэ FTN-фюьхэр musicnet – ърЄрыюуш c:\bbs\outbound\musicnet.<эюьхЁ_чюэ√>. ╧Ёш ёюхфшэхэш ї ё ышэърьш, яЁхф· тшт°шьш рфЁхёр шч фюьхэют fido ш fidonet.org, шёяюы№чєхЄё  фюьхэ fidonet. (╥рър  тючьюцэюёЄ№ Ёхрышчютрэр фы  єёЄЁрэхэш  яюёыхфёЄтшщ ю°шсюўэ√ї ъюэЇшуєЁрЎшщ эр єфры╕ээ√ї єчырї.)

4.15. exec

─шЁхъЄштр exec юяшё√трхЄ єёыютшх ш ъюьрэфє ╬╤, ъюЄюЁр  сєфхЄ чряє∙хэр яЁш т√яюыэхэшш єёыютш . ╙ёыютшхь ёыєцшЄ ёюс√Єшх яЁш╕ьр Їрщыр, шь  ъюЄюЁюую яюфїюфшЄ яюф чрфрээє■ ьрёъє. ╩юьрэфр, ъръ яЁртшыю, чръы■ўрхЄё  т ърт√ўъш.

┼ёыш ъюьрэфр яЁхфтрЁ хЄё  тюёъышЎрЄхы№э√ь чэръюь, юэр сєфхЄ т√яюыэхэр ёЁрчє яю яЁш╕ьє Їрщыр. ╚эрўх – яю юъюэўрэшш ёхрэёр.

binkd фы  32-їсшЄэ√ї тхЁёшщ Windows, ъЁюьх «!», ьюцэю шёяюы№чютрЄ№ ьюфшЇшърЄюЁ√ «@» ш «@@». «@» ючэрўрхЄ чряєёъ яЁюуЁрь√ т юЄфхы№эюь юъэх ъюэёюыш, «@@» - т ёъЁ√Єюь юъэх.

┬ ёЄЁюъх ъюьрэф√ ьюцэю шёяюы№чютрЄ№ ьръЁюё√, эрўшэр■∙шхё  ё ёшьтюыр чтхчфюўъш «*», яю¤Єюьє чэръ чт╕чфюўъш (эх ьръЁюё) т ъюьрэфх фюыцхэ яЁхфтрЁ Є№ё  ёшьтюыюь шёъхщяшэур (юсЁрЄэющ ъюёющ ўхЁЄющ «\»), р ўЄюс√ єърчрЄ№ т ъюьрэфх ¤ЄюЄ ёшьтюы, хую эєцэю єърч√трЄ№ фтрцф√. ┬ ьрёъх шьхэш Їрщыр ърцф√щ ёшьтюы шёъхщяшэур эєцэю фюяюыэшЄхы№эю фєсышЁютрЄ№, яю¤Єюьє яєЄш т ╬╤ Windows эєцэю єърч√трЄ№ ўхЄ√Ёх чэрър «\» яюфЁ ф (эряЁшьхЁ: «c:\\\\binkd»).

┬ёх Їрщы√ т ёЄЁюъх ъюьрэф√ ыєў°х єърч√трЄ№ ё рсёюы■Єэ√ь яєЄ╕ь, ¤Єю яючтюышЄ шчсхцрЄ№ ю°шсюъ яЁш шчьхэхэшш яхЁхьхээ√ї юъЁєцхэш  ш яЁш чряєёъх binkd шч фЁєуюую ърЄрыюур. ┬ ьрёъх ьюцэю єърч√трЄ№ яєЄ№ ъ ъюэъЁхЄэюьє ърЄрыюує яЁш╕ьр Їрщыют шыш эх єърч√трЄ№ хую, Єюуфр ьрёър фюыцэр эрўшэрЄ№ё  ё ёшьтюыр чт╕чфюўъш «*».

╘юЁьрЄ (яюёыхфэшх фтр трЁшрэЄр ьюуєЄ с√Є№ шёяюы№чютрэ√ Єюы№ъю т binkd/w32 ш binkd/w9x):

exec "ъюьрэфр ярЁрьхЄЁ√ ш/шыш ьръЁюё√" <ьрёър шьхэш>
exec "!ъюьрэфр ярЁрьхЄЁ√ ш/шыш ьръЁюё√" <ьрёър шьхэш>

exec "@ъюьрэфр ярЁрьхЄЁ√ ш/шыш ьръЁюё√" <ьрёър шьхэш>
exec "@@ъюьрэфр ярЁрьхЄЁ√ ш/шыш ьръЁюё√" <ьрёър шьхэш>

уфх:

ъюьрэфр ярЁрьхЄЁ√ ш/шыш ьръЁюё√ – ъюьрэфэр  ёЄЁюър фы  чряєёър яЁюуЁрь√ ё ьръЁюёрьш шыш схч эшї;

<ьрёър шьхэш> - ьрёър шьхэш Їрщыр, яЁютхЁ хьр  яю яЁш╕ьє ърцфюую Їрщыр.

┬ючьюцэ√х ьръЁюё√:

*F – яюыэюх шь  яЁшэ Єюую Їрщыр (ё яєЄ╕ь);

*A0..*A9 – яхЁт√х 10 рфЁхёют єфры╕ээющ ёшёЄхь√ (*A0 – яхЁт√щ рфЁхё, *A9 – фхё Є√щ рфЁхё);

*A*, *A@ - ёяшёюъ тёхї рфЁхёют єфры╕ээющ ёшёЄхь√, Ёрчфхыхээ√ї яЁюсхырьш;

*P – яЁшчэръ ярЁюы№эюёЄш ёхрэёр, яЁшэшьрхЄ чэрўхэш  0 (эхярЁюы№э√щ) шыш 1 (ярЁюы№э√щ);

*L - яЁшчэръ шчтхёЄэюёЄш єфры╕ээющ ёшёЄхь√ (Є.х. ╬яшёрэр ыш ¤Єр ёшёЄхьр т ёЄЁюъх node), яЁшэшьрхЄ чэрўхэш  0 (эхшчтхёЄэр) шыш 1 (шчтхёЄэр);

*H – шь  їюёЄр шыш рфЁхё IP єфры╕ээющ ёшёЄхь√;

*N – ъюЁюЄъюх шь  яЁш эЄюую Їрщыр (шёяюы№чєхЄё  Єюы№ъю т тхЁёшш фы  32ї-сшЄэ√ї ╬╤ Windows);

*S – шь  Їрщыр ё шэЇюЁьрЎшхщ SRIF (ёь. !SRIF.TXT шч фшёЄЁшсєЄштр шыш ъюьяыхъЄр шёїюфэ√ї ЄхъёЄют binkd, Єръцх ёь. фюъєьхэЄ FTSC «FSC-0086.001»).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ√:

exec "!my-freq-processor.exe /options *S" *.req
exec "d:\\path\\my-pkt-unpacker.exe /options *A*" c:\\\\bbs\\\\inbound\\\\*.pkt
exec "d:\\path\\my-tosser.exe /options" *.su? *.mo? *.tu? *.we? *.th? *.fr? *.sa?
Exec "!d:\\path\\my-pkt-filter.exe *F /options" c:\\\\bbs\\\\inbound\\\\unsecure\\\\*.pkt
exec "d:\\path\\my-special-unpacker.bat /options" c:\\\\bbs\\\\inbound-of-my-friend\\\\*

┬ яхЁтюь яЁшьхЁх binkd ёЇюЁьшЁєхЄ Їрщы яю ёЄрэфрЁЄє SRIF ш чряєёЄшЄ яЁюуЁрььє my-freq-processor.exe ё єърчрээ√ьш ярЁрьхЄЁрьш ёЁрчє яю яЁш╕ьє Їрщыр, чрърэўштр■∙хуюё  эр «.req», эхчртшёшью юЄ Єюую, ё ъръшь ышэъюь яЁюїюфшЄ ёхрэё ёт чш (чр∙ш∙хэ ярЁюыхь шыш эхЄ, ш фрцх хёыш фы  ышэър шёяюы№чєхЄё  юЄфхы№э√щ ърЄрыюу фы  яЁш╕ьр Їрщыют). ╧ЁюуЁрььр фюыцэр ЁрёяюырурЄ№ё  т Єхъє∙хь ърЄрыюух шыш т ърЄрыюух, ъюЄюЁ√щ єърчрэ т яхЁхьхээющ юъЁєцхэш  PATH. ┬ю тЄюЁюь яЁшьхЁх яю юъюэўрэшш ёхрэёр ёт чш сєфхЄ т√яюыэхэр ъюьрэфр d:\path\my-pkt-unpacker.exe ё єърчрээ√ьш юяЎш ьш, т ъюэхЎ сєфхЄ яюфёЄрэютыхэю шь  Їрщыр, хёыш ёхрэё ёт чш с√ы чр∙ш∙╕э ярЁюыхь ш т ярЁюы№э√щ шэсрєэф с√ы яЁшэ Є Їрщы ё яръхЄюь эхЄьхщыр. ┬ ЄЁхЄ№хь яЁшьхЁх яЁюуЁрььр сєфхЄ т√яюыэхэр яю юъюэўрэшш ёхрэёр ёт чш ё ы■с√ь ышэъюь, хёыш с√ы яЁшэ Є яръхЄ ¤їюьхщыр. ┬ ўхЄт╕ЁЄюь яЁшьхЁх яЁюуЁрььр сєфхЄ т√яюыэхэр тю тЁхь  ёхрэёр ёт чш, эх чр∙ш∙хээюую ярЁюыхь, т ъюЄюЁюь с√ы яЁшэ Є Їрщы ё яръхЄюь эхЄь¤щыр, т эрўрых ёяшёър ярЁрьхЄЁют ъюьрэф√ сєфхЄ тёЄртыхэю шь  яЁшэ Єюую Їрщыр ё яєЄ╕ь. ┬ я Єюь яЁшьхЁх ёъЁшяЄ сєфхЄ т√яюыэхэ яю юъюэўрэшш ёхрэёр ёт чш ё єчыюь, т ёЄЁюъх node фы  ъюЄюЁюую єърчрэ тїюф ∙шщ шэсрєэф т ёыєўрх, хёыш юЄ ¤Єюую ышэър с√ы яЁшэ Є ы■сющ Їрщы.

4.16. fdinhist

─шЁхъЄштр fdinhist чрфр╕Є шь  Їрщыр, т ъюЄюЁ√щ т фтюшўэюь тшфх сєфхЄ чряшё√трЄ№ё  ёЄрЄшёЄшър тїюф ∙шї ёхрэёют ёт чш. ╘юЁьрЄ Їрщыр ёютьхёЄшь ё ьхщыхЁюь «FrontDoor», ўЄю яючтюы хЄ шёяюы№чютрЄ№ рэрышчрЄюЁ√ ёЄрЄшёЄшъш, ЁрчЁрсюЄрээ√х фы  ¤Єюую ьхщыхЁр.

╧рЁрьхЄЁ – яєЄ№ ш шь  Їрщыр. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

fdinhist c:\\bbs\\log\\in.his

4.17. fdouthist

─шЁхъЄштр fdouthist чрфр╕Є шь  Їрщыр, т ъюЄюЁ√щ т фтюшўэюь тшфх сєфхЄ чряшё√трЄ№ё  ёЄрЄшёЄшър шёїюф ∙шї ёхрэёют ёт чш. ╘юЁьрЄ Їрщыр ёютьхёЄшь ё ьхщыхЁюь «FrontDoor», ўЄю яючтюы хЄ шёяюы№чютрЄ№ рэрышчрЄюЁ√ ёЄрЄшёЄшъш, ЁрчЁрсюЄрээ√х фы  ¤Єюую ьхщыхЁр.

╧рЁрьхЄЁ – яєЄ№ ш шь  Їрщыр. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

fdouthist c:\\bbs\\log\\out.his

4.18. filebox

─шЁхъЄштр filebox чрфр╕Є яєЄ№ ъ ърЄрыюує Їрщы-сюъёют т ёЄшых ьхщыхЁр «T-Mail». ╧єЄ№ єърч√трхЄё  ярЁрьхЄЁюь ¤Єющ фшЁхъЄшт√. Binkd єьххЄ ЁрсюЄрЄ№ ё Їрщысюъёрьш т «ъюЁюЄъюь» ш т «фышээюь» ЇюЁьрЄх T-mail. ╧юфЁюсэхх ю ЇюЁьрЄх Їрщысюъёют ёь. т я. 7.1.3 ш т фюъєьхэЄрЎшш эр ьхщыхЁ «T-Mail». ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (Їрщысюъё√ эх шёяюы№чє■Єё ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

filebox c:\\bbs\\filebox

4.19. flag

─шЁхъЄштр flag чрфр╕Є єёыютшх ш шь  Їрщыр, ъюЄюЁ√щ сєфхЄ ёючфрэ яЁш т√яюыэхэшш єёыютш . ╘рщы ёючфрЄё  яєёЄ√ь (фышэющ 0 срщЄ). ┼ёыш Їрщы ёє∙хёЄтєхЄ, юэ эх сєфхЄ яхЁхчряшёрэ, эю сєфхЄ юсэютыхэю тЁхь  хую ьюфшЇшърЎшш. ╙ёыютшхь ёыєцшЄ ёюс√Єшх яЁш╕ьр Їрщыр, шь  ъюЄюЁюую яюфїюфшЄ яюф чрфрээє■ ьрёъє.

╚ьххЄ ёь√ёы єърч√трЄ№ яюыэ√щ яєЄ№ ъ Їрщыє Їырур. ┬ яєЄш ъ Їрщыє Їырур ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√. ┬ ьрёъх шьхэш Їрщыр хую эєцэю фюяюыэшЄхы№эю фєсышЁютрЄ№, яю¤Єюьє яєЄш Їрщырь т ╬╤ Windows эєцэю єърч√трЄ№ ўхЄ√Ёх чэрър «\» яюфЁ ф (эряЁшьхЁ: «c:\\\\binkd»).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╤ь. Єръцх юяшёрэшх фшЁхъЄшт√ exec.

╧ЁшьхЁ√:

flag c:\\bbs\\flags\\toss.now *.su? *.mo? *.tu? *.we? *.th? *.fr? *.sa?
flag c:\\bbs\\flags\\netmail.in c:\\\\bbs\\\\inbound\\\\*.pkt

4.20. ftrans

─шЁхъЄштр ftrans чрфр╕Є яЁртшыр яюфёЄрэютъш ёЄЁюъ т яєЄ ї, яхЁхўшёыхээ√ї т Їрщырї-ёяшёърї (*.?lo) яюўЄютющ юўхЁхфш. ╚ёяюы№чєхЄё  т ёыєўрх шёяюы№чютрэш  binkd ш фЁєушї яЁюуЁрьь эр Ёрчэ√ї ъюья№■ЄхЁрї, тючьюцэю ё Ёрчэ√ьш ╬╤ (эряЁшьхЁ, binkd эр ёхЁтхЁх яюф FreeBSD, р ЄюёёхЁ ш ЁхфръЄюЁ эр ъюья№■ЄхЁх яюы№чютрЄхы  яюф Windows 2000). ╧Ёш ¤Єюь ърЄрыюу яюўЄютющ юўхЁхфш ЁрёяюырурхЄё  эр ёхЄхтюь фшёъх ш яєЄш ъ эхьє юЄышўр■Єё  эр Ёрчэ√ї ъюья№■ЄхЁрї. ╧рЁрьхЄЁ√ – фтх ёЄЁюъш: чрьхэ хьр  ш чрьхэ ■∙р , ъръ яЁртшыю чръы■ўр■Єё  т ърт√ўъш.

┬ ёыєўрх шёяюы№чютрэш  ёьх°рээюую юъЁєцхэш  (╬╤ ёхьхщёЄтр UNIX ш Windows, OS/2, DOS), ъюуфр ёшьтюы ЁрчфхышЄхы  ¤ыхьхэЄют яєЄш ЁрчышўрхЄё , эхюсїюфшью шёяюы№чютрЄ№ фтр яЁртшыр (чрфртрЄ№ фтх фшЁхъЄшт√ ftrans): фы  яюфёЄрэютъш яєЄш ш фы  яюфёЄрэютъш ЁрчфхышЄхы . ┬ ёЄЁюърї яюшёър ш яюфёЄрэютъш ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√.

╘юЁьрЄ:

ftrans "чрьхэ хьр  яюфёЄЁюър" "чрьхэ ■∙р  яюфёЄЁюър"

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ√:

ftrans "D:\\fido\\outbound" "/var/spool/fido/outb"
ftrans "\\" "/"
ftrans "D:\\fido\\outbound" "╠:\\outbound"

4.21. hold

─шЁхъЄштр hold чрфр╕Є ярєчє ьхцфє ёхЁш ьш яюя√Єюъ т√чютр ышэър т ёыєўрх хую эхфюёЄєяэюёЄш. ╧рєчр єёЄрэртыштрхЄё  яюёых чрфрээюую фшЁхъЄштющ try ўшёыр яюя√Єюъ ёюхфшэхэш . ╧рЁрьхЄЁ – яюыюцшЄхы№эюх ўшёыю. ╧рєчр чрфр╕Єё  т ёхъєэфрї. ╟эрўхэшх яю єьюыўрэш■: 0 (эхЄ ярєч√).

╥хїэшўхёъш ярєчр ЁхрышчєхЄё  яєЄ╕ь чряшёш т Їрщы NNNNMMMM.hld ёЄЁюъш ё ўшёыюь - тЁхьхэхь юъюэўрэш  ярєч√ т ЇюЁьрЄх unixtime, ыхтр  ўрёЄ№ шьхэш Їрщыр ёютярфрхЄ ё ыхтющ ўрёЄ№■ шьхэш Їрщыют *.?ut ш *.?lo фы  ¤Єюую ышэър. (╤ь. я. 7.3.2.)

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

hold 600

4.22. hold-skipped

─шЁхъЄштр hold-skipped чрфр╕Є

╧рЁрьхЄЁ – Ўхыюх эхюЄЁшЎрЄхы№эюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 0 (эхЄ яЁхфхыр).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

hold-skipped

4.23. inbound

─шЁхъЄштр inbound єърч√трхЄ яєЄ№ ъ ърЄрыюує, т ъюЄюЁ√щ binkd яюьх∙рхЄ Їрщы√, яЁшэ Є√х тю тЁхь  ёхрэёют ёт чш, чр∙ш∙╕ээ√ї ярЁюыхь (тю тЁхь  ярЁюы№э√ї ёхёёшщ). ▌ЄюЄ ърЄрыюу фюыцхэ с√Є№ юфшэръют√ь т эрёЄЁющърї тёхї яЁюуЁрьь, ёюёЄрты ■∙шї эр°є FTN-ёшёЄхьє. ┬ яєЄш ъ Їрщыє ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√.

▌Єр фшЁхъЄштр  ты хЄё  юс чрЄхы№эющ.

╧ЁшьхЁ:

inbound c:\\bbs\\inbound

4.24. inbound-nonsecure

─шЁхъЄштр inbound-nonsecure єърч√трхЄ яєЄ№ ъ ърЄрыюує, т ъюЄюЁ√щ binkd яюьх∙рхЄ Їрщы√, яЁшэ Є√х тю тЁхь  ёхрэёют ёт чш, эх чр∙ш∙╕ээ√ї ярЁюыхь (тю тЁхь  эхярЁюы№э√ї ёхёёшщ). ▌ЄюЄ ърЄрыюу фюыцхэ с√Є№ юфшэръют√ь т эрёЄЁющърї тёхї яЁюуЁрьь, ёюёЄрты ■∙шї эр°є FTN-ёшёЄхьє, хёыш юэ єърчрэ т ¤Єшї яЁюуЁрььрї. ┬ яєЄш ъ Їрщыє ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ. ┬ ёыєўрх х╕ юЄёєЄёЄтш  тёх яЁшэ Є√х Їрщы√ яюьх∙р■Єё  т ърЄрыюу, єърчрээ√щ т фшЁхъЄштх inbound.

╧ЁшьхЁ:

inbound-nonsecure c:\\bbs\\inbound\\unsecure

4.25. inboundcase

─шЁхъЄштр inboundcase чрфр╕Є Ёхцшь яЁхюсЁрчютрэш  ЁхушёЄЁр сєът т шь╕эрї яЁшэ Є ї binkd Їрщыют. ┬ючьюцэ√х чэрўхэш  Ёхцшьр:

  • save – чряшё√трЄ№ Їрщы ё шьхэхь т Єюь цх эряшёрэшш, ъръюх с√ыю яхЁхфрэю ё єфры╕ээющ ёЄюЁюэ√;

  • upper – яЁхюсЁрчют√трЄ№ сєът√ т шьхэш Їрщыр т тхЁїэшщ ЁхушёЄЁ;

  • lower – яЁхюсЁрчют√трЄ№ сєът√ т шьхэш Їрщыр т эшцэшщ ЁхушёЄЁ;

  • mixed – яЁхюсЁрчют√трЄ№ яхЁтє■ яюёых ЁрчфхышЄхы  сєътє т шьхэш Їрщыр т тхЁїэшщ ЁхушёЄЁ, тёх юёЄры№э√х – т эшцэшщ (ЁрчфхышЄхыхь ёўшЄрхЄё  ы■сющ ёшьтюы, эх  ты ■∙шщё  сєътющ шыш ЎшЇЁющ), эряЁшьхЁ шь  Їрщыр «file-id.diz» сєфхЄ яЁхюсЁрчютрэю т «File-Id.Diz».

╧рЁрьхЄЁ – ёЄЁюър, яЁшэшьр■∙р  юфэю шч ўхЄ√Ё╕ї чэрўхэшщ: «save», «upper», «lower», «mixed». ╟эрўхэшх яю єьюыўрэш■ – «save» (юёЄрты Є№ шьхэр Їрщыют схч шчьхэхэш ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

inboundcase save

4.26. include

─шЁхъЄштр include шёяюы№чєхЄё  фы  тъы■ўхэш  ўрёЄш ъюэЇшуєЁрЎшш шч фЁєуюую Їрщыр. ╧рЁрьхЄЁ фшЁхъЄшт√ – ёЄЁюър, яєЄ№ ъ тъы■ўрхьюьє Їрщыє. ╠юцхЄ шёяюы№чютрЄ№ё , ъ яЁшьхЁє, фы  чряєёър эхёъюы№ъшї ъюяшщ binkd ё Їрщырьш ъюэЇшуєЁрЎшш, Ёрчышўр■∙шьшё  т ўрёЄш ярЁрьхЄЁют ш сюы№°ющ юс∙хщ (тъы■ўрхьющ) ўрёЄ№■ ъюэЇшуєЁрЎшш. ┬ яєЄш ъ Їрщыє ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√.

╧ЁшьхЁ:

include c:\\bbs\\binkd\\nodes.cfg

4.27. iport

─шЁхъЄштр iport чрфр╕Є TCP яюЁЄ, ъюЄюЁ√щ сєфхЄ юЄъЁ√Є binkd фы  яЁш╕ьр тїюф ∙шї ёюхфшэхэшщ. ▌Єр фшЁхъЄштр ьюцхЄ шёяюы№чютрЄ№ё  фы  єёЄрэютъш эхёЄрэфрЁЄэюую яюЁЄр фы  ЁрсюЄ√ binkd, т ўрёЄэюёЄш фы  юсїюфр чряЁх∙р■∙шї яЁртшы ёхЄхтюую °ы■чр-сЁрэфьрє¤Ёр.

╧рЁрьхЄЁ – Ўхыюх яюыюцшЄхы№эюх ўшёыю ышсю ёЄЁюър (эрчтрэшх эюьхЁр яюЁЄр шч Їрщыр /etc/services т unix ш c:\winnt\system32\drivers\etc\services т Windows NT ш 2000, т c:\windows\system32\drivers\etc\services тWindows XP ш 2003). ╟эрўхэшх яю єьюыўрэш■ – 24554.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

iport 443

4.28. kill-dup-partial-files

┼ёыш фшЁхъЄштр kill-dup-partial-files єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd яЁш яЁш╕ьх эютюую Їрщыр сєфхЄ єфры Є№ эх яюыэюёЄ№■ яЁшэ Є√щ Їрщы ё Єхь цх шьхэхь, эю юЄышўр■∙шщё  тЁхьхэхь шчьхэхэш  ш ЁрчьхЁюь. ┼ёыш ¤Єр фшЁхъЄштр эх єърчрэр, т ърЄрыюух яЁш╕ьр Їрщыют (т ърЄрыюух, єърчрээюь фшЁхъЄштющ temp-inblund ышсю, хёыш тЁхьхээ√щ ърЄрыюу шэсрєэфр эх чрфрэ, т ърЄрыюурї inbound ш inbound-nonsecure) сєфєЄ эръряыштрЄ№ё  Їрщы√ ё шьхэрьш *.dt ш *.hr.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

kill-dup-partial-files

4.29. kill-old-bsy

┼ёыш фшЁхъЄштр kill-old-bsy єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd сєфхЄ єфры Є№ шч ърЄрыюур яюўЄютющ юўхЁхфш Їрщы√-Їыруш чрэ ЄюёЄш єфры╕ээющ ёшёЄхь√ *.bsy, ъюЄюЁ√х ёЄрЁ°х, ўхь єърчрээ√щ т ярЁрьхЄЁх яхЁшюф тЁхьхэш.

╧рЁрьхЄЁ – Ўхыюх яюыюцшЄхы№эюх ўшёыю, хфшэшЎ√ шчьхЁхэш  - ёхъєэф√. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (Їрщы√ *.bsy эх єфры ■Єё ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

kill-old-bsy 43200

4.30. kill-old-partial-files

─шЁхъЄштр kill-old-partial-files чрфр╕Є тЁхь , яю шёЄхўхэшш ъюЄюЁюую binkd сєфхЄ єфры Є№ ёЄрЁ√х ўрёЄшўэю яЁшэ Є√х Їрщы√. ┬Ёхь  єърч√трхЄё  т ярЁрьхЄЁх фшЁхъЄ√т√ яюыюцшЄхы№э√ь Ўхы√ь ўшёыюь, шчьхЁ хЄё  т ёхъєэфрї. ┼ёыш ¤Єр фшЁхъЄштр эх єърчрэр, т ърЄрыюух яЁш╕ьр Їрщыют (т ърЄрыюух, єърчрээюь фшЁхъЄштющ temp-inblund ышсю, хёыш тЁхьхээ√щ ърЄрыюу эх чрфрэ, т ърЄрыюурї inbound ш inbound-nonsecure) сєфєЄ эръряыштрЄ№ё  Їрщы√ ё шьхэрьш *.dt ш *.hr.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

kill-old-partial-files 86400

4.31. location

─шЁхъЄштр location чрфр╕Є эрчтрэшх ьхёЄэюёЄш, т ъюЄюЁющ Ёрёяюыюцхэр FTN-ёшёЄхьр. ▌Єю шёъы■ўшЄхы№эю ёяЁртюўэр  шэЇюЁьрЎш , ъюЄюЁр  яЁхф· ты хЄё  єфры╕ээющ ёЄюЁюэх тю тЁхь  яЁюЎхфєЁ√ юяючэрэш  FTN-ёшёЄхь√. ╧рЁрьхЄЁ – ЄхъёЄютр  ёЄЁюър, юс√ўэю чръы■ўрхЄё  т ърт√ўъш.

▌Єр фшЁхъЄштр  ты хЄё  юс чрЄхы№эющ.

╧ЁшьхЁ:

location "Magadan, Russia"

4.32. log

─шЁхъЄштр log чрфр╕Є шь  Їрщыр, т ъюЄюЁ√щ binkd сєфхЄ чряшё√трЄ№ яЁюЄюъюы ётюхщ ЁрсюЄ√. ┬ сюы№°шэёЄтх ёыєўрхт шьххЄ ёь√ёы єърч√трЄ№ шь  Їрщыр ё яєЄ╕ь, ўЄюс√ шёъы■ўшЄ№ яєЄрэшЎє яЁш чряєёъх binkd шч Ёрчэ√ї ърЄрыюуют Їрщыютющ ёшёЄхь√. ┬ яєЄш ъ Їрщыє ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√.

╧рЁрьхЄЁ – ёЄЁюър. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (яЁюЄюъюы эх тхфхЄё ).

▌Єр фшЁхъЄштр  ты хЄё  юс чрЄхы№эющ. ╧Ёш чряєёъх binkd ёхЁтшёюь т Windows ш фхьюэюь т ╬╤ ёхьхщёЄтр UNIX шьххЄ ёь√ёы єърч√трЄ№ х╕ яхЁтющ фшЁхъЄштющ Їрщыр ъюэЇшуєЁрЎшш, ўЄюс√ ю°шсъш ъюэЇшуєЁрЎшш с√ыш чряшёрэ√ т Їрщы яЁюЄюъюыр.

╧ЁшьхЁ:

log c:\\bbs\\logs\\binkd.log

4.33. loglevel

─шЁхъЄштр loglevel чрфр╕Є єЁютхэ№ яЁюЄюъюышЁютрэш , ъюЄюЁ√щ сєфхЄ шёяюы№чютрЄ№ё  яЁш т√тюфх фшруэюёЄшўхёъшї ёююс∙хэшщ т Їрщы яЁюЄюъюыр binkd ышсю т syslog. ╧рЁрьхЄЁ фшЁхъЄшт√ – яюыюцшЄхы№эюх ўшёыю (яюыюцшЄхы№эюх шыш юЄЁшЎрЄхы№эюх т яЁхфхырї 0..32767 ышсю 0..2147483647 т чртшёшьюёЄш юЄ ъюьяшы ЄюЁр, Ёхры№э√щ ёь√ёы шьх■Є чэрўхэш  юЄ 0 фю 10). ╟эрўхэшх яю єьюыўрэш■ – 0 (яЁюЄюъюышЁє■Єё  Єюы№ъю ъЁшЄшўхёъшх ю°шсъш).

╧хЁхўхэ№ єЁютэхщ яЁюЄюъюышЁютрэш :
-1 – ёююс∙хэш  windows-тхЁёшш юс єёЄрэютъх, єфрыхэшш ш ёюёЄю эшш ёхЁтшёр;
0 – ъЁшЄшўхёър  ю°шсър, т Ёхчєы№ЄрЄх ъюЄюЁющ фры№эхщ°р  ЁрсюЄр binkd эхтючьюцэр;
1 – ю°шсъш ш яЁшўшэ√ юёЄрэютъш;
2 – ю°шсъш ёюхфшэхэш , ЄЁрэёы Ўш  яєЄхщ, шчьхэхэш  Їрщыр ъюэЇшуєЁрЎшш, ёюёЄю эшх яЁюЄюъюыр binkp;
3 – тъы■ўхэшх/т√ъы■ўхэшх Ёрё°шЁхэшщ binkp, яЁшхь ш юЄяЁртър Їрщыют, чряєёъ тэх°эшї яЁюуЁрьь, єфрыхэшх яєёЄ√ї Їрщысюъёют;
4 – чряєёъ binkd, ъюф тючтЁрЄр чртхЁ°шт°хуюё  яюЄюьър, яюыы, ю°шсър ёхЁтхЁр, ЁрсюЄр ё Їрщырьш ш фЁ.;
5 – ЁрсюЄр ё DNS, юЄъЁ√Єшх/чръЁ√Єшх ёюъхЄют ш Їрщыют, юсЁхчрэшх ш яхЁхшьхэютрэшх Їрщыют ш фЁ.;
6 – яЁюЄюъюы binkp, юЄэюёшЄхы№э√х яєЄш;
7 – рфЁхёр т Ёхцшьх ND, яЁшхь ш яхЁхфрўр сыюъют фрээ√ї;
8 – яЁхюсЁрчютрэш  шь╕э Їрщыют, ЄрщьрєЄ т Windows 9x, рфЁхёр єфры╕ээющ ёшёЄхь√, тЁхь  юяхЁрЎшш, ...;
9 – шэЇюЁьрЎш  ю яЁюЎхёёх яЁш╕ьр;
10 – юЄырфюўэ√х ёююс∙хэш  ю тчршьюфхщёЄтшш ё яЁюъёш.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

loglevel 4

4.34. maxclients

─шЁхъЄштр maxclients чрфр╕Є ьръёшьры№эю фюяєёЄшьюх фы  binkd ўшёыю ъышхэЄёъшї яЁюЎхёёют (шыш яюЄюъют т ьэюуюяюЄюўэ√ї ╬╤), ъюЄюЁ√х ьюуєЄ ЁрсюЄрЄ№ юфэютЁхьхээю. ─Ёєушьш ёыютрьш: ¤Єю ьръёшьры№эю тючьюцэюх ўшёыю юфэютЁхьхээ√ї шёїюф ∙шї ёхрэёют ёт чш. ╧рЁрьхЄЁ – Ўхыюх эхюЄЁшЎрЄхы№эюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 100.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

maxclients 2

4.35. maxservers

─шЁхъЄштр maxservers чрфр╕Є ьръёшьры№эю фюяєёЄшьюх фы  binkd ўшёыю ёхЁтхЁэ√ї яЁюЎхёёют (шыш яюЄюъют т ьэюуюяюЄюўэ√ї ╬╤), ъюЄюЁ√х ьюуєЄ ЁрсюЄрЄ№ юфэютЁхьхээю. ─Ёєушьш ёыютрьш: ¤Єю ьръёшьры№эю тючьюцэюх ўшёыю юфэютЁхьхээ√ї тїюф ∙шї ёхрэёют ёт чш. ╧рЁрьхЄЁ – Ўхыюх эхюЄЁшЎрЄхы№эюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 100.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

maxservers 2

4.36. minfree

─шЁхъЄштр minfree чрфр╕Є ьшэшьры№эю фюяєёЄшьюх ъюышўхёЄтю ётюсюфэюую ьхёЄр эр Ёрчфхых фшёър, т ъюЄюЁюь Ёрёяюыюцхэ ърЄрыюу, юяшёрээ√щ т фшЁхъЄштх inbound. ╧рЁрьхЄЁ – эхюЄЁшЎрЄхы№эюх ўшёыю, юсючэрўрхЄ ъюышўхёЄтю ъшыюсрщЄ. ┼ёыш тю тЁхь  ярЁюы№эющ ёхёёшш binkd юсэрЁєцшы, ўЄю ётюсюфэюх ьхёЄю яюёых яЁш╕ьр ёыхфє■∙хую Їрщыр ёЄрэхЄ ьхэ№°х єърчрээюую, юэ т ¤Єюь ёхрэёх юЄърч√трхЄё  юЄ яЁш╕ьр Їрщыют ш ЁрсюЄрхЄ Єюы№ъю эр юЄяЁртъє. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (схч юуЁрэшўхэшщ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

minfree 2048

4.37. minfree-nonsecure

─шЁхъЄштр minfree-nonsecure чрфр╕Є ьшэшьры№эю фюяєёЄшьюх ъюышўхёЄтю ётюсюфэюую ьхёЄр эр Ёрчфхых фшёър, т ъюЄюЁюь Ёрёяюыюцхэ ърЄрыюу, юяшёрээ√щ т фшЁхъЄштх inbound. ╧рЁрьхЄЁ – эхюЄЁшЎрЄхы№эюх ўшёыю, юсючэрўрхЄ ъюышўхёЄтю ъшыюсрщЄ. ┼ёыш тю тЁхь  эхярЁюы№эющ ёхёёшш binkd юсэрЁєцшы, ўЄю ётюсюфэюх ьхёЄю яюёых яЁш╕ьр ёыхфє■∙хую Їрщыр ёЄрэхЄ ьхэ№°х єърчрээюую, юэ т ¤Єюь ёхрэёх юЄърч√трхЄё  юЄ яЁш╕ьр Їрщыют ш ЁрсюЄрхЄ Єюы№ъю эр юЄяЁртъє. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (схч юуЁрэшўхэшщ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

minfree-nonsecure 2048

4.38. node

─шЁхъЄштр node юяшё√трхЄ ярЁрьхЄЁ√ ышэър, ё ъюЄюЁ√ь тючьюцэю ёюхфшэхэшх.

╘юЁьрЄ (эхюс чрЄхы№э√х ярЁрьхЄЁ√ чръы■ўхэ√ т ътрфЁрЄэ√х ёъюсъш, юс чрЄхы№э√х – т єуыют√х ёъюсъш, ЇшуєЁэ√х ёъюсъш юсЁрьы ■Є трЁшрэЄ√, юфшэ шч ъюЄюЁ√ї юс чрЄхыхэ, трЁшрэЄ√ Ёрчфхы ■Єё  ёшьтюыюь «|»):

node <FTN-рфЁхё> [-nr|-nd] [-md|-nomd] [-ip|-sip] [{рфЁхёр їюёЄют|-} [{ярЁюы№|-} [рЄЁшсєЄ [{рєЄсюъё|-} [{шэсюъё|-}]]]]]

уфх:

  • FTN-рфЁхё - рфЁхё ышэър т ЇюЁьрЄх 2D, 3D, 4D шыш 5D, эхфюёЄр■∙шх ўрёЄш рфЁхёр яюфёЄрты ■Єё  эр юёэютх рфЁхёют эр°хщ ёшёЄхь√ (фюёЄрЄюўэю єърчрЄ№ Єюы№ъю эюьхЁ єчыр ышэър);

  • -nr - я√ЄрЄ№ё  шёяюы№чютрЄ№ Ёхцшь «not reliable link mode» («NR mode») яЁюЄюъюыр binkp фы  ышэър (Ёхцшь тъы■ўшЄё  Єюы№ъю хёыш єфры╕ээр  ёЄюЁюэр хую яюффхЁцштрхЄ), ярЁрьхЄЁ эхюс чрЄхыхэ, эх ьюцхЄ шёяюы№чютрЄ№ё  юфэютЁхьхээю ё «-nd»;

  • -nd - я√ЄрЄ№ё  шёяюы№чютрЄ№ Ёхцшь «no dupes mode» («ND mode») яЁюЄюъюыр binkp фы  ышэър (Ёхцшь тъы■ўшЄё  Єюы№ъю хёыш єфры╕ээр  ёЄюЁюэр хую яюффхЁцштрхЄ), ярЁрьхЄЁ эхюс чрЄхыхэ, эх ьюцхЄ шёяюы№чютрЄ№ё  юфэютЁхьхээю ё «-nr»;

  • -md - я√ЄрЄ№ё  шёяюы№чютрЄ№ °шЇЁютрэшх MD5 яЁш юсьхэх ярЁюыхь т яЁюЄюъюых binkp фы  ышэър (Ёхцшь тъы■ўшЄё  Єюы№ъю хёыш єфры╕ээр  ёЄюЁюэр хую яюффхЁцштрхЄ), ярЁрьхЄЁ эхюс чрЄхыхэ, эх ьюцхЄ шёяюы№чютрЄ№ё  юфэютЁхьхээю ё «-nomd»;

  • -nomd - я√ЄрЄ№ё  шёяюы№чютрЄ№ °шЇЁютрэшх MD5 яЁш юсьхэх ярЁюыхь т яЁюЄюъюых binkp фы  ышэър (Ёхцшь тъы■ўшЄё  Єюы№ъю хёыш єфры╕ээр  ёЄюЁюэр хую яюффхЁцштрхЄ), ярЁрьхЄЁ эхюс чрЄхыхэ, эх ьюцхЄ шёяюы№чютрЄ№ё  юфэютЁхьхээю ё «-md»;

  • -ip – яЁютхЁ Є№ ёююЄтхЄёЄтшх рфЁхёр IP ышэър єърчрээюьє(√ь) т ёЄЁюъх node яЁш яЁш╕ьх ёюхфшэхэш  ш ёўшЄрЄ№ ёхрэё ёт чш эх чр∙ш∙хээ√ь ярЁюыхь яЁш эхёююЄтхЄёЄтшш фрцх хёыш с√ы яЁхф· тыхэ тхЁэ√щ ярЁюы№, ярЁрьхЄЁ эхюс чрЄхыхэ, эх ьюцхЄ шёяюы№чютрЄ№ё  юфэютЁхьхээю ё «-sip»;

  • -sip – яЁютхЁ Є№ ёююЄтхЄёЄтшх рфЁхёр IP ышэър єърчрээюьє(√ь) т ёЄЁюъх node яЁш яЁш╕ьх ёюхфшэхэш  ш яЁхъЁр∙рЄ№ ёхрэё яЁш эхёююЄтхЄёЄтшш, ярЁрьхЄЁ эхюс чрЄхыхэ, эх ьюцхЄ шёяюы№чютрЄ№ё  юфэютЁхьхээю ё «-ip»;

  • рфЁхёр їюёЄют – яхЁхўхэ№ рфЁхёют IP, фюьхээ√ї шь╕э DNS ш ёшьтюыр чт╕чфюўъш, Ёрчфхы╕ээ√ї Єюўъющ ё чря Єющ; чт╕чфюўър юсючэрўрхЄ эхюсїюфшьюёЄ№ ёухэхЁшЁютрЄ№ шь  DNS шч рфЁхёр FTN эр срчх фюьхэр DNS, єърчрээюую т фшЁхъЄштх rootdomain; ¤ЄюЄ ёяшёюъ ьюцхЄ с√Є№ чрьхэ╕э чэръюь «ьшэєё» («-»), ъюЄюЁ√щ юсючэрўрхЄ яєёЄющ ёяшёюъ, т ¤Єюь ёыєўрх binkd эшъюуфр эх сєфхЄ я√ЄрЄ№ё  єёЄрэютшЄ№ ёюхфшэхэшх ё Єръшь ышэъюь (юс√ўэю шёяюы№чєхЄё  фы  юяшёрэш  яющэЄют); рфЁхё їюёЄр ьюцхЄ Єръцх ёюфхЁцрЄ№ эюьхЁ яюЁЄр фы  ышэър, яЁш ¤Єюь юэ ёюёЄюшЄ шч рфЁхёр IP шыш фюьхээюую шьхэш, ЁрчфхышЄхы  т тшфх чэрър фтюхЄюўш  («:») ш ўшёыр -эюьхЁр яюЁЄр ышсю ёшьтюы№эюую шьхэш яюЁЄр (шь  яюЁЄр фюыцэю с√Є№ юяшёрэю т Їрщых /etc/services фы  unix ш т c:\winnt\system32\drivers\etc\services ф ы windows NT ш 2000, ёь. Єръцх фшЁхъЄштє oport);

  • ярЁюы№ – ярЁюы№, ъюЄюЁ√щ яЁютхЁ хЄё  т эрўрых ёхрэёр ёт чш ё єфры╕ээющ ёшёЄхьющ; ьюцхЄ с√Є№ чрьхэ╕э чэръюь «ьшэєё» («-»), ъюЄюЁ√щ юсючэрўрхЄ яєёЄющ ярЁюы№ (юЄёєЄёЄтшх ярЁюы );

  • рЄЁшсєЄ – рЄЁшсєЄ (flavour) фы  рєЄсюъёр, ьюцхЄ яЁшэшьрЄ№ чэрўхэш : «i» («immediate»), «c» («crash»), «d» («direct»), «h» («hold»), «-» («normal»); фы  binkd рфЁшсєЄ√ «immediate», «crash», «normal» ш «direct» шьх■Є юфшэръют√щ ёь√ёы – яЁшёєЄёЄтшх Їрщыр т рєЄсюъёх шэшЎшшЁєхЄ яЁюЎхфєЁє єёЄрэютыхэш  ёюхфшэхэш  ё ышэъюь, Ёрчышўшх тючэшърхЄ Єюы№ъю т юўхЁхфэюёЄш яхЁхфрўш Їрщыют шч яхЁёюэры№эюую рєЄсюъёр ш рєЄсюъёют ёЄшыхщ «T-Mail» ш «The Brake!»: яхЁхфр■Єё  Їрщы√ шч рєЄсюъёют т яюёыхфютрЄхы№эюёЄш: «immediate», «crash»,«direct», «normal»; хёыш рєЄсюъё шьххЄ рЄЁшсєЄ «hold», Їрщы√ шч эхую яхЁхфр■Єё  Єюы№ъю тю тЁхь  тїюф ∙хщ ёхёёшш;

  • рєЄсюъё – яєЄ№ ъ яхЁёюэры№эюьє ърЄрыюує эр юЄяЁртъє Їрщыют; binkd яхЁхфрхЄ Їрщы√, яюьх∙хээ√х т ¤ЄюЄ ърЄрыюу, єърчрээюьє ышэъє, єўшЄ√тр  рЄЁшсєЄ (ёь. яЁхф√фє∙шщ яєэъЄ); яхЁхфрўх эх яюфыхцрЄ Їрщы√, шьхэр ъюЄюЁ√ї ёююЄтхЄёЄтє■Є ьрёъх «.*» (Є.х. ═х яхЁхфр■Єё  Їрщы√, эрўшэр■∙шхё  ёю чэрър Єюўъш), Єръцх ёъЁ√Є√х ш ёшёЄхьэ√х Їрщы√ (т ╬╤ ш эр Їрщыют√ї ёшёЄхьрї, ъюЄюЁ√х яюффхЁцштр■Є Єръшх рЄЁшсєЄ√); т яєЄш ъ Їрщыє ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√.

  • шэсюъё - яєЄ№ ъ яхЁёюэры№эюьє ърЄрыюує эр яЁш╕ь Їрщыют; binkd яюьх∙рхЄ т ¤ЄюЄ ърЄрыюу тёх яЁшэ Є√х юЄ ышэър Їрщы√; т яєЄш ъ Їрщыє ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ. ┬ ёыєўрх, ъюуфр єёЄрэртыштрхЄё  ёхрэё ёт чш ё ышэъюь, эх юяшёрээ√ь т фшЁхъЄштх node, шёяюы№чє■Єё  эрёЄЁющъш, чрфрээ√х фшЁхъЄштющ defnode ш ярЁюыш шч Їрщыр ярЁюыхщ, єърчрээюую т фшЁхъЄштх passwords.

╧ЁшьхЁ:

node 5047/888 - password
node 5047/999 hostname;* password i c:\\bbs\\boxes\\to999 c:\\bbs\\boxes\\from999

4.39. nodeinfo

─шЁхъЄштр nodeinfo юяшё√трхЄ ярЁрьхЄЁ√ эр°хщ FTN ёЄрэЎшш. ╧Ёшэ Єю єърч√трЄ№ ьръёшьры№эю тючьюцэє■ т ёхрэёх ёт чш ёъюЁюёЄ№ (т ЇюЁьх «ўшёыю» (срщЄ) ышсю «╫шёыю┼фшэшЎршчьхЁхэш ») ш, ўхЁхч чря Єє■, яюффхЁцштрхь√х Їыруш эюфышёЄр.

╧рЁрьхЄЁ – яЁюшчтюы№эр  ёЄЁюър. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю.

▌Єр фшЁхъЄштр  ты хЄё  юс чрЄхы№эющ.

╧ЁшьхЁ:

nodeinfo 128K,IBN,XW

4.40. oblksize

─шЁхъЄштр oblksize чрфр╕Є ьръёшьры№э√щ ЁрчьхЁ яхЁхфртрхьюую сыюър фрээ√ї т срщЄрї. ╙ьхэ№°хэшх чэрўхэш  ьюцхЄ яюЄЁхсютрЄ№ё  т ёшЄєрЎшш ё сюы№°шь ъюышўхёЄтюь яюЄхЁ№ яръхЄют IP (ё Ўхы№■ єьхэ№°шЄ№ шчс√Єюўэ√щ ЄЁрЇшъ яЁш яютЄюЁэющ яюё√ыъх яръхЄют т TCP). ╙тхышўхэшх чэрўхэш  яют√°рхЄ ¤ЇЇхъЄштэюёЄ№ яхЁхфрўш Їрщыют (т ърцфюь сыюъх фрээ√ї binkp 1.0 шёяюы№чєхЄё  2 срщЄр эр ёыєцхсэє■ шэЇюЁьрЎш■).

╧рЁрьхЄЁ – Ўхыюх яюыюцшЄхы№эюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 4096 (срщЄ). ╠ръёшьры№эю фюяєёЄшьюх чэрўхэшх – 32767 (юуЁрэшўхэю яЁюЄюъюыюь binkp).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ (т ъюЄюЁюь чэрўхэшх ЁрчьхЁр сыюър єёЄрэртыштрхЄё  Єръшь, ўЄюс√ шёъы■ўшЄ№ ЇЁруьхэЄрЎш■ яръхЄют IP яЁш яюфъы■ўхэшш яю Ethernet):

oblksize 1445

4.41. oport

─шЁхъЄштр oport эрчэрўрхЄ яюЁЄ, эр ъюЄюЁ√щ binkd сєфхЄ я√ЄрЄ№ё  єёЄрэютшЄ№ ёюхфшэхэшх т Єюь ёыєўрх, ъюуфр яюЁЄ фы  ышэър эх єърчрэ  тэю т рфЁхёх їюёЄр ышэър т ёЄЁюъх node.

╧рЁрьхЄЁ – Ўхыюх яюыюцшЄхы№эюх ўшёыю ышсю ёЄЁюър (эрчтрэшх эюьхЁр яюЁЄр шч Їрщыр /etc/services т unix ш c:\winnt\system32\drivers\etc\services т Windows NT ш 2000, т c:\windows\system32\drivers\etc\services тWindows XP ш 2003). ╟эрўхэшх яю єьюыўрэш■ – 24554.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

oport 24555

4.42. overwrite

─шЁхъЄштр overwrite чрфр╕Є яхЁхўхэ№ ьрёюъ шь╕э Їрщыют, ъюЄюЁ√х сєфєЄ чрьх∙рЄ№ё  т ърЄрыюух яЁшхьр Їрщыют яЁшэ Є√ьш эют√ьш. ▌Єр тючьюцэюёЄ№ юс√ўэю шёяюы№чєхЄё  фы  шёъы■ўхэш  ёшЄєрЎшш юсЁрсюЄъш єёЄрЁхт°хщ шэЇюЁьрЎшш эр эр°хщ FTN ёшёЄхьх, эряЁшьхЁ, фы  ртЄюьрЄшўхёъющ чрьхэ√ ёхЄхт√ї ёхуьхэЄют эюфышёЄр, ЁрёяЁюёЄЁрэ хь√ї яю Їрщы¤їх.

╧рЁрьхЄЁ√ – ёяшёюъ ёЄЁюъ, Ёрчфхыхээ√ї яЁюсхырьш. ╩рцф√щ ярЁрьхЄЁ юяшё√трхЄ юфэє ьрёъє шьхэш Їрщыр схч єърчрэш  яєЄш.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

overwrite net_*.*

4.43. passwords

─шЁхъЄштр passwords чрфр╕Є шь  Їрщыр ярЁюыхщ ёЄшы  ьхщыхЁр T-mail. ─шЁхъЄштр шёяюы№чєхЄё  фы  тхфхэш  ёяшёър ярЁюыхщ т юфэюь ьхёЄх (т юфэюь Їрщых) эр ёЄрэЎшш FTN.

╧рЁрьхЄЁ – ёЄЁюър, шь  Їрщыр, юс√ўэю ё яєЄ╕ь. ┬ яєЄш ъ Їрщыє ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (Їрщы ярЁюыхщ эх шёяюы№чєхЄё ).

╘юЁьрЄ Їрщыр ярЁюыхщ (єуыют√х ёъюсъш юсючэрўр■Є юс чрЄхы№э√х ¤ыхьхэЄ√, ътрфЁрЄэ√х – эхюс чрЄхы№э√х):

<рфЁхё FTN> [ярЁюы№]

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

passwords c:\\t-mail\\password.lst

4.44. percents

┼ёыш фшЁхъЄштр percents єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd т√тюфшЄ эр ъюэёюы№ (¤ъЁрэ) шэЇюЁьрЎш■ ю Єюь, ърър  ўрёЄ№ Їрщыр яхЁхфрэр шыш яЁшэ Єр.

╧рЁрьхЄЁр эхЄ.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

percents

4.45. pid-file

─шЁхъЄштр pid-file чрфр╕Є шь  Їрщыр, ъюЄюЁ√щ сєфхЄ шёяюы№чютрЄ№ё  фы  їЁрэхэш  шфхэЄшЇшърЄюЁр яЁюЎхёёр binkd тю тЁхь  хую ЁрсюЄ√. ▌ЄюЄ Їрщы шёяюы№чєхЄё  т ╬╤ ёхьхщёЄтр unix фы  яЁюёЄюЄ√ юсэрЁєцхэш  эхЁрсюЄр■∙хую binkd т ёыєўрх хую ртрЁшщэюую чртхЁ°хэш  ш фы  яЁюёЄюЄ√ єяЁртыхэш  фхьюэюь binkd (эряЁшьхЁ, ъюьрэфр, шэшЎшшЁє■∙р  яхЁхўшЄ√трэшх Їрщыр ъюэЇшуєЁрЎшш, т√уы фшЄ Єръ: «kill -1 `cat binkd.pid`»). ╤ь. Єръцх я. 7.3.1.

╧рЁрьхЄЁ – ёЄЁюър, шь  Їрщыр, юс√ўэю ё яєЄ╕ь. ┬ яєЄш ъ Їрщыє ърцф√щ ёшьтюы «\» эєцэю єърч√трЄ№ фтрцф√. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (Їрщы PID эх шёяюы№чєхЄё ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

pid-file /var/run/binkd.pid

4.46. prescan

─шЁхъЄштр prescan чрфр╕Є фюяюыэшЄхы№эюх ёърэшЁютрэшх ърЄрыюур яюўЄютющ юўхЁхфш фы  ышэър єцх яюёых єёЄрэютыхэш  ё эшь ёюхфшэхэш  ш яЁш яхЁхфрўх Їрщыют.

╧рЁрьхЄЁ юЄёєЄёЄтєхЄ.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

prescan

4.47. printq

┼ёыш фшЁхъЄштр printq єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd т√тюфшЄ эр ъюэёюы№ (¤ъЁрэ) шэЇюЁьрЎш■ ю ёюёЄю эшш яюўЄютющ юўхЁхфш яЁш ърцфюш х╕ ёърэшЁютрэшш.

╧рЁрьхЄЁ юЄёєЄёЄтєхЄ.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

printq

4.48. proxy

─шЁхъЄштр proxy чрфр╕Є ярЁрьхЄЁ√ ёхЁтхЁр яЁюъёш ёЄрэфрЁЄр HTTP/HTTPS, ъюЄюЁ√щ фюыцхэ шёяюы№чютрЄ№ binkd фы  юёє∙хёЄтыхэш  шёїюф ∙шї ёюхфшэхэшщ. ╤ютьхёЄэю ё binkd ьюцэю шёяюы№чютрЄ№ ы■сющ ёхЁтхЁ яЁюъёш, ъюЄюЁ√щ яюффхЁцштрхЄ ъюьрэфє CONNECT яЁюЄюъюыр HTTP. ╤юхфшэхэшх ё ёхЁтхЁюь яЁюъёш ьюцхЄ с√Є№ чр∙ш∙хэю ъюьсшэрЎшхщ ыюушэр ш ярЁюы , яЁш ¤Єюь тючьюцэю шёяюы№чютрэшх ьхЄюфют рєЄхэЄшЇшърЎшш BASIC ш NTLM-DIGEST. ╧ЁшьхЁ√ ёютьхёЄшьюую ╧╬ ёхЁтхЁют яЁюъёш: Squid, MS ISA Server, OOPS, WinProxy, WinGate.

╧рЁрьхЄЁ - ёЄЁюър тшфр:

рфЁхё:яюЁЄ[/ыюушэ/ярЁюы№[/шь _ъюья№■ЄхЁр/фюьхэ_windows]]

, уфх:

  • рфЁхё – рфЁхё IP ышсю фюьхээюх шь  ёхЁтхЁр HTTP proxy;

  • яюЁЄ – эюьхЁ яюЁЄр TCP ёхЁтхЁр HTTP proxy (юс√ўэю 3128 ышсю 80);

  • ыюушэ – єўхЄэюх шь  фы  рєЄхэЄшЇшърЎшш эр ёхЁтхЁх HTTP proxy (ёютярфрхЄ ё шьхэхь яюы№чютрЄхы , ъюЄюЁюх чряЁр°штрхЄё  сЁрєчхЁюь яЁш яюя√Єъх ёюхфшэхэш  ё шёяюы№чютрэшхь ёхЁтхЁр яЁюъёш);

  • ярЁюы№ – ёхъЁхЄэ√щ ярЁюы№ фы  рєЄхэЄшЇшърЎшш эр ёхЁтхЁх HTTP proxy (ёютярфрхЄ ё ярЁюыхь, ъюЄюЁюх чряЁр°штрхЄё  сЁрєчхЁюь яЁш яюя√Єъх ёюхфшэхэш  ё шёяюы№чютрэшхь ёхЁтхЁр яЁюъёш);

  • шь _ъюья№■ЄхЁр – шь  ┬р°хую ъюья№■ЄхЁр яю MS netbios (шь  ┬р°хую ъюья№■ЄхЁр т «ёхЄш Microsoft»: т ╬╤ Windwos 95, 98, Me єърч√трхЄё  эр тъырфъх «шфхэЄшЇшърЎш » т ярЁрьхЄЁрї «╤хЄ№» ярэхыш єяЁртыхэш ; т ╬╤ Windows 2000, XP, 2003 єърч√трхЄё  эр тъырфъх «шфхэЄшЇшърЎш » т ярЁрьхЄЁрї «╤шёЄхьр» ярэхыш єяЁртыхэш );

  • фюьхэ_windows – фюьхэ Windows, т ъюЄюЁюь яЁюшёїюфшЄ рєЄхэЄшЇшърЎш  ё шёяюы№чютрэшхь NTLM (юс√ўэю ¤Єю хфшэёЄтхээ√щ т ┬р°хщ юЁурэшчрЎшш фюьхэ Windows, т ъюЄюЁюь ┬√ яЁюїюфшЄх рєЄхэЄшЇшърЎш■ яюёых тъы■ўхэш  ъюья№■ЄхЁр);

  • ътрфЁрЄэ√х ёъюсъш юсючэрўр■Є эхюс чрЄхы№э√х ¤ыхьхэЄ√.

╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (яЁюъёш ёЄрэфрЁЄр HTTP/HTTPS эх шёяюы№чєхЄё ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ√:

proxy proxy.my.dom:3128
proxy proxy.secure.my.dom:3128/login/password
proxy proxy.ntlm.my.dom:1080/login/password/myhost/domain

┬ яхЁтюь яЁшьхЁх шёяюы№чєхЄё  яЁюъёш схч рєЄхэЄшЇшърЎшш, тю тЄюЁюь – c рєЄхэЄшЇшърЎшхщ BASIC, т ЄЁхЄ№хь - ё рєЄхэЄшЇшърЎшхщ NTLM.

4.49. rescan-delay

─шЁхъЄштр rescan-delay чрфр╕Є чрфхЁцъє ьхцфє ёърэшЁютрэш ьш яюўЄютющ юўхЁхфш. ▌Єр чрфхЁцър ьюцхЄ єтхышўштрЄ№ё  эр чэрўхэшх, ърчрээюх т фшЁхъЄштх call-delay. ╧юсюўэюх фхщёЄтшх фшЁхъЄшт√ – ЁхуєышЁєхЄ чрфхЁцъє яхЁхф чртхЁ°хэшхь binkd т ёыєўрх шёяюы№чютрэш  юяЎшш ъюьрэфэющ ёЄЁюъш «-p».

╧рЁрьхЄЁ – Ўхыюх яюыюцшЄхы№эюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 60 (ёхъєэф).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

rescan-delay 2

4.50. root-domain

─шЁхъЄштр root-domain чрфр╕Є ёЄЁюъє срчютюую фюьхэр DNS фы  ЇюЁьшЁютрэш  шьхэш DNS фы  їюёЄр ышэър шч хую рфЁхёр FTN.

╘юЁьрЄ яЁхюсЁрчютрэш :

p╧╬╔═╥.f═╬─└.n╤┼╥▄.z╟╬═└.root-domain.
f═╬─└.n╤┼╥▄.z╟╬═└.root-domain.

уфх ╧╬╔═╥, ═╬─└, ╤┼╥▄ ш ╟╬═└ юсючэрўр■Є ёююЄтхЄёЄтє■∙шх эюьхЁр-ўрёЄш рфЁхёр FTN ышэър, хёыш эюьхЁ яющэЄр юЄёєЄёЄтєхЄ шыш Ёртхэ эєы■, юэ эх ЄЁрэёышЁєхЄё  ш ¤Єр ўрёЄ№ фюьхэр DNS эх шёяюы№чєхЄё . ╥ръ, рфЁхё 1:2/3.4 яЁхюсЁрчєхЄё  ъ тшфє «p4.f3.n2.z1.fidonet.net.» яЁш єърчрэшш срчютюую фюьхэр «fidonet.net.»

╧рЁрьхЄЁ – ёЄЁюър. ╟эрўхэшх яю єьюыўрэш■ – «fidonet.net.». ╨хъюьхэфєхЄё  єърч√трЄ№ шь  фюьхэр, чртхЁ°р  хую Єюўъющ, тю шчсхцрэшх ртЄюьрЄшўхёъюую яюшёър фюьхэр т яЁюЎхфєЁх ЁрчЁх°хэш  фюьхээ√ї шь╕э ё яюфёЄрэютъющ т ъюэхЎ ёЄЁюъ фюьхэр яю єьюыўрэш■ ш фюьхэют фы  яюшёър, юяшёрээ√ї т ъюэЇшуєЁрЎшш ╬╤.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

root-domain fidonet.net.

4.51. send-if-pwd

┼ёыш фшЁхъЄштр send-if-pwd єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd сєфхЄ юЄяЁрты Є№ Їрщы√ т ёыєўрх тїюф ∙хую ёхрэёр ёт чш, чр∙ш∙╕ээюую ярЁюыхь ш яЁш ы■сюь шёїюф ∙хь ёхрэёх ёт чш. ┼ёыш ¤Єр фшЁхъЄштр єърчрэр ш эр ышэър ё юЄёєЄёЄтє■∙шь ярЁюыхь шьххЄё  яюўЄр ышсю Їрщы√ ё рЄЁшсєЄюь hold, юэш ьюуєЄ эшъюуфр эх с√Є№ яхЁхфрэ√. ╥рър  яюўЄр эшъюуфр эх сєфхЄ яхЁхфрэр эр ышэър, є ъюЄюЁюую эх єърчрэ рфЁхё їюёЄр.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

send-if-pwd

4.52. skipmask

─шЁхъЄштр skipmask чрфр╕Є ьрёъш шь╕э Їрщыют, ъюЄюЁ√х эх сєфєЄ яЁшэшьрЄ№ё  binkd эр эр°хщ ёЄюЁюэх ш сєфєЄ єфры Є№ё  ъръ єёях°эю яхЁхфрээ√х эр ёЄюЁюэх ышэър.

╧рЁрьхЄЁ√ – ёяшёюъ ьрёюъ шь╕э Їрщыют схч яєЄхщ. ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (яЁшэшьр■Єё  тёх Їрщы√).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

skipmask *.avi pm2.*

4.53. socks

─шЁхъЄштр socks чрфр╕Є ярЁрьхЄЁ√ яЁюъёш-ёхЁтхЁр ёЄрэфрЁЄр socks, ъюЄюЁ√щ фюыцхэ шёяюы№чютрЄ№ binkd фы  юёє∙хёЄтыхэш  шёїюф ∙шї ёюхфшэхэшщ. ╤ютьхёЄэю ё binkd ьюцэю шёяюы№чютрЄ№ socks тхЁёшщ 4 ш 5, яЁш шёяюы№чютрэшш socks 5 ёюхфшэхэшх ё ёхЁтхЁюь socks ьюцхЄ с√Є№ чр∙ш∙хэю ъюьсшэрЎшхщ ыюушэр ш ярЁюы .

╧рЁрьхЄЁ - ёЄЁюър тшфр:

рфЁхё:яюЁЄ[/[ыюушэ/ярЁюы№]]

, уфх:

  • рфЁхё – рфЁхё IP ышсю фюьхээюх шь  ёхЁтхЁр socks-proxy;

  • яюЁЄ – эюьхЁ яюЁЄр TCP ёхЁтхЁр socks-proxy (юс√ўэю 1080);

  • ыюушэ – єўхЄэюх шь  фы  рєЄхэЄшЇшърЎшш эр socks 5;

  • ярЁюы№ – ёхъЁхЄэ√щ ярЁюы№ фы  рєЄхэЄшЇшърЎшш эр socks 5;

  • ътрфЁрЄэ√х ёъюсъш юсючэрўр■Є эхюс чрЄхы№э√х ¤ыхьхэЄ√.

┬ ёыєўрх шёяюы№чютрэш  socks 4 єърч√трхЄё  Єюы№ъю рфЁхё ш яюЁЄ, т ёыєўрх шёяюы№чютрэш  socks 5 схч рєЄхэЄшЇшърЎшш т ъюэхЎ ёЄЁюъш фюсрты хЄё  ёшьтюы ъюёющ ўхЁЄ√ «/», т ёыєўрх шёяюы№чютрэш  socks 5 ё рєЄхэЄшЇшърЎшхщ шёяюы№чєхЄё  яюыэ√щ ЇюЁьрЄ.

╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю (яЁюъёш ёЄрэфрЁЄр socks эх шёяюы№чєхЄё ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ√:

socks socks4.my.dom:1080
socks socks5.my.dom:1080/
socks socks5.secure.my.dom:1080/login/password

┬ яхЁтюь яЁшьхЁх шёяюы№чєхЄё  socks 4, тю тЄюЁюь – socks 5 схч рєЄхэЄшЇшърЎшш, т ЄЁхЄ№хь - socks 5 ё рєЄхэЄшЇшърЎшхщ яю ыюушэє ш ярЁюы■.

4.54. syslog

┼ёыш фшЁхъЄштр syslog єърчрэр т Їрщых ъюэЇшуєЁрЎшш, binkd т√тюфшЄ яЁюЄюъюы ЁрсюЄ√ т ёшёЄхьэ√щ ыюу ╬╤. ─шЁхъЄштр фхщёЄтшЄхы№эр Єюы№ъю т ╬╤ ёхьхщёЄтр UNIX ш binkd, ёъюьяшышЁютрээ√щ фы  фЁєушї ╬╤, тюёяЁшэшьрхЄ ¤Єє фшЁхъЄштє ъръ ю°шсюўэє■ (эхшчтхёЄэє■).

╧рЁрьхЄЁ – ёЄЁюър, эрчтрэшх syslog facility. ┬ючьюцэ√х чэрўхэш : «kern», «user», «mail», «daemon», «auth», «syslog», «lpr», «news», «uucp», «cron», «authpriv», «ftp», «local0», «local1», «local2», «local3», «local4», «local5», «local6», «local7» (єЄюўэшЄ№ ёяшёюъ фюяєёЄшь√ї фы  ┬р°хщ ╬╤ чэрўхэшщ ьюцэю т ёЄЁрэшЎх man syslog). ╟эрўхэшх яю єьюыўрэш■ эх єёЄрэютыхэю.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

syslog local0

4.55. sysname

─шЁхъЄштр sysname чрфр╕Є эрчтрэшх эр°хщ FTN ёЄрэЎшш.

╧рЁрьхЄЁ – яЁюшчтюы№эр  ёЄЁюър, юс√ўэю чръы■ўрхЄё  т ърт√ўъш.

▌Єр фшЁхъЄштр  ты хЄё  юс чрЄхы№эющ.

╧ЁшьхЁ:

sysname «My Cool Station»

4.56. sysop

─шЁхъЄштр sysop чрфр╕Є шь  ёшёюяр эр°хщ FTN-ёшёЄхь√. ╧рЁрьхЄЁ – ёЄЁюър, юс√ўэю чръы■ўрхЄё  т ърт√ўъш.

▌Єр фшЁхъЄштр  ты хЄё  юс чрЄхы№эющ.

╧ЁшьхЁ:

sysop Ivan

4.57. temp-inbound

─шЁхъЄштр temp-inbound чрфр╕Є яєЄ№ ъ ърЄрыюує фы  тЁхьхээюую їЁрэхэш  яЁшэ Є√ї эх фю ъюэЎр Їрщыют. ┼ёыш єърчрэр, тёх яЁшэшьрхь√х binkd Їрщы√ ёэрўрыр чряшё√тр■Єё  т ¤ЄюЄ ърЄрыюу, чрЄхь яхЁхьх∙р■Єё  т ърЄрыюу, єърчрээ√щ ъ фшЁхъЄштх inbound шыш inbound-nonsecure. ─ы  ёъюЁюёЄш яхЁхьх∙хэш  Їрщыют шьххЄ ёь√ёы ЁрёяюырурЄ№ ърЄрыюуш, юяшёрээ√х т фшЁхъЄштрї «temp-inbound», «inbound» ш «inbound-nonsecure» эр юфэюь фшёъютюь ыюушўхёъюь Ёрчфхых (Єюьх). ╧рЁрьхЄЁ – ёЄЁюър-яєЄ№. ╟эрўхэшх яю єьюыўрэш■ – эх єёЄрэютыхэю.

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

temp-inbound c:\\bbs\\inbound\\binkdtmp

4.58. timeout

─шЁхъЄштр timeout чрфр╕Є тЁхь  юцшфрэш  юЄтхЄр т ёхъєэфрї яЁш єёЄрэютыхээюь TCP-ёюхфшэхэш  ё єфры╕ээющ ёшёЄхьющ. ╧рЁрьхЄЁ – Ўхыюх эхюЄЁшЎрЄхы№эюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 300 (Є.х. я Є№ ьшэєЄ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

timeout 300

4.59. try

─шЁхъЄштр try чрфр╕Є ўшёыю яюя√Єюъ т√чютр єфры╕ээющ FTN-ёшёЄхь√, яюёых эхєфрўш ъюЄюЁ√ї т√чют√ ¤Єющ ёшёЄхь√ сєфєЄ яЁшюёЄрэютыхэ√ эр тЁхь , єърчрээюх т фшЁхъЄштх hold. ╧рЁрьхЄЁ – Ўхыюх эхюЄЁшЎрЄхы№эюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 0 (эхЄ юуЁрэшўхэш  ўшёыр яюя√Єюъ).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ.

╧ЁшьхЁ:

try 10

4.60. tzoff

─шЁхъЄштр tzoff чрфр╕Є ёьх∙хэшх ыюъры№эюую ўрёютюую яю ёр ъ ьшЁютюьє тЁхьхэш UTC т ёхъєэфрї. ╧рЁрьхЄЁ – Ўхыюх ўшёыю. ╟эрўхэшх яю єьюыўрэш■ – 0 (тЁхь  эр ўрёрї ъюья№■ЄхЁр ёююЄтхёЄтєхЄ UTC).

▌Єр фшЁхъЄштр  ты хЄё  эхюс чрЄхы№эющ ш х╕ шёяюы№чютрэшх эхюсїюфшью Єюы№ъю т Єхї юяхЁрЎшюээ√ї ёшёЄхьрї ш яЁш ъюьяшы Ўшш binkd Єхьш ъюьяшы ЄюЁрьш, т ъюЄюЁ√ї эхЄ уюЄют√ї ЇєэъЎшщ т√ўшёыхэш  тЁхьхэш UTC. ┬ ърцфюь ъюэъЁхЄэюь ёыєўрх шьххЄ ёь√ёы яЁютхЁшЄ№, ёююЄтхЄёЄтєхЄ ыш тЁхь  ёюс√Єшщ, чряшёрээ√ї т Їрщы яЁюЄюъюыр, UTC. ═хЄ эхюсїюфшьюёЄш шёяюы№чютрЄ№ ¤Єє фшЁхъЄштє т Windows, OS/2, ╬╤ ёхьхщёЄтр UNIX.

╧ЁшьхЁ (ёьх∙хэшх UTC+6):

tzoff 1800

5. ╧рЁрьхЄЁ√ ъюьрэфэющ ёЄЁюъш.

Binkd яЁш эюЁьры№эющ ЁрсюЄх фюыцхэ с√Є№ чряє°хэ ё єърчрэшхь ярЁрьхЄЁют т ъюьрэфэющ ёЄЁюъх.

╘юЁьрЄ ёЄЁюъш т√чютр binkd (єърчрэ√ тёх тючьюцэ√х юяЎшш фы  тёхї ╬╤, эхюс чрЄхы№э√х ¤ыхьхэЄ√ чръы■ўхэ√ т ътрфЁрЄэ√х ёъюсъш, чэръ «|» Ёрчфхы хЄ трЁшрэЄ√ – Є.х. юяЎшш, ъюЄюЁ√х эх ьюуєЄ с√Є№ шёяюы№чютрэ√ юфэютЁхьхээю):

[/path/to/]binkd [-[C][c][p][q][r][s][v][m][h][T][i|u]] [-t srvcmd] [-S srvn] [-P node] config

╧рЁрьхЄЁ√, эрўшэр■∙шхё  ёю чэрър ьшэєё («-»), эрч√тр■Єё  юяЎш ьш (options). ┬ёх сєът√ т юяЎш ї – ырЄшэёъшх. ╧юЁ фюъ єърчрэш  юяЎшщ эх шьххЄ чэрўхэш , уыртэюх ўЄюс√ ярЁрьхЄЁ – шь  Їрщыр ъюэЇшуєЁрЎшш с√ы єърчрэ яюёыхфэшь.

═рсюЁ фхщёЄтє■∙шї юяЎшщ чртшёшЄ юЄ ╬╤, фы  ъюЄюЁющ ёъюьяшышЁютрэ binkd, ш юЄ трЁшрэЄр ёсюЁъш binkd.

╩ЁрЄъє■ ёяЁртъє яю ярЁрьхЄЁрь ъюьрэфэющ ёЄЁюъш binkd ьюцэю тёхуфр яюыєўшЄ№, чряєёЄшт binkd схч ярЁрьхЄЁют шыш ё ярЁрьхЄЁюь «-h». ╧ЁшьхЁ фы  Windows NT:

C:\fido\binkd> binkd -h
usage: binkd [-CcpqrsvmhTiu] [-S srvn] [-P node] config
-C exit(3) on config change
-c run client only
-T minimize to System Tray
-i install WindowsNT service
-u uninstall WindowsNT service
-S srvn name of WindowsNT service (default: binkd-service)
-P node poll a node
-p run client only, poll, quit
-q be quiet
-r disable crypt traffic
-s run server only
-v be verbose / dump version and quit
-m disable CRAM-MD5 authorization
-h print this help

Copyright (c) 1996-2003 Dima Maloff and others.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation. See COPYING.

Report bugs to 2:463/68 or binkd-bugs@happy.kiev.ua.

─рыхх т ¤Єющ уыртх ёыхфє■Є юяшёрэш  ърцфющ юяЎшш.

5.01. -C (чруыртэр , яЁюяшёэр  сєътр «C»).

┼ёыш binkd чряє∙хэ ё юяЎшхщ «-C», юэ яхЁхф ёърэшЁютрэшхь яюўЄютющ юўхЁхфш сєфхЄ яЁютхЁ Є№ юсэютыхэшх Їрщыр ъюэЇшуєЁрЎшш. ┬ ╬╤ ёхьхщёЄтр UNIX ш яЁш ЁрсюЄх ёхЁтшёюь т 32-ї сшЄэ√ї ╬╤ Windows т ёыєўрх, хёыш Їрщы ъюэЇшуєЁрЎшш шчьхэшыё , binkd чряєёЄшЄ ёхс  чрэютю ш яЁхф√фє∙р  ъюяш  чртхЁ°шЄё  (т Windows ё ъюфюь тючтЁрЄр 3, т UNIX - 0). ┬ тхЁёш ї фы  DOS ш Windows 3.x ш яЁш ЁрсюЄх binkd/w32 т юс√ўэюь Ёхцшьх (эх ёхЁтшёюь) binkd чртхЁ°шЄё  ё ъюфюь тючтЁрЄр 3. ▌Єю шёяюы№чєхЄё  фы  ртЄюьрЄшўхёъюую яЁшэ Єш  шчьхэхэшщ т Їрщых ъюэЇшуєЁрЎшш binkd.

╧ЁшьхЁ ъюьрэфэюую Їрщыр фы  MS DOS ш Windows:

@echo off
:loop
c:\bbs\binkd\binkd -C c:\bbs\binkd\binkd.cfg
if errorlevel 4 goto end
if errorlevel 3 goto loop
:end

5.02. -c (ёЄЁюўэр  сєътр «c»).

╬яЎш  «-c» чряЁх∙рхЄ binkd яЁшэшьрЄ№ тїюф ∙шх ёюхфшэхэш , Є.х. т binkd ЁрсюЄрхЄ Єюы№ъю ъышхэЄёър  ўрёЄ№.

╧ЁшьхЁ:

binkd -c binkd.cfg

5.03. -D (яЁюяшёэр  сєътр «D»).

╬яЎш  «-D» єърч√трхЄ binkd ЁрсюЄрЄ№ фхьюэюь (т Їюэютюь Ёхцшьх). ╚ьххЄ ёь√ёы Єюы№ъю фы  ╬╤ ёхьхщёЄтр UNIX ш т фЁєушї ╬╤ ¤Єр юяЎш  эхфюёЄєяэр.

╧ЁшьхЁ:

/usr/local/sbin/binkd -D /usr/local/etc/binkd.conf

5.04. -h (ёЄЁюўэр  сєътр «h»).

Binkd, т√чтрээ√щ ё юяЎшхщ «-h», т√тхфхЄ эр ¤ъЁрэ шэЇюЁьрЎш■ ЇюЁьрЄх ъюьрэфэющ ёЄЁюъш ш ю фюёЄєяэ√ї юяЎш ї, чрЄхь чртхЁ°шЄ ЁрсюЄє. ╥ръюх цх яютхфхэшх є binkd, чряє∙хээюую схч єърчрэш  т ъюьрэфэющ ёЄЁюъх ярЁрьхЄЁют ш юяЎшщ, р Єръцх ё эхяюфхЁцштрхь√ьш шь юяЎш ьш. ╧Ёш шёяюы№чютрэшш юяЎшш «-h» Їрщы ъюэЇшуєЁрЎшш т ъюьрэфэющ ёЄЁюъх єърч√трЄ№ эх юс чрЄхы№эю.

╧ЁшьхЁ:

binkd -h
binkd

5.05. -i (ёЄЁюўэр  сєътр «i»).

─хщёЄтшх юяЎшш «-i» чртшёшЄ юЄ юяхЁрЎшюээющ ёшёЄхь√, фы  ъюЄюЁющ ёъюьяшышЁютрэ binkd. ┬ 32-їсшЄэ√ї ╬╤ ёхьхщёЄтр Windows ¤Єр юяЎш  шёяюы№чєхЄё  фы  єёЄрэютъш ёхЁтшёр ё Єхьш ярЁрьхЄЁрьш, ъюЄюЁ√х с√ыш чрфрэ√ ёютьхёЄэю ё юяЎшхщ «-i». Binkd єёЄрэртыштрхЄ ёхс  ёхЁтшёюь ш ёЁрчє чряєёърхЄ ¤ЄюЄ ёхЁтшё. ┬ ╬╤ ёхьхщёЄтр UNIX ш т OS/2 ¤Єр юяЎш  ёыєцшЄ фы  чряєёър binkd шч-яюф фхьюэр inetd, яЁш ¤Єюь яюфЁрчєьхтрхЄё  юяЎш  «-s». ╬яЎш  «-i» эх ьюцхЄ шёяюы№чютрЄ№ё  юфэютЁхьхээю ё юяЎшхщ «-u» (т Windows).

╧ЁшьхЁ√ ъюьрэф єёЄрэютъш ёхЁтшёр фы  Windows 2000 (NT, XP, 2003):

binkd -i binkd.cfg
binkd -i -S binkd binkd.cfg
binkd -i -S binkd -s -T binkd.cfg

╧ЁшьхЁ√ ъюьрэф єёЄрэютъш ёхЁтшёр фы  Windows 95 (98, Me):

c:\bbs\binkd\binkd9x -i c:\bbs\binkd\binkd.cfg
binkd9x -i -S binkd binkd.cfg

╧ЁшьхЁ ёЄЁюъш фы  Їрщыр ъюэЇшуєЁрЎшш inetd (/etc/inetd.conf) тю FreeBSD (рэрыюушўэю ш т ы■сющ фЁєующ ╬╤ ёхьхщёЄтр UNIX):

binkp stream tcp nowait fido /usr/local/sbin/binkd binkd -i -q /usr/local/etc/fido/binkd.conf

5.06. -m (ёЄЁюўэр  сєътр «m»).

╬яЎш  «-m» чряЁх∙рхЄ binkd шёяюы№чютрЄ№ °шЇЁютрэшх ярЁюы  яю рыуюЁшЄьє MD5 (рєЄхэЄшЇшърЎш■ CRAM-MD5, ёь. FSP-1019), Єръшь юсЁрчюь, binkd тёхуфр сєфхЄ яхЁхфртрЄ№ ш яЁшэшьрЄ№ ярЁюы№ Єюы№ъю т юЄъЁ√Єюь тшфх. ╥ръцх эх сєфхЄ шёяюы№чютрЄ№ё  °шЇЁютрэшх ёюуырёэю Ёрё°шЁхэш■ CRYPT яЁюЄюъюыр binkp, яю¤Єюьє юяЎш  «-m» ЇръЄшўхёъш яюфЁрчєьхтрхЄ юяЎш■ «-r». ▌Єр юяЎш  ьюцхЄ шёяюы№чютрЄ№ё  Єюы№ъю фы  ЄхёЄшЁютрэш  шыш т чр∙ш∙╕ээющ юЄ яЁюэшъэютхэшщ шчтэх ыюъры№эющ ёхЄш. ┬ьхёЄю эх╕ ЁхъюьхфэєхЄё  шёяюы№чютрЄ№ юяЎш■ «-nomd» т фшЁхъЄштх node.

╧ЁшьхЁ:

binkd -m binkd.cfg

5.07. -n (ёЄЁюўэр  сєътр «n»).

╬яЎш  «-n» яю тшырё№ т binkd 0.9.9. ╬эр єърч√трхЄ binkd эх юёє∙хёЄты Є№ ш эх яЁшэшьрЄ№ т√чют√, Єръшь юсЁрчюь, яюёых ўЄхэш  Їрщыр ъюэЇшуєЁрЎшш ш т√яюыэхэш  фхщёЄтшщ, чрфрээ√ї фЁєушьш юяЎш ьш ъюьрэфэющ ёЄЁюъш, binkd чртхЁ°шЄ ЁрсюЄє . ╬яЎш  «-n» юс√ўэю шёяюы№чєхЄё  ёютьхёЄэю ё юяЎшхщ «-P» шыш «-vvv».

╧ЁшьхЁ√:

binkd -n -P2:5076/207 -P 3:712/848 binkd.cfg
binkd -nvvv binkd.cfg

5.08. -P (яЁюяшёэр  сєътр «P»).

╬яЎш  «-P» чрфр╕Є рфЁхё ышэър, эр ъюЄюЁ√щ binkd ёючфрёЄ poll (ёючфрёЄ яєёЄющ шыш юсэютшЄ Їрщы тшфр *.ilo, ёююЄтхЄёЄтє■∙шщ ышэъє, т ърЄрыюух яюўЄютющ юўхЁхфш). └фЁхё ышэър єърч√трхЄё  ярЁрьхЄЁюь юяЎшш тяыюЄэє■ шыш ўххЁч яЁюсхы. ┬ ъюьрэфэющ ёЄЁюъх ьюуєЄ с√Є№ єърчрэ√ эхёъюы№ъю юяЎшщ «-P». ╬яЎш  «-P» юс√ўэю шёяюы№чєхЄё  ёютьхёЄэю ё юяЎшхщ «-p».

╧ЁшьхЁ√:

binkd -P2:5076/207 -P 3:712/848 binkd.cfg
binkd -P2:5080/102 -p binkd.cfg

5.09. -p (ёЄЁюўэр  сєътр «p»).

┼ёыш т ъюьрэфэющ ёЄЁюъх єърчрэр юяЎш  «-p», binkd чряєёЄшЄё  т Ёхцшьх ъышхэЄр (сєфхЄ юёє∙хёЄты Є№ Єюы№ъю шёїюф ∙шх ёюхфшэхэш ) ш яю юяєёЄю°хэш■ юўхЁхфш эр юЄяЁртъє, чртхЁ°шЄё  ё ъюфюь тючтЁрЄр 0. ▌Єр юяЎш  яюыхчэр фы  Єюую, ўЄюс√ с√ёЄЁю юЄяЁртшЄ№ ш/шыш чрсЁрЄ№ яюўЄє, эряЁшьхЁ, яЁш єёЄрэютыхэшш ьюфхьэюую ёюхфшэхэш  яю фшрыряє. ╬яЎш  «-p» яюфЁрчєьхтрхЄ фхщёЄтшх юяЎшш «-c» ш эхёютьхёЄшьр ё юяЎшщ «-s».

╧ЁшьхЁ:

binkd -p binkd.cfg

5.10. -q (ёЄЁюўэр  сєътр «q»).

╬яЎш  «-q» чряЁх∙рхЄ binkd т√тюфшЄ№ ўЄю с√ Єю эш с√ыю эр ъюэёюы№ (эр ¤ъЁрэ). ╚ёяюы№чєхЄё  юс√ўэю т ёЄЁюъх т√чютр binkd шч фхьюэр inetd.

╧ЁшьхЁ:

binkd -q binkd.cfg

5.11. -r (ёЄЁюўэр  сєътр «r»).

╬яЎш  «-r» чряЁх∙рхЄ binkd шёяюы№чютрЄ№ °шЇЁютрэшх ЄЁрЇшър ёюуырёэю Ёрё°шЁхэш■ CRYPT яЁюЄюъюыр binkp.

╧ЁшьхЁ:

binkd -r binkd.cfg

5.12. -S (яЁюяшёэр  сєътр «S»).

╬яЎш  «-S» ёыєцшЄ т binkd/w32 ш binkd/w9x фы  єърчрэш  шьхэш ёхЁтшёр тьхёЄю чрфрээюую яю єьюыўрэш■ «binkd-service». ╚ь  ьюцхЄ ёюфхЁцрЄ№ сєът√, ЎшЇЁ√, яЁюсхы√, чэръш «-» (┼ёыш т шьхэш ёхЁтшёр яЁшёєЄёЄтє■Є яЁюсхы√, юэю фюыцэю с√Є№ чръы■ўхэю т ърт√ўъш тю шчсхцрэш  ю°шсъш Ёрёяючэртрэш  ярЁрьхЄЁют ъюьрэфэющ ёЄЁюъш). ╬яЎш  «-S» шёяюы№чєхЄё  ёютьхёЄэю ё юяЎш ьш «-i» шыш «-u». ▌Єр юяЎш  шьххЄ ёь√ёы Єюы№ъю фы  binkd/w32 ш binkd/w9x ш т фЁєушї трЁшрэЄрї binkd эх тюёяЁшэшьрхЄё .

╧ЁшьхЁ√:

binkd -i -S «Binkd service» binkd.cfg
binkd -u -S «Binkd service»

5.13. -s (ёЄЁюўэр  сєътр «s»).

╬яЎш  «-s» чряЁх∙рхЄ binkd юёє∙хёЄты Є№ шёїюф ∙шх ёюхфшэхэш , Є.х. т binkd ЁрсюЄрхЄ Єюы№ъю ёхЁтхЁэр  ўрёЄ№.

╧ЁшьхЁ:

binkd -s binkd.cfg

5.14. -T (яЁюяшёэр  сєътр «T»).

╬яЎш  «-T» чрфр╕Є Ёхцшь ЁрсюЄ√ binkd/w32, т ъюЄюЁюь т ёт╕ЁэєЄюь ёюёЄю эшш binkd яюьх∙рхЄ ётю■ шъюэъє т «System Tray» Windows (т яЁртющ ўрёЄш «╧рэхыш чрфрў») ш яЁш ъышъх ыхтющ ъэюяъющ ь√°ш яю шъюэъх тюёёЄрэртыштрхЄ тшф юъэр. ╧Ёш ЁрсюЄх binkd ёхЁтшёюь шёяюы№чютрэшх ¤Єющ юяЎшш  ты хЄё  юфэшь шч ёяюёюсют ёяЁ ЄрЄ№ юъэю ъюэёюыш binkd ё ¤ъЁрэр (фЁєующ ёяюёюс – т ярЁрьхЄЁрї ёхЁтшёр єсЁрЄ№ яюьхЄъє тчршьюфхщёЄтш  ё Ёрсюўшь ёЄюыюь, эю Єюуфр т√чтрЄ№ юъэю ъюэёюыш ёхЁтшёр binkd сєфхЄ эхтючьюцэю).

╧ЁшьхЁ√:

binkd -T binkd.cfg
binkd -T -i binkd.cfg

┬ю тЄюЁюь яЁшьхЁх binkd єёЄрэртыштрхЄ ёхс  ёхЁтшёюь, ъюЄюЁ√щ сєфхЄ ётюЁрўштрЄ№ё  т system tray.

5.15. -t (ёЄЁюўэр  сєътр «t»).

╬яЎш  «-t» ёыєцшЄ фы  єяЁртыхэш  ёхЁтшёюь т binkd, ёъюьяшышЁютрээюую фы  ╬C Windows 95 (98, Me). ╩юьрэфр єяЁртыхэш  ёхЁтшёюь чрфр╕Єё  ярЁрьхЄЁюь юяЎшш. Binkd/w9x т√яюыэ хЄ ъюьрэфє ш чртхЁ°рхЄё . ╬яЎш  «-t» ўрёЄю шёяюы№чєхЄё  ёютьхёЄэю ё юяЎшхщ «-S».

─юяєёЄшь√х ъюьрэф√:

  • start – чряєёъ ёхЁтшёр binkd/w9x;

  • stop – юёЄрэютър ёхЁтшёр binkd/w9x;

  • restart – юёЄрэютър ш яютЄюЁэ√щ чряєёъ ёхЁтшёр binkd/w9x;

  • status – чряЁюё ёЄрЄєёр ёюёЄю эш  ёхЁтшёр binkd/w9x.

╧ЁшьхЁ√:

binkd9x -t start
binkd9x -tstop
binkd9x -t status -S binkd
binkd9x -trestart -Sbinkd

5.16. -u (ёЄЁюўэр  сєътр «u»).

┬ 32-їсшЄэ√ї ╬╤ ёхьхщёЄтр Windows юяЎш  «-u» шёяюы№чєхЄё  фы  єфрыхэш  Ёрэхх єёЄрэютыхээюую ёхЁтшёр binkd. ╧хЁхф єфрыхэшхь ёхЁтшёр т Windows юэ сєфхЄ юёЄрэютыхэ. ╬яЎш  «-u» эх ьюцхЄ шёяюы№чютрЄ№ё  юфэютЁхьхээю ё юяЎшхщ «-i»

╧ЁшьхЁ√ ъюьрэф юёЄрэютъш ш єфрыхэш  ёхЁтшёр фы  Windows 2000 (NT, XP, 2003):

binkd -u
binkd -u -S binkd

╧ЁшьхЁ√ ъюьрэф єфрыхэш  ёхЁтшёр фы  Windows 95 (98, Me):

c:\bbs\binkd\binkd9x -u
binkd9x -u -S binkd

5.16. -v (ёЄЁюўэр  сєътр «v»).

Binkd, т√чтрээ√щ ё юяЎшхщ «-v», т√тхфхЄ эр ¤ъЁрэ шэЇюЁьрЎш■ ю тхЁёшш, чрЄхь чртхЁ°шЄ ЁрсюЄє.

┼ёыш юяЎш  «-v» єърчрэр ЄЁшцф√ ышсю єърчрэр т тшфх «-vvv», ышсю «-vv -v» ш яюёых эх╕ єърчрэ Їрщы ъюэЇшуєЁрЎшш, binkd т√тхфхЄ яЁюўшЄрээє■ ш юсЁрсюЄрээє■ шь ъюэЇшуєЁрЎш■ эр ¤ъЁрэ ш яЁюфюыцшЄ ЁрсюЄє. (╥Ёющэр  «v» т ёяшёъх юяЎшщ ¤ътштрыхэЄэр єърчрэш■ фшЁхъЄшт√ «debugcfg» т Їрщых ъюэЇшуєЁрЎшш.) ╥ръюх яютхфхэшх binkd ёўшЄрхЄё  єёЄрЁхт°шь ш т тхЁёш ї 1.x сєфхЄ шчьхэхэю.

╧Ёш шёяюы№чютрэшш юфшэюўэющ юяЎшш «-h» Їрщы ъюэЇшуєЁрЎшш т ъюьрэфэющ ёЄЁюъх єърч√трЄ№ эх юс чрЄхы№эю.

╧ЁшьхЁ√:

binkd -v
binkd -vvv binkd.cfg
binkd -v -v -v binkd.cfg

binkd -vv -v binkd.cfg

6. ╬яшёрэшх ЁрсюЄ√ binkd.

╧Ёш чряєёъх binkd рэрышчшЁєхЄ яхЁхфрээ√х хьє ярЁрьхЄЁ√, ўшЄрхЄ Їрщы ъюэЇшуєЁрЎшш ш чрЄхь чряєёърхЄ ёхЁтхЁэє■ ўрёЄ№ (хёыш юэр эх чряЁх∙хэр т ъюэЇшуєЁрЎшюээюь Їрщых шыш юяЎш ьш ъюьрэфэющ ёЄЁюъш) ш ёыхфюь – ъышхэЄёъє■ ўрёЄ№ (юя Є№ цх хёыш юэр эх чряЁх∙хэр).

┬ю тЁхь  рэрышчр ярЁрьхЄЁют ш Їрщыр ъюэЇшуєЁрЎшш binkd ьюцхЄ юсэрЁєцшЄ№ ю°шсъш (эхтхЁэю єърчрээ√щ ярЁрьхЄЁ, юяхўрЄъш т Їрщых ъюэЇшуєЁрЎшш ш Є.я.). ┬ Єръшї ёшЄєрЎш ї binkd т√тюфшЄ фшруэюёЄшўхёъшх ёююс∙хэш  эр ¤ъЁрэ (Єюўэхх, т «ёЄрэфрЁЄэ√щ яюЄюъ ю°шсюъ», р т windows т эхъюЄюЁ√ї ёыєўр ї ш т юъэю Єшяр «alert» эр ¤ъЁрэ ъюэёюыш ъюья№■ЄхЁр).

┬ ёыєўрх єёях°эюую ўЄхэш  Їрщыр ъюэЇшуєЁрЎшш binkd шэшЎшрышчшЁєхЄ ёхЁтхЁэ√щ ш ъышхэЄёъшщ яЁюЎхёё√ (яюЄюъш т ьэюуюяюЄюўэ√ї ╬╤). ╨рчєьххЄё , ёююЄтхЄёЄтє■∙шщ яЁюЎхёё (яюЄюъ) шэшЎшрышчшЁєхЄё  Єюы№ъю Єюуфр, ъюуфр юэ эх чряЁх∙╕э юяЎш ьш «-c», «-s» ш фшЁхъЄштрьш Їрщыр ъюэЇшуєЁрЎшш «maxservers», «maxclients»: єърчрэшх т ъюьрэфэющ ёЄЁюъх юфэющ юяЎшш «-c» схч юяЎшш «-s» ышсю єърчрэшх т Їрщых ъюэЇшуєЁрЎшш «maxservers 0» чряЁх∙рхЄ чряєёъ ёхЁтхЁэюую яЁюЎхёёр; єърчрэшх т ъюьрэфэющ ёЄЁюъх юфэющ юяЎшш «-s» схч юяЎшш «-c» ышсю єърчрэшх т Їрщых ъюэЇшуєЁрЎшш «maxclients 0» чряЁх∙рхЄ чряєёъ ъышхэЄёъюую яЁюЎхёёр. ╙ўЄшЄх, ўЄю юяЎш  «-p» яюфЁрчєьхтрхЄ Єръцх ш фхщёЄтшх юяЎшш «-c». ┬ ёыєўрх шёяюы№чютрэш  юяЎшш «-p» binkd шэшЎшшЁєхЄ ъышхэЄёъшщ яЁюЎхёё, ъюЄюЁ√щ яЁш юсэрЁєцхэшш яєёЄющ юўхЁхфш чртхЁ°рхЄ ЁрсюЄє binkd. ▌Єр тючьюцэюёЄ№ шёяюы№чєхЄё  фы  юёє∙хёЄтыхэш  Ёрчютюую т√чютр ышэър(ют), ўрёЄю ёютьхёЄэю ё юяЎшхщ «-P<address>».

┬ ёыєўрх ЁрсюЄ√ ш ъышхэЄёъющ, ш ёхЁтхЁэющ ўрёЄш binkd тчршьюфхщёЄтшх ъышхэЄёъюую ш ёхЁтхЁэюую яЁюЎхёёр юёє∙хёЄты хЄё  ёю ёЄюЁюэ√ ёхЁтхЁэюую яЁюЎхёёр, яюёъюы№ъє юэ  ты хЄё  «ЁюфшЄхыхь» яю юЄэю°хэш■ ъ ъышхэЄёъюьє яЁюЎхёёє. ╥ръцх т ¤Єюь ёыєўрх ёхЁтхЁэ√щ яЁюЎхёё єяЁрты хЄ юсЁрсюЄъющ ёшуэрыют, яхЁхчряєёъюь (яЁш шчьхэхэшш ъюэЇшуєЁрЎшюээюую Їрщыр ышсю яю ёшуэрыє) ш чртхЁ°хэшхь ЁрсюЄ√ binkd. ┼ёыш цх ёхЁтхЁэр  ўрёЄ№ binkd чряЁх∙хэр, юсЁрсюЄъющ ёшуэрыют чрэшьрхЄё  юёэютэющ ъышхэЄёъшщ яЁюЎхёё.

╧Ёш шэшЎшрЎшш ёхрэёр ёт чш (ъръ тїюф ∙хую, Єръ ш шёїюф ∙хую) binkd ёючфр╕Є ёяхЎшры№э√щ яЁюЎхёё (яюЄюъ) фы  хую юсЁрсюЄъш. ╥ръшь юсЁрчюь ьэюуючрфрўэ√х тючьюцэюёЄш ╬╤ шёяюы№чє■Єё  фы  єяЁю∙хэш  ъюфр. ▌ЄюЄ яюфїюф эръырф√трхЄ юуЁрэшўхэшх т юфшэ ёхрэё ёт чш фы  binkd т юфэючрфрўэ√ї ╬╤ (эряЁшьхЁ, т DOS).

6.1. ╧ЁюЄюъюышЁютрэшх.

┬ яЁюЎхёёх ЁрсюЄ√ binkd ьюцхЄ ёююс∙рЄ№ шэЇюЁьрЎш■ ю яЁютюфшь√ї фхщёЄтш ї ш шї Ёхчєы№ЄрЄрї яєЄ╕ь т√тюфр шэЇюЁьрЎшюээ√ї ёююс∙хэшщ эр ¤ъЁрэ (ъюэёюы№) ш т Їрщы яЁюЄюъюыр (log-Їрщы). ┬√тюф шэЇюЁьрЎшш эр ¤ъЁрэ ЁхуєышЁєхЄё  юяЎшхщ «-q» ш ярЁрьхЄЁрьш Їрщыр ъюэЇшуєЁрЎшш «conlog» ш «printq». ╧ЁюЄюъюышЁютрэшх т Їрщы юяЁхфхы хЄё  ярЁрьхЄЁрьш Їрщыр ъюэЇшуєЁрЎшш «log» ш «loglevel», Єръцх т ╬╤ ёхьхщёЄтр Unix ьюцхЄ шёяюы№чтюрЄ№ё  т√тюф ёююс∙хэшщ т ёшёЄхьэє■ ёыєцсє syslog, ўЄю чрфр╕Єё  ярЁрьхЄЁюь.Їрщыр ъюэЇшуєЁрЎшш «syslog».

─ы  юс√ўэющ ЁрсюЄ√ єЁютхэ№ яЁюЄюъюышЁютрэш  єёЄрэртыштрхЄё  т чэрўхэшх юЄ 0 фю 4 (чэрўхэшх 4 яЁхфырурхЄё  т яЁшьхЁх Їрщыр ъюэЇшуєЁрЎшш, яюёЄрты хьюь т фшёЄЁшсєЄштх binkd). ╙Ёютэш 5 ш 6 шёяюы№чє■Єё  фы  т√ ёэхэш  эхяюырфюъ ё Їрщырьш т юўхЁхфш (єЁютхэ№ 5) ш фы  т√ тыхэш  ю°шсюъ т ёюхфшэхэшш ё єфры╕ээ√ь єчыюь (єЁютхэ№ 6). ╙Ёютэш сюыхх 6 шёяюы№чє■Єё  фы  юЄырфъш ш Ёхъюьхэфє■Єё  ЁрчЁрсюЄўшърьш фы  шёяюы№чютрэш  т юЄў╕Єрї юс юсэрЁєцхээ√ї ю°шсърї т яЁюуЁрььх.

6.2. ╚ёїюф ∙шх ёюхфшэхэш  (binkd-client).

╩ръ єърчрэю т√°х, фы  ърцфюую шёїюф ∙хую ёхрэёр ёт чш ёючфр╕Єё  ётющ яЁюЎхёё (яюЄюъ). ▌ЄюЄ яЁюЎхёё юяЁхфхы хЄ рфЁхё IP ышэър шч DNS шыш Їрщыр ъюэЇшуєЁрЎшш, юёє∙хёЄты хЄ яюя√Єъє ёюхфшэхэш  ё ышэъюь, т ёыєўрх эхєфрўш яютЄюЁ хЄ яюя√Єъє чрфрээюх т фшЁхъЄштх try ўшёыю Ёрч, р т ёыєўрх єфрўш яЁютюфшЄ ёхрэё ёт чш, чрЄхь чряшё√трхЄ Ёхчєы№ЄрЄ ЁрсюЄ√ т Їрщы *.try т ърЄрыюух яюўЄютющ юўхЁхфш ш чртхЁ°рхЄё  ё ъюфюь тючтЁрЄр, ёююс∙р■∙шь юс єёях°эющ ЁрсюЄх (ъюф 0) шыш юс ю°шсъх.

╨рсюЄющ ъышхэЄёъющ ўрёЄш binkd єяЁрты хЄ Єръ эрч√трхь√щ «ьхэхфцхЁ ъышхэЄют» (client manager). ▌Єю яюфяЁюуЁрььр, ъюЄюЁр  яЁюшчтюфшЄ яхЁшюфшўхёъшщ яЁюёьюЄЁ ърЄрыюуют яюўЄютющ юўхЁхфш ш тёхї Їрщы-сюъёют, ш чряєёърхЄ яЁюЎхёё (яюЄюъ) фы  єёЄрэютыхэш  ёюхфшэхэш  ш юЄяЁртъш яюўЄ√ яЁш эрышўшш «ръЄштэющ» яюўЄ√ (Є.х. яюўЄ√, ЄЁхсє■∙хщ юЄяЁртъш т эрёЄю ∙шщ ьюьхэЄ тЁхьхэш).

╤юхфшэхэшх шэшЎшшЁєхЄё  (Є.х. чряєёърхЄё  ёююЄтхЄёЄтє■∙шщ ъышхэЄёъшщ яЁюЎхёё шыш яюЄюъ) яЁш эрышўшш яюўЄ√ ё рЄЁшсєЄрьш «normal», «direct», «crash», «immediate» ш эх шэшЎшшЁєхЄё  яЁш эрышўшш яюўЄ√ ё рЄЁшсєЄюь «hold», шёїюф ∙шьш FREQ (Їрщырьш *.req) ш Їрщырьш т Їрщысюъёрї.

6.2.1. └ыуюЁшЄь ЁрсюЄ√ ьхэхфцхЁр ъышхэЄют.

╨рёёьюЄЁшь яюфЁюсэю ЁрсюЄє ьхэхфцхЁр ъышхэЄют.

╤Ёрчє цх яюёых чряєёър ьхэхфцхЁр ъышхэЄют юэ яЁюёьрЄЁштрхЄ (ёърэшЁєхЄ) яюўЄютє■ юўхЁхф№: ърЄрыюуш яюўЄютющ юўхЁхфш (outbound), ш Їрщы-сюъё√ – ъръ юс· тыхээ√х т Їрщых ъюэЇшуєЁрЎшш Їрщы-сюъё√ ёЄшыхщ ьхщыхЁют «T-mail» ш «The Brake!», Єръ ш юяшёрээ√х т фшЁхъЄштрї «node» яхЁёюэры№э√х Їрщы-сюъё√ ышэъют. ┬ ёыєўрх эрышўш  «ръЄштэющ» яюўЄ√ (ёь. я. 6.1) фы  ышэър, юЄёєЄётшш ё эшь ръЄштэюую ёюхфшэхэш  ш яЁш шчтхёЄэюь рфЁхёх IP ышсю фюьхээюь шьхэш ¤Єюую ышэър ьхэхфцхЁ ъышхэЄют чряєёърхЄ яЁюЎхфєЁє шэшЎшшЁютрэш  ёюхфшэхэш , фы  ёхую ёючфр╕Є яЁюЎхёё (яюЄюъ), ъюЄюЁ√щ ЁрсюЄрхЄ ё ¤Єшь ышэъюь. ╥ръ яЁюшёїюфшЄ фю Єюую ьюьхэЄр, яюър ўшёыю чряє∙хээ√ї ъышхэЄёъшї яЁюЎхёёют (яюЄюъют) эх фюёЄшуыю чэрўхэш  фшЁхъЄшт√ «maxclients» Їрщыр ъюэЇшуєЁрЎшш ышсю яюўЄютр  юўхЁхф№ эх шёўхЁярхЄё . ┬ ёыєўрх фюёЄшцхэш  яЁхфхыр «maxclients» ьхэхфцхЁ ъышхэЄют фхырхЄ ярєчє фышЄхы№эюёЄ№■ «call-delay» ш чрЄхь яютЄюЁ хЄ яЁютхЁъє ўшёыр чряє∙хээ√ї ъышхэЄёъшї яЁюЎхёёют. ╧ю шёўхЁярэшш яюўЄютющ юўхЁхфш ьхэхфцхЁ ъышхэЄют фхырхЄ ярєчє фышЄхы№эюёЄ№■ «rescan-delay». ╧юёых ёърэшЁютрэш  яюўЄютющ юўхЁхфш, хёыш юэр яєёЄр, эхЄ ръЄштэ√ї ёхрэёют ёт чш ш binkd чряє∙хэ ё юяЎшхщ «-P», ьхэхфцхЁ ъышхэЄют чртхЁ°рхЄ ЁрсюЄє binkd. ╘юЁьры№эю рыуюЁшЄь юяшёрэ т ЄрсышЎх 6.2.1.

╥рсышЎр 6.2.1

─хщёЄтшх

╤ыхфє■∙шщ

1

╚эшЎшрышчрЎш .

2

2

╤ърэшЁютрэшх яюўЄютющ юўхЁхфш ш ёюёЄртыхэшх ёяшёър ышэъют, фы  ъюЄюЁ√ї шьххЄё  яюўЄр.

3

3

╬ўхЁхф№ яєёЄр?

─р: 9.
═хЄ: 4.

4

┬√сюЁ юўхЁхфэюую ышэър шч юўхЁхфш.

5

5

╧юўЄр эр ышэър «ръЄштэр»? (яюўЄр ё рЄЁшсєЄрьш «normal», «direct», «crash», «immediate»; эхЄ Їрщыр *.hld фы  ышэър шыш тЁхь , єърчрээюх т Їрщых *.hld, єцх яЁю°ыю, ёяшёюъ шэЄхЁэхЄ-рфЁхёют ышэър эхяєёЄющ)

─р: 6.
═хЄ: 4.

6

╫шёыю чряє∙хээ√ї ъышхэЄёъшї яЁюЎхёёют (яюЄюъют) ьхэ№°х «maxclients»?

─р: 8.
═хЄ: 7.

7

╧рєчр эр тЁхь  «call-delay»

6

8

╟ряєёъ ъышхэЄёъюую яЁюЎхёёр (яюЄюър) фы  ышэър.

4

9

Binkd чряє∙хэ ё юяЎшхщ «-p» ш ўшёыю чряє∙хээ√ї ъышхэЄёъшї яЁюЎхёёют = 0?

─р: 11.
═хЄ: 10.

10

╧рєчр эр тЁхь  «rescan-delay»

2

11

╟ртхЁ°хэшх.




6.2.2. ╬яшёрэшх ЁрсюЄ√ ъышхэЄёъюую яЁюЎхёёр.

╨рёёьюЄЁшь яюфЁюсэю ЁрсюЄє ъышхэЄёъюую яЁюЎхёёр: яЁюЎхёёр (шыш яюЄюър т ьэюуюяюЄюўэ√ї трЁшрэЄрї binkd), ъюЄюЁ√щ юёє∙хёЄты хЄ ёюхфшэхэшх ё єфры╕ээ√ь єчыюь ш яЁютюфшЄ ёхрэё ёт чш.

╩ышхэЄёъшщ яЁюЎхёё ёЄрЁЄєхЄ шч ьхэхфцхЁр ъышхэЄют яюёых ЇюЁьшЁютрэш  эхяєёЄющ юўхЁхфш Їрщыют, яЁхфэрчэрўхээ√ї эхъюЄюЁюьє ышэъє. ╧Ёш т√чютх ъышхэЄёъшщ яЁюЎхёё яюыєўрхЄ ярЁрьхЄЁ√ ышэър ш ёяшёюъ Їрщыют эр юЄяЁртъє, т√сЁрээ√щ шч яюўЄютющ юўхЁхфш.

╩ышхэЄёъшщ яЁюЎхёё яюёых ёЄрЁЄр т√сшЁрхЄ яхЁтюх фюьхээюх шь  шыш рфЁхё IP ышэър шч єърчрээ√ї т фшЁхъЄштх Їрщыр ъюэЇшуєЁрЎшш node ышсю, т ёыєўрх х╕ юЄёєЄётш , defnode. (┼ёыш єърчрээ ёшьтюы «*», х∙╕ фю т√чютр ъышхэЄёъюую яЁюЎхёёр яЁютюфшЄё  яЁхюсЁрчютрэшх ъ тшфє pNN.fNNN.nNNNN.zN.fidonet.net ёюуырёэю FSP-1026 (тьхёЄю fidonet.net ьюцхЄ с√Є№ єърчрэ фЁєующ ъюЁэхтющ фюьхэ). ┬ Єюь ёыєўрх, хёыш т√сЁрээ√щ рфЁхё internet яЁхфёЄрты хЄ ёюсющ фюьхээюх шь , яЁюшчтюфшЄё  чряЁюё ъ ╬╤ ю ЁрчЁх°хэшш шьхэш т рфЁхё IP. ┬ ёыєўрх юЄёєЄёЄтш  рфЁхёр IP є єърчрээюую фюьхээюую шьхэш ЁрсюЄр яЁюшчтюфшЄё  т√сюЁър ёыхфє■∙хую шэЄхЁэхЄ-рфЁхёр ышэър. ╩юуфр тёх шэЄхЁэхЄ-рфЁхёр ышэър чрърэўштр■Єё , ъышхэЄёъшщ яЁюЎхёё чртхЁ°рхЄё .

╧юёых юяЁхфхыхэш  рфЁхёр IP ышэър яЁюшчтюфшЄё  яюя√Єър єёЄрэютыхэш  ёюхфшэхэш  TCP. ┬ ёыєўрх єърчрэш  ёяхЎшЇшўэюую фы  ышэър яюЁЄр TCP яЁюшчтюфшЄё  ёюхфшэхэшх ё єърчрээ√ь яюЁЄюь, яю єьюыўрэш■ цх шёяюы№чєхЄё  яюЁЄ 24554. ╧хЁхф яюя√Єъющ єёЄрэютшЄ№ ёюхфшэхэшх TCP т√ёЄрты хЄё  ЄрщьхЁ, єърчрээ√щ т фшЁхъЄштх Їрщыр ъюэЇшуєЁрЎшш «connect-timeout» (хёыш ¤Єр фшЁхъЄштр яЁшёєЄёЄтєхЄ т ъюэЇшуєЁрЎшш binkd) ш ёыєўрх юЄёєЄёЄтш  юЄтхЄр TCP юЄ їюёЄр ышэър яю шёЄхўхэшш єърчрээюую тЁхьхэш яЁюЎхфєЁр єёЄрэютъш ёюхфшэхэш  яЁхЁ√трхЄё .

┬ ёыєўрх єёЄрэютыхэш  ёюхфшэхэш  TCP яЁютхЁ хЄё  яЁхф· тыхээ√щ єфры╕ээ√ь єчыюь рфЁхё ш яюффхЁцштрхь√х шь тхЁёшш ш Ёрё°шЁхэш  яЁюЄюъюыр binkp, Єръцх юЄё√ырхЄё  ёюсёЄтхээр  Єрър  шэЇюЁьрЎш . ┬ ёыєўрх ёютярфхэш  юфэюую шч яЁхф· тыхээ√ї єфры╕ээющ ёЄюЁюэющ рфЁхёр FTN ё т√ч√трхь√ь рфЁхёюь яЁютюфшЄё  яЁюЎхфєЁр рєЄхэЄшЇшърЎшш эр єфры╕ээюь єчых (юЄяЁрты хЄё  ярЁюы№ шыш фрщфцхёЄ ярЁюы  – т чртшёшьюёЄш юЄ чряЁю°хээюую єфры╕ээющ ёЄюЁюэющ ёяюёюср рєЄхэЄшЇшърЎшш). ┬ ёыєўрх єёях°эющ рєЄхэЄшЇшърЎшш яЁютюфшЄё  юсьхэ Їрщырьш.

┬ ёыєўрх ЁрсюЄ√ яю яЁюЄюъюыє binkp 1.1 яю чртхЁ°хэшш яЁюЎхфєЁ√ юсьхэр Їрщырьш яЁютюфшЄё  яютЄюЁэюх ёърэшЁютрэшх яюўЄютющ юўхЁхфш ш ЇюЁьшЁютрэшх Їрщыют фы  юЄяЁртъш. ┼ёыш эют√ї Їрщыют эхЄ эш ё эр°хщ, эш ё єфры╕ээющ ёЄюЁюэ√ – ёхрэё чртхЁ°рхЄё .

6.2.3. ╬фэюъЁрЄэю чрсЁрЄ№ ш юЄюёырЄ№ яюўЄє.

╬ёє∙хёЄтшЄ№ юфшэюўэ√щ т√чют юёэютэюую ышэър – Єшяшўэр  чрфрўр юъюэхўэюую яюы№чютрЄхы  (point, яющэЄ) ёхЄш FIDOnet (шыш фЁєующ ёхЄш, яюёЄЁюхээющ яю Єхїэюыюушш FTN). ┬ binkd фы  ¤Єюую яЁхфєёяюЄЁхэ ёяхЎшры№э√щ Ёхцшь ЁрсюЄ√, чрфртрхь√щ юяЎш ьш ъюьрэфэющ ёЄЁюъш «-p» ш «-P». ╬яЎш  «-P» фы  ёючфрэш  т яюўЄютющ юўхЁхфш яєёЄюую Їрщыр, шэшЎшшЁє∙хую ёюхфшэхэшх, р юяЎш  «-p» шёяюы№чєхЄё  фы  чряєёър ъышхэЄёъющ ўрёЄш binkd ш чртхЁ°хэш  ЁрсюЄ√ яюёых юёє∙хёЄтыхэш  ёхрэёр ёт чш (ышсю шёўхЁярэш  ўшёыр яюя√Єюъ ёюхфшэшЄ№ё ). ▌Єш юяЎшш ьюцэю шёяюы№чютрЄ№ ш яю юЄфхы№эюёЄш, эю эрфю єўшЄ√трЄ№, ўЄю єърчрэшх юяЎшш «-P» схч юяЎшш «-p» ЁрчЁх°рхЄ ЁрсюЄє ёхЁтхЁэющ ўрёЄш binkd ш яю чртхЁ°хэшш тёхї ёюхфшэхэшщ binkd эх сєфхЄ ёрьюёЄю Єхы№эю чртхЁ°рЄ№ё . ╧ю¤Єюьє шёяюы№чютрэшх юяЎшш «-P» схч юяЎшш «-p» ьрыюяЁшьхэшью. ┼ёыш цх юяЎш  «-p» шёяюы№чєхЄё  схч юяЎшш «-P», binkd чртхЁ°шЄё  ёЁрчє т Єюь ёыєўрх, ъюуфр юўхЁхф№ эр юЄяЁртъє яєёЄр ш юёє∙хёЄтшЄ т√чют хёыш т юўхЁхфш шьх■Єё  Їрщы√. ▌Єю ьюцхЄ шёяюы№чютрЄ№ё , эряЁшьхЁ, фы  юЄяЁртъш шёїюф ∙хщ яюўЄ√ т Єюь ёыєўрх, ъюуфр фхЁцрЄ№ binkd яюёЄю ээю ЁрсюЄр■∙шь эхЎхыхёююсЁрчэю (эряЁшьхЁ, т ёыєўрх ъюьєЄшЁєхьюую ёхрэёютюую яюфъы■ўхэш  ъ Internet).

╧ЁшьхЁ т√чютр єчыр 3:712/848@fidonet:

binkd -P 3:712/848@fidonet -p binkd.cfg

╬фэюъЁрЄэ√щ т√чют ьюцэю шёяюы№чютрЄ№ фы  юёє∙хёЄтыхэш  т√чютют ы■сюую ъюышўхёЄтр ышэъют, фы  ўхую эр ърцфюую шч эшї фюыцэ√ с√Є№ Їрщы√ т юўхЁхфш эр юЄяЁртъє (шыш фы  ърцфюую эєцэю єърчрЄ№ юяЎш■ «-P» хую рфЁхёюь). ┴юыхх Єюую, т ёыєўрх эхяєёЄющ юўхЁхфш binkd сєфхЄ я√ЄрЄ№ё  єёЄрэютшЄ№ ёюхфшэхэшх ёю тёхьш шчтхёЄэ√ьш хьє ышэърьш, фы  ъюЄюЁ√ї шьххЄё  яюўЄр.

═р ЁрсюЄє binkd т Ёхцшьх юфэюъЁрЄэюую т√чютр эхяюёЁхфёЄтхээю тыш ■Є фшЁхъЄшт√ Їрщыр ъюэЇшуєЁрЎшш: rescan-delay, try, maxclients, Єръцх ьюцхЄ яютыш Є№ фшЁхъЄштр call-delay (т ёыєўрх, ъюуфр ўшёыю ышэъют т юўхЁхфш сюы№°х ўшёыр maxclients) ш т эхъюЄюЁ√ї ёшЄєрЎш ї ьюуєЄ тыш Є№ фшЁхъЄшт√ defnode ш connect-timeout.

─шЁхъЄштр rescan-delay ётюшь яюсюўэ√ь фхщёЄтшхь чрфрхЄ ярєчє яхЁхф Єхь, ъръ binkd чртхЁ°шЄ ЁрсюЄє. ┬ ёыєўрх эхфюёЄєяэюёЄш ъръюую-ышсю ышэър фшЁхъЄштр connect-timeout шьххЄ чэрўхэшх, хёыш юэр ьхэ№°х ЄрщьрєЄр TCP ёхЄхтюую фЁрщтхЁр юяхЁрЎшюээющ ёшёЄхь√. ─шЁхъЄштр try т ёыєўрх эхфюёЄєяэюёЄш ышэър ш яЁш юЄёєЄёЄтшш юЄтхЄр эр чряЁюё єёЄрэютыхэш  ёюхфшэхэш  TCP Єръцх ьюцхЄ тэхёЄш чрфхЁцъє эр тЁхь  try*<ЄрщьрєЄ єёЄрэютыхэш  ёхрэёр TCP> (ЄрщьрєЄ тю ьэюушї ╬╤ Ёртхэ ьшэєЄх) ышсю эр тЁхь  try*connect-timeout (т чртшёшьюёЄш юЄ Єюую, ъръющ ЄрщьрєЄ ьхэ№°х).

┬ ёыєўрх єърчрэш  т фшЁхъЄштх defnode чт╕чфюўъш т яюых рфЁхёр IP binkd сєфхЄ Єръцх я√ЄрЄ№ё  юЄяЁртшЄ№ яюўЄє эр эхюс· тыхээ√х  тэю т Їрщых ъюэЇшуєЁрЎшш рфЁхёр (хёыш ърър -ышсю яюўЄр шьххЄё  т яюўЄютющ юўхЁхфш).

6.2.3. ╧юёЄю ээю ЁрсюЄр■∙шщ binkd-client.

┬ ёыєўрх, ъюуфр є яющэЄр ёхЄш FIDOnet (шыш фЁєующ FTN-ёютьхёЄшьющ ёхЄш) шьххЄё  яюёЄю ээю тъы■ўхээ√щ ъюья№■ЄхЁр ё т√їюфюь т internet, ёшёюя ьюцхЄ шёяюы№чютрЄ№ binkd ЁрсюЄр■∙шь яюёЄю ээю. ╧Ёш ¤Єюь binkd сєфхЄ юёє∙хёЄты Є№ т√чют яюёых Єюую, ъръ т хую яюўЄютющ юўхЁхфш юърцхЄё  ўЄю-Єю ЄЁхсє■∙хх юЄяЁртъш. ╧ЁютхЁър яюўЄютющ юўхЁхфш яЁютюфшЄё  ё яхЁшюфюь, єърчрээ√ь т фшЁхъЄштх «rescan-delay» (т ёхъєэфрї). (═х чрс√трщЄх, Ёхў№ шф╕Є ю яющэЄх, ъюЄюЁюьє эхюс чрЄхы№эю яЁшэшьрЄ№ тїюф ∙шх ёюхфшэхэш , р шэюуфр юэ ш эх шьххЄ Єръющ тючьюцэюёЄш, эряЁшьхЁ, т ёыєўрх, ъюуфр ъюья№■ЄхЁ эх шьххЄ яєсышўэюую IP рфЁхёр ш шёяюы№чєхЄё  NAT - Network Address Translation).

─ы  ЁрсюЄ√ т Ёхцшьх ъышхэЄр шёяюы№чєхЄё  юяЎш  ъюьрэфэющ ёЄЁюъш «-c» схч єърчрэш  юяЎшш «-s». ┬ ╬╤ ёхьхщёЄтр UNIX т ёыєўрх ЁрсюЄ√ binkd т Їюэютюь Ёхцшьх (Є.э. Ёхцшьх фхьюэр) шёяюы№чєхЄё  Єръцх юяЎш  «-D», яЁш ¤Єюь binkd яюёых шэшЎшрышчрЎшш юЄёюхфшэ хЄё  юЄ ъюэёюыш ш ЁрсюЄрхЄ схч т√тюфр шэЇюЁьрЎшш эр ¤ъЁрэ. ┬ 32-ї сшЄэ√ї тхЁёш ї ╬╤ Windows яЁш шёяюы№чютрэшш юяЎшш «-T» юъэю binkd ьюцхЄ с√Є№ ёяЁ Єрэю, яЁш ¤Єюь т ёшёЄхьэ√щ ЄЁ¤щ яюьх∙рхЄё  юЁшушэры№эр  шъюэър. ╥ръцх т ╬╤ Windows 95 (98, Me) ьюцэю шёяюы№чтюрЄ№ ёяхЎшры№эє■ тхЁёш■ binkd/w9x, ъюЄюЁр  тёхуфр ЁрсюЄрхЄ т Їюэютюь Ёхцшьх ш яЁхфэрчэрўхэр фы  шёяюы№чютрэш  т ърўхёЄтх «ёхЁтшёр» Windows 9x, р т ╬╤ Windows NT (2000, XP, 2003) ьюцэю єёЄрэютшЄ№ binkd т ърўхёЄтх ёшёЄхьэюую ёхЁтшёр ё яюью∙№■ юяЎшщ «-i» ш «-S» (яюфЁюсэхх ёь. юяшёрэш  ¤Єшї юяЎшщ).

╧ЁшьхЁ яЁюёЄюую чряєёър binkd т ърўхёЄтх ъышхэЄр:

binkd -ё binkd.cfg

╧ЁшьхЁ чряєёър binkd т ърўхёЄтх ъышхэЄр т Ёхцшьх фхьюэр (т ╬╤ ёхьхщёЄтр UNIX):

/usr/local/sbin/binkd -ёD /usr/local/etc/binkd/binkd.conf

╧ЁшьхЁ чряєёър binkd т ърўхёЄтх ъышхэЄр ёт╕ЁэєЄ√ь т ёшёЄхьэ√щ ЄЁ¤щ т Windows:

start /min binkd.exe -ёT binkd.cfg

╧ЁшьхЁ√ єёЄрэютъш ш чряєёър binkd-ъышхэЄр ёхЁтшёюь Windows NT (ё шьхэхь ёхЁтшёр яю єьюыўрэш■ ш ё єърчрэшхь шьхэш):

binkd.exe -ёi binkd.cfg

binkd.exe -ёi -S "binkd client" binkd.cfg

╧ЁшьхЁ√ єёЄрэютъш ш чряєёър binkd-ъышхэЄр ёхЁтшёюь Windows 9x, (ё шьхэхь ёхЁтшёр яю єьюыўрэш■ ш ё єърчрэшхь шьхэш):

binkd9x.exe -ёi binkd.cfg

binkd9x.exe -ёi -S "client only binkd" binkd.cfg

6.3. ┬їюф ∙хх ёюхфшэхэшх (binkd-server).

Binkd, ЁрсюЄр■∙шщ т Ёхцшьх ёхЁтхЁр (binkd-ёхЁтхЁ), Єюы№ъю цф╕Є ш юсЁрсрЄ√трхЄ тїюф ∙шх ёюхфшэхэш , ёрь цх эх шэшЎшшЁєхЄ ёюхфшэхэш  ё фЁєушьш єчырьш. ─ы  ърцфюую тїюф ∙хую ёюхфшэхэш  ёючфр╕Єё  юЄфхы№э√щ яЁюЎхёё (яюЄюъ т ьэюуюяюЄюўэ√ї ╬╤). ╤ючфрэшхь ш єяЁртыхэшхь ёхЁтхЁэ√ьш яюЄюърьш чрэшьрхЄё  ёяхЎшры№э√щ яЁюЎхёё - «ьхэхфцхЁ ёхЁтхЁр».

6.3.1. └ыуюЁшЄь ЁрсюЄ√ ьхэхфцхЁр ёхЁтхЁр.

╠хэхфцхЁ ёхЁтхЁр юЄъЁ√трхЄ ёюъхЄ Єшяр TCP ш цф╕Є ёюхфшэхэш  юЄ єфры╕ээюую єчыр. ╧Ёш єёЄрэютыхэшш тїюф ∙хую ёюхфшэхэш  TCP ьхэхфцхЁ ёхЁтхЁр ёючфр╕Є эют√щ яЁюЎхёё (яюЄюъ т ьэюуюяюЄюўэ√ї ╬╤), ъюЄюЁ√щ юсЁрсрЄ√трхЄ ¤Єю ёюхфшэхэшх. ╠хэхфцхЁ ёхЁтхЁр юЄёыхцштрхЄ ъюышўхёЄтю юфэютЁхьхээю ЁрсюЄр■∙шї ёхЁтхЁэ√ь яЁюЎхёёют (яюЄюъют).

─Ёєур  чрфрўр ьхэхфцхЁр ёхЁтхЁр – юЄёыхцштрЄ№ шчьхэхэшх Їрщыр ъюэЇшуєЁрЎшш. ╨хръЎш  эр шчьхэхэшх Їрщыр ъюэЇшур чртшёшЄ юЄ юяхЁрЎшюээющ ёшёЄхь√ ш юЄ ъюьяшы ЄюЁр. ┬ ╬╤ ёхьхщётр UNIX шэшЎшшЁєхЄё  яхЁхчряєёъ binkd, т ╬╤ Windows ш т юфэючрфрўэ√ї ╬╤ binkd чртхЁ°рхЄё  ё ъюфюь тючтЁрЄр 3. (┬ ёыхфє■∙шї тхЁёш ї ¤Єю сєфхЄ шчьхэхэю, сєф№Єх тэшьрЄхы№э√.)

6.3.2. └ыуюЁшЄь ЁрсюЄ√ ёхЁтхЁэюую яЁюЎхёёр.

╧юёых чряєёър ёхЁтхЁэ√щ яЁюЎхёё яЁютхЁ хЄ ўшёыю ЁрсюЄр■∙шї «ъюыыху» ш ёыєўрх яЁхт√°хэш  ышьшЄр, чрфрээюую т фшЁхъЄштх «maxservers» Їрщыр ъюэЇшуєЁрЎшш, эютюх тїюф ∙хх ёюхфшэхэшх чртхЁ°рхЄё , яЁш ¤Єюь єфры╕ээ√щ єчхы яюыєўрхЄ ёююс∙хэшх яЁюЄюъюыр binkp «M_BSY Too many servers».

╤ыхфюь яЁютюфшЄё  рэрышч шэЇюЁьрЎшш, яюыєўхээющ юЄ єфры╕ээющ ёЄюЁюэ√: рфЁхёр FTN, яюфхЁцштрхь√х тхЁёшш ш Ёрё°шЁхэш  яЁюЄюъюыр binkp. ─рыхх Єрър  шэЇюЁьрЎш  ю ёхсх юЄё√ырхЄё  фы  єфры╕ээющ ёЄюЁюэ√.

╟рЄхь яЁютюфшЄё  ярЁюы№эр  рєЄхэЄшЇшърЎш  т√чтрт°хщ ёЄюЁюэ√ (єфры╕ээюую ъышхэЄр), ш т ёыєўрх єёях°эющ яЁютхЁъш ярЁюы , яЁюшчтюфшЄё  яЁютхЁър Їрщыют-Їыруют чрэ ЄюёЄш рфЁхёют, яЁхф· тыхээ√ї єфры╕ээющ ёЄюЁюэющ (Їрщыют *.BSY). ┼ёыш фы  ъръшї-Єю рфЁхёют Їрщы√-Їыруш чрэ ЄюёЄш ёє∙хёЄтє■Є, ¤Єш рфЁхёр шёъы■ўр■Єё  шч ёяшёър.

─рыхх ЇюЁьшЁєхЄё  ёяшёюъ Їрщыют эр юЄяЁртъє ш яЁюшчтюфшЄё  юсьхэ Їрщырьш.

┬ ёыєўрх ЁрсюЄ√ яю яЁюЄюъюыє binkp 1.1 яю чртхЁ°хэшш яЁюЎхфєЁ√ юсьхэр Їрщырьш яЁютюфшЄё  яютЄюЁэюх ёърэшЁютрэшх яюўЄютющ юўхЁхфш ш ЇюЁьшЁютрэшх Їрщыют фы  юЄяЁртъш. ┼ёыш эют√ї Їрщыют эхЄ эш ё эр°хщ, эш ё єфры╕ээющ ёЄюЁюэ√ – ёхрэё чртхЁ°рхЄё .

6.3.3. ╚эЄхЁръЄштэр  ЁрсюЄр binkd-ёхЁтхЁ.

─ы  ЁрсюЄ√ т Ёхцшьх ёхЁтхЁр шёяюы№чєхЄё  юяЎш  ъюьрэфэющ ёЄЁюъш «-s» схч єърчрэш  юяЎшш «-c». ╧Ёш ¤Єюь binkd т√тюфшЄ шэЇюЁьрЎшюээ√х ёююс∙хэш  эр ётю■ ъюэёюы№, т чртшёшьюЄёш юЄ фшЁхъЄшт Їрщыр ъюэЇшуєЁрЎшш «conlog», «printq» ш «loglevel». ┬√тюф шэЇюЁьрЎшш эр ъюэёюы№ чряЁх∙рхЄ юяЎш  ъюьрэфэющ ёЄЁюъш «-q». ┬ ы■сюь ёыєўрх эр ъюэёюы№ т√тюф Єё  ёююс∙хэш  юс ю°шсърї т ъюьрэфэющ ёЄЁюъх, ю эхтючьюцэюёЄш чруЁєчшЄ№ Їрщы ъюэЇшуєЁрЎшш ш юс ю°шсърї т э╕ь. ┬ 32-ї сшЄэ√ї тхЁёш ї ╬╤ Windows яЁш шёяюы№чютрэшш юяЎшш «-T» юъэю binkd ьюцхЄ с√Є№ ёяЁ Єрэю, яЁш ¤Єюь т ёшёЄхьэ√щ ЄЁ¤щ яюьх∙рхЄё  юЁшушэры№эр  шъюэър.

╧ЁшьхЁ√ чряєёър binkd т Ёхцшьх «Єюы№ъю ёхЁтхЁ»:

binkd -s binkd.cfg

binkd.exe -sT binkd.cfg

6.3.4. ╨рсюЄр binkd-ёхЁтхЁ ёшёЄхьэющ ёыєцсющ.

┬ ёыєўрх эхюсїюфшьюёЄш яюёЄю ээющ ЁрсюЄ√ binkd т ърўхёЄтх ёхЁтхЁр, шьххЄ ёь√ёы чряєёърЄ№ хую ъръ ёшёЄхьэє■ ёыєцсє. ┬ ╬╤, юёэютрээ√ї эр UNIX, ёшёЄхьэ√х ёыєцс√ эрч√тр■Єё  «фхьюэрьш» («daemons»), т ╬╤ Windows - «ёхЁтшёрьш» шыш «ёыєцсрьш» («services»).

╧ЁшьхЁ чряєёър binkd-ёхЁтхЁ т Ёхцшьх фхьюэр: т UNIX:

/usr/local/sbin/binkd -Dqs /usr/local/etc/fido/binkd.conf

╧ЁшьхЁ єёЄрэютъш ш чряєёър binkd ёхЁтшёюь Windows:

binkd.exe -i binkd.cfg

╧ЁшьхЁ юёЄрэютъш ш єфрыхэш  ёхЁтшёр binkd т Windows:

binkd.exe -u

╧юфЁюсэюёЄш ю Єръюь шёяюы№чютрэшш binkd ёь. т Ёрчфхых 6.4.1.

6.3.5. ╨рсюЄр binkd-ёхЁтхЁ яюф єяЁртыхэшхь inetd.

┬ эхъюЄюЁ√ї юяхЁрЎшюээ√ї ёшёЄхьрї тючьюцэр ртЄюьрЄшўхёър  ЁрсюЄр binkd т Ёхцшьх ёхЁтхЁр яюф єяЁртыхэшхь inetd. ╧Ёш ¤Єюь ёыєцср inetd «ёыє°рхЄ» эрчэрўхээ√щ фы  binkd яюЁЄ ш чряєёърхЄ binkd яюёых єёЄрэютыхэш  ёюхфшэхэш  TCP. ┬ Єръюь Ёхцшьх binkd юсьхэштрхЄё  фрээ√ьш ё єфры╕ээ√ь єчыюь ўхЁхч ётюш ёЄрэфрЁЄэ√щ тїюфэющ ш т√їюфэющ яюЄюъш (stdin ш stdout т ЄхЁьшэрї  ч√ър яЁюуЁрььшЁютрэш  ╤). ╤т ч№ ьхцфє ¤Єшьш яюЄюърьш ш ёюъхЄюь TCP єёЄрэртыштрхЄ inetd. ╨рсюЄр Єръющ ёт чъш т эхъюЄюЁ√ї ёшЄєрЎш ї ¤ъюэюьшЄ шёяюы№чєхьє■ юяхЁрЄштэє■ ярь Є№ ш яЁюЎхёёюЁэюх тЁхь , яюёъюы№ъє binkd чряєёърхЄё  Єюы№ъю эр тЁхь  тїюф ∙хую ёхрэёр ёт чш.

─ы  ЁрсюЄ√ ёютьхёЄэю ё inetd є binkd, ёъюьяшышЁютрээюую фы  OS/2, Amiga шыш ╬╤ ёхьхщёЄтр UNIX, яЁхфєёьюЄЁхэр юяЎш  ъюьрэфэющ ёЄЁюъш «-i». ╧Ёш ¤Єюь, ўЄюс√ эх ёьх°штрЄ№ яхЁхфртрхь√х фрээ√х ш шэЇюЁьрЎшюээ√х ёююс∙хэш  binkd, ЄЁхсєхЄё  єърч√трЄ№ Єръцх юяЎш■ «-q» ышсю чряЁх∙рЄ№ т√тюф шэЇюЁьрЎшш эр ъюэёюы№ т Їрщых ъюэЇшуєЁрЎшш binkd (чръюььхэЄшЁютрЄ№ фшЁхъЄшт√ «conlog» ш «printq»).

═рўшэр■∙шх ўрёЄю фхыр■Є ю°шсъє, чрс√тр , ўЄю т Їрщых ъюэЇшуєЁрЎшш inetd эхюсїюфшью яхЁт√ь ярЁрьхЄЁюь єърч√трЄ№ шь  яЁюуЁрьь√.

╧ЁшьхЁ ёЄЁюъш чряєёър binkd т Їрщых ъюэЇшуєЁрЎшш inetd (inetd.conf) фы  ╬╤ ёхьхщёЄтр unix:

binkp stream tcp nowait root /usr/local/sbin/binkd binkd -isq /usr/local/etc/fido/binkd.conf

╧Ёш ¤Єюь т ёяшёъх тючьюцэ√ї яюЁЄют (Їрщы /etc/services) фюыцэр с√Є№ чряшё№ ю яЁюЄюъюых binkp:

binkp 24554/TCP

6.4. ╙эштхЁёры№э√щ Ёхцшь ЁрсюЄ√ binkd: ёхЁтхЁ+ъышхэЄ.

╥шяшўэ√ь яЁшьхэхэшхь binkd эр єчых FIDOnet  ты хЄё  хую ъюьсшэшЁтрээюх шёяюы№чютрэшх т ърўхёЄтх ъръ ъышхэЄр, Єръ ш ёхЁтхЁр. ╥ръющ Ёхцшь ЁрсюЄ√ т binkd ёфхырэ яю єьюыўрэш■ (Є.х. яЁш юЄёєЄётшш ъръшї-ышсю юяЎшщ ъюьрэфэющ ёЄЁюъш).

┬ ъюьсшэшЁютрээюь Ёхцшьх ьхэхфцхЁ ёхЁтхЁр ъЁюьх юсёыєцштрэш  ёхЁтхЁэющ ўрёЄш binkd, т√яюыэ хЄ Єръцх ЇєэъЎшш юс∙хую єяЁртыхэш : юЄёыхцштрхЄ шчьхэхэш  Їрщыр ъюэЇшуєЁрЎшш, юсЁрсрЄ√трхЄ ёшуэры√ ╬╤. ┬ юёЄры№эюь ЁрсюЄр ьхэхфцхЁр ёхЁтхЁр ш ьхэхфцхЁр ъышхэЄют binkd юёюсхээюёЄхщ эх шьххЄ.

╧ЁшьхЁ√ чряєёър binkd т єэштхЁёры№эюь Ёхцшьх (яхЁт√щ яЁшьхЁ – юс√ўэ√щ чряєёъ, тЄюЁющ яЁшьхЁ – чряєёъ т Windows ё тючьюцюёЄ№■ ёъЁ√Єш  юъэр binkd т ёшёЄхьэ√щ ЄЁ¤щ):

binkd binkd.cfg

binkd.exe -T binkd.cfg

6.4.1. ╨рсюЄр binkd схч єўрёЄш  яюы№чютрЄхы .

┬ ёыєўрх эхюсїюфшьюёЄш яюёЄю ээющ ЁрсюЄ√ binkd т ърўхёЄтх ёхЁтхЁр, шьххЄ ёь√ёы чряєёърЄ№ хую ъръ ёшёЄхьэє■ ёыєцсє. ┬ ╬╤, юёэютрээ√ї эр UNIX, ёшёЄхьэ√х ёыєцс√ эрч√тр■Єё  «фхьюэрьш» («daemons»), т ╬╤ Windows - «ёхЁтшёрьш» шыш «ёыєцсрьш» («services»). ┬ фЁєушї юяхЁрЎшюээ√ї ёшёЄхьрї ЁрсюЄр binkd т ърўхёЄтх ёшёЄхьэющ ёыєцс√ яЁхфєёьюЄЁхэр Єюы№ъю яюф єяЁртыхэшхь inetd (ёь. я.6.3.5), т ╬╤ ёхьхщёЄтр UNIX ЁрсюЄр binkd яюф єяЁртыхэшхь inetd Єръцх тючьюцэр.

6.4.1.1. ╤хЁтшё т Windows.

┬ ёыєўрх эхюсїюфшьюёЄш яюёЄю ээющ ЁрсюЄ√ binkd т ърўхёЄтх ёхЁтхЁр, шьххЄ ёь√ёы чряєёърЄ№ хую ъръ ёшёЄхьэє■ ёыєцсє. ┬ Windows ¤Єю ЁхрышчєхЄё  яєЄ╕ь єёЄрэютъш binkd ёшёЄхьэ√ь ёхЁтшёюь ё шёяюы№чютрэшхь юяЎшщ ъюьрэфэющ ёЄЁюъш «-i» ш «-S».

┬ Windows NT, Windows 2000 ь сюыхх яючфэшї тхЁёш ї ышэхщъш NT ёхЁтшё binkd яю єьюыўрэш■ т√тюфшЄ ётю╕ ъюэёюы№эюх юъэю эр ¤ъЁрэ яюёых Єюую, ъръ яюы№чютрЄхы№ чрыюушэшЄё  т ёшёЄхьє. ╙сЁрЄ№ хую ё ¤ъЁрэр ьюцэю фтєь  ёяюёюсрьш. ╧хЁт√щ ёяюёюс: єърчрЄ№ яЁш єёЄрэютъх binkd ёхЁтшёюь юяЎш■ ъюьрэфэющ ёЄЁюъш «-T», ш яЁш яю тыхэшш юъэр bikd ётхЁэєЄ№ хую т ёшёЄхьэ√щ ЄЁ¤щ ъэюяъющ ьшэшьшчрЎшш юъэр. ┬ЄюЁющ ёяюёюс – шчьхэшЄ№ эрёЄЁющъш ёшёЄхьэюую ёхЁтшёр, ёэ т яюьхЄъє «ЁрчЁх°шЄ№ тчршьюфхщёЄтшх ё Ёрсюўшь ёЄюыюь», т ¤Єюь ёыєўрх шьххЄ ёь√ёы чряЁхЄшЄ№ binkd т√тюфшЄ№ шэЇюЁьрЎш■ эр ъюэёюы№ (єърчрЄ№ юяЎш■ ъюьрэфэющ ёЄЁюъш «-q» яЁш єёЄрэютъх ёхЁтшёр ышсю чръюььхэЄшЁютрЄ№ фшЁхъЄшт√ «conlog» ш «printq» т Їрщых ъюэЇшуєЁрЎшш).

┬ Windows 95, Windows 98 ш Windows Me шч-чр юёюсхээюёЄхщ ЁхрышчрЎшш ЄхъёЄютющ ъюэёюыш т ¤Єшї тхЁёш ї ╬╤ яЁшїюфшЄё  шёяюы№чютрЄ№ ёяхЎшры№э√щ трЁшрэЄ шёяюыэ хьюую Їрщыр: binkd9x.exe, ъюЄюЁ√щ ЁрсюЄрхЄ схч яюёЄю ээющ ъюэёюыш (ёючфр╕Є ъюэёюы№ Єюы№ъю т эхюсїюфшь√ї ёыєўр ї эр эхсюы№°юх тЁхь ). ╚фхэЄшЇшЎшЁютрЄ№ ¤ЄюЄ трЁшрэЄ binkd ьюцэю яю эрышўш■ яюфёЄЁюъш Win9x т шэЇюЁьрЎшюээюь ёююс∙хэшш, т√тюфшь√ь binkd яЁш єърчрэшш юяЎшш ъюьрэфэющ ёЄЁюъш «-v», эряЁшьхЁ:

Binkd 0.9.8 (Nov 29 2004 13:47:40/Win9x)
Press any key...

╚ёяюы№чютрэшх binkd/win9x схч єёЄрэютъш хую ёхЁтшёюь т Windows 95 (98, Me) тючьюцэю, эю т ¤Єюь ёыєўрх юэ ЁрсюЄрхЄ шёъы■ўшЄхы№эю т Їюэютюь Ёхцшьх яюфюсэю фхьюэє т UNIX.

┬ Ўхы ї єыєў°хэш  схчюярёэюёЄш шёяюы№чютрэш  binkd т Ёхцшьх ёхЁтшёр т Windows NT (2000, XP, 2003) шьххЄ ёь√ёы эрчэрўшЄ№ хьє фы  ЁрсюЄ√ юЄфхы№эюую яюы№чютрЄхы , ъюЄюЁюьє ЁрчЁх°шЄ№ фюёЄєя Єюы№ъю ъ эєцэ√ь Їрщырь ш ърЄрыюурь.

╧ЁшьхЁ єёЄрэютъш ш чряєёър binkd ёхЁтшёюь Windows ё шьхэхь яю єьюыўрэш■ («binkd-service»):

binkd.exe -i binkd.cfg

╧ЁшьхЁ єёЄрэютъш ш чряєёър binkd ёхЁтшёюь Windows ё шьхэхь «Universal binkd» ё тючьюцэюёЄ№■ ёъЁ√Єш  юъэр т ёшёЄхьэ√щ ЄЁ¤щ:

binkd.exe -iTS "Universal binkd" binkd.cfg

╧ЁшьхЁ юёЄрэютъш ш єфрыхэш  ёхЁтшёр Windows ё шьхэхь «Universal binkd»:

binkd.exe -uS "Universal binkd"

╧ЁшьхЁ юёЄрэютъш ш єфрыхэш  ёхЁтшёр Windows ё шьхэхь «binkd-service» (шь  ёхЁтшёр binkd яю єьюыўрэш■):

binkd.exe -u

6.4.1.2. ─хьюэ т unix.

┬ ╬╤, юёэютрээ√ї эр UNIX, ёшёЄхьэ√х ёыєцс√ эрч√тр■Єё  «фхьюэрьш» («daemons») ш фы  чряєёър binkd т ърўхёЄтх фхьюэр шёяюы№чєхЄё  юяЎш  ъюьрэфэющ ёЄЁюъш «-D». ╧Ёш шёяюы№чютрэшш ¤Єющ юяЎшш binkd юЄёюхфшэ хЄё  юЄ ъюэёюыш ш ЁрсюЄрхЄ т Їюэютюь Ёхцшьх. ╧юёъюы№ъє ёт ч№ ё ъюэёюы№■ є фхьюэр юЄёєЄёЄтєхЄ, тё  шэЇюЁьрЎш , ъюЄюЁр  т шэЄхЁръЄштэюь Ёхцшьх т√тюфшЄё  эр ¤ъЁрэ, єїюфшЄ т «эшъєфр» ш шьххЄ ёь√ёы ёютьхёЄэю ё юяЎшхщ «-D» єърч√трЄ№ юяЎш■ «-q» ышсю чряЁх∙рЄ№ т√тюф эр ¤ъЁрэ т Їрщых ъюэЇшуєЁрЎшш, фы  ўхую чръюььхэЄшЁютрЄ№ фшЁхъЄшт√ «conlog» ш «printq».

╧ЁшьхЁ чряєёър binkd-ёхЁтхЁ т Ёхцшьх фхьюэр:

/usr/local/sbin/binkd -Dqs /usr/local/etc/fido/binkd.conf

╬с√ўэю ЁрсюЄр фхьюэюь эєцэр т эхяЁхЁ√тэюь Ёхцшьх - ўЄюс√ фхьюэ binkd чряєёърыё  т яЁюЎхёёх чруЁєчъш ╬╤. ─ы  ¤Єюую эєцэю тёЄртшЄ№ ёЄЁюъє чряєёър binkd т юфшэ шч ёЄрЁЄют√ї ёъЁшяЄют ╬╤, эряЁшьхЁ тю FreeBSD/OpenBSD/NetBSD т Їрщы /etc/rc.local. ╠юцэю Єръцх ёючфрЄ№ ёъЁшяЄ чряєёър/юёЄрэютъш binkd ш яюьхёЄшЄ№ хую т ърЄрыюу ёЄрЁЄют√ї ёъЁшяЄют: /etc/init.d (Linux) шыш /usr/local/etc/rc.d (FreeBSD). ╤ъЁшяЄ яЁшсышчшЄхы№эю Єръющ:

#!/bin/sh

case $1 in

start)
su fido -c «/usr/local/sbin/binkd -Dq /usr/local/etc/fido/binkd.conf»
;;

stop)
kill `cat /var/run/binkd.pid`
;;

esac



┬ Ўхы ї єыєў°хэш  схчюярёэюёЄш шёяюы№чютрэш  binkd шьххЄ ёь√ёы эрчэрўшЄ№ хьє фы  ЁрсюЄ√ юЄфхы№эюую яюы№чютрЄхы , ъюЄюЁюьє ЁрчЁх°шЄ№ фюёЄєя Єюы№ъю ъ эєцэ√ь Їрщырь ш ърЄрыюурь. ┬ючьюцэю Єръцх чряєёърЄ№ binkd ё шёяюы№чютрэшхь chroot.

6.4. ╨рсюЄр т чр∙ш∙хээющ (ъюЁяюЁрЄштэющ) ёхЄш.

═хЁхфъю binkd єёЄрэютыхэ эр їюёЄх, Ёрёяюыюцхээюь т чр∙ш∙╕ээюь ьхцёхЄхт√ь ¤ъЁрэюь ёхуьхэЄх ёхЄш (эряЁшьхЁ, эр ёхЁтхЁх ышсю ъюья№■ЄхЁх яюы№чютрЄхы  т юЁурэшчрЎшш). ─рцх хёыш юэ ЁрсюЄрхЄ эр ъюья№■ЄхЁх, эряЁ ьє■ яюфъы■ўхээюь ъ Internet, ёрь ъюья№■ЄхЁ т ёютЁхьхээюь ьшЁх фюыцхэ с√Є№ чр∙ш∙╕э юЄ яЁюшчтюы№эюую фюёЄєяр шч Internet (юЄ тшЁєёют, юЄ эхёрэъЎшюэшЁютрээюую фюёЄєяр). ═хъюЄюЁ√х яЁютрщфхЁ√ Internet Єръцх чр∙ш∙р■Є ъюья№■ЄхЁ√ ётюшї ъышхэЄют. ┬ю тёхї юяшёрээ√ї ш т эхъюЄюЁ√ї фЁєушї ёыєўр ї эхюсїюфшь√ ёяхЎшры№э√х эрёЄЁющъш ьхцёхЄхтюую ¤ъЁрэр шыш яхЁёюэры№эюую (ыюъры№эюую) ёхЄхтюую Їшы№ЄЁр IP.

6.4.1. ╚ёяюы№чютрэшх proxy.

╟рўрёЄє■ т юЁурэшчрЎш ї яюы№чютрЄхыш шьх■Є фюёЄєя ъ ЁхёєЁёрь Internet Єюы№ъю яюёЁхфёЄтюь ёхЁтхЁр proxy. ╥ръющ ёхЁтхЁ яЁшэшьрхЄ ёюхфшэхэшх юЄ яЁюуЁрьь√-ъышхэЄр ш ёючфр╕Є чряЁюё ъ тэх°эхьє ЁхёєЁёє. ╧юёых єёЄрэютыхэш  ёюхфшэхэш  ё тэх°эшь ЁхёєЁёюь ёхЁтхЁ яЁюъёш юёє∙хёЄты хЄ яхЁхё√ыъє фрээ√ї ьхцфє яЁюуЁрььющ-ъышхэЄюь ш єфрыхээ√ь ёхЁтхЁюь, тючьюцэю ё рэрышчюь ш Їшы№ЄЁрЎшхщ ёюфхЁцшьюую.

Binkd яюффхЁцштрхЄ ёхЁтхЁ√ яЁюъёш ЄЁ╕ї ёЄрэфрЁЄэ√ї тшфют:

  1. HTTP/HTTPS, ъръ ё рєЄхэЄшЇшърЎшхщ яюы№чютрЄхы , Єръ ш схч эх╕;

  2. SOCKS v.4;

  3. SOCKS v.5, ъръ ё рєЄхэЄшЇшърЎшхщ яюы№чютрЄхы , Єръ ш схч эх╕.

┬ ёыєўрх ЁрсюЄ√ ўхЁхч ёхЁтхЁ яЁюъёш HTTP/HTTPS binkd юёє∙хёЄты хЄ чряЁюё ъ ёхЁтхЁє яЁюъёш ьхЄюфюь CONNECT ё єърчрэшхь рфЁхёр ш яюЁЄр єфры╕ээющ ёЄюЁюэ√ (яю єьюыўрэш■ шёяюы№чєхЄё  яюЁЄ 24554). ═ю т Єшяют√ї эрёЄЁющърї ёхЁтхЁют яЁюъёш ЁрчЁх°хэ√ эх тёх чряЁюё√ ьхЄюфр CONNECT , р Єюы№ъю ъ шчсЁрээюьє ёяшёъє яюЁЄют TCP, юс√ўэю Єюы№ъю юфшэ яюЁЄ ё эюьхЁюь 443 (¤ЄюЄ яюЁЄ шёяюы№чєхЄё  сЁрєчхЁрьш яю єьюыўрэш■ т яЁюЄюъюых HTTPS яЁш ЁрсюЄх ё URL тшфр https://host.domain.tld). ╤ююЄтхёЄтхээю, ўЄюс√ binkd ьюу ЁрсюЄрЄ№ ўхЁхч Єръющ ёхЁтхЁ яЁюъёш, эхюсїюфшью ышсю ЁрсюЄрЄ№ ё ышэъюь, є ъюЄюЁюую ёютьхёЄшь√щ ё binkd ьхщыхЁ юЄтхўрхЄ эр яюЁЄє TCP 443, ышсю эєцэю шчьхэшЄ№ ъюэЇшуєЁрЎш■ ёхЁтхЁр яЁюъёш Єръшь юсЁрчюь, ўЄюс√ юэ яючтюы ы ёюхфшэхэш  яю ьхЄюфє CONNECT эр ёЄрэфрЁЄэ√щ яюЁЄ binkp – TCP 24554.

┬ ёыєўрх ЁрсюЄ√ ўхЁхч ёхЁтхЁ яЁюъёш SOCKS юсюшї яюффхЁцштрхь√ї тхЁёшщ binkd юёє∙хёЄты хЄ чряЁюё ъ ёхЁтхЁє яЁюъёш эр єёЄрэютыхэшх ёюхфшэхэш  ё єфры╕ээ√ь їюёЄюь. ╧Ёш ¤Єюь юуЁрэшўхэш  эр єёЄрэютыхэшх ёюхфшэхэшщ Єръцх ьюуєЄ шуЁрЄ№ Ёюы№.

╧Ёш ЁрсюЄх ўхЁхч яЁюъёш SOCKS v.5 ьюцхЄ ЄЁхсютрЄ№ё  рєЄхэЄшЇшърЎш  яюы№чютрЄхы . ╧Ёш ЁрсюЄх цх ўхЁхч яЁюъёш SOCKS v.4 рєЄхэЄшЇшърЎш  эх ЄЁхсєхЄё .

╬ёюсхээюёЄ№ ЁрсюЄ√ binkd ўхЁхч ёхЁтхЁ яЁюъёш чръы■ўрхЄё  т Єюь, ўЄю т ¤Єюь ёыєўрх юс√ўэю эхЄ эшъръющ тючьюцэюёЄш юсхёяхўшЄ№ яЁш╕ь тїюф ∙шї ёюхфшэхэшщ. ┬хф№ ёхЁтхЁ яЁюъёш яЁюяєёърхЄ ёюхфшэхэш  Єюы№ъю шч тэєЄЁхээхщ ёхЄш т Internet, юсхёяхўштр  хфшэє■ Єюўъє т√їюфр т яєсышўэє■ ёхЄ№ шч яЁштрЄэющ (ъюЁяюЁрЄштэющ) ёхЄш.

╧ЁшьхЁ√ ъюэЇшуєЁрЎшш binkd фы  ЁрсюЄ√ ё шёяюы№чютрэшхь ёхЁтхЁр яЁюъёш ёь. т я.я. 4.48. ш 4.53.

6.4.2. ╚ёяюы№чютрэшх NAT ш эрёЄЁющър firewall.

╧юьшью ЁрсюЄ√ ўхЁхч ёхЁтхЁ яЁюъёш, т ёхЄ ї юЁурэшчрЎшщ (р шэюуфр ш т ёхЄш яЁютрщфхЁр Internet) шёяюы№чє■Єё  Єръ эрч√трхь√х ўрёЄэ√х яюфьэюцхёЄтр рфЁхёют IP, Єръцх эрч√трхь√х рфЁхёрьш Intranet. ▌Єю рфЁёх шч яюфёхЄхщ 10.0.0.0/8, 172.16.0.0/12 ш 192.168.0.0/16 (ёь. RFC 1918 «Address Allocation for Private Internets»). ╧Ёш шёяюы№чютрэшш Єръющ рфЁхёрЎшш фы  фюёЄєяр т Internet шёяюы№чєхЄё  ЄЁрэёы Ўш  рфЁхёют IP шч тэєЄЁхээхщ ёхЄш т Internet ш юсЁрЄэю, эрч√трхьр  NAT (network address translation) шыш PAT (port address translation). ╥Ёрэёы Ўш  яЁютюфшЄё  эр єёЄЁющёЄтх шыш ёхЁтхЁх, ЁрсюЄр■∙шь т ърўхёЄтх °ы■чр т Internet, яЁшў╕ь юс√ўэю Єръющ °ы■ч  ты хЄё  ЇрщЁтюыюь (ьхцёхЄхт√ь ¤ъЁрэюь).

┬ ёыєўрх ЁрсюЄ√ binkd т ёхЄш, чр∙ш∙╕ээющ °ы■чюь шыш ЇрщЁтюыюь ё NAT, фы  ЁрсюЄ√ binkd ё тэх°эшьш яю юЄэю°хэш■ ъ ыюъры№эющ ёхЄш єчырьш эхюсїюфшьр ёяхЎшры№эр  ъюэЇшуєЁрЎш  ЇрщЁтюыр. ╧Ёш ¤Єюь эрёЄЁющъш ёрьюую binkd эх шьх■Є юёюсхээюёЄхщ, юэш Єюўэю Єръшх цх ъръ ш яЁш хую ЁрсюЄх эр ъюья№■ЄхЁх ё яєсышўэ√ь рфЁхёюь IP.

┬ю-яхЁт√ї, фы  юёє∙хёЄтхыэш  ъышхэЄёъшї ёюхфшэхэшщ юЄ binkd ъ тэх°эшь єчырь эр ЇрщЁтюых фюыцэ√ с√Є№ ЁрчЁх°хэ√ ёюхфшэхэш  юЄ рфЁхёр IP ъюья№■ЄхЁр, эр ъюЄюЁюь ЁрсюЄрхЄ binkd, яю яЁюЄюъюыє TCP эр яюЁЄ 24554 (ш, тючьюцэю, эр фЁєушх яюЁЄ√ – т Єюь ёыєўрх, хёыш яЁюшчтюф Єё  ёюхфшэхэш  эр эхёЄрэфрЁЄэ√щ яюЁЄ эр ъръшї-Єю єчырї).

┬ю-тЄюЁ√ї, фы  юсхёяхўхэш  яЁш╕ьр тїюф ∙шї ёюхфшэхэшщ, эр ЇрщЁтюых эхюсїюфшью ъръ ЁрчЁх°шЄ№ тїюф ∙шх ёюхфшэхэш , Єръ ш юсхёяхўшЄ№ ЄЁрэёы Ўш■ рфЁхёют. ╧Ёш ¤Єюь тючьюцэ√ фтр трЁшрэЄр ЄЁрэёы Ўшш рфЁхёют.

  1. ═рчэрўшЄ№ ёююЄтхЄётшх юфэюую шч фюёЄєяэ√ї яєсышўэ√ї (т√фхыхээ√ї яЁютрщфхЁюь) рфЁхёют IP рфЁхёє IP ъюья№■ЄхЁр, эр ъюЄюЁюь ЁрсюЄрхЄ binkd; ─Ёєушьш ёыютрьш – юсхёяхўшЄ№ ЄЁрэёы Ўш■ т√фхыхээюую яєсышўэюую ш яЁштрЄэюую рфЁхёют IP (NAT). ╧Ёш ¤Єюь ш шёїюф ∙шх юЄ binkd ёюхфшэхэш  сєфєЄ т√уы фхЄ№ ъръ ёюхфшэхэш  ё ¤Єюую цх рфЁхёр. ┬ ¤Єюь ёыєўрх эхюсїюфшью ЁрчЁх°шЄ№ ёюхфшэхэш  шч Internet эр ¤ЄюЄ рфЁхё Єюы№ъю яю яюЁЄє 24554 яЁюЄюъюыр TCP (шыш фЁєующ яюЁЄ, эр ъюЄюЁюь юЄтхўрхЄ binkd), р тёх яЁюўшх – чряЁхЄшЄ№. ▌Єю эхюсїюфшью фы  юсхёяхўхэш  чр∙ш∙╕ээюёЄш ъюья№■ЄхЁр юЄ тчыюьр (р т шЄюух ш ыюъры№эющ ёхЄш т Ўхыюь).

  2. ╧хЁхэряЁрты Є№ тїюф ∙шх ёюхфшэхэш  яю яЁюЄюъюыє TCP ш яюЁЄє 24554 эр рфЁхё ъюь№■ЄхЁр ё ЁрсюЄр■∙шь binkd эр ЄюЄ яюЁЄ, эр ъюЄюЁюь юэ яЁшэшьрхЄ ёюхфшэхэш . ─Ёєушьш ёыютрьш – юсхёяхўшЄ№ ЄЁрэёы Ўш■ рфЁхёр ш яюЁЄр (PAT). ┬ ¤Єюь ёыєўрх фы  юсхёяхўхэш  тїюф ∙шї ёюхфшэхэшщ эх эєцхэ ёяхЎшры№э√щ рфЁхё IP. ═ю т Єюь ёыєўрх, ъюуфр яЁштрЄэр  рфЁхёрЎш  шёяюы№чєхЄё  яЁютрщфхЁюь, тЁ ф ыш юэ сєфхЄ ЄЁрэёышЁютрЄ№ юЄфхы№э√щ яюЁЄ, ш т ёыєўрх хую юЄърчр яЁшф╕Єё  чрърч√трЄ№ є эхую т√фхыхээ√щ рфЁхё IP.

6.6. ╟ряєёъ тэх°эшї яЁюуЁрьь шч binkd.

╧Ёш Ёхры№эющ ЁрсюЄх єчыр FTN яЁшїюфшЄё  чряєёърЄ№ яЁюуЁрьь√ юсЁрсюЄъш яюўЄ√ яюёых яЁш╕ьр Їрщыют. ┬ binkd шьххЄё  тючьюцэюёЄ№ ртЄюьрЄшчшЁютрЄ№ Єръшх фхщёЄтш . ┬ючьюцэюёЄш яю ртЄюьрЄшчрЎшш чръы■ўр■Єё  т Єюь, ўЄю binkd єьххЄ юсЁрсрЄ√трЄ№ ёюс√Єш  яю єёыютш■ яЁш╕ьр Їрщыр. ╧Ёш ¤Єюь ьюцэю чрфртрЄ№ ьрёъє шьхэш Їрщыр ш яєЄш ъ ърЄрыюує, т ъюЄюЁ√щ яюьх∙рхЄё  Їрщы.

╬фшэ шч трЁшрэЄют фхщёЄтшщ – ёючфрэшх (яєёЄюую) Їрщыр яЁш єфютыхЄтюЁхэшш єёыютш  (Є.х. ъюуфр с√ы яЁшэ Є Їрщы, яюфїюф ∙шщ яю єърчрээющ т єёыютшш ьрёъх). ╙ёыютшх ёючфрэшх Єръюую Їрщыр ш хую шь  чрфр╕Єё  т фшЁхъЄштх Їрщыр ъюэЇшуєЁрЎшш «flag». (╤ь. я.4.19) ╧ю тыхэшх ёююЄтхЄёЄтє■∙хую Їрщыр ьюцхЄ юс√Є№ юЄёыхцхэю фЁєушьш яЁюуЁрььрьш, ъюЄюЁ√х яЁюшчтхфєЄ эхюсїюфшь√х фхщёЄтш  (чряєёЄ Є юсЁрсюЄъє).

─Ёєующ трЁшрэЄ фхщёЄтшщ яЁш т√яюыэхэшш єёыютш  – чряєёъ яЁюуЁрьь яЁ ью шч binkd. ▌Єю фхщёЄтшх чрфр╕Єё  т фшЁхъЄштх Їрщыр ъюэЇшуєЁрЎшш «exec». (╤ь. я.4.15)

╟ряєёъ яЁюуЁрьь юёє∙хёЄты хЄё  ё шёяюы№чютрэшхь ёшёЄхьэюую т√чютр system(), яЁш ¤Єюь т√ч√трхЄё  шэЄхЁяЁхЄрЄюЁ ъюьрэф, шёяюы№чєхь√щ юяхЁрЎшюээющ ёшёЄхьющ. ┬ ╬╤ ёхьхщёЄтр UNIX т√ч√трхЄё  шэЄхЁяЁхЄрЄюЁ, єърчрээ√щ т юяшёрэшш яюы№чютрЄхы , юЄ шьхэш ъюЄюЁюую ЁрсюЄрхЄ binkd. ┬ юёЄры№э√ї ╬╤ – ЄюЄ шэЄхЁяЁхЄрЄюЁ ъюьрэф, эр ъюЄюЁ√щ эрёЄЁюхэр юяхЁрЎшюээр  ёшёЄхьр (юс√ўэю ¤Єю COMMAND.COM т Windows 95,98,Me; CMD.EXE т Windows NT,2000,XP,2003; CMD.EXE т OS/2). ╧ЁюуЁрьь√ т√яюыэ ■Єё  шч яЁюЎхёёр (яюЄюър), ъюЄюЁ√щ яЁшэ ы Їрщы√, яюфїюф ∙шх яю ьрёъх ъ юяшёрээ√ь т фшЁхъЄштх Їрщыр ъюэЇшуєЁрЎшш «exec».

╟ряєёъ ъюьрэф тючьюцхэ ъръ эхяюёЁхфёЄтхээю яюёых яЁш╕ьр Їрщыют, Єръ ш яю чртхЁ°хэшш ёхрэёр. ╬яхЁрЄштэ√щ чряєёъ ьюцхЄ шьхЄ№ ёь√ёы фы  юсЁрсюЄъш Їрщыют√ї чряЁюёют ш юЄяЁртъш чряЁю°хээюую т Єюь цх ёхрэёх (фы  ўхую Їрщы√ эєцэю яюьхёЄшЄ№ т Їрщысюъё, ёююЄтхЄёЄтє■∙шщ рфЁхёє єфры╕ээющ ёЄюЁюэ√ ышсю шёяюы№чютрЄ№ яЁюЄюъюы тчршьюфхщёЄтш  ь¤щыхЁр ш ЇЁхъяЁюЎхёёюЁр SRIF, ёь. ). ╟рфхЁцрээ√щ чряєёъ шьххЄ ёь√ёы фы  яЁхфюЄтЁр∙хэш  фышЄхы№э√ї ярєч т яхЁхфрўх фрээ√ї ш фы  яЁхфюЄтЁр∙хэш  яютЄюЁэюую чряєёър юфэющ ш Єющ цх яЁюуЁрьь√ т ёыєўрх яЁш╕ьр ярўъш юфэюЄшяэ√ї Їрщыют.

┬ 32-сшЄэ√ї тхЁёш ї Windows тючьюцхэ чряєёъ ъюьрэф т юЄфхы№эюь яЁюЎхёёх. ▌Єю яючтюы хЄ шчсхцрЄ№ чрфхЁцхъ, т√чтрээ√ї юцшфрэшхь чртхЁ°хэш  ЁрсюЄ√ тэх°эхщ яЁюуЁрьь√.

╧Ёш ЇюЁьшЁютрэшш ьрёъш Їрщыют эєцэю тэшьрЄхы№эю юЄёыхцштрЄ№, т ъръшї ёыєўр ї сєфхЄ ёЁрсрЄ√трЄ№ ¤Єю єёыютшх. ─ы  Єюую, ўЄюс√ т√яюыэшЄ№ юсЁрсюЄъє яЁшэ Єющ яюўЄ√ эх тю тёхї ёыєўр ї, р Єюы№ъю яюёых ёхрэёр ёт чш, чр∙ш∙╕ээюую ярЁюыхь, эєцэю єърчрЄ№ ьрёъє яюыэюую яєЄш ъ Їрщырь т ърЄрыюух, чрфрээюь т фшЁхъЄштх «inbound». ═рюсюЁюЄ, ўЄюс√ т√яюыэшЄ№ юсЁрсюЄъє яЁшэ Єющ яюўЄ√ Єюы№ъю яюёых ёхрэёр ёт чш схч шёяюы№чютрэш  ярЁюы , эєцэю єърчрЄ№ т ьрёъх яюыэ√щ яєЄ№ ъ Їрщырь т ърЄрыюух, чрфрээюь т фшЁхъЄштх «inbound-nonsecure». ╥ръцх эєцэю єўшЄ√трЄ№ юёюсхээюёЄш ╬╤ ш Їрщыютющ ёшёЄхь√, эряЁшьхЁ, т ╬╤ ёхьхщёЄтр UNIX °ЄрЄэ√х Їрщыют√х ёёшЄхь√  ты ■Єё  ЁхушёЄЁючртшёшь√ьш, ш ьрёъш фюыцэ√ єўшЄ√трЄ№ тёх трЁшрэЄ√ эряшёрэш  шьхэш Їрщыр ш яєЄш. ╧Ёш шёяюы№чютрэшш цх ёхЄхт√ї фшёъют т ёыєўрх Ёрчэ√ї ╬╤ ёхЁтхЁр ш ъышхэЄр тючьюцэ√ эхюўхтшфэ√х ёшЄєрЎшш.

┬ ьрёъх Їрщыр ьюцэю єърч√трЄ№ чэръш ьръЁюяюфёЄрэютъш «?», юсючэрўр■∙шщ юфшэ ы■сющ ёшьтюы, ш «*», юсючэрўр■∙шщ яЁюшчтюы№эюх ъюышўхёЄтю ы■с√ї ёшьтюыют (т Єюь ўшёых ш юЄёєЄтшх ёшьтюыр). ╩Ёюьх Єюую, ьюцэю шёяюы№чютрЄ№ яюёыхфютрЄхы№эюёЄ№ ёшьтюыют, чръы■ў╕ээ√ї т ътрфЁрЄэ√х ёъюсъш, Єрър  ъюэёЄЁєъЎш   ты хЄё  ёяшёъюь ры№ЄхЁэрЄштэ√ї ёшьтюыют. ╫Єюс√ єърчрЄ№ ёшьтюы√ «?», «*», «]», «[», «\», «#», шї эхюсїюфшью яЁхфтрЁ Є№ чэръюь юсЁрЄэющ ъюёющ ўхЁЄ√ «\». (▌ЄюЄ чэръ ьюцэю шёяюы№чютрЄ№ ш фы  фЁєушї ёшьтюыют, т ъюЄюЁ√ї т√ ёюьэхтрхЄхё№.)

╧ЁшьхЁ√ чряєёър ъюьрэф фы  ╬╤ ёхьхщёЄтр UNIX.

╬сЁрсюЄър FREQ тю тЁхь  ёхрэёр:

exec "!/fido/scripts/simplefreq *S" *.[Rr][Ee][Qq]

╬сЁрсюЄър яюўЄ√ яю чртхЁ°хэш■ ёхрэёр:

exec "/fido/scripts/ftrack.sh" *.[Pp][Kk][Tt]
exec "/fido/scripts/pkt2000toss.sh" *.[Pp]2[Kk]
exec "/fido/scripts/echotoss.sh" *.[Ss][Uu]? *.[Mm][Oo]? *.[Tt][Tu]? *.[Ww][We]?
exec "/fido/scripts/echotoss.sh" *.[Tt][Hh]? *.[Ff][Rr]? *.[Ss][Aa]?
exec "/fido/scripts/fechotoss.sh" /fido/inbound-secure/*.[TtZz][Ii][Cc]

╧ЁшьхЁ√ чряєёър ъюьрэф фы  ╬╤ Windows, OS/2 ш Є.я..

╬сЁрсюЄър FREQ тю тЁхь  ёхрэёр:

exec "!d:\\path\\allfix.exe Rp -SRIF *S" *.req

╬сЁрсюЄър яюўЄ√ яю чртхЁ°хэш■ ёхрэёр:

exec "d:\\path\\my-pkt-unpacker.exe /options" c:\\\\bbs\\\\inbound\\\\*.pkt
exec "d:\\path\\my-tosser.exe /options" *.su? *.mo? *.tu? *.we? *.th? *.fr? *.sa?
exec "d:\\path\\my-filer.exe /options" *.tic *.zic
exec "d:\\path\\my-pkt-filter.exe /options *F" c:\\\\bbs\\\\inbound\\\\unsecure\\\\*.pkt

7. ╘юЁьрЄ√ ёыєцхсэ√ї Їрщыют ш ърЄрыюуют.

7.1. CяЁртър яю ърЄрыюурь яюўЄютющ юўхЁхфш ш Їрщысюъёрь.

7.1.1. BSO.

└ссЁхтшрЄєЁр «BSO» Ёрё°шЇЁют√трхЄё  ъръ «Binkley style outbound», ¤ЄюЄ ЇюЄьрЄ юўхЁхфш яюыєўшы ётю╕ эрчтрэшх юЄ ь¤щыхЁр BinkleyTerm, т ъюЄюЁюь с√ы яЁшьхэ╕э тяхЁт√х, ш фю ёшї яюЁ ъырёёшўхёъшь юяшёрэшхь ЇюЁьрЄр  ты хЄё  Ёрчфхы outbound ЁєъютюфёЄтр яю BinkleyTerm.

BSO уюЄютшЄё  ъ ёЄрэфрЁЄшчрЎшш т FTSC ш юяєсышъютрэ т ёяхЎшЇшърЎшш FSP-1034

└єЄсрєэф BSO яЁхфёЄрты хЄ ёюсющ шхЁрЁїш■ яюфърЄрыюуют, т ъюЄюЁ√ї ёюфхЁцрЄё  Їрщы√, рфЁхёютрээ√х ышэъє. ╘рщы√ ё эхяръютрээ√ь (эхрЁїштшЁютрээ√ь) эхЄьхщыюь шьхэє■Єё  ё ёєЇЇшъёюь «ut», юёЄры№э√х Їрщы√ яхЁхўшёы ■Єё  т Їрщых-ёяшёъх ё ёєЇЇшъюь «lo» (flow-file).╧хЁхф ёєЇЇшъcюь ёЄртшЄё  ёшьтюы рЄЁшсєЄр, ш ¤Єш ЄЁш ёшьтюыр юЄфхы ■Єё  юЄ ыхтющ ўрёЄш шьхэш Їрщыр Єюўъющ (ш т ЄхЁьшэрї DOS юсЁрчє■Є Ёрё°шЁхэшх Їрщыр). └фЁхё ышэър чръюфшЁютрэ т шьхэш ърЄрыюур ш шьхэш Їрщыр: фы  ъюфшЁютрэш  рфЁхёр шёяюы№чєхЄё  эряшёрэшх фюьхэр FTN (эх сюыхх 8 чэръют), °хёЄэрфЎрЄшЁшўэюх яЁхфёЄртыхэшх эюьхЁр чюэ√, ўхЄ√Ё╕їЁрчЁ фэ√х °хёЄэрфЎрЄшЁшўэ√х яЁхфёЄртыхэш  эюьхЁют ёхЄш ш єчыр, фы  яющэЄют Єръцх тюё№ьшЁрчЁ фэюх °хёЄэрфЎрЄшЁшўэюх яЁхфёЄртыхэшх эюьхЁр яющэЄр.

╧юўЄр фы  єчыют т√уы фшЄ т BSO ёыхфє■∙шь юсЁрчюь:

╩рЄрыюу тшфр
/юьхэ[.юьхЁ_чюэ√]/
т ъюЄюЁюь Ёрёяюырур■Єё  Їрщы√ тшфр
юьхЁёхЄшюьхЁєчыр.ЄЁшсєЄшя
эшъры№эюхшь .хэ№эхфхышюьхЁ

╧юўЄр фы  яющэЄют - Єръшь:

╩рЄрыюу тшфр:
/юьхэ[.юьхЁ_чюэ√]/═юьхЁёхЄш═юьхЁєчыр/
т ъюЄюЁюь Ёрёяюырур■Єё  Їрщы√ тшфр:
юьхЁяющэЄр.ЄЁшсєЄшя
эшъры№эюхшь .хэ№эхфхышюьхЁ

  • юьхэ
    ╤ЄЁюър шч 8 чэръют, ёютярфр■∙р  ё эряшёрэшхь фюьхэр FTN (т ёыєўрх фышэ√ фюьхэр, яЁхт√°р■∙хщ 8 ёшьтюыют, ыш°эшх юсЁхчр■Єё  ъръ эхёююЄтхЄёЄтє■∙шх ёЄрэфрЁЄє рфЁхёрЎшш FTN). ┬ ёыєўрх шёяюы№чютрэш  хфшэёЄтхээюую фюьхэр т ёхЄш шь  ърЄрыюур ьюцхЄ эх ёютярфрЄ№ ё эряшёрэшхь фюьхэр т рфЁхёр. ─юьхэ  ты хЄё  юёэютэющ ўрёЄ№■ срчютюую ърЄрыюур фы  5D-рфЁхёрЎшш.

  • юьхЁ_чюэ√
    ╪хёэрфЎрЄшЁшўэюх ўшёыю, Ёртэюх эюьхЁє чюэ√ т рфЁхёх ышэър. ═х шёяюы№чєхЄё  т ёыєўрх ёютярфхэш  чюэ√ т рфЁхёх ышэър ш т ёюсёЄтхээюь рфЁхёх. ═юьхЁ чюэ√ юЄыхф хЄё  юЄ фюьхэр Єюўъющ.

  • юьхЁёхЄш
    ╫хЄ√Ё╕їЁрчЁ фэюх °хёэрфЎрЄшЁшўэюх ўшёыю, Ёртэюх эюьхЁє ёхЄш т рфЁхёх ышэър. ┬ ёыєўрх ьхэ№°хую ўшёыр ёыхтр фюяюыэ хЄё  эєы ьш. ═х юЄфхы хЄё  юЄ эюьхЁр єчыр, ёыхфє■∙хую чр эшь.

  • юьхЁєчыр
    ╫хЄ√Ё╕їЁрчЁ фэюх °хёэрфЎрЄшЁшўэюх ўшёыю, Ёртэюх эюьхЁє єчыр т рфЁхёх ышэър. ┬ ёыєўрх ьхэ№°хую ўшёыр ёыхтр фюяюыэ хЄё  эєы ьш. ═х юЄфхы хЄё  юЄ эюьхЁр ёхЄш, ёЄю ∙хую яхЁхф эшь.

  • ЄЁшсєЄ
    ╬фшэ ёшьтюы, чрфр■∙шщ рЄЁшсєЄ яюўЄ√. ╚ёяюы№чєхь√щ ёшьтюы чртшёшЄ юЄ Єюую,  ты хЄё  ыш Їрщы эхЄьхщы-яръхЄюь шыш Їрщы-ёяшёъюь.
    ─ы  эхЄьхщы-яръхЄют шёяюы№чє■Єё : «o» - рЄЁшсєЄ «normal», «d» - «direct», «h» - «hold», «c» - «crash» («Continuous» т юЁшушэры№эющ ёяхЎшЇшърЎшш BinkeyTerm), «i» - «immediate». ─ы  ёяшёъют шёяюы№чє■Єё : «f» - рЄЁшсєЄ «normal», «d» - «direct», «h» - «hold», «c» - «crash», «i» - «immediate». └ЄЁшсєЄ «immediate»  ты хЄё  Ёрё°шЁхэшхь юЁшушэры№эющ ёяхЎшЇшърЎшш.

  • юьхЁяющэЄр
    ┬юё№ьшЁрчЁ фэюх °хёэрфЎрЄшЁшўэюх ўшёыю, Ёртэюх эюьхЁє єчыр т рфЁхёх ышэър-яющэЄр. ─ы  єчыют (яющэЄют ё эюьхЁюь 0) эх шёяюы№чєхЄё . ╧юёых эюьхЁр яющэЄр ёЄртшЄё  Єюўър, чрЄхь ёыхфєхЄ ёшьтюы рЄЁшсєЄр ш фтр ёшьтюыр Єшяр Їрщыр (яръхЄ шыш ёяшёюъ).

  • шя
    ─тр ёшьтюыр Єшяр Їрщыр. ┬ючьюцэ√х чэрўхэш : «ut» ш «lo». «ut» юсючэрўрхЄ эхяръютрээ√щ (эхрЁїштшЁютрээ√щ) яръхЄ эхЄьхщыр, «lo» - ёяшёюъ Їрщыют фы  юЄяЁртъш.

  • эшъры№эюхшь 
    ╚ь  Їрщыр, ёухэхЁшЁютрээюх фы  юсхёяхўхэш  єэшъры№эюёЄш яръютрээюую (рЁїштшЁютрээюую) яюўЄютюую яръхЄр. ╨хъюьхэфєхЄё  ухэхЁшЁютрЄ№ шь  эр юёэютрэшш рфЁхёют юЄяЁртшЄхы  ш яюыєўрЄхы , ё Єхь, ўЄюс√ ьюцэю с√ыю т√ ты Є№ «яюЄхЁ ээ√х» яръхЄ√ (Є.х. яръхЄ√, ъюЄюЁ√х с√ыш єфрыхэ√ шч Їрщыр-ёяшёър, эю юёЄрышё№ эхЄЁюэєЄ√ьш).

  • хэ№эхфхыш
    ─тх сєът√, юсючэрўр■∙шх фхэ№ эхфхыш ЇюЁьшЁютрэш  яръхЄр. ╬ёэютрэ√ эр ёюъЁр∙╕ээ√ї рэуышщёъшї эрчтрэш ї фэхщ эхфхыш: Su, Mo, Tu, We, Fr, Th, Sa.

  • юьхЁ
    ╧юЁ фъют√щ эюьхЁ Їрщыр. ═єьхЁрЎш  эрўшэрхЄё  ё эєы .

╩рцф√щ Їрщы-ёяшёюъ ёюфхЁцшЄ ёяшёюъ Їрщыют, яЁхфэрчэрўхээ√ї фы  юЄяЁртъш ышэъє. ╩рцфюх шь  Їрщыр ЁрёяюырурхЄё  т юЄфхы№эющ ёЄЁюъх, ёЄЁюъш Ёрчфхы ■Єё  Єръ, ъръ ¤Єю яЁшэ Єю т шёяюы№чєхьющ ╬╤ фы  ЄхъёЄют√ї Їрщыют (яЁюуЁрььр фюыцэр юсЁрсрЄ√трЄ№ тёх трЁшрэЄ√: ш юфшэ ёшьтюы яхЁхтюфр ёЄЁюъш, ш яюёыхфютрЄхы№эюёЄ№ яхЁхтюфр ърЁхЄъш ё яхЁхтюфюь ёЄЁюъш). ╬с√ўэю єърч√тр■Єё  рсёюы■Єэ√х (яюыэ√х) яєЄш ъ Їрщырь, эю тючьюцэю ш шёяюы№чютрэшх яєЄхщ юЄэюёшЄхы№эю ърЄрыюур, т ъюЄюЁюь ЁрёяюырурхЄё  ё Їрщы ёяшёър. ╩рцф√щ Їрщы ьюцхЄ яЁхфтрЁ Є№ё  ёшьтюыюь, чрфр■∙шь эхюсїюфшьюх фхщёЄтшх ё Їрщыюь яюёых хую єёях°эющ юЄяЁртъш.

╘юЁьрЄ чряшёш т Їрщых-ёяшёъх:

[юфшЇшърЄюЁ][єЄ№]ь Їрщыр

  • юфшЇшърЄюЁ
    ╬фшэ шч ёшьтюыют: «^», «#», «~», «$», «!», яЁюсхы ышсю юЄёєЄёЄтшх ёшьтюыр.

  • ^
    ╧юёых єёях°эющ юЄяЁртъш юсЁхчрЄ№ Їрщы фю эєыхтющ фышэ√. ▌ЄюЄ ьюфшЇшърЄюЁ юс√ўэю шёяюы№чєхЄё  фы  Їрщыют яръютрээющ (рЁїштшЁютрээющ) яюўЄ√.

  • #
    ╧юёых єёях°эющ юЄяЁртъш єфрышЄ№ Їрщы.

  • !
    ═х юЄё√ырЄ№ Їрщы, яюёъюы№ъє Їрщы єцх юЄюёырэ.

  • ~
    ═х юЄё√ырЄ№ Їрщы. (╤ЄЁюър ъюььхэЄрЁш ). ▌ЄюЄ ьюфшЇшърЄюЁ  ты хЄё  Ёрё°шЁхэшхь яхЁтюэрўры№эющ ёяхЎшЇшърЎшш.

  • $
    ═х юЄё√ырЄ№ Їрщы. (╤ЄЁюър ъюььхэЄрЁш ). ▌ЄюЄ ьюфшЇшърЄюЁ  ты хЄё  Ёрё°шЁхэшхь яхЁтюэрўры№эющ ёяхЎшЇшърЎшш.

  • ╧Ёюсхы.
    ╧юёых єёях°эющ юЄяЁртъш юёЄртшЄ№ Їрщы эр ьхёЄх.

  • єЄ№
    ╩рЄрыюу, т ъюЄюЁюь ЁрёяюырурхЄё  Їрщы. ╧єЄ№ ьюцхЄ с√Є№ рсёюы■Єэ√ь ышсю юЄэюёшЄхы№э√ь. ╬ЄэюёшЄхы№э√щ яєЄ№ юЄёўшЄ√трхЄё  юЄ ърЄрыюур, т ъюЄюЁюь ЁрёяюырурхЄё  Їрщы-ёяшёюъ. ┼ёыш яєЄ№ эх єърчрэ, Їрщы ш∙хЄё  т ърЄрыюух, т ъюЄюЁюь ЁрёяюырурхЄё  Їрщы-ёяшёюъ.

  • ь Їрщыр
    ╚ь  Їрщыр фы  юЄяЁртъш. ┼ёыш шь  Їрщыр эрўшэрхЄё  ё юфэюую шч ёшьтюыют-ьюфшЇшърЄюЁют, юэю фюыцэю яЁхфтрЁ Є№ё  яЁюсхыюь.

╧ЁшьхЁ√ шь╕э Їрщыют.

═хЄьхщыют√щ яръхЄ ё рЄЁшсєЄюь «normal» фы  єчыр 2:5080/68@fidonet ё єчыр 2:5080/102@fidonet (чюэр є ¤Єшї єчыют юфэр, яю¤Єюьє ърЄрыюу схч ёєЇЇшъёр ё эюьхЁюь чюэ√):

D:\Ftn\Outbound\Fidonet\13d80044.out

═хЄьхщыют√щ яръхЄ ё рЄЁшсєЄюь «direct» фы  єчыр 3:712/848@fidonet ё єчыр 2:5080/102@fidonet:

D:\Ftn\Outbound\Fidonet.003\02c80350.dut

╘рщы-ёяшёюъ ё рЄЁшсєЄюь «direct» фы  єчыр 3:712/848@fidonet ё єчыр 2:5080/102@fidonet:

D:\Ftn\Outbound\Fidonet.003\02c80350.dlo

═хЄьхщыют√щ яръхЄ ё рЄЁшсєЄюь «hold» фы  яющэЄр 2:5080/102.100@fidonet ё єчыр 2:5080/102@fidonet:

D:\Ftn\Outbound\Fidonet\13d80066\00000064.hut

╘рщы-ёяшёюъ ё рЄЁшсєЄюь «hold» фы  яющэЄр 2:5080/102.100@fidonet ё єчыр 2:5080/102@fidonet:

D:\Ftn\Outbound\Fidonet\13d80066\00000064.hlo

╧ЁшьхЁ ёюфхЁцшьюую Їрщыр-ёяшёър.

^D:\Ftn\Outbound\Fidonet\d08a1f00.mo0
#D:\Ftn\Outbound\Fileout\nodediff.z74
#D:\Ftn\Outbound\Fileout\17h2n539.tic

7.1.2. ASO.

7.1.3. ╘рщысюъё√, ёютьхёЄшь√х ё ьхщыхЁюь «T-Mail».

Binkd ёяюёюсхэ юЄяЁрты Є№ Їрщы√, яюьх∙╕ээ√х ьхщыхЁюь T-Mail т ёяхЎшры№э√х ърЄрыюуш, эрч√трхь√х Їрщысюъёрьш. ╙ T-mail хёЄ№ фтр тшфр Їрщысюъёют: ЄЁрфшЎшюээ√х «ъюЁюЄъшх», яюфўшэ ■∙шхё  яЁртшырь шьхэютрэш  Їрщыют т DOS (8.3) ш Ёхрышчютрээ√х т T-mail/NT ш T-mail/2 «фышээ√х». ╘рщысюъё√ ЇюЁьрЄр T-mail шёяюы№чє■Є 4D-рфЁхёрЎш■ FTN (схч фюьхэр).

«╩юЁюЄъшх» Їрщысюъё√ ЇюЁьрЄр T-mail яЁхфёЄрты ■Є ёюсющ яюфърЄрыюуш ё шьхэрьш ёЄшы  DOS т срчютюь ърЄрыюух. ╚ь  ърцфюую яюфърЄрыюур-Їрщысюъёр ёухэхЁшЁютрэю шч рфЁхёр FTN ёшёЄхь√ эрчэрўхэш  ё шёяюы№чютрэшхь 32-Ёшўэющ ёшёЄхь√ ёўшёыхэш , т ъюЄюЁющ ЎшЇЁ√ юЄ «0» фю «9» ёютярфр■Є ё 10-Ёшўэ√ьш ЎшЇЁрьш, р ЎшЇЁрь юЄ 10 фю 31 эрчэрўхэ√ сєът√ ырЄшэёъюую (рэуышщёъюую) рыЇртшЄр юЄ «A» фю «V», тёх сєът√ - яЁюяшёэ√х (чруыртэ√х). ╧юф эюьхЁ чюэ√ юЄтхфхэ√ фтр ёшьтюыр, яюф эюьхЁ ёхЄш ш эюьхЁ єчыр - яю ЄЁш чэрър, яюф эюьхЁ яющэЄр - фтр яхЁт√ї чэрър яюёых Єюўъш (є єчыр ёЄртшЄё  «00»). ╥ЁхЄшщ чэръ яюёых Єюўъш ьюцхЄ шёяюы№чютрЄ№ё  фы  рЄЁшсєЄр «hold», фы  ўхую шёяюы№чєхЄё  сєътр «H». ╥ръшь юсЁрчюь, Їрщысюъё «ъюЁюЄъюую» ЇюЁьрЄр T-mail шьххЄ юуЁрэшўхэш : фы  рфЁхёют єчыют юЄ 1:1/0 фю 1023:32767/32767 ш фы  эюьхЁют яющэЄют юЄ 0 фю 1023.

╘юЁьрЄ ъюЁюЄъюую Їрщысюъёр T-mail:
юьхЁчюэ√юьхЁёхЄшюьхЁєчыр.юьхЁяющэЄр[ЄЁшсєЄ]

  • юьхЁчюэ√
    ─тх 32-Ёшўэ√х ЎшЇЁ√ эюьхЁр чюэ√ (юЄ «01» фю «VV»).
  • юьхЁёхЄш
    ╥Ёш 32-Ёшўэ√х ЎшЇЁ√ эюьхЁр ёхЄш (юЄ «001» фю «VVV»).
  • юьхЁєчыр
    ╥Ёш 32-Ёшўэ√х ЎшЇЁ√ эюьхЁр єчыр (юЄ «000» фю «VVV»).
  • юьхЁяющэЄр
    ─тх 32-Ёшўэ√х ЎшЇЁ√ эюьхЁр яющэЄр (юЄ «00» фю «VV»).
  • ЄЁшсєЄ
    └ЄЁшсєЄ Їрщысюъёр «hold» юсючэрўрхЄё  сєътющ «H», яЁш юЄёєЄёЄтшш сєът√ «H» Їрщысюъё шьххЄ рЄЁшсєЄ «normal». ─Ёєушх рЄЁшсєЄ√ эх яюффхЁцштр■Єё .

╧ЁшьхЁ√ ъюЁюЄъшї Їрщысюъёют T-mail:

╘рщысюъё ё рЄЁшсєЄюь «normal» фы  юЄяЁртъш Їрщыют ъююЁфшэрЄюЁє чюэ√ 2:

D:\Ftn\fileboxT\02002000.00

╘рщысюъё ё рЄЁшсєЄюь «hold» фы  яющэЄр 2:5080/102.63

D:\Ftn\fileboxT\024UO036.1VH

«─ышээ√х» Їрщысюъё√ ЇюЁьрЄр T-mail яЁхфёЄрты ■Є ёюсющ яюфърЄрыюуш ё фышээ√ьш шьхэрьш т срчютюь ърЄрыюух. ╚ь  ърцфюую яюфърЄрыюур-Їрщысюъёр ёюёЄюшЄ шч ЎшЇЁ рфЁхёр FTN ёшёЄхь√ эрчэрўхэш  ё шёяюы№чютрэшхь фхё Єшўэющ ёшёЄхь√ ёўшёыхэш , Ёрчфхы╕ээ√ї Єюўърьш. ┬ ъюэЎх фы  єърчрэш  рЄЁшсєЄр «hold» ьюцхЄ ёЄю Є№ «.H» шыш «.h». ╥ръшь юсЁрчюь, Їрщысюъё «фышээюую» ёЄшы  T-mail эх шьххЄ юуЁрэшўхэшщ.

╘юЁьрЄ фышээюую Їрщысюъёр T-mail:
юьхЁчюэ√.юьхЁёхЄш.юьхЁєчыр.юьхЁяющэЄр[.ЄЁшсєЄ]

  • юьхЁчюэ√
    ─хё Єшўэ√х ЎшЇЁ√ эюьхЁр чюэ√.
  • юьхЁёхЄш
    ─хё Єшўэ√х ЎшЇЁ√ эюьхЁр ёхЄш.
  • юьхЁєчыр
    ─хё Єшўэ√х ЎшЇЁ√ эюьхЁр єчыр.
  • юьхЁяющэЄр
    ─хё Єшўэ√х ЎшЇЁ√ эюьхЁр яющэЄр.
  • ЄЁшсєЄ
    └ЄЁшсєЄ Їрщысюъёр «hold» юсючэрўрхЄё  сєътющ «H» шыш «h», яЁш юЄёєЄёЄтшш сєът√ рЄЁшсєЄр Їрщысюъё шьххЄ рЄЁшсєЄ «normal». ─Ёєушх рЄЁшсєЄ√ эх яюффхЁцштр■Єё .

╧ЁшьхЁ√ фышээ√ї Їрщысюъёют T-mail:

╘рщысюъё ё рЄЁшсєЄюь «normal» фы  юЄяЁртъш Їрщыют ъююЁфшэрЄюЁє чюэ√ 2:

D:\Ftn\fileboxT\2.2.0.0

╘рщысюъё ё рЄЁшсєЄюь «hold» фы  яющэЄр 2:5080/102.63

D:\Ftn\fileboxT\2.5080.102.63.H

7.1.4. ╘рщысюъё√, ёютьхёЄшь√х ё ьхщыхЁюь «The Brake!».

╘рщысюъё√ ЇюЁьрЄр The Brake! яЁхфёЄрты ■Є ёюсющ яюфърЄрыюуш ё фышээ√ьш шьхэрьш т срчютюь ърЄрыюух. ╚ь  ърцфюую яюфърЄрыюур-Їрщысюъёр ёюёЄюшЄ шч фюьхэр ш ЎшЇЁ рфЁхёр FTN ёшёЄхь√ эрчэрўхэш  ё шёяюы№чютрэшхь фхё Єшўэющ ёшёЄхь√ ёўшёыхэш , Ёрчфхы╕ээ√ї Єюўърьш. ┬ ъюэЎх, яюёых Єюўъш, єърчрэ рЄЁшсєЄ. ╥ръшь юсЁрчюь, Їрщысюъё ЇюЁьрЄр The Brake! эх шьххЄ юуЁрэшўхэшщ.

╘юЁьрЄ Їрщысюъёр The Brake!:
юьхэ.юьхЁчюэ√.юьхЁёхЄш.юьхЁєчыр.юьхЁяющэЄр.ЄЁшсєЄ

  • юьхэ
    ╚ь  фюьхэр FTN, ёЄЁюўэ√ьш сєътрьш.
  • юьхЁчюэ√
    ─хё Єшўэ√х ЎшЇЁ√ эюьхЁр чюэ√.
  • юьхЁёхЄш
    ─хё Єшўэ√х ЎшЇЁ√ эюьхЁр ёхЄш.
  • юьхЁєчыр
    ─хё Єшўэ√х ЎшЇЁ√ эюьхЁр єчыр.
  • юьхЁяющэЄр
    ─хё Єшўэ√х ЎшЇЁ√ эюьхЁр яющэЄр.
  • ЄЁшсєЄ
    └ЄЁшсєЄ Їрщысюъёр. ┬ючьюцэ√х чэрўхэш : «immediate», «Immediate», «crash», «Crash», «direct», «Direct», «normal», «Normal», «hold», «Hold».

╧ЁшьхЁ√ Їрщысюъёют ЇюЁьрЄр The Brake!

╘рщысюъё ё рЄЁшсєЄюь «normal» фы  юЄяЁртъш Їрщыют ъююЁфшэрЄюЁє чюэ√ 2 ёхЄш fidonet:

D:\Ftn\fileboxTheBrake\fidonet.2.2.0.0.normal

╘рщысюъё ё рЄЁшсєЄюь «hold» фы  яющэЄр 2:5080/102.63@fidonet

D:\Ftn\fileboxTheBrake\fidonet.2.5080.102.63.Hold

7.2. ╘юЁьрЄ√ Їрщыют

7.2.1. ╘рщы ярЁюыхщ.

Binkd ёяюёюсхэ ўшЄрЄ№ ярЁюыш шч ЄхъёЄютюую Їрщыр ярЁюыхщ, шёяюы№чєхьюую ьхщыхЁюь: T-Mail.

┬ Їрщых ЇюЁьрЄр T-mail ърцфр  ёЄЁюър ёюфхЁцшЄ фтр ёыютр: рфЁхё FTN ш ярЁюы№, Ёрчфхы╕ээ√х яЁюсхырьш ш/шыш чэрърьш Єрсєы Ўшш. CЄЁюър ьюцхЄ эрўшэрЄ№ё  яЁюсхырьш ш/шыш чэрърьш Єрсєы Ўшш. ╧єёЄ√х ёЄЁюъш ш ёЄЁюъш, яхЁтюх ёыютю т ъюЄюЁ√ї эх  ты хЄё  рфЁхёюь FTN, шуэюЁшЁє■Єё  (Єръ шуэюЁшЁє■Єё  ёЄЁюъш ъюььхэЄрЁшхт T-mail). ╥ръцх шуэюЁшЁєхЄё  юёЄрЄюъ ёЄЁюъш яюёых ярЁюы .

╧ЁшьхЁ.

;==╘рщы ярЁюыхщ ёЄшы  T-mail=====================
2:5080/102 pwd1
7:1500/102 pwd2

7.2.2. ─тюшўэ√щ Їрщы ёЄрЄшёЄшъш ёЄшы  T-mail.

7.2.3. ─тюшўэ√щ Їрщы ёЄрЄшёЄшъш ёЄшы  FrontDoor.

7.3. ╘рщы√, ёючфртрхь√х binkd т яЁюЎхёёх ЁрсюЄ√.

7.3.1. ╘рщы ё PID.

┬ ╬╤ ёхьхщёЄтр UNIX binkd ёючфр╕Є Їрщы ё эюьхЁюь яЁюЎхёёр (PID – Process ID). ▌Єю яюьюурхЄ яЁхфєяЁхфшЄ№ яютЄюЁэ√щ чряєёъ binkd ш юЄёыхфшЄ№ хую ЁрсюЄюёяюёюсэюёЄ№. ╘рщы PID юс√ўэю ЁрёяюырурхЄё  т ърЄрыюух /var/run ш эрч√трхЄё  binkd.pid. ┬ Їрщых ъюэЇшуєЁрЎшш ьюцэю чрфрЄ№ фЁєуюх хую Ёрчьх∙хэшх ш шь , ўЄю яючтюы хЄ чряєёърЄ№ эхёъюы№ъю ъюяшщ binkd ё Ёрчэ√ьш ъюэЇшуєЁрЎш ьш.

╘рщы PID яЁхфёЄрты хЄ ёюсющ ЄхъёЄют√щ Їрщы ш ёюфхЁцшЄ ёЄЁюъє-ўшёыю, Ёртэюх эюьхЁє «ЁюфшЄхы№ёъюую» яЁюЎхёёр. ┬ ёыєўрх чряєёър ё юяЎшхщ «-c» ¤Єю яЁюЎхёё ьхэхфцхЁр ъышхэЄют, т юёЄры№э√ї ёыєўр ї – яЁюЎхёё ьхэхфцхЁр ёхЁтхЁр binkd.

7.3.2. ╘рщы√, ёючфртрхь√х т ърЄрыюух яюўЄютющ юўхЁхфш.

Binkd ёючфр╕Є ш шёяюы№чєхЄ эхёъюы№ъю Їрщыют фы  юЄёыхцштрэш  ёюёЄю эш  ёюхфшэхэшщ ё ышэърьш. ╚ьхэр Єръшї Їрщыют ёюёЄрты ■Єё  шч фтєї ўрёЄхщ, Ёрчфхы╕ээ√ї Єюўъющ: ыхтр  ўрёЄ№ шьхэш ёююЄтхЄёЄтєхЄ яЁртшырь ъюфшЁютрэш  рфЁхёр т шёяюы№чєхьюь рєЄсрєэфх, яЁртр  ўрёЄ№ ёюёЄюшЄ шч ЄЁ╕ї сєът ш єърч√трхЄ эр ЇєэъЎш■ Їрщыр.

  • ╘рщы тшфр *.bsy.
    ╤ЄрэфрЁЄэ√щ Їрщы-Їыру чрэ ЄюёЄш ышэър фы  BSO. ╤ючфр╕Єё  яЁш єёях°эюь ёюхфшэхэшш ё ышэъюь яюёых яюыєўхэш  юЄ эхую ёяшёър рфЁхёют FTN.

  • ╘рщы тшфр *.csy.
    ╘рщы-Їыру,  ты ■∙шщё  Ёрё°шЁхэшхь юЁшушэры№эющ ёяхЎшЇшърЎшш BSO. ╚ёяюы№чєхЄё  фы  шэфшърЎшш яЁюЎхёёр єёЄрэютыхэш  ёюхфшэхэш  ё ышэъюь. ╩ышхэЄёъшщ яЁюЎхёё ёючфр╕Є хую яхЁхф юЄъЁ√Єшхь ёюъхЄр ш єфры хЄ яюёых ёючфрэш  Їырур *.bsy, р т ёыєўрх юсэрЁєцхэш  Єръюую Їрщыр чртхЁ°рхЄё . ▌ЄюЄ Їрщы-Їыру яЁхфюЄтЁр∙рхЄ юфэютЁхьхээє■ яюя√Єъє ёюхфшэшЄ№ё  фтєь  ъышхэЄёъшьш яЁюЎхёёрьш, Єръцх юэ ёючфр╕Єё  ш яЁютхЁ хЄё  эхъюЄюЁ√ьш фЁєушьш FTN ьхщыхЁрьш (эряЁшьхЁ, T-mail).

  • ╘рщы тшфр *.hld.
    ╚ёяюы№чєхЄё  фы  їЁрэхэш  тЁхьхэш, фю ъюЄюЁюую юЄыюцхэ ёыхфє■∙шщ т√чют ышэър яюёых шёўхЁярэш  ышьшЄр эхєфрўэ√ї яюя√Єюъ ёюхфшэхэш . ┬Ёхь  чряшёрэю т тшфх ёЄЁюъш ЎшЇЁ, яЁхфёЄрты ■∙шї ёюсющ ўшёыю ёхъєэф юЄ "эрўрыр ¤яюїш UNIX" (1  этрЁ  1970 у.).
    ▌ЄюЄ Їрщы ёяхЎшЇшўхэ фы  binkd.

  • ╘рщы тшфр *.try.
    ╚ёяюы№чєхЄё  фы  їЁрэхэш  ёЄрЄєёр яюёыхфэхую ёхрэёр ёт ш ё ышэъюь (єфрўэюую шыш эхєфрўэюую). ╤юёЄюшЄ шч ЄЁ╕ї яюыхщ: ъюышўхёЄтю єёях°э√ї яюя√Єюъ (фтюшўэюх 16-ЄшсшЄэюх ўшёыю ё яюЁ фъюь срщЄ «ьырф°шщ яхЁт√ь»), ъюышўхёЄтю схчєёях°э√ї яюя√Єюъ (фтюшўэюх 16-ЄшсшЄэюх ўшёыю ё яюЁ фъюь срщЄ «ьырф°шщ яхЁт√ь») ш ёЄЁюъє ё ёююс∙хэшхь. ┬ ёыєўрх єёях°эю чртхЁ°шт°хуюё  ёхрэёр ЄЁхЄ№х яюых ёюфхЁцшЄ ёЄЁюъє «CONNECT/BND», т ёыєўрх эхєфрўэюую - ёЄЁюъє ёююс∙хэш  юс ю°шсъх.
    ╧Ёш схчєёях°эющ яюя√Єъх ёюхфшэхэш  binkd єтхышўштрхЄ ёў╕Єўшъ эхєфрўэ√ї яюя√Єюъ (тЄюЁюх яюых т Їрщых *.try) фю Єхї яюЁ, яюър эх сєфхЄ яЁхт√°хэю ўшёыю, чрфрээюх т фшЁхъЄштх Їрщыр ъюэЇшуєЁрЎшш «try», яюёых ўхую юсэєы хЄ ёў╕Єўшъ ш чряшё√трхЄ тЁхь  ёыхфє■∙хщ яюя√Єъш т Їрщы *.hld.
    ▌ЄюЄ Їрщы ёяхЎшЇшўхэ фы  binkd.

  • ╘рщы тшфр *.stc.
    ╘рщы ё шэЇюЁьрЎшхщ ю ёюёЄю эшш яюўЄ√ фы /юЄ ышэър яЁш ЁрсюЄх т Ёхцшьх ND («No Dupes mode»).
    ▌ЄюЄ Їрщы ёяхЎшЇшўхэ фы  binkd.

7.3.3. ┬Ёхьхээ√х Їрщы√, шёяюы№чє■∙шхё  яЁш яЁшхьх Їрщыют.

╫Єюс√ шёъы■ўшЄ№ юсЁрсюЄъє яЁшэ Є√ї эх фю ъюэЎр Їрщыют фЁєушьш яЁюуЁрььрьш, binkd ёэрўрыр чряшё√трхЄ яЁшэ Є√х фрээ√х т Їрщы√ ёю ёяхЎшры№э√ьш шьхэрьш, р яю чртхЁ°хэшш яЁш╕ьр (яЁш яюыєўхэшш юЄ ышэър яюфЄтхЁцфхэш  ю чртхЁ°хэшш яхЁхфрўш) яхЁхшьхэют√трхЄ тЁхьхээ√щ Їрщы т эрчэрўхээюх єфры╕ээющ ёЄюЁюэющ шь .

─ы  ърцфюую яЁшэшьрхьюую Їрщыр binkd ёючфр╕Є т ърЄрыюух фы  яЁш╕ьр Їрщыют фтр тЁхьхээ√ї Їрщыр: *.hr ё юяшёрэшхь Їрщыр ш *.dt ё ёюфхЁцшь√ь Їрщыр (ыхт√х ўрёЄш Їрщыют ухэхЁшЁє■Єё  ё юсхёяхўхэшхь єэшъры№эюёЄш ш ёютярфр■Є є юсюшї Їрщыют). ╒Ёрэхэшх шэЇюЁьрЎшш ю яЁшэшьрхьюь Їрщых юЄфхы№эю юЄ эхую ёрьюую урЁрэЄшЁєхЄ эхчртшёшьюёЄ№ binkd юЄ шёяюы№чєхьющ Їрщыютющ ёшёЄхь√ ш ╬╤.

╘рщы *.hr ёюфхЁцшЄ ёЄЁюъє, ёюёЄю ∙є■ шч ўхЄ√Ё╕ї яюыхщ: шь  Їрщыр, хую ЁрчьхЁ, тЁхь  яюёыхфэхую шчьхэхэш  ш рфЁхё ышэър, ъюЄюЁ√щ °ы╕Є Їрщы. ═р юёэютх ¤Єющ шэЇюЁьрЎшш binkd яЁшэшьрхЄ Ёх°хэшх ю яЁш╕ьх Їрщыр ё ёютярфр■∙шь шьхэхь юЄ ¤Єюую цх ышэър ъръ яЁюфюыцхэшх ёє∙хёЄтє■∙хую Їрщыр ышсю ъръ эютюую.

8. ─Ёєур  фюъєьхэЄрЎш .

8.1. ─юъєьхэЄрЎш  шч фшёЄЁшсєЄштэюую ъюьяыхъЄр binkd.

┬ ъюьяыхъЄх юЇшЎшры№эюую фшёЄЁшсєЄштр binkd юс чрЄхы№эю яЁшёєЄёЄтєхЄ шэёЄЁєъЎш  яю єёЄрэютъх, Їрщы ёю ёяшёъюь ЇєэъЎшюэры№э√ї шчьхэхэшщ, фюъєьхэЄ «╫рёЄ√х тюяЁюё√ яю ьхщыхЁє binkd ш юЄтхЄ√ эр эшї» («Binkd FAQ»), ёЄЁрэшўър man binkd, юяшёрэшх binkd/w9x, ъЁрЄъюх юяшёрэшх яЁюЄюъюыр binkp, юяшёрэшх яЁюЄюъюыр SRIF ш эхъюЄюЁ√х фЁєушх фюъєьхэЄ√, яЁхфёЄрты ■∙шх шэЄхЁхё ёъюЁхх фы  ЁрчЁрсюЄўшъют. ┬ рЁїштрї ё binkd, эх  ты ■∙шїё  юЇшЎшры№э√ьш фшёЄЁшсєЄштрьш, ўрёЄ№ шыш тё  фюъєьхэЄрЎш  ьюцхЄ юЄёєЄёЄтютрЄ№, яю¤Єюьє сєф№Єх тэшьрЄхы№э√.

8.2. ─юъєьхэЄрЎш  т Internet.

═р ьюьхэЄ эряшёрэш  ¤Єюую ЄхъёЄр т Internet шьххЄё  эхёъюы№ъю шёЄюўэшъют, ёюфхЁцр∙шї фюъєьхэЄрЎш■ яю ьхщыхЁє binkd ш яЁюЄюъюыє binkp:

  1. ╤рщЄ http://binkd.grumbler.org

  2. └Ёїшт FTP ftp://cvs.happy.kiev.ua/pub/fidosoft/mailer/binkd/ ш эхёъюы№ъю хую чхЁъры:
    ftp://cheetah.itpark.com.ua/pub/fido/binkd/ (╙ъЁршэр, яюффхЁцштрхЄ чхЁърыю Pavel Gulchouck 2:463/68)
    ftp://fido.thunderdome.ws/pub/mirror/binkd/ (╤╪└, яюффхЁцштрхЄ чхЁърыю Matt Bedynek 1:106/1)
    ftp://ftp.alexblues.ru/pub/binkd/ (╨юёёш , яюффхЁцштрхЄ чхЁърыю Alexander Gladchenko 2:5080/111)
    ftp://cube.sut.ru/pub/mirror/binkd/ (╨юёёш , яюффхЁцштрхЄ чхЁърыю Dmitriy Yermakov 2:5030/1115)
    http://binkd.spb.ru (╨юёёш , яюффхЁцштрхЄ чхЁърыю Andrey Ostanovsky 2:5030/1957)

  3. ╨єъютюфёЄтю яюы№чютрЄхы  binkd v.0.9.2 эр рэуышщёъюь  ч√ъх, эряшёрээюх Nick Soveiko: http://www.doe.carleton.ca/~nsoveiko/fido/binkd/

  4. └тЄюЁёъюх юяшёрэшх binkd ш яЁюЄюъюыр binkp ─ьшЄЁш  ╠рыютр:
    http://www.corbina.net/~maloff/binkd

  5. ╩юыыхъЎш  ёЄрэфрЁЄют FTN эр ёрщЄх FTSC:
    http://www.ftsc.org/download/

▀ эх ьюує урЁрэЄшЁютрЄ№, ўЄю ъръшх-Єю ЁхёєЁё√ эх яхЁхёЄрэєЄ ЁрсюЄрЄ№ ш эртхЁэ ър єурфр■, єЄтхЁцфр , ўЄю ўхЁхч эхъюЄюЁюх тЁхь  яю т Єё  ш фЁєушх ЁхёєЁё√.

8.2. ╚ёЄюўэшъш шэЇюЁьрЎшш т FIDOnet.

╧ёюъюы№ъє binkd  ты хЄё  яюўЄютющ яЁюуЁрььющ, шёяюы№чєхьющ т ёхЄш FIDOnet, хёЄхёЄтхээю, ўЄю т ¤Єющ ёхЄш фюёЄрЄюўэю яЁюёЄю эрщЄш шэЇюЁьрЎш■ ю э╕ь ш, сюыхх Єюую, ьюцэю яюыєўшЄ№ яюью∙№ т эрёЄЁющъх. ─ы  юс∙хэш  яюы№чютрЄхыхщ ш ЁрчЁрсюЄўъшют binkd ёє∙хёЄтєхЄ фтх ¤їюъюэЇхЁхэЎшш FIDOnet: Ёєёёъю ч√ўэр  RU.BINKD ш рэуыю ч√ўэр  BINKD (юэр  ты хЄё  ьхцфєэрЁюфэющ). ╥ръцх шьх■∙шх юЄэю°хэшх ъ binkd Їрщы√ ЁрёяЁюёЄЁрэ ■Єё  яю Їрщы¤їх AFTNBINKD.


$Id: binkd-ug-ru.htm,v 1.1.2.9 2008/10/02 06:11:13 gul Exp $ binkd/doc/CVS/0000775000076400007640000000000011700610241011507 5ustar gulgulbinkd/doc/CVS/Tag0000664000076400007640000000001611700610241012142 0ustar gulgulNbinkd-0_9_11 binkd/doc/CVS/Repository0000664000076400007640000000001211700610241013602 0ustar gulgulbinkd/doc binkd/doc/CVS/Entries0000664000076400007640000000010311700610241013035 0ustar gulgul/binkd-ug-ru.htm/1.1.2.9/Thu Oct 2 06:11:13 2008//Tbinkd-0_9_11 D binkd/doc/CVS/Root0000664000076400007640000000004611700610241012355 0ustar gulgul:pserver:binkd@cvs.happy.kiev.ua:/cvs binkd/ftnnode.h0000664000076400007640000001021107700137203012117 0ustar gulgul/* * ftnnode.h -- Handle our links * * ftnnode.h is a part of binkd project * * Copyright (C) 1996 Dima Maloff, 5047/13 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING. */ /* * $Id: ftnnode.h,v 2.8.2.1 2003/06/30 22:49:39 hbrew Exp $ * * $Log: ftnnode.h,v $ * Revision 2.8.2.1 2003/06/30 22:49:39 hbrew * Allow to override -ip, -sip, -md, -nomd in add_node() * * Revision 2.8 2003/05/01 09:55:01 gul * Remove -crypt option, add global -r option (disable crypt). * * Revision 2.7 2003/03/31 19:35:16 gul * Clean semaphores usage * * Revision 2.6 2003/03/11 00:04:25 gul * Use patches for compile under MSDOS by MSC 6.0 with IBMTCPIP * * Revision 2.5 2003/03/01 15:55:02 gul * Current outgoing address is now attibute of session, but not node * * Revision 2.4 2003/02/28 20:39:08 gul * Code cleanup: * change "()" to "(void)" in function declarations; * change C++-style comments to C-style * * Revision 2.3 2003/02/22 15:53:46 gul * Bugfix with locking array of nodes in multithread version * * Revision 2.2 2003/02/22 11:45:41 gul * Do not resolve hosts if proxy or socks5 using * * Revision 2.1 2001/02/15 11:03:18 gul * Added crypt traffic possibility * * Revision 2.0 2001/01/10 12:12:38 gul * Binkd is under CVS again * * Revision 1.6 1997/11/03 06:10:39 mff * +nodes_init() * * Revision 1.5 1997/10/23 04:06:48 mff * many changes to hide pNod int ftnnode.c * * Revision 1.4 1997/08/19 21:32:09 mff * host/port replaced with hosts -- ASCIIz in "host1,host2,..,hostN" form * * Revision 1.3 1997/06/16 05:49:13 mff * Removed bitmapped flavours. * * Revision 1.2 1997/02/07 07:07:00 mff * busy, flvrs, hold_until, ibox, obox, obox_flvr * * Revision 1.1 1996/12/29 09:41:45 mff * Initial revision * */ #ifndef _ftnnode_h #define _ftnnode_h #include #include "Config.h" #include "ftnaddr.h" #include "iphdr.h" #define MAXPWDLEN 40 typedef struct _FTN_NODE FTN_NODE; struct _FTN_NODE { char *hosts; /* "host1:port1,host2:port2,*" */ FTN_ADDR fa; char pwd[MAXPWDLEN + 1]; char obox_flvr; char *obox; char *ibox; int NR_flag; int ND_flag; int MD_flag; int restrictIP; time_t hold_until; int busy; /* 0=free, 'c'=.csy, other=.bsy */ int mail_flvr; /* -1=no mail, other=it's flavour */ int files_flvr; /* -1=no files, other=it's flavour */ }; /* * Call this before all others functions from this file. */ void nodes_init (void); /* * Call this before exit to free resources. */ void nodes_deinit (void); /* * Lock and release pNod array */ void locknodesem (void); void releasenodesem (void); /* * Return up/downlink info by fidoaddress. 0 == node not found */ FTN_NODE *get_node_info (FTN_ADDR *fa); /* * Find up/downlink info by fidoaddress and write info into node var. * Return pointer to node structure or NULL if node not found. */ FTN_NODE *get_node (FTN_ADDR *fa, FTN_NODE *node); /* * Add a new node, or edit old settings for a node * * 1 -- ok, 0 -- error; */ int add_node (FTN_ADDR *fa, char *hosts, char *pwd, char obox_flvr, char *obox, char *ibox, int NR_flag, int ND_flag, int MD_flag, int restrictIP); #define NR_ON 1 #define NR_OFF 0 #define NR_USE_OLD -1 /* Use old value */ #define ND_ON 1 #define ND_OFF 0 #define ND_USE_OLD -1 /* Use old value */ #define MD_ON 1 #define MD_OFF -1 #define MD_USE_OLD 0 /* Use old value, default value */ #define RIP_ON 1 #define RIP_OFF 0 #define RIP_SIP 2 /* Strict IP check (-sip) */ #define RIP_USE_OLD -1 /* Use old value */ /* * Iterates through nodes while func() == 0. */ int foreach_node (int (*func) (FTN_NODE *fn, void *a2), void *a3); /* * Dump node list */ void print_node_info (FILE *out); /* * Create a poll for an address (in "z:n/n.p" format) (0 -- bad) */ #define POLL_NODE_FLAVOUR 'i' int poll_node (char *s); #endif binkd/readme.ND0000664000076400007640000003573507622772654012035 0ustar gulgul 1. Что это такое. Это режим работы binkp, на 100% защищенный от повторной передачи файлов (и, естественно, от потерь) независимо от того, в какой момент оборвалось соединение. Это достигается за счет некоторого замедления протокола (информация о следующем файле передается только после получения M_GOT на предыдущий), задержки перед переименованием файла в его настоящее имя (это происходит только после получения M_FILE на следующий файл, т.е. когда мы уверены, что на той стороне файл прибит), и сохранения статуса сессий в файлах *.stc. 2. Как оно работает. Протокол binkp оказался очень хорошо адаптированным для введения этой фичи. Не пришлось его менять вообще, меняется только поведение сторон. Основные тезисы: - сессия в ND-mode включается только если обе стороны на нее согласны. То есть если обе стороны сказали OPT ND при handshake. Отвечающая сторона всегда говорит OPT ND, если она поддерживает этот режим. Таким образом, не нужно менять (и даже проверять) версию протокола. - опция ND включает в себя опцию NR. То есть ND без NR не бывает. Вызывающая сторона при handshake говорит "OPT NR ND", отвечающая - просто "OPT ND". - начало передачи следующего файла (offset request) происходит только после приема M_GOT или M_SKIP на предыдущий. - файл на приеме переименовывается только после начала передачи следующего, когда мы точно знаем, что там получили M_GOT и удалили файл. Введено новое поле state.in_complete - полностью принятый файл, который ждет переименования. - на передающей стороне между удалением файла и получением M_GET на следующий в файле *.stc (status-file) сохраняются параметры предыдущего файла - мы не знаем, переименовался ли он на принимающей стороне, и при обрыве сессии в следующий раз мы его предложим (но передавать не будем - нечего, предложим только для переименования). - статус физически сохраняется на диск каждый раз, чтобы не было потерь не только в случае обрыва соединения, но и при сбое питания, скажем. - передача файлов на узел всегда начинается с передачи статуса, независимо от того, включена ли ND- или NR-mode. Иначе файл может потеряться (не переименоваться) при выключении ND-mode. 3. Некоторые подробности реализации. Все было бы совсем просто, если бы у remote было всего одно AKA. Тогда status можно было бы передавать всегда в начале сессии, и забыть о нем. В случае нескольких AKA пришлось обрабатывать status-файлы на этапе сканирования outbound (модуль ftnq); появились новые поля state'а: cur_addr (адрес, для которого в данный момент передается почта) и ND_addr (адрес, для которого мы будем обновлять status - он несколько запаздывает по отношению к cur_addr). Если remote согласился принимать файл, указанный в status (т.е. он его уже переименовал и считает этот новым), то мы не можем просто так отказаться его передавать и перейти к следующему файлу - на remote не совпадет GET_FILE_balance. Поэтому нам надо всегда на M_GET отвечать "M_FILE name offset time 0", и только потом переходить к новому файлу (remote скажет "file transfer interrupted", и все будет нормально). Очень помогает двойной EOB при окончании сессии на binkp/1.1. Это дает нам возможность убедиться в переименовании последнего файла без дополнительных сообщений протокола. Было большое искушение не удалять файл на передающей стороне до его переименования на принимающей, а в статусе сохранять информацию о том, что этот файл передавать не нужно (только предложить). В этом случае при удалении статуса или невозможности его сохранить может возникнуть дуп (как на обычном -NR), но не будет потери файла. Но от этого пришлось отказаться: если файл лежит в outbound, туда может быть что-то допаковано, и его прийдется передавать опять, т.е. возникнут те же дупы. Поэтому при невозможности сохранения статуса приходится разрывать сессию, а при его удалении ручками файл может не быть переименован принимающей стороной. Что ж, при удалении самого файла тоже возможна его потеря - файл *.stc ничем не хуже. ;-) Можно было бы сделать режим защиты от дупов и без замедления протокола (при -NR), за счет того, что перед передачей файла идет две посылки (запрос смещения и собственно начало передачи): - при получении M_GOT мы выставляем status и удаляем файл; - при получении "M_FILE 0" мы переименовываем файл, поскольку знаем, что remote получил ответ на offset request, а значит, и M_GOT от предыдущего файла; - при получении M_GOT мы можем удалить предыдущий статус, потому что знаем, что принят следующий файл, а значит, было принято сообщение M_FILE о нем, т.е. предыдущий был переименован. Недостаток этого метода заключается в том, что status всегда непустой, т.е. следующая сессия всегда будет начинаться с передачи fake-файла, даже если предыдущая сессия была завершена успешно (иначе нужно делать еще один цикл подтверждений в конце сессии, т.е. изменение самого binkp) В общем, я от этого способа решил отказаться. Пусть лучше медленнее, но без непонятных юзеру действий binkd и без толпы файлов .stc в outbound (в том, что реализовано, файл .stc появляется достаточно редко, только при обрыве сессии между получением M_GOT на один файл и M_GET на следующий). 4. Недостатки. - замедление работы протокола в режиме ND. Протокол в режиме ND работает примерно настолько же медленнее режима NR, насколько режим NR медленнее нормального режима; - отъедается чуть больше памяти (увеличился размер структуры state); - при ответе на входящее соединение всегда передается "OPT ND", показывающая, что мы поддерживаем этот режим - она может удивлять (а может и рекламировать), а кто-то скажет, что это избыточный траффик ;-) - очистка статуса последнего переданного файла происходит только непосредственно перед окончанием сессии, т.е. после полной передачи всех файлов в _обе_ стороны. 5. Грабли (выявлены в процессе тестирования): - файл передался, от него есть статус, на принимающей стороне ждет переименования, произошел обрыв, и при следующей сессии оказалась bsy на главное aka передающей стороны. Тогда сессия проводится с вторым AKA (но та сторона об этом не знает), принимается статус, расценивается как другой файл (from-address ведь уже не тот), подтверждаем прием, передающая сторона думает, что раз хотят принимать с начала, значит, уже переименовали, и со спокойной совестью статус удаляет. Решение: при приеме файла проверять все предъявленные aka, в т.ч. занятые. - возможна ситуация, когда файл есть только в "недокаченном" (а на самом деле, непереименованном) виде, когда переименование планируется при передаче статуса. Если же другой линк предложит файл с тем же именем, то при kill-dup-partial-files "недокаченный" файл будет прибит. Решение: при kill-dup-partial-files прибивать только файлы с тем же именем от того же линка, а не все файлы с таким именем. - опция ND не включает в себя NR, ведь при ответе всем говорится ND, и если это включает в себя NR, то все сессии будут проводиться в режимах ND или NR, независимо от желания "звонящего". То есть, для корректной работы, опция ND может предъявляться только при binkp 1.1 или выше, и звонящий может предъявлять ND только вместе с NR, но не саму по себе. Кстати, если при ответе говорить "OPT NR", то можно всем звонящим принудительно навязывать NR-mode (если они это умеют, конечно) - интересная фича. ;-) - при согласии принимать файл с начала нельзя предлагать сразу следующий файл из-за внутренних счетчиков binkd. Нужно сначала сообщить, что мы будем передавать файл с начала, и только после этого переходить к следующему файлу, тогда это воспринимается нормально. 6. Пример сессии в режиме ND (рассмотрена только передача в одну сторону): master slave #if status=="X size time" >> M_FILE X